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/signature_verifier.h" | 5 #include "base/crypto/signature_verifier.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 | 8 |
9 #include "base/crypto/cssm_init.h" | 9 #include "base/crypto/cssm_init.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 | 11 |
12 namespace base { | 12 namespace base { |
13 | 13 |
14 SignatureVerifier::SignatureVerifier() : csp_handle_(0), sig_handle_(0) { | 14 SignatureVerifier::SignatureVerifier() : sig_handle_(0) { |
15 EnsureCSSMInit(); | 15 EnsureCSSMInit(); |
16 | |
17 static CSSM_VERSION version = {2, 0}; | |
18 CSSM_RETURN crtn; | |
19 crtn = CSSM_ModuleAttach(&gGuidAppleCSP, &version, &kCssmMemoryFunctions, 0, | |
20 CSSM_SERVICE_CSP, 0, CSSM_KEY_HIERARCHY_NONE, | |
21 NULL, 0, NULL, &csp_handle_); | |
22 DCHECK(crtn == CSSM_OK); | |
23 } | 16 } |
24 | 17 |
25 SignatureVerifier::~SignatureVerifier() { | 18 SignatureVerifier::~SignatureVerifier() { |
26 Reset(); | 19 Reset(); |
27 if (csp_handle_) { | |
28 CSSM_RETURN crtn = CSSM_ModuleDetach(csp_handle_); | |
29 DCHECK(crtn == CSSM_OK); | |
30 } | |
31 } | 20 } |
32 | 21 |
33 bool SignatureVerifier::VerifyInit(const uint8* signature_algorithm, | 22 bool SignatureVerifier::VerifyInit(const uint8* signature_algorithm, |
34 int signature_algorithm_len, | 23 int signature_algorithm_len, |
35 const uint8* signature, | 24 const uint8* signature, |
36 int signature_len, | 25 int signature_len, |
37 const uint8* public_key_info, | 26 const uint8* public_key_info, |
38 int public_key_info_len) { | 27 int public_key_info_len) { |
39 signature_.assign(signature, signature + signature_len); | 28 signature_.assign(signature, signature + signature_len); |
40 public_key_info_.assign(public_key_info, | 29 public_key_info_.assign(public_key_info, |
41 public_key_info + public_key_info_len); | 30 public_key_info + public_key_info_len); |
42 | 31 |
43 CSSM_ALGORITHMS key_alg = CSSM_ALGID_RSA; // TODO(wtc): hardcoded. | 32 CSSM_ALGORITHMS key_alg = CSSM_ALGID_RSA; // TODO(wtc): hardcoded. |
44 | 33 |
45 memset(&public_key_, 0, sizeof(public_key_)); | 34 memset(&public_key_, 0, sizeof(public_key_)); |
46 public_key_.KeyData.Data = const_cast<uint8*>(&public_key_info_[0]); | 35 public_key_.KeyData.Data = const_cast<uint8*>(&public_key_info_[0]); |
47 public_key_.KeyData.Length = public_key_info_.size(); | 36 public_key_.KeyData.Length = public_key_info_.size(); |
48 public_key_.KeyHeader.HeaderVersion = CSSM_KEYHEADER_VERSION; | 37 public_key_.KeyHeader.HeaderVersion = CSSM_KEYHEADER_VERSION; |
49 public_key_.KeyHeader.BlobType = CSSM_KEYBLOB_RAW; | 38 public_key_.KeyHeader.BlobType = CSSM_KEYBLOB_RAW; |
50 public_key_.KeyHeader.Format = CSSM_KEYBLOB_RAW_FORMAT_X509; | 39 public_key_.KeyHeader.Format = CSSM_KEYBLOB_RAW_FORMAT_X509; |
51 public_key_.KeyHeader.AlgorithmId = key_alg; | 40 public_key_.KeyHeader.AlgorithmId = key_alg; |
52 public_key_.KeyHeader.KeyClass = CSSM_KEYCLASS_PUBLIC_KEY; | 41 public_key_.KeyHeader.KeyClass = CSSM_KEYCLASS_PUBLIC_KEY; |
53 public_key_.KeyHeader.KeyAttr = CSSM_KEYATTR_EXTRACTABLE; | 42 public_key_.KeyHeader.KeyAttr = CSSM_KEYATTR_EXTRACTABLE; |
54 public_key_.KeyHeader.KeyUsage = CSSM_KEYUSE_VERIFY; | 43 public_key_.KeyHeader.KeyUsage = CSSM_KEYUSE_VERIFY; |
55 CSSM_KEY_SIZE key_size; | 44 CSSM_KEY_SIZE key_size; |
56 CSSM_RETURN crtn; | 45 CSSM_RETURN crtn; |
57 crtn = CSSM_QueryKeySizeInBits(csp_handle_, NULL, &public_key_, &key_size); | 46 crtn = CSSM_QueryKeySizeInBits(GetSharedCSPHandle(), NULL, |
| 47 &public_key_, &key_size); |
58 if (crtn) { | 48 if (crtn) { |
59 NOTREACHED() << "CSSM_QueryKeySizeInBits failed: " << crtn; | 49 NOTREACHED() << "CSSM_QueryKeySizeInBits failed: " << crtn; |
60 return false; | 50 return false; |
61 } | 51 } |
62 public_key_.KeyHeader.LogicalKeySizeInBits = key_size.LogicalKeySizeInBits; | 52 public_key_.KeyHeader.LogicalKeySizeInBits = key_size.LogicalKeySizeInBits; |
63 | 53 |
64 // TODO(wtc): decode signature_algorithm... | 54 // TODO(wtc): decode signature_algorithm... |
65 CSSM_ALGORITHMS sig_alg = CSSM_ALGID_SHA1WithRSA; | 55 CSSM_ALGORITHMS sig_alg = CSSM_ALGID_SHA1WithRSA; |
66 | 56 |
67 crtn = CSSM_CSP_CreateSignatureContext(csp_handle_, sig_alg, NULL, | 57 crtn = CSSM_CSP_CreateSignatureContext(GetSharedCSPHandle(), sig_alg, NULL, |
68 &public_key_, &sig_handle_); | 58 &public_key_, &sig_handle_); |
69 if (crtn) { | 59 if (crtn) { |
70 NOTREACHED(); | 60 NOTREACHED(); |
71 return false; | 61 return false; |
72 } | 62 } |
73 crtn = CSSM_VerifyDataInit(sig_handle_); | 63 crtn = CSSM_VerifyDataInit(sig_handle_); |
74 if (crtn) { | 64 if (crtn) { |
75 NOTREACHED(); | 65 NOTREACHED(); |
76 return false; | 66 return false; |
77 } | 67 } |
(...skipping 28 matching lines...) Expand all Loading... |
106 sig_handle_ = 0; | 96 sig_handle_ = 0; |
107 } | 97 } |
108 signature_.clear(); | 98 signature_.clear(); |
109 | 99 |
110 // Can't call CSSM_FreeKey on public_key_ because we constructed | 100 // Can't call CSSM_FreeKey on public_key_ because we constructed |
111 // public_key_ manually. | 101 // public_key_ manually. |
112 } | 102 } |
113 | 103 |
114 } // namespace base | 104 } // namespace base |
115 | 105 |
OLD | NEW |