Avi Drissman | 201a9a83 | 2022-09-13 19:39:25 | [diff] [blame] | 1 | // Copyright 2012 The Chromium Authors |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 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 | |||||
Hubert Chao | 7248d583 | 2021-07-21 16:33:26 | [diff] [blame] | 14 | #include "base/containers/span.h" |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 15 | #include "crypto/crypto_export.h" |
16 | |||||
17 | namespace crypto { | ||||
18 | |||||
19 | class ECPrivateKey; | ||||
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 20 | class ECSignatureCreator; |
21 | |||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 22 | // Signs data using a bare private key (as opposed to a full certificate). |
23 | // We need this class because SignatureCreator is hardcoded to use | ||||
24 | // RSAPrivateKey. | ||||
25 | class CRYPTO_EXPORT ECSignatureCreator { | ||||
26 | public: | ||||
[email protected] | 6b2e61f | 2012-02-28 08:06:54 | [diff] [blame] | 27 | virtual ~ECSignatureCreator() {} |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 28 | |
29 | // Create an instance. The caller must ensure that the provided PrivateKey | ||||
30 | // instance outlives the created ECSignatureCreator. | ||||
[email protected] | 7c3090a0 | 2012-09-19 15:11:33 | [diff] [blame] | 31 | // TODO(rch): This is currently hard coded to use SHA256. Ideally, we should |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 32 | // pass in the hash algorithm identifier. |
rsleevi | ffe5a13 | 2016-06-28 01:51:52 | [diff] [blame] | 33 | static std::unique_ptr<ECSignatureCreator> Create(ECPrivateKey* key); |
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 34 | |
Hubert Chao | 7248d583 | 2021-07-21 16:33:26 | [diff] [blame] | 35 | // Signs |data| and writes the results into |signature| as a DER encoded |
36 | // ECDSA-Sig-Value from RFC 3279. | ||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 37 | // |
38 | // ECDSA-Sig-Value ::= SEQUENCE { | ||||
39 | // r INTEGER, | ||||
40 | // s INTEGER } | ||||
Hubert Chao | 7248d583 | 2021-07-21 16:33:26 | [diff] [blame] | 41 | virtual bool Sign(base::span<const uint8_t> data, |
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame] | 42 | std::vector<uint8_t>* signature) = 0; |
[email protected] | 7c3090a0 | 2012-09-19 15:11:33 | [diff] [blame] | 43 | |
44 | // DecodeSignature converts from a DER encoded ECDSA-Sig-Value (as produced | ||||
45 | // by Sign) to a `raw' ECDSA signature which consists of a pair of | ||||
46 | // big-endian, zero-padded, 256-bit integers, r and s. On success it returns | ||||
47 | // true and puts the raw signature into |out_raw_sig|. | ||||
48 | // (Only P-256 signatures are supported.) | ||||
avi | dd373b8b | 2015-12-21 21:34:43 | [diff] [blame] | 49 | virtual bool DecodeSignature(const std::vector<uint8_t>& signature, |
50 | std::vector<uint8_t>* out_raw_sig) = 0; | ||||
[email protected] | e4c1847 | 2012-01-25 00:56:43 | [diff] [blame] | 51 | }; |
52 | |||||
53 | } // namespace crypto | ||||
54 | |||||
55 | #endif // CRYPTO_EC_SIGNATURE_CREATOR_H_ |