RSA.h 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Span.h>
  9. #include <LibCrypto/ASN1/DER.h>
  10. #include <LibCrypto/BigInt/UnsignedBigInteger.h>
  11. #include <LibCrypto/NumberTheory/ModularFunctions.h>
  12. #include <LibCrypto/PK/PK.h>
  13. namespace Crypto::PK {
  14. template<typename Integer = UnsignedBigInteger>
  15. class RSAPublicKey {
  16. public:
  17. RSAPublicKey(Integer n, Integer e)
  18. : m_modulus(move(n))
  19. , m_public_exponent(move(e))
  20. , m_length(m_modulus.trimmed_length() * sizeof(u32))
  21. {
  22. }
  23. RSAPublicKey()
  24. : m_modulus(0)
  25. , m_public_exponent(0)
  26. {
  27. }
  28. Integer const& modulus() const { return m_modulus; }
  29. Integer const& public_exponent() const { return m_public_exponent; }
  30. size_t length() const { return m_length; }
  31. void set_length(size_t length) { m_length = length; }
  32. ErrorOr<ByteBuffer> export_as_der() const
  33. {
  34. ASN1::Encoder encoder;
  35. TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr<void> {
  36. TRY(encoder.write(m_modulus));
  37. TRY(encoder.write(m_public_exponent));
  38. return {};
  39. }));
  40. return encoder.finish();
  41. }
  42. void set(Integer n, Integer e)
  43. {
  44. m_modulus = move(n);
  45. m_public_exponent = move(e);
  46. m_length = (m_modulus.trimmed_length() * sizeof(u32));
  47. }
  48. private:
  49. Integer m_modulus;
  50. Integer m_public_exponent;
  51. size_t m_length { 0 };
  52. };
  53. template<typename Integer = UnsignedBigInteger>
  54. class RSAPrivateKey {
  55. public:
  56. RSAPrivateKey(Integer n, Integer d, Integer e, Integer p, Integer q)
  57. : m_modulus(move(n))
  58. , m_private_exponent(move(d))
  59. , m_public_exponent(move(e))
  60. , m_prime_1(move(p))
  61. , m_prime_2(move(q))
  62. , m_exponent_1(NumberTheory::Mod(m_private_exponent, m_prime_1.minus(1)))
  63. , m_exponent_2(NumberTheory::Mod(m_private_exponent, m_prime_2.minus(1)))
  64. , m_coefficient(NumberTheory::ModularInverse(m_prime_2, m_prime_1))
  65. , m_length(m_modulus.trimmed_length() * sizeof(u32))
  66. {
  67. }
  68. RSAPrivateKey(Integer n, Integer d, Integer e, Integer p, Integer q, Integer dp, Integer dq, Integer qinv)
  69. : m_modulus(move(n))
  70. , m_private_exponent(move(d))
  71. , m_public_exponent(move(e))
  72. , m_prime_1(move(p))
  73. , m_prime_2(move(q))
  74. , m_exponent_1(move(dp))
  75. , m_exponent_2(move(dq))
  76. , m_coefficient(move(qinv))
  77. , m_length(m_modulus.trimmed_length() * sizeof(u32))
  78. {
  79. }
  80. RSAPrivateKey() = default;
  81. Integer const& modulus() const { return m_modulus; }
  82. Integer const& private_exponent() const { return m_private_exponent; }
  83. Integer const& public_exponent() const { return m_public_exponent; }
  84. Integer const& prime1() const { return m_prime_1; }
  85. Integer const& prime2() const { return m_prime_2; }
  86. Integer const& exponent1() const { return m_exponent_1; }
  87. Integer const& exponent2() const { return m_exponent_2; }
  88. Integer const& coefficient() const { return m_coefficient; }
  89. size_t length() const { return m_length; }
  90. ErrorOr<ByteBuffer> export_as_der() const
  91. {
  92. ASN1::Encoder encoder;
  93. TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr<void> {
  94. TRY(encoder.write(0x00u)); // version
  95. TRY(encoder.write(m_modulus));
  96. TRY(encoder.write(m_public_exponent));
  97. TRY(encoder.write(m_private_exponent));
  98. TRY(encoder.write(m_prime_1));
  99. TRY(encoder.write(m_prime_2));
  100. TRY(encoder.write(m_exponent_1));
  101. TRY(encoder.write(m_exponent_2));
  102. TRY(encoder.write(m_coefficient));
  103. return {};
  104. }));
  105. return encoder.finish();
  106. }
  107. private:
  108. Integer m_modulus;
  109. Integer m_private_exponent;
  110. Integer m_public_exponent;
  111. Integer m_prime_1;
  112. Integer m_prime_2;
  113. Integer m_exponent_1; // d mod (p-1)
  114. Integer m_exponent_2; // d mod (q-1)
  115. Integer m_coefficient; // q^-1 mod p
  116. size_t m_length { 0 };
  117. };
  118. template<typename PubKey, typename PrivKey>
  119. struct RSAKeyPair {
  120. PubKey public_key;
  121. PrivKey private_key;
  122. };
  123. using IntegerType = UnsignedBigInteger;
  124. class RSA : public PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>> {
  125. public:
  126. using KeyPairType = RSAKeyPair<PublicKeyType, PrivateKeyType>;
  127. static KeyPairType parse_rsa_key(ReadonlyBytes der);
  128. static KeyPairType generate_key_pair(size_t bits = 256, IntegerType e = 65537)
  129. {
  130. IntegerType p;
  131. IntegerType q;
  132. IntegerType lambda;
  133. do {
  134. p = NumberTheory::random_big_prime(bits / 2);
  135. q = NumberTheory::random_big_prime(bits / 2);
  136. lambda = NumberTheory::LCM(p.minus(1), q.minus(1));
  137. dbgln("checking combination p={}, q={}, lambda={}", p, q, lambda.length());
  138. } while (!(NumberTheory::GCD(e, lambda) == 1));
  139. auto n = p.multiplied_by(q);
  140. auto d = NumberTheory::ModularInverse(e, lambda);
  141. dbgln("Your keys are Pub(n={}, e={}) and Priv(n={}, d={}, p={}, q={})", n, e, n, d, p, q);
  142. RSAKeyPair<PublicKeyType, PrivateKeyType> keys {
  143. { n, e },
  144. { n, d, e, p, q }
  145. };
  146. return keys;
  147. }
  148. RSA(IntegerType n, IntegerType d, IntegerType e)
  149. {
  150. m_public_key.set(n, e);
  151. m_private_key = { n, d, e, 0, 0, 0, 0, 0 };
  152. }
  153. RSA(PublicKeyType& pubkey, PrivateKeyType& privkey)
  154. : PKSystem<RSAPrivateKey<IntegerType>, RSAPublicKey<IntegerType>>(pubkey, privkey)
  155. {
  156. }
  157. RSA(ByteBuffer const& publicKeyPEM, ByteBuffer const& privateKeyPEM)
  158. {
  159. import_public_key(publicKeyPEM);
  160. import_private_key(privateKeyPEM);
  161. }
  162. RSA(StringView privKeyPEM)
  163. {
  164. import_private_key(privKeyPEM.bytes());
  165. m_public_key.set(m_private_key.modulus(), m_private_key.public_exponent());
  166. }
  167. // create our own keys
  168. RSA()
  169. {
  170. auto pair = generate_key_pair();
  171. m_public_key = pair.public_key;
  172. m_private_key = pair.private_key;
  173. }
  174. virtual void encrypt(ReadonlyBytes in, Bytes& out) override;
  175. virtual void decrypt(ReadonlyBytes in, Bytes& out) override;
  176. virtual void sign(ReadonlyBytes in, Bytes& out) override;
  177. virtual void verify(ReadonlyBytes in, Bytes& out) override;
  178. #ifndef KERNEL
  179. virtual ByteString class_name() const override
  180. {
  181. return "RSA";
  182. }
  183. #endif
  184. virtual size_t output_size() const override
  185. {
  186. return m_public_key.length();
  187. }
  188. void import_public_key(ReadonlyBytes, bool pem = true);
  189. void import_private_key(ReadonlyBytes, bool pem = true);
  190. PrivateKeyType const& private_key() const { return m_private_key; }
  191. PublicKeyType const& public_key() const { return m_public_key; }
  192. };
  193. class RSA_PKCS1_EME : public RSA {
  194. public:
  195. // forward all constructions to RSA
  196. template<typename... Args>
  197. RSA_PKCS1_EME(Args... args)
  198. : RSA(args...)
  199. {
  200. }
  201. ~RSA_PKCS1_EME() = default;
  202. virtual void encrypt(ReadonlyBytes in, Bytes& out) override;
  203. virtual void decrypt(ReadonlyBytes in, Bytes& out) override;
  204. virtual void sign(ReadonlyBytes, Bytes&) override;
  205. virtual void verify(ReadonlyBytes, Bytes&) override;
  206. #ifndef KERNEL
  207. virtual ByteString class_name() const override
  208. {
  209. return "RSA_PKCS1-EME";
  210. }
  211. #endif
  212. virtual size_t output_size() const override
  213. {
  214. return m_public_key.length();
  215. }
  216. };
  217. }