11145ef852a4e230e1f642eecd8de155f2b26bc53jkummerow@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved. 29e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Use of this source code is governed by a BSD-style license that can be 39e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// found in the LICENSE file. 49e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 59e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#ifndef CRYPTO_SIGNATURE_CREATOR_H_ 69e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#define CRYPTO_SIGNATURE_CREATOR_H_ 79e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 89e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include <vector> 99e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 109e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "build/build_config.h" 119e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "base/basictypes.h" 129e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#include "crypto/crypto_export.h" 139e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 149e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#if defined(USE_OPENSSL) 159e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Forward declaration for openssl/*.h 169e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgtypedef struct env_md_ctx_st EVP_MD_CTX; 179e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#elif defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 189e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Forward declaration. 199e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgstruct SGNContextStr; 209e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#endif 219e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 229e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgnamespace crypto { 239e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 249e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgclass RSAPrivateKey; 259e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 269e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Signs data using a bare private key (as opposed to a full certificate). 279e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org// Currently can only sign data using SHA-1 or SHA-256 with RSA PKCS#1v1.5. 289e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.orgclass CRYPTO_EXPORT SignatureCreator { 299e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org public: 309e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // The set of supported hash functions. Extend as required. 319e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org enum HashAlgorithm { 329e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org SHA1, 339e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org SHA256, 349e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org }; 359e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 369e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org ~SignatureCreator(); 379e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 389e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // Create an instance. The caller must ensure that the provided PrivateKey 399e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // instance outlives the created SignatureCreator. Uses the HashAlgorithm 409e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // specified. 419e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org static SignatureCreator* Create(RSAPrivateKey* key, HashAlgorithm hash_alg); 429e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 439e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 449e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // Signs the precomputed |hash_alg| digest |data| using private |key| as 459e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // specified in PKCS #1 v1.5. 469e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org static bool Sign(RSAPrivateKey* key, 479e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org HashAlgorithm hash_alg, 489e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org const uint8* data, 499e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org int data_len, 509e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org std::vector<uint8>* signature); 519e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 529e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // Update the signature with more data. 539e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org bool Update(const uint8* data_part, int data_part_len); 549e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 559e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // Finalize the signature. 569e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org bool Final(std::vector<uint8>* signature); 579e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 589e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org private: 599e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org // Private constructor. Use the Create() method instead. 609e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org SignatureCreator(); 619e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 629e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org RSAPrivateKey* key_; 639e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 649e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#if defined(USE_OPENSSL) 659e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org EVP_MD_CTX* sign_context_; 669e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#elif defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX) 679e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org SGNContextStr* sign_context_; 689e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#endif 699e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 709e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org DISALLOW_COPY_AND_ASSIGN(SignatureCreator); 719e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org}; 729e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 739e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org} // namespace crypto 749e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org 759e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org#endif // CRYPTO_SIGNATURE_CREATOR_H_ 769e3e0b618a14a05efd7d66f20bac4423dd3a1a2ffschneider@chromium.org