xref: /aosp_15_r20/external/cronet/crypto/signature_creator.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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