1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #ifndef CRYPTO_SIGNATURE_CREATOR_H_ 6*635a8641SAndroid Build Coastguard Worker #define CRYPTO_SIGNATURE_CREATOR_H_ 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard Worker #include <stdint.h> 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard Worker #include <memory> 11*635a8641SAndroid Build Coastguard Worker #include <vector> 12*635a8641SAndroid Build Coastguard Worker 13*635a8641SAndroid Build Coastguard Worker #include "base/macros.h" 14*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h" 15*635a8641SAndroid Build Coastguard Worker #include "crypto/crypto_export.h" 16*635a8641SAndroid Build Coastguard Worker 17*635a8641SAndroid Build Coastguard Worker // Forward declaration for openssl/*.h 18*635a8641SAndroid Build Coastguard Worker typedef struct env_md_ctx_st EVP_MD_CTX; 19*635a8641SAndroid Build Coastguard Worker 20*635a8641SAndroid Build Coastguard Worker namespace crypto { 21*635a8641SAndroid Build Coastguard Worker 22*635a8641SAndroid Build Coastguard Worker class RSAPrivateKey; 23*635a8641SAndroid Build Coastguard Worker 24*635a8641SAndroid Build Coastguard Worker // Signs data using a bare private key (as opposed to a full certificate). 25*635a8641SAndroid Build Coastguard Worker // Currently can only sign data using SHA-1 or SHA-256 with RSA PKCS#1v1.5. 26*635a8641SAndroid Build Coastguard Worker class CRYPTO_EXPORT SignatureCreator { 27*635a8641SAndroid Build Coastguard Worker public: 28*635a8641SAndroid Build Coastguard Worker // The set of supported hash functions. Extend as required. 29*635a8641SAndroid Build Coastguard Worker enum HashAlgorithm { 30*635a8641SAndroid Build Coastguard Worker SHA1, 31*635a8641SAndroid Build Coastguard Worker SHA256, 32*635a8641SAndroid Build Coastguard Worker }; 33*635a8641SAndroid Build Coastguard Worker 34*635a8641SAndroid Build Coastguard Worker ~SignatureCreator(); 35*635a8641SAndroid Build Coastguard Worker 36*635a8641SAndroid Build Coastguard Worker // Create an instance. The caller must ensure that the provided PrivateKey 37*635a8641SAndroid Build Coastguard Worker // instance outlives the created SignatureCreator. Uses the HashAlgorithm 38*635a8641SAndroid Build Coastguard Worker // specified. 39*635a8641SAndroid Build Coastguard Worker static std::unique_ptr<SignatureCreator> Create(RSAPrivateKey* key, 40*635a8641SAndroid Build Coastguard Worker HashAlgorithm hash_alg); 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard Worker // Signs the precomputed |hash_alg| digest |data| using private |key| as 43*635a8641SAndroid Build Coastguard Worker // specified in PKCS #1 v1.5. 44*635a8641SAndroid Build Coastguard Worker static bool Sign(RSAPrivateKey* key, 45*635a8641SAndroid Build Coastguard Worker HashAlgorithm hash_alg, 46*635a8641SAndroid Build Coastguard Worker const uint8_t* data, 47*635a8641SAndroid Build Coastguard Worker int data_len, 48*635a8641SAndroid Build Coastguard Worker std::vector<uint8_t>* signature); 49*635a8641SAndroid Build Coastguard Worker 50*635a8641SAndroid Build Coastguard Worker // Update the signature with more data. 51*635a8641SAndroid Build Coastguard Worker bool Update(const uint8_t* data_part, int data_part_len); 52*635a8641SAndroid Build Coastguard Worker 53*635a8641SAndroid Build Coastguard Worker // Finalize the signature. 54*635a8641SAndroid Build Coastguard Worker bool Final(std::vector<uint8_t>* signature); 55*635a8641SAndroid Build Coastguard Worker 56*635a8641SAndroid Build Coastguard Worker private: 57*635a8641SAndroid Build Coastguard Worker // Private constructor. Use the Create() method instead. 58*635a8641SAndroid Build Coastguard Worker SignatureCreator(); 59*635a8641SAndroid Build Coastguard Worker 60*635a8641SAndroid Build Coastguard Worker EVP_MD_CTX* sign_context_; 61*635a8641SAndroid Build Coastguard Worker 62*635a8641SAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(SignatureCreator); 63*635a8641SAndroid Build Coastguard Worker }; 64*635a8641SAndroid Build Coastguard Worker 65*635a8641SAndroid Build Coastguard Worker } // namespace crypto 66*635a8641SAndroid Build Coastguard Worker 67*635a8641SAndroid Build Coastguard Worker #endif // CRYPTO_SIGNATURE_CREATOR_H_ 68