Botan  2.12.1
Crypto and TLS for C++11
rsa.h
Go to the documentation of this file.
1 /*
2 * RSA
3 * (C) 1999-2008,2016 Jack Lloyd
4 *
5 * Botan is released under the Simplified BSD License (see license.txt)
6 */
7 
8 #ifndef BOTAN_RSA_H_
9 #define BOTAN_RSA_H_
10 
11 #include <botan/pk_keys.h>
12 #include <botan/bigint.h>
13 #include <string>
14 #include <memory>
15 #include <vector>
16 
17 namespace Botan {
18 
19 class RSA_Public_Data;
20 class RSA_Private_Data;
21 
22 /**
23 * RSA Public Key
24 */
25 class BOTAN_PUBLIC_API(2,0) RSA_PublicKey : public virtual Public_Key
26  {
27  public:
28  /**
29  * Load a public key.
30  * @param alg_id the X.509 algorithm identifier
31  * @param key_bits DER encoded public key bits
32  */
33  RSA_PublicKey(const AlgorithmIdentifier& alg_id,
34  const std::vector<uint8_t>& key_bits);
35 
36  /**
37  * Create a public key.
38  * @arg n the modulus
39  * @arg e the exponent
40  */
41  RSA_PublicKey(const BigInt& n, const BigInt& e);
42 
43  std::string algo_name() const override { return "RSA"; }
44 
45  bool check_key(RandomNumberGenerator& rng, bool) const override;
46 
47  AlgorithmIdentifier algorithm_identifier() const override;
48 
49  std::vector<uint8_t> public_key_bits() const override;
50 
51  /**
52  * @return public modulus
53  */
54  const BigInt& get_n() const;
55 
56  /**
57  * @return public exponent
58  */
59  const BigInt& get_e() const;
60 
61  size_t key_length() const override;
62  size_t estimated_strength() const override;
63 
64  // internal functions:
65  std::shared_ptr<const RSA_Public_Data> public_data() const;
66 
67  std::unique_ptr<PK_Ops::Encryption>
68  create_encryption_op(RandomNumberGenerator& rng,
69  const std::string& params,
70  const std::string& provider) const override;
71 
72  std::unique_ptr<PK_Ops::KEM_Encryption>
73  create_kem_encryption_op(RandomNumberGenerator& rng,
74  const std::string& params,
75  const std::string& provider) const override;
76 
77  std::unique_ptr<PK_Ops::Verification>
78  create_verification_op(const std::string& params,
79  const std::string& provider) const override;
80 
81  protected:
82  RSA_PublicKey() = default;
83 
84  void init(BigInt&& n, BigInt&& e);
85 
86  std::shared_ptr<const RSA_Public_Data> m_public;
87  };
88 
89 /**
90 * RSA Private Key
91 */
93  {
94  public:
95  /**
96  * Load a private key.
97  * @param alg_id the X.509 algorithm identifier
98  * @param key_bits PKCS#1 RSAPrivateKey bits
99  */
100  RSA_PrivateKey(const AlgorithmIdentifier& alg_id,
101  const secure_vector<uint8_t>& key_bits);
102 
103  /**
104  * Construct a private key from the specified parameters.
105  * @param p the first prime
106  * @param q the second prime
107  * @param e the exponent
108  * @param d if specified, this has to be d with
109  * exp * d = 1 mod (p - 1, q - 1). Leave it as 0 if you wish to
110  * the constructor to calculate it.
111  * @param n if specified, this must be n = p * q. Leave it as 0
112  * if you wish to the constructor to calculate it.
113  */
114  RSA_PrivateKey(const BigInt& p, const BigInt& q,
115  const BigInt& e, const BigInt& d = 0,
116  const BigInt& n = 0);
117 
118  /**
119  * Create a new private key with the specified bit length
120  * @param rng the random number generator to use
121  * @param bits the desired bit length of the private key
122  * @param exp the public exponent to be used
123  */
125  size_t bits, size_t exp = 65537);
126 
127  bool check_key(RandomNumberGenerator& rng, bool) const override;
128 
129  /**
130  * Get the first prime p.
131  * @return prime p
132  */
133  const BigInt& get_p() const;
134 
135  /**
136  * Get the second prime q.
137  * @return prime q
138  */
139  const BigInt& get_q() const;
140 
141  /**
142  * Get d with exp * d = 1 mod (p - 1, q - 1).
143  * @return d
144  */
145  const BigInt& get_d() const;
146 
147  const BigInt& get_c() const;
148  const BigInt& get_d1() const;
149  const BigInt& get_d2() const;
150 
151  secure_vector<uint8_t> private_key_bits() const override;
152 
153  // internal functions:
154  std::shared_ptr<const RSA_Private_Data> private_data() const;
155 
156  std::unique_ptr<PK_Ops::Decryption>
157  create_decryption_op(RandomNumberGenerator& rng,
158  const std::string& params,
159  const std::string& provider) const override;
160 
161  std::unique_ptr<PK_Ops::KEM_Decryption>
162  create_kem_decryption_op(RandomNumberGenerator& rng,
163  const std::string& params,
164  const std::string& provider) const override;
165 
166  std::unique_ptr<PK_Ops::Signature>
167  create_signature_op(RandomNumberGenerator& rng,
168  const std::string& params,
169  const std::string& provider) const override;
170 
171  private:
172 
173  void init(BigInt&& d, BigInt&& p, BigInt&& q, BigInt&& d1, BigInt&& d2, BigInt&& c);
174 
175  std::shared_ptr<const RSA_Private_Data> m_private;
176  };
177 
178 }
179 
180 #endif
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
Definition: compiler.h:31
std::string algo_name() const override
Definition: rsa.h:43
Definition: alg_id.cpp:13
int(* init)(CTX *)
std::shared_ptr< const RSA_Public_Data > m_public
Definition: rsa.h:86
std::vector< T, secure_allocator< T > > secure_vector
Definition: secmem.h:65