OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #ifndef BASE_CRYPTO_SIGNATURE_VERIFIER_H_ | |
6 #define BASE_CRYPTO_SIGNATURE_VERIFIER_H_ | |
7 #pragma once | |
8 | |
9 #include "build/build_config.h" | |
10 | |
11 #if defined(USE_NSS) | |
12 #include <cryptoht.h> | |
13 #elif defined(OS_MACOSX) | |
14 #include <Security/cssm.h> | |
15 #endif | |
16 | |
17 #include <vector> | |
18 | |
19 #include "base/base_api.h" | |
20 #include "base/basictypes.h" | |
21 | |
22 #if defined(OS_WIN) | |
23 #include "base/crypto/scoped_capi_types.h" | |
24 #endif | |
25 | |
26 namespace base { | |
27 | |
28 // The SignatureVerifier class verifies a signature using a bare public key | |
29 // (as opposed to a certificate). | |
30 class BASE_API SignatureVerifier { | |
31 public: | |
32 SignatureVerifier(); | |
33 ~SignatureVerifier(); | |
34 | |
35 // Streaming interface: | |
36 | |
37 // Initiates a signature verification operation. This should be followed | |
38 // by one or more VerifyUpdate calls and a VerifyFinal call. | |
39 // | |
40 // The signature algorithm is specified as a DER encoded ASN.1 | |
41 // AlgorithmIdentifier structure: | |
42 // AlgorithmIdentifier ::= SEQUENCE { | |
43 // algorithm OBJECT IDENTIFIER, | |
44 // parameters ANY DEFINED BY algorithm OPTIONAL } | |
45 // | |
46 // The signature is encoded according to the signature algorithm, but it | |
47 // must not be further encoded in an ASN.1 BIT STRING. | |
48 // Note: An RSA signatures is actually a big integer. It must be in the | |
49 // big-endian byte order. | |
50 // | |
51 // The public key is specified as a DER encoded ASN.1 SubjectPublicKeyInfo | |
52 // structure, which contains not only the public key but also its type | |
53 // (algorithm): | |
54 // SubjectPublicKeyInfo ::= SEQUENCE { | |
55 // algorithm AlgorithmIdentifier, | |
56 // subjectPublicKey BIT STRING } | |
57 bool VerifyInit(const uint8* signature_algorithm, | |
58 int signature_algorithm_len, | |
59 const uint8* signature, | |
60 int signature_len, | |
61 const uint8* public_key_info, | |
62 int public_key_info_len); | |
63 | |
64 // Feeds a piece of the data to the signature verifier. | |
65 void VerifyUpdate(const uint8* data_part, int data_part_len); | |
66 | |
67 // Concludes a signature verification operation. Returns true if the | |
68 // signature is valid. Returns false if the signature is invalid or an | |
69 // error occurred. | |
70 bool VerifyFinal(); | |
71 | |
72 // Note: we can provide a one-shot interface if there is interest: | |
73 // bool Verify(const uint8* data, | |
74 // int data_len, | |
75 // const uint8* signature_algorithm, | |
76 // int signature_algorithm_len, | |
77 // const uint8* signature, | |
78 // int signature_len, | |
79 // const uint8* public_key_info, | |
80 // int public_key_info_len); | |
81 | |
82 private: | |
83 void Reset(); | |
84 | |
85 std::vector<uint8> signature_; | |
86 | |
87 #if defined(USE_OPENSSL) | |
88 struct VerifyContext; | |
89 VerifyContext* verify_context_; | |
90 #elif defined(USE_NSS) | |
91 VFYContext* vfy_context_; | |
92 #elif defined(OS_MACOSX) | |
93 std::vector<uint8> public_key_info_; | |
94 | |
95 CSSM_CC_HANDLE sig_handle_; | |
96 | |
97 CSSM_KEY public_key_; | |
98 #elif defined(OS_WIN) | |
99 ScopedHCRYPTPROV provider_; | |
100 | |
101 ScopedHCRYPTHASH hash_object_; | |
102 | |
103 ScopedHCRYPTKEY public_key_; | |
104 #endif | |
105 }; | |
106 | |
107 } // namespace base | |
108 | |
109 #endif // BASE_CRYPTO_SIGNATURE_VERIFIER_H_ | |
OLD | NEW |