[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 1 | // Copyright (c) 2012 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 CRYPTO_EC_SIGNATURE_CREATOR_H_ | ||||
6 | #define CRYPTO_EC_SIGNATURE_CREATOR_H_ | ||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 7 | |
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame^] | 8 | #include <stdint.h> |
9 | |||||
[email protected] | 7c3090a0 | 2012-09-19 15:11:33 | [diff] [blame] | 10 | #include <string> |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 11 | #include <vector> |
12 | |||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 13 | #include "crypto/crypto_export.h" |
14 | |||||
15 | namespace crypto { | ||||
16 | |||||
17 | class ECPrivateKey; | ||||
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 18 | class ECSignatureCreator; |
19 | |||||
20 | class CRYPTO_EXPORT ECSignatureCreatorFactory { | ||||
21 | public: | ||||
22 | virtual ~ECSignatureCreatorFactory() {} | ||||
23 | |||||
24 | virtual ECSignatureCreator* Create(ECPrivateKey* key) = 0; | ||||
25 | }; | ||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 26 | |
27 | // Signs data using a bare private key (as opposed to a full certificate). | ||||
28 | // We need this class because SignatureCreator is hardcoded to use | ||||
29 | // RSAPrivateKey. | ||||
30 | class CRYPTO_EXPORT ECSignatureCreator { | ||||
31 | public: | ||||
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 32 | virtual ~ECSignatureCreator() {} |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 33 | |
34 | // Create an instance. The caller must ensure that the provided PrivateKey | ||||
35 | // instance outlives the created ECSignatureCreator. | ||||
[email protected] | 7c3090a0 | 2012-09-19 15:11:33 | [diff] [blame] | 36 | // TODO(rch): This is currently hard coded to use SHA256. Ideally, we should |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 37 | // pass in the hash algorithm identifier. |
38 | static ECSignatureCreator* Create(ECPrivateKey* key); | ||||
39 | |||||
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 40 | // Set a factory to make the Create function return non-standard |
41 | // ECSignatureCreator objects. Because the ECDSA algorithm involves | ||||
42 | // randomness, this is useful for higher-level tests that want to have | ||||
43 | // deterministic mocked output to compare. | ||||
44 | static void SetFactoryForTesting(ECSignatureCreatorFactory* factory); | ||||
45 | |||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 46 | // Signs |data_len| bytes from |data| and writes the results into |
47 | // |signature| as a DER encoded ECDSA-Sig-Value from RFC 3279. | ||||
48 | // | ||||
49 | // ECDSA-Sig-Value ::= SEQUENCE { | ||||
50 | // r INTEGER, | ||||
51 | // s INTEGER } | ||||
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame^] | 52 | virtual bool Sign(const uint8_t* data, |
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 53 | int data_len, |
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame^] | 54 | std::vector<uint8_t>* signature) = 0; |
[email protected] | 7c3090a0 | 2012-09-19 15:11:33 | [diff] [blame] | 55 | |
56 | // DecodeSignature converts from a DER encoded ECDSA-Sig-Value (as produced | ||||
57 | // by Sign) to a `raw' ECDSA signature which consists of a pair of | ||||
58 | // big-endian, zero-padded, 256-bit integers, r and s. On success it returns | ||||
59 | // true and puts the raw signature into |out_raw_sig|. | ||||
60 | // (Only P-256 signatures are supported.) | ||||
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame^] | 61 | virtual bool DecodeSignature(const std::vector<uint8_t>& signature, |
62 | std::vector<uint8_t>* out_raw_sig) = 0; | ||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 63 | }; |
64 | |||||
65 | } // namespace crypto | ||||
66 | |||||
67 | #endif // CRYPTO_EC_SIGNATURE_CREATOR_H_ |