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 #ifndef BASE_CRYPTO_RSA_PRIVATE_KEY_H_ | 5 #ifndef BASE_CRYPTO_RSA_PRIVATE_KEY_H_ |
6 #define BASE_CRYPTO_RSA_PRIVATE_KEY_H_ | 6 #define BASE_CRYPTO_RSA_PRIVATE_KEY_H_ |
7 | 7 |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 | 9 |
10 #if defined(USE_NSS) | 10 #if defined(USE_NSS) |
(...skipping 21 matching lines...) Expand all Loading... |
32 | 32 |
33 // ASN.1 encoding of the AlgorithmIdentifier from PKCS #8. | 33 // ASN.1 encoding of the AlgorithmIdentifier from PKCS #8. |
34 static const uint8 kRsaAlgorithmIdentifier[]; | 34 static const uint8 kRsaAlgorithmIdentifier[]; |
35 | 35 |
36 // ASN.1 tags for some types we use. | 36 // ASN.1 tags for some types we use. |
37 static const uint8 kBitStringTag = 0x03; | 37 static const uint8 kBitStringTag = 0x03; |
38 static const uint8 kIntegerTag = 0x02; | 38 static const uint8 kIntegerTag = 0x02; |
39 static const uint8 kNullTag = 0x05; | 39 static const uint8 kNullTag = 0x05; |
40 static const uint8 kOctetStringTag = 0x04; | 40 static const uint8 kOctetStringTag = 0x04; |
41 static const uint8 kSequenceTag = 0x30; | 41 static const uint8 kSequenceTag = 0x30; |
42 | 42 |
43 // |big_endian| here specifies the byte-significance of the integer components | 43 // |big_endian| here specifies the byte-significance of the integer components |
44 // that will be parsed & serialized (modulus(), etc...) during Import(), | 44 // that will be parsed & serialized (modulus(), etc...) during Import(), |
45 // Export() and ExportPublicKeyInfo() -- not the ASN.1 DER encoding of the | 45 // Export() and ExportPublicKeyInfo() -- not the ASN.1 DER encoding of the |
46 // PrivateKeyInfo/PublicKeyInfo (which is always big-endian). | 46 // PrivateKeyInfo/PublicKeyInfo (which is always big-endian). |
47 explicit PrivateKeyInfoCodec(bool big_endian) : big_endian_(big_endian) {} | 47 explicit PrivateKeyInfoCodec(bool big_endian) : big_endian_(big_endian) {} |
48 | 48 |
49 // Exports the contents of the integer components to the ASN.1 DER encoding | 49 // Exports the contents of the integer components to the ASN.1 DER encoding |
50 // of the PrivateKeyInfo structure to |output|. | 50 // of the PrivateKeyInfo structure to |output|. |
51 bool Export(std::vector<uint8>* output); | 51 bool Export(std::vector<uint8>* output); |
52 | 52 |
53 // Exports the contents of the integer components to the ASN.1 DER encoding | 53 // Exports the contents of the integer components to the ASN.1 DER encoding |
54 // of the PublicKeyInfo structure to |output|. | 54 // of the PublicKeyInfo structure to |output|. |
55 bool ExportPublicKeyInfo(std::vector<uint8>* output); | 55 bool ExportPublicKeyInfo(std::vector<uint8>* output); |
56 | 56 |
57 // Parses the ASN.1 DER encoding of the PrivateKeyInfo structure in |input| | 57 // Parses the ASN.1 DER encoding of the PrivateKeyInfo structure in |input| |
58 // and populates the integer components with |big_endian_| byte-significance. | 58 // and populates the integer components with |big_endian_| byte-significance. |
| 59 // IMPORTANT NOTE: This is currently *not* security-approved for importing |
| 60 // keys from unstrusted sources. |
59 bool Import(const std::vector<uint8>& input); | 61 bool Import(const std::vector<uint8>& input); |
60 | 62 |
61 // Accessors to the contents of the integer components of the PrivateKeyInfo | 63 // Accessors to the contents of the integer components of the PrivateKeyInfo |
62 // structure. | 64 // structure. |
63 std::vector<uint8>* modulus() { return &modulus_; }; | 65 std::vector<uint8>* modulus() { return &modulus_; }; |
64 std::vector<uint8>* public_exponent() { return &public_exponent_; }; | 66 std::vector<uint8>* public_exponent() { return &public_exponent_; }; |
65 std::vector<uint8>* private_exponent() { return &private_exponent_; }; | 67 std::vector<uint8>* private_exponent() { return &private_exponent_; }; |
66 std::vector<uint8>* prime1() { return &prime1_; }; | 68 std::vector<uint8>* prime1() { return &prime1_; }; |
67 std::vector<uint8>* prime2() { return &prime2_; }; | 69 std::vector<uint8>* prime2() { return &prime2_; }; |
68 std::vector<uint8>* exponent1() { return &exponent1_; }; | 70 std::vector<uint8>* exponent1() { return &exponent1_; }; |
69 std::vector<uint8>* exponent2() { return &exponent2_; }; | 71 std::vector<uint8>* exponent2() { return &exponent2_; }; |
70 std::vector<uint8>* coefficient() { return &coefficient_; }; | 72 std::vector<uint8>* coefficient() { return &coefficient_; }; |
71 | 73 |
72 private: | 74 private: |
73 // Utility wrappers for PrependIntegerImpl that use the class's |big_endian_| | 75 // Utility wrappers for PrependIntegerImpl that use the class's |big_endian_| |
74 // value. | 76 // value. |
75 void PrependInteger(const std::vector<uint8>& in, std::list<uint8>* out); | 77 void PrependInteger(const std::vector<uint8>& in, std::list<uint8>* out); |
76 void PrependInteger(uint8* val, int num_bytes, std::list<uint8>* data); | 78 void PrependInteger(uint8* val, int num_bytes, std::list<uint8>* data); |
77 | 79 |
78 // Prepends the integer stored in |val| - |val + num_bytes| with |big_endian| | 80 // Prepends the integer stored in |val| - |val + num_bytes| with |big_endian| |
79 // byte-significance into |data| as an ASN.1 integer. | 81 // byte-significance into |data| as an ASN.1 integer. |
80 void PrependIntegerImpl(uint8* val, | 82 void PrependIntegerImpl(uint8* val, |
81 int num_bytes, | 83 int num_bytes, |
82 std::list<uint8>* data, | 84 std::list<uint8>* data, |
83 bool big_endian); | 85 bool big_endian); |
84 | 86 |
85 // Utility wrappers for ReadIntegerImpl that use the class's |big_endian_| | 87 // Utility wrappers for ReadIntegerImpl that use the class's |big_endian_| |
86 // value. | 88 // value. |
87 bool ReadInteger(uint8** pos, uint8* end, std::vector<uint8>* out); | 89 bool ReadInteger(uint8** pos, uint8* end, std::vector<uint8>* out); |
88 bool ReadIntegerWithExpectedSize(uint8** pos, | 90 bool ReadIntegerWithExpectedSize(uint8** pos, |
89 uint8* end, | 91 uint8* end, |
90 size_t expected_size, | 92 size_t expected_size, |
91 std::vector<uint8>* out); | 93 std::vector<uint8>* out); |
92 | 94 |
93 // Reads an ASN.1 integer from |pos|, and stores the result into |out| with | 95 // Reads an ASN.1 integer from |pos|, and stores the result into |out| with |
94 // |big_endian| byte-significance. | 96 // |big_endian| byte-significance. |
95 bool ReadIntegerImpl(uint8** pos, | 97 bool ReadIntegerImpl(uint8** pos, |
96 uint8* end, | 98 uint8* end, |
97 std::vector<uint8>* out, | 99 std::vector<uint8>* out, |
98 bool big_endian); | 100 bool big_endian); |
99 | 101 |
100 // Prepends the integer stored in |val|, starting a index |start|, for | 102 // Prepends the integer stored in |val|, starting a index |start|, for |
101 // |num_bytes| bytes onto |data|. | 103 // |num_bytes| bytes onto |data|. |
102 void PrependBytes(uint8* val, | 104 void PrependBytes(uint8* val, |
103 int start, | 105 int start, |
104 int num_bytes, | 106 int num_bytes, |
105 std::list<uint8>* data); | 107 std::list<uint8>* data); |
106 | 108 |
107 // Helper to prepend an ASN.1 length field. | 109 // Helper to prepend an ASN.1 length field. |
108 void PrependLength(size_t size, std::list<uint8>* data); | 110 void PrependLength(size_t size, std::list<uint8>* data); |
109 | 111 |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 CSSM_KEY key_; | 201 CSSM_KEY key_; |
200 CSSM_CSP_HANDLE csp_handle_; | 202 CSSM_CSP_HANDLE csp_handle_; |
201 #endif | 203 #endif |
202 | 204 |
203 DISALLOW_COPY_AND_ASSIGN(RSAPrivateKey); | 205 DISALLOW_COPY_AND_ASSIGN(RSAPrivateKey); |
204 }; | 206 }; |
205 | 207 |
206 } // namespace base | 208 } // namespace base |
207 | 209 |
208 #endif // BASE_CRYPTO_RSA_PRIVATE_KEY_H_ | 210 #endif // BASE_CRYPTO_RSA_PRIVATE_KEY_H_ |
OLD | NEW |