1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef CRYPTO_EC_SIGNATURE_CREATOR_H_ 6*6777b538SAndroid Build Coastguard Worker #define CRYPTO_EC_SIGNATURE_CREATOR_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <memory> 11*6777b538SAndroid Build Coastguard Worker #include <string> 12*6777b538SAndroid Build Coastguard Worker #include <vector> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 15*6777b538SAndroid Build Coastguard Worker #include "crypto/crypto_export.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace crypto { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker class ECPrivateKey; 20*6777b538SAndroid Build Coastguard Worker class ECSignatureCreator; 21*6777b538SAndroid Build Coastguard Worker 22*6777b538SAndroid Build Coastguard Worker // Signs data using a bare private key (as opposed to a full certificate). 23*6777b538SAndroid Build Coastguard Worker // We need this class because SignatureCreator is hardcoded to use 24*6777b538SAndroid Build Coastguard Worker // RSAPrivateKey. 25*6777b538SAndroid Build Coastguard Worker class CRYPTO_EXPORT ECSignatureCreator { 26*6777b538SAndroid Build Coastguard Worker public: ~ECSignatureCreator()27*6777b538SAndroid Build Coastguard Worker virtual ~ECSignatureCreator() {} 28*6777b538SAndroid Build Coastguard Worker 29*6777b538SAndroid Build Coastguard Worker // Create an instance. The caller must ensure that the provided PrivateKey 30*6777b538SAndroid Build Coastguard Worker // instance outlives the created ECSignatureCreator. 31*6777b538SAndroid Build Coastguard Worker // TODO(rch): This is currently hard coded to use SHA256. Ideally, we should 32*6777b538SAndroid Build Coastguard Worker // pass in the hash algorithm identifier. 33*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<ECSignatureCreator> Create(ECPrivateKey* key); 34*6777b538SAndroid Build Coastguard Worker 35*6777b538SAndroid Build Coastguard Worker // Signs |data| and writes the results into |signature| as a DER encoded 36*6777b538SAndroid Build Coastguard Worker // ECDSA-Sig-Value from RFC 3279. 37*6777b538SAndroid Build Coastguard Worker // 38*6777b538SAndroid Build Coastguard Worker // ECDSA-Sig-Value ::= SEQUENCE { 39*6777b538SAndroid Build Coastguard Worker // r INTEGER, 40*6777b538SAndroid Build Coastguard Worker // s INTEGER } 41*6777b538SAndroid Build Coastguard Worker virtual bool Sign(base::span<const uint8_t> data, 42*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t>* signature) = 0; 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // DecodeSignature converts from a DER encoded ECDSA-Sig-Value (as produced 45*6777b538SAndroid Build Coastguard Worker // by Sign) to a `raw' ECDSA signature which consists of a pair of 46*6777b538SAndroid Build Coastguard Worker // big-endian, zero-padded, 256-bit integers, r and s. On success it returns 47*6777b538SAndroid Build Coastguard Worker // true and puts the raw signature into |out_raw_sig|. 48*6777b538SAndroid Build Coastguard Worker // (Only P-256 signatures are supported.) 49*6777b538SAndroid Build Coastguard Worker virtual bool DecodeSignature(const std::vector<uint8_t>& signature, 50*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t>* out_raw_sig) = 0; 51*6777b538SAndroid Build Coastguard Worker }; 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker } // namespace crypto 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker #endif // CRYPTO_EC_SIGNATURE_CREATOR_H_ 56