Chromium Code Reviews| 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/test_tools/crypto_test_utils.h" | 5 #include "net/quic/test_tools/crypto_test_utils.h" |
| 6 | 6 |
| 7 #include <openssl/bn.h> | 7 #include <openssl/bn.h> |
| 8 #include <openssl/ec.h> | 8 #include <openssl/ec.h> |
| 9 #include <openssl/ecdsa.h> | 9 #include <openssl/ecdsa.h> |
| 10 #include <openssl/evp.h> | 10 #include <openssl/evp.h> |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 23 void EvpMdCtxCleanUp(EVP_MD_CTX* ctx) { | 23 void EvpMdCtxCleanUp(EVP_MD_CTX* ctx) { |
| 24 (void)EVP_MD_CTX_cleanup(ctx); | 24 (void)EVP_MD_CTX_cleanup(ctx); |
| 25 } | 25 } |
| 26 | 26 |
| 27 } // namespace anonymous | 27 } // namespace anonymous |
| 28 | 28 |
| 29 namespace net { | 29 namespace net { |
| 30 | 30 |
| 31 namespace test { | 31 namespace test { |
| 32 | 32 |
| 33 class TestChannelIDSigner : public ChannelIDSigner { | 33 class TestChannelIDKey : public ChannelIDKey { |
|
wtc
2014/05/28 22:04:29
net/quic/test_tools/crypto_test_utils_nss.cc also
| |
| 34 public: | 34 public: |
| 35 virtual ~TestChannelIDSigner() { } | 35 explicit TestChannelIDKey(EVP_PKEY* ecdsa_key) : ecdsa_key_(ecdsa_key) {} |
| 36 virtual ~TestChannelIDKey() { } | |
| 36 | 37 |
| 37 // ChannelIDSigner implementation. | 38 // ChannelIDKey implementation. |
| 38 | 39 |
| 39 virtual bool Sign(const string& hostname, | 40 virtual bool Sign(StringPiece signed_data, |
| 40 StringPiece signed_data, | 41 string* out_signature) override { |
| 41 string* out_key, | |
| 42 string* out_signature) OVERRIDE { | |
| 43 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> ecdsa_key( | |
| 44 HostnameToKey(hostname)); | |
| 45 | |
| 46 *out_key = SerializeKey(ecdsa_key.get()); | |
| 47 if (out_key->empty()) { | |
| 48 return false; | |
| 49 } | |
| 50 | |
| 51 EVP_MD_CTX md_ctx; | 42 EVP_MD_CTX md_ctx; |
| 52 EVP_MD_CTX_init(&md_ctx); | 43 EVP_MD_CTX_init(&md_ctx); |
| 53 crypto::ScopedOpenSSL<EVP_MD_CTX, EvpMdCtxCleanUp> | 44 crypto::ScopedOpenSSL<EVP_MD_CTX, EvpMdCtxCleanUp> |
| 54 md_ctx_cleanup(&md_ctx); | 45 md_ctx_cleanup(&md_ctx); |
| 55 | 46 |
| 56 if (EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL, | 47 if (EVP_DigestSignInit(&md_ctx, NULL, EVP_sha256(), NULL, |
| 57 ecdsa_key.get()) != 1) { | 48 ecdsa_key_.get()) != 1) { |
| 58 return false; | 49 return false; |
| 59 } | 50 } |
| 60 | 51 |
| 61 EVP_DigestUpdate(&md_ctx, ChannelIDVerifier::kContextStr, | 52 EVP_DigestUpdate(&md_ctx, ChannelIDVerifier::kContextStr, |
| 62 strlen(ChannelIDVerifier::kContextStr) + 1); | 53 strlen(ChannelIDVerifier::kContextStr) + 1); |
| 63 EVP_DigestUpdate(&md_ctx, ChannelIDVerifier::kClientToServerStr, | 54 EVP_DigestUpdate(&md_ctx, ChannelIDVerifier::kClientToServerStr, |
| 64 strlen(ChannelIDVerifier::kClientToServerStr) + 1); | 55 strlen(ChannelIDVerifier::kClientToServerStr) + 1); |
| 65 EVP_DigestUpdate(&md_ctx, signed_data.data(), signed_data.size()); | 56 EVP_DigestUpdate(&md_ctx, signed_data.data(), signed_data.size()); |
| 66 | 57 |
| 67 size_t sig_len; | 58 size_t sig_len; |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 87 memset(signature.get(), 0, kSignatureLength); | 78 memset(signature.get(), 0, kSignatureLength); |
| 88 BN_bn2bin(sig.get()->r, signature.get() + 32 - BN_num_bytes(sig.get()->r)); | 79 BN_bn2bin(sig.get()->r, signature.get() + 32 - BN_num_bytes(sig.get()->r)); |
| 89 BN_bn2bin(sig.get()->s, signature.get() + 64 - BN_num_bytes(sig.get()->s)); | 80 BN_bn2bin(sig.get()->s, signature.get() + 64 - BN_num_bytes(sig.get()->s)); |
| 90 | 81 |
| 91 *out_signature = string(reinterpret_cast<char*>(signature.get()), | 82 *out_signature = string(reinterpret_cast<char*>(signature.get()), |
| 92 kSignatureLength); | 83 kSignatureLength); |
| 93 | 84 |
| 94 return true; | 85 return true; |
| 95 } | 86 } |
| 96 | 87 |
| 97 virtual string GetKeyForHostname(const string& hostname) OVERRIDE { | 88 virtual string SerializeKey() override { |
| 98 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> ecdsa_key( | 89 // i2d_PublicKey will produce an ANSI X9.62 public key which, for a P-256 |
| 99 HostnameToKey(hostname)); | 90 // key, is 0x04 (meaning uncompressed) followed by the x and y field |
| 100 return SerializeKey(ecdsa_key.get()); | 91 // elements as 32-byte, big-endian numbers. |
| 92 static const int kExpectedKeyLength = 65; | |
| 93 | |
| 94 int len = i2d_PublicKey(ecdsa_key_.get(), NULL); | |
| 95 if (len != kExpectedKeyLength) { | |
| 96 return ""; | |
| 97 } | |
| 98 | |
| 99 uint8 buf[kExpectedKeyLength]; | |
| 100 uint8* derp = buf; | |
| 101 i2d_PublicKey(ecdsa_key_.get(), &derp); | |
| 102 | |
| 103 return string(reinterpret_cast<char*>(buf + 1), kExpectedKeyLength - 1); | |
| 101 } | 104 } |
| 102 | 105 |
| 103 private: | 106 private: |
| 107 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> ecdsa_key_; | |
| 108 }; | |
| 109 | |
| 110 class TestChannelIDSource : public ChannelIDSource { | |
| 111 public: | |
| 112 virtual ~TestChannelIDSource() {} | |
| 113 | |
| 114 // ChannelIDSource implementation. | |
| 115 | |
| 116 virtual bool GetChannelIDKey( | |
| 117 const string& hostname, | |
| 118 scoped_ptr<ChannelIDKey>* channel_id_key) override { | |
| 119 channel_id_key->reset(new TestChannelIDKey(HostnameToKey(hostname))); | |
| 120 return true; | |
| 121 } | |
| 122 | |
| 123 private: | |
| 104 static EVP_PKEY* HostnameToKey(const string& hostname) { | 124 static EVP_PKEY* HostnameToKey(const string& hostname) { |
| 105 // In order to generate a deterministic key for a given hostname the | 125 // In order to generate a deterministic key for a given hostname the |
| 106 // hostname is hashed with SHA-256 and the resulting digest is treated as a | 126 // hostname is hashed with SHA-256 and the resulting digest is treated as a |
| 107 // big-endian number. The most-significant bit is cleared to ensure that | 127 // big-endian number. The most-significant bit is cleared to ensure that |
| 108 // the resulting value is less than the order of the group and then it's | 128 // the resulting value is less than the order of the group and then it's |
| 109 // taken as a private key. Given the private key, the public key is | 129 // taken as a private key. Given the private key, the public key is |
| 110 // calculated with a group multiplication. | 130 // calculated with a group multiplication. |
| 111 SHA256_CTX sha256; | 131 SHA256_CTX sha256; |
| 112 SHA256_Init(&sha256); | 132 SHA256_Init(&sha256); |
| 113 SHA256_Update(&sha256, hostname.data(), hostname.size()); | 133 SHA256_Update(&sha256, hostname.data(), hostname.size()); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 136 | 156 |
| 137 EC_KEY_set_private_key(ecdsa_key.get(), k.get()); | 157 EC_KEY_set_private_key(ecdsa_key.get(), k.get()); |
| 138 EC_KEY_set_public_key(ecdsa_key.get(), point.get()); | 158 EC_KEY_set_public_key(ecdsa_key.get(), point.get()); |
| 139 | 159 |
| 140 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> pkey(EVP_PKEY_new()); | 160 crypto::ScopedOpenSSL<EVP_PKEY, EVP_PKEY_free> pkey(EVP_PKEY_new()); |
| 141 // EVP_PKEY_set1_EC_KEY takes a reference so no |release| here. | 161 // EVP_PKEY_set1_EC_KEY takes a reference so no |release| here. |
| 142 EVP_PKEY_set1_EC_KEY(pkey.get(), ecdsa_key.get()); | 162 EVP_PKEY_set1_EC_KEY(pkey.get(), ecdsa_key.get()); |
| 143 | 163 |
| 144 return pkey.release(); | 164 return pkey.release(); |
| 145 } | 165 } |
| 146 | |
| 147 static string SerializeKey(EVP_PKEY* key) { | |
| 148 // i2d_PublicKey will produce an ANSI X9.62 public key which, for a P-256 | |
| 149 // key, is 0x04 (meaning uncompressed) followed by the x and y field | |
| 150 // elements as 32-byte, big-endian numbers. | |
| 151 static const int kExpectedKeyLength = 65; | |
| 152 | |
| 153 int len = i2d_PublicKey(key, NULL); | |
| 154 if (len != kExpectedKeyLength) { | |
| 155 return ""; | |
| 156 } | |
| 157 | |
| 158 uint8 buf[kExpectedKeyLength]; | |
| 159 uint8* derp = buf; | |
| 160 i2d_PublicKey(key, &derp); | |
| 161 | |
| 162 return string(reinterpret_cast<char*>(buf + 1), kExpectedKeyLength - 1); | |
| 163 } | |
| 164 }; | 166 }; |
| 165 | 167 |
| 166 // static | 168 // static |
| 167 ChannelIDSigner* CryptoTestUtils::ChannelIDSignerForTesting() { | 169 ChannelIDSource* CryptoTestUtils::ChannelIDSourceForTesting() { |
| 168 return new TestChannelIDSigner(); | 170 return new TestChannelIDSource(); |
| 169 } | 171 } |
| 170 | 172 |
| 171 } // namespace test | 173 } // namespace test |
| 172 | 174 |
| 173 } // namespace net | 175 } // namespace net |
| OLD | NEW |