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 |