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_SIGNATURE_CREATOR_H_ 6#define CRYPTO_SIGNATURE_CREATOR_H_ 7 8#include <vector> 9 10#include "build/build_config.h" 11#include "base/basictypes.h" 12#include "crypto/crypto_export.h" 13 14#if defined(USE_OPENSSL) 15// Forward declaration for openssl/*.h 16typedef struct env_md_ctx_st EVP_MD_CTX; 17#elif defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 18// Forward declaration. 19struct SGNContextStr; 20#endif 21 22namespace crypto { 23 24class RSAPrivateKey; 25 26// Signs data using a bare private key (as opposed to a full certificate). 27// Currently can only sign data using SHA-1 or SHA-256 with RSA PKCS#1v1.5. 28class CRYPTO_EXPORT SignatureCreator { 29 public: 30 // The set of supported hash functions. Extend as required. 31 enum HashAlgorithm { 32 SHA1, 33 SHA256, 34 }; 35 36 ~SignatureCreator(); 37 38 // Create an instance. The caller must ensure that the provided PrivateKey 39 // instance outlives the created SignatureCreator. Uses the HashAlgorithm 40 // specified. 41 static SignatureCreator* Create(RSAPrivateKey* key, HashAlgorithm hash_alg); 42 43 44 // Signs the precomputed |hash_alg| digest |data| using private |key| as 45 // specified in PKCS #1 v1.5. 46 static bool Sign(RSAPrivateKey* key, 47 HashAlgorithm hash_alg, 48 const uint8* data, 49 int data_len, 50 std::vector<uint8>* signature); 51 52 // Update the signature with more data. 53 bool Update(const uint8* data_part, int data_part_len); 54 55 // Finalize the signature. 56 bool Final(std::vector<uint8>* signature); 57 58 private: 59 // Private constructor. Use the Create() method instead. 60 SignatureCreator(); 61 62 RSAPrivateKey* key_; 63 64#if defined(USE_OPENSSL) 65 EVP_MD_CTX* sign_context_; 66#elif defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 67 SGNContextStr* sign_context_; 68#endif 69 70 DISALLOW_COPY_AND_ASSIGN(SignatureCreator); 71}; 72 73} // namespace crypto 74 75#endif // CRYPTO_SIGNATURE_CREATOR_H_ 76