| 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/cert/ct_log_verifier.h" | 5 #include "net/cert/ct_log_verifier.h" |
| 6 | 6 |
| 7 #include <cryptohi.h> | 7 #include <cryptohi.h> |
| 8 #include <keyhi.h> | 8 #include <keyhi.h> |
| 9 #include <nss.h> | 9 #include <nss.h> |
| 10 #include <pk11pub.h> | 10 #include <pk11pub.h> |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 } | 56 } |
| 57 } | 57 } |
| 58 | 58 |
| 59 } // namespace | 59 } // namespace |
| 60 | 60 |
| 61 CTLogVerifier::~CTLogVerifier() { | 61 CTLogVerifier::~CTLogVerifier() { |
| 62 if (public_key_) | 62 if (public_key_) |
| 63 SECKEY_DestroyPublicKey(public_key_); | 63 SECKEY_DestroyPublicKey(public_key_); |
| 64 } | 64 } |
| 65 | 65 |
| 66 CTLogVerifier::CTLogVerifier() | 66 bool CTLogVerifier::Init(const base::StringPiece& public_key) { |
| 67 : hash_algorithm_(ct::DigitallySigned::HASH_ALGO_NONE), | |
| 68 signature_algorithm_(ct::DigitallySigned::SIG_ALGO_ANONYMOUS), | |
| 69 public_key_(NULL) {} | |
| 70 | |
| 71 bool CTLogVerifier::Init(const base::StringPiece& public_key, | |
| 72 const base::StringPiece& description) { | |
| 73 SECItem key_data; | 67 SECItem key_data; |
| 74 | 68 |
| 75 crypto::EnsureNSSInit(); | 69 crypto::EnsureNSSInit(); |
| 76 | 70 |
| 77 key_data.data = reinterpret_cast<unsigned char*>( | 71 key_data.data = reinterpret_cast<unsigned char*>( |
| 78 const_cast<char*>(public_key.data())); | 72 const_cast<char*>(public_key.data())); |
| 79 key_data.len = public_key.size(); | 73 key_data.len = public_key.size(); |
| 80 | 74 |
| 81 CERTSubjectPublicKeyInfo* public_key_info = | 75 CERTSubjectPublicKeyInfo* public_key_info = |
| 82 SECKEY_DecodeDERSubjectPublicKeyInfo(&key_data); | 76 SECKEY_DecodeDERSubjectPublicKeyInfo(&key_data); |
| 83 if (!public_key_info) { | 77 if (!public_key_info) { |
| 84 DVLOG(1) << "Failed decoding public key."; | 78 DVLOG(1) << "Failed decoding public key."; |
| 85 return false; | 79 return false; |
| 86 } | 80 } |
| 87 | 81 |
| 88 public_key_ = SECKEY_ExtractPublicKey(public_key_info); | 82 public_key_ = SECKEY_ExtractPublicKey(public_key_info); |
| 89 SECKEY_DestroySubjectPublicKeyInfo(public_key_info); | 83 SECKEY_DestroySubjectPublicKeyInfo(public_key_info); |
| 90 | 84 |
| 91 if (!public_key_) { | 85 if (!public_key_) { |
| 92 DVLOG(1) << "Failed extracting public key."; | 86 DVLOG(1) << "Failed extracting public key."; |
| 93 return false; | 87 return false; |
| 94 } | 88 } |
| 95 | 89 |
| 96 key_id_ = crypto::SHA256HashString(public_key); | 90 key_id_ = crypto::SHA256HashString(public_key); |
| 97 description_ = description.as_string(); | |
| 98 | 91 |
| 99 // Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are | 92 // Right now, only RSASSA-PKCS1v15 with SHA-256 and ECDSA with SHA-256 are |
| 100 // supported. | 93 // supported. |
| 101 switch (SECKEY_GetPublicKeyType(public_key_)) { | 94 switch (SECKEY_GetPublicKeyType(public_key_)) { |
| 102 case rsaKey: | 95 case rsaKey: |
| 103 hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; | 96 hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; |
| 104 signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_RSA; | 97 signature_algorithm_ = ct::DigitallySigned::SIG_ALGO_RSA; |
| 105 break; | 98 break; |
| 106 case ecKey: | 99 case ecKey: |
| 107 hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; | 100 hash_algorithm_ = ct::DigitallySigned::HASH_ALGO_SHA256; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 133 SECStatus rv = VFY_VerifyDataDirect( | 126 SECStatus rv = VFY_VerifyDataDirect( |
| 134 reinterpret_cast<const unsigned char*>(data_to_sign.data()), | 127 reinterpret_cast<const unsigned char*>(data_to_sign.data()), |
| 135 data_to_sign.size(), public_key_, &sig_data, | 128 data_to_sign.size(), public_key_, &sig_data, |
| 136 GetNSSSigAlg(signature_algorithm_), GetNSSHashAlg(hash_algorithm_), | 129 GetNSSSigAlg(signature_algorithm_), GetNSSHashAlg(hash_algorithm_), |
| 137 NULL, NULL); | 130 NULL, NULL); |
| 138 DVLOG(1) << "Signature verification result: " << (rv == SECSuccess); | 131 DVLOG(1) << "Signature verification result: " << (rv == SECSuccess); |
| 139 return rv == SECSuccess; | 132 return rv == SECSuccess; |
| 140 } | 133 } |
| 141 | 134 |
| 142 } // namespace net | 135 } // namespace net |
| OLD | NEW |