| OLD | NEW | 
|    1 // Copyright 2013 The Chromium Authors. All rights reserved. |    1 // Copyright 2013 The Chromium Authors. All rights reserved. | 
|    2 // Use of this source code is governed by a BSD-style license that can be |    2 // Use of this source code is governed by a BSD-style license that can be | 
|    3 // found in the LICENSE file. |    3 // found in the LICENSE file. | 
|    4  |    4  | 
|    5 #include "net/quic/crypto/proof_source_chromium.h" |    5 #include "net/quic/crypto/proof_source_chromium.h" | 
|    6  |    6  | 
|    7 #include <openssl/digest.h> |    7 #include <openssl/digest.h> | 
|    8 #include <openssl/evp.h> |    8 #include <openssl/evp.h> | 
|    9 #include <openssl/rsa.h> |    9 #include <openssl/rsa.h> | 
|   10  |   10  | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   75     DLOG(FATAL) << "Unable to read signed certificate timestamp."; |   75     DLOG(FATAL) << "Unable to read signed certificate timestamp."; | 
|   76     return false; |   76     return false; | 
|   77   } |   77   } | 
|   78  |   78  | 
|   79   return true; |   79   return true; | 
|   80 } |   80 } | 
|   81  |   81  | 
|   82 bool ProofSourceChromium::GetProof(const IPAddress& server_ip, |   82 bool ProofSourceChromium::GetProof(const IPAddress& server_ip, | 
|   83                                    const string& hostname, |   83                                    const string& hostname, | 
|   84                                    const string& server_config, |   84                                    const string& server_config, | 
 |   85                                    QuicVersion quic_version, | 
 |   86                                    base::StringPiece chlo_hash, | 
|   85                                    bool ecdsa_ok, |   87                                    bool ecdsa_ok, | 
|   86                                    scoped_refptr<ProofSource::Chain>* out_chain, |   88                                    scoped_refptr<ProofSource::Chain>* out_chain, | 
|   87                                    string* out_signature, |   89                                    string* out_signature, | 
|   88                                    string* out_leaf_cert_sct) { |   90                                    string* out_leaf_cert_sct) { | 
|   89   DCHECK(private_key_.get()) << " this: " << this; |   91   DCHECK(private_key_.get()) << " this: " << this; | 
|   90  |   92  | 
|   91   crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |   93   crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 
|   92   crypto::ScopedEVP_MD_CTX sign_context(EVP_MD_CTX_create()); |   94   crypto::ScopedEVP_MD_CTX sign_context(EVP_MD_CTX_create()); | 
|   93   EVP_PKEY_CTX* pkey_ctx; |   95   EVP_PKEY_CTX* pkey_ctx; | 
|   94   if (!EVP_DigestSignInit(sign_context.get(), &pkey_ctx, EVP_sha256(), nullptr, |   96  | 
|   95                           private_key_->key()) || |   97   if (quic_version > QUIC_VERSION_30) { | 
|   96       !EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) || |   98     uint32_t len = chlo_hash.length(); | 
|   97       !EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) || |   99     if (!EVP_DigestSignInit(sign_context.get(), &pkey_ctx, EVP_sha256(), | 
|   98       !EVP_DigestSignUpdate( |  100                             nullptr, private_key_->key()) || | 
|   99           sign_context.get(), |  101         !EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) || | 
|  100           reinterpret_cast<const uint8_t*>(kProofSignatureLabel), |  102         !EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) || | 
|  101           sizeof(kProofSignatureLabel)) || |  103         !EVP_DigestSignUpdate( | 
|  102       !EVP_DigestSignUpdate( |  104             sign_context.get(), | 
|  103           sign_context.get(), |  105             reinterpret_cast<const uint8_t*>(kProofSignatureLabel), | 
|  104           reinterpret_cast<const uint8_t*>(server_config.data()), |  106             sizeof(kProofSignatureLabel)) || | 
|  105           server_config.size())) { |  107         !EVP_DigestSignUpdate(sign_context.get(), | 
 |  108                               reinterpret_cast<const uint8_t*>(&len), | 
 |  109                               sizeof(len)) || | 
 |  110         !EVP_DigestSignUpdate( | 
 |  111             sign_context.get(), | 
 |  112             reinterpret_cast<const uint8_t*>(chlo_hash.data()), len) || | 
 |  113         !EVP_DigestSignUpdate( | 
 |  114             sign_context.get(), | 
 |  115             reinterpret_cast<const uint8_t*>(server_config.data()), | 
 |  116             server_config.size())) { | 
 |  117       return false; | 
 |  118     } | 
 |  119   } else if (!EVP_DigestSignInit(sign_context.get(), &pkey_ctx, EVP_sha256(), | 
 |  120                                  nullptr, private_key_->key()) || | 
 |  121              !EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING) || | 
 |  122              !EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, -1) || | 
 |  123              !EVP_DigestSignUpdate( | 
 |  124                  sign_context.get(), | 
 |  125                  reinterpret_cast<const uint8_t*>(kProofSignatureLabelOld), | 
 |  126                  sizeof(kProofSignatureLabelOld)) || | 
 |  127              !EVP_DigestSignUpdate( | 
 |  128                  sign_context.get(), | 
 |  129                  reinterpret_cast<const uint8_t*>(server_config.data()), | 
 |  130                  server_config.size())) { | 
|  106     return false; |  131     return false; | 
|  107   } |  132   } | 
|  108  |  133  | 
|  109   // Determine the maximum length of the signature. |  134   // Determine the maximum length of the signature. | 
|  110   size_t len = 0; |  135   size_t len = 0; | 
|  111   if (!EVP_DigestSignFinal(sign_context.get(), nullptr, &len)) { |  136   if (!EVP_DigestSignFinal(sign_context.get(), nullptr, &len)) { | 
|  112     return false; |  137     return false; | 
|  113   } |  138   } | 
|  114   std::vector<uint8_t> signature(len); |  139   std::vector<uint8_t> signature(len); | 
|  115   // Sign it. |  140   // Sign it. | 
|  116   if (!EVP_DigestSignFinal(sign_context.get(), signature.data(), &len)) { |  141   if (!EVP_DigestSignFinal(sign_context.get(), signature.data(), &len)) { | 
|  117     return false; |  142     return false; | 
|  118   } |  143   } | 
|  119   signature.resize(len); |  144   signature.resize(len); | 
|  120   out_signature->assign(reinterpret_cast<const char*>(signature.data()), |  145   out_signature->assign(reinterpret_cast<const char*>(signature.data()), | 
|  121                         signature.size()); |  146                         signature.size()); | 
|  122   *out_chain = chain_; |  147   *out_chain = chain_; | 
|  123   VLOG(1) << "signature: " |  148   VLOG(1) << "signature: " | 
|  124           << base::HexEncode(out_signature->data(), out_signature->size()); |  149           << base::HexEncode(out_signature->data(), out_signature->size()); | 
|  125   *out_leaf_cert_sct = signed_certificate_timestamp_; |  150   *out_leaf_cert_sct = signed_certificate_timestamp_; | 
|  126   return true; |  151   return true; | 
|  127 } |  152 } | 
|  128  |  153  | 
|  129 }  // namespace net |  154 }  // namespace net | 
| OLD | NEW |