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_SIGNATURE_CREATOR_H_ 6*6777b538SAndroid Build Coastguard Worker #define CRYPTO_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 <vector> 12*6777b538SAndroid Build Coastguard Worker 13*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 14*6777b538SAndroid Build Coastguard Worker #include "crypto/crypto_export.h" 15*6777b538SAndroid Build Coastguard Worker #include "third_party/boringssl/src/include/openssl/base.h" 16*6777b538SAndroid Build Coastguard Worker 17*6777b538SAndroid Build Coastguard Worker namespace crypto { 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Worker class RSAPrivateKey; 20*6777b538SAndroid Build Coastguard Worker 21*6777b538SAndroid Build Coastguard Worker // Signs data using a bare private key (as opposed to a full certificate). 22*6777b538SAndroid Build Coastguard Worker // Currently can only sign data using SHA-1 or SHA-256 with RSA PKCS#1v1.5. 23*6777b538SAndroid Build Coastguard Worker class CRYPTO_EXPORT SignatureCreator { 24*6777b538SAndroid Build Coastguard Worker public: 25*6777b538SAndroid Build Coastguard Worker // The set of supported hash functions. Extend as required. 26*6777b538SAndroid Build Coastguard Worker enum HashAlgorithm { 27*6777b538SAndroid Build Coastguard Worker SHA1, 28*6777b538SAndroid Build Coastguard Worker SHA256, 29*6777b538SAndroid Build Coastguard Worker }; 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker SignatureCreator(const SignatureCreator&) = delete; 32*6777b538SAndroid Build Coastguard Worker SignatureCreator& operator=(const SignatureCreator&) = delete; 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker ~SignatureCreator(); 35*6777b538SAndroid Build Coastguard Worker 36*6777b538SAndroid Build Coastguard Worker // Create an instance. The caller must ensure that the provided PrivateKey 37*6777b538SAndroid Build Coastguard Worker // instance outlives the created SignatureCreator. Uses the HashAlgorithm 38*6777b538SAndroid Build Coastguard Worker // specified. 39*6777b538SAndroid Build Coastguard Worker static std::unique_ptr<SignatureCreator> Create(RSAPrivateKey* key, 40*6777b538SAndroid Build Coastguard Worker HashAlgorithm hash_alg); 41*6777b538SAndroid Build Coastguard Worker 42*6777b538SAndroid Build Coastguard Worker // Signs the precomputed |hash_alg| digest |data| using private |key| as 43*6777b538SAndroid Build Coastguard Worker // specified in PKCS #1 v1.5. 44*6777b538SAndroid Build Coastguard Worker static bool Sign(RSAPrivateKey* key, 45*6777b538SAndroid Build Coastguard Worker HashAlgorithm hash_alg, 46*6777b538SAndroid Build Coastguard Worker const uint8_t* data, 47*6777b538SAndroid Build Coastguard Worker int data_len, 48*6777b538SAndroid Build Coastguard Worker std::vector<uint8_t>* signature); 49*6777b538SAndroid Build Coastguard Worker 50*6777b538SAndroid Build Coastguard Worker // Update the signature with more data. 51*6777b538SAndroid Build Coastguard Worker bool Update(const uint8_t* data_part, int data_part_len); 52*6777b538SAndroid Build Coastguard Worker 53*6777b538SAndroid Build Coastguard Worker // Finalize the signature. 54*6777b538SAndroid Build Coastguard Worker bool Final(std::vector<uint8_t>* signature); 55*6777b538SAndroid Build Coastguard Worker 56*6777b538SAndroid Build Coastguard Worker private: 57*6777b538SAndroid Build Coastguard Worker // Private constructor. Use the Create() method instead. 58*6777b538SAndroid Build Coastguard Worker SignatureCreator(); 59*6777b538SAndroid Build Coastguard Worker 60*6777b538SAndroid Build Coastguard Worker bssl::UniquePtr<EVP_MD_CTX> sign_context_; 61*6777b538SAndroid Build Coastguard Worker }; 62*6777b538SAndroid Build Coastguard Worker 63*6777b538SAndroid Build Coastguard Worker } // namespace crypto 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker #endif // CRYPTO_SIGNATURE_CREATOR_H_ 66