| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "base/crypto/rsa_private_key.h" | 5 #include "base/crypto/rsa_private_key.h" |
| 6 | 6 |
| 7 #include <iostream> | 7 #include <iostream> |
| 8 #include <list> | 8 #include <list> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 // static | 25 // static |
| 26 RSAPrivateKey* RSAPrivateKey::Create(uint16 num_bits) { | 26 RSAPrivateKey* RSAPrivateKey::Create(uint16 num_bits) { |
| 27 scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey); | 27 scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey); |
| 28 if (!result->InitProvider()) | 28 if (!result->InitProvider()) |
| 29 return NULL; | 29 return NULL; |
| 30 | 30 |
| 31 DWORD flags = CRYPT_EXPORTABLE; | 31 DWORD flags = CRYPT_EXPORTABLE; |
| 32 | 32 |
| 33 // The size is encoded as the upper 16 bits of the flags. :: sigh ::. | 33 // The size is encoded as the upper 16 bits of the flags. :: sigh ::. |
| 34 flags |= (num_bits << 16); | 34 flags |= (num_bits << 16); |
| 35 if (!CryptGenKey(result->provider_, CALG_RSA_SIGN, flags, &result->key_)) | 35 if (!CryptGenKey(result->provider_, CALG_RSA_SIGN, flags, |
| 36 result->key_.receive())) |
| 36 return NULL; | 37 return NULL; |
| 37 | 38 |
| 38 return result.release(); | 39 return result.release(); |
| 39 } | 40 } |
| 40 | 41 |
| 41 // static | 42 // static |
| 42 RSAPrivateKey* RSAPrivateKey::CreateFromPrivateKeyInfo( | 43 RSAPrivateKey* RSAPrivateKey::CreateFromPrivateKeyInfo( |
| 43 const std::vector<uint8>& input) { | 44 const std::vector<uint8>& input) { |
| 44 scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey); | 45 scoped_ptr<RSAPrivateKey> result(new RSAPrivateKey); |
| 45 if (!result->InitProvider()) | 46 if (!result->InitProvider()) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 dest += pki.exponent1()->size(); | 89 dest += pki.exponent1()->size(); |
| 89 memcpy(dest, &pki.exponent2()->front(), pki.exponent2()->size()); | 90 memcpy(dest, &pki.exponent2()->front(), pki.exponent2()->size()); |
| 90 dest += pki.exponent2()->size(); | 91 dest += pki.exponent2()->size(); |
| 91 memcpy(dest, &pki.coefficient()->front(), pki.coefficient()->size()); | 92 memcpy(dest, &pki.coefficient()->front(), pki.coefficient()->size()); |
| 92 dest += pki.coefficient()->size(); | 93 dest += pki.coefficient()->size(); |
| 93 memcpy(dest, &pki.private_exponent()->front(), pki.private_exponent()->size())
; | 94 memcpy(dest, &pki.private_exponent()->front(), pki.private_exponent()->size())
; |
| 94 dest += pki.private_exponent()->size(); | 95 dest += pki.private_exponent()->size(); |
| 95 | 96 |
| 96 READ_ASSERT(dest == blob.get() + blob_size); | 97 READ_ASSERT(dest == blob.get() + blob_size); |
| 97 if (!CryptImportKey( | 98 if (!CryptImportKey( |
| 98 result->provider_, reinterpret_cast<uint8*>(public_key_struc), blob_size, | 99 result->provider_, reinterpret_cast<uint8*>(public_key_struc), |
| 99 NULL, CRYPT_EXPORTABLE, &result->key_)) { | 100 blob_size, NULL, CRYPT_EXPORTABLE, result->key_.receive())) { |
| 100 return NULL; | 101 return NULL; |
| 101 } | 102 } |
| 102 | 103 |
| 103 return result.release(); | 104 return result.release(); |
| 104 } | 105 } |
| 105 | 106 |
| 106 RSAPrivateKey::RSAPrivateKey() : provider_(NULL), key_(NULL) {} | 107 RSAPrivateKey::RSAPrivateKey() : provider_(NULL), key_(NULL) {} |
| 107 | 108 |
| 108 RSAPrivateKey::~RSAPrivateKey() { | 109 RSAPrivateKey::~RSAPrivateKey() {} |
| 109 if (key_) { | |
| 110 if (!CryptDestroyKey(key_)) | |
| 111 NOTREACHED(); | |
| 112 } | |
| 113 | |
| 114 if (provider_) { | |
| 115 if (!CryptReleaseContext(provider_, 0)) | |
| 116 NOTREACHED(); | |
| 117 } | |
| 118 } | |
| 119 | 110 |
| 120 bool RSAPrivateKey::InitProvider() { | 111 bool RSAPrivateKey::InitProvider() { |
| 121 return FALSE != CryptAcquireContext(&provider_, NULL, NULL, | 112 return FALSE != CryptAcquireContext(provider_.receive(), NULL, NULL, |
| 122 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); | 113 PROV_RSA_FULL, CRYPT_VERIFYCONTEXT); |
| 123 } | 114 } |
| 124 | 115 |
| 125 bool RSAPrivateKey::ExportPrivateKey(std::vector<uint8>* output) { | 116 bool RSAPrivateKey::ExportPrivateKey(std::vector<uint8>* output) { |
| 126 // Export the key | 117 // Export the key |
| 127 DWORD blob_length = 0; | 118 DWORD blob_length = 0; |
| 128 if (!CryptExportKey(key_, NULL, PRIVATEKEYBLOB, 0, NULL, &blob_length)) { | 119 if (!CryptExportKey(key_, NULL, PRIVATEKEYBLOB, 0, NULL, &blob_length)) { |
| 129 NOTREACHED(); | 120 NOTREACHED(); |
| 130 return false; | 121 return false; |
| 131 } | 122 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 return false; | 202 return false; |
| 212 } | 203 } |
| 213 | 204 |
| 214 for (size_t i = 0; i < encoded_length; ++i) | 205 for (size_t i = 0; i < encoded_length; ++i) |
| 215 output->push_back(encoded[i]); | 206 output->push_back(encoded[i]); |
| 216 | 207 |
| 217 return true; | 208 return true; |
| 218 } | 209 } |
| 219 | 210 |
| 220 } // namespace base | 211 } // namespace base |
| OLD | NEW |