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