RSA.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. /*
  2. * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/Debug.h>
  7. #include <AK/Random.h>
  8. #include <AK/ScopeGuard.h>
  9. #include <LibCrypto/ASN1/ASN1.h>
  10. #include <LibCrypto/ASN1/DER.h>
  11. #include <LibCrypto/ASN1/PEM.h>
  12. #include <LibCrypto/PK/RSA.h>
  13. namespace Crypto::PK {
  14. static constexpr Array<int, 7> pkcs8_rsa_key_oid { 1, 2, 840, 113549, 1, 1, 1 };
  15. RSA::KeyPairType RSA::parse_rsa_key(ReadonlyBytes der)
  16. {
  17. // we are going to assign to at least one of these
  18. KeyPairType keypair;
  19. ASN1::Decoder decoder(der);
  20. // There are four possible (supported) formats:
  21. // PKCS#1 private key
  22. // PKCS#1 public key
  23. // PKCS#8 private key
  24. // PKCS#8 public key
  25. // They're all a single sequence, so let's check that first
  26. {
  27. auto result = decoder.peek();
  28. if (result.is_error()) {
  29. // Bad data.
  30. dbgln_if(RSA_PARSE_DEBUG, "RSA key parse failed: {}", result.error());
  31. return keypair;
  32. }
  33. auto tag = result.value();
  34. if (tag.kind != ASN1::Kind::Sequence) {
  35. dbgln_if(RSA_PARSE_DEBUG, "RSA key parse failed: Expected a Sequence but got {}", ASN1::kind_name(tag.kind));
  36. return keypair;
  37. }
  38. }
  39. // Then enter the sequence
  40. {
  41. auto error = decoder.enter();
  42. if (error.is_error()) {
  43. // Something was weird with the input.
  44. dbgln_if(RSA_PARSE_DEBUG, "RSA key parse failed: {}", error.error());
  45. return keypair;
  46. }
  47. }
  48. bool has_read_error = false;
  49. auto const check_if_pkcs8_rsa_key = [&] {
  50. // see if it's a sequence:
  51. auto tag_result = decoder.peek();
  52. if (tag_result.is_error()) {
  53. // Decode error :shrug:
  54. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: {}", tag_result.error());
  55. return false;
  56. }
  57. auto tag = tag_result.value();
  58. if (tag.kind != ASN1::Kind::Sequence) {
  59. // We don't know what this is, but it sure isn't a PKCS#8 key.
  60. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: Expected a Sequence but got {}", ASN1::kind_name(tag.kind));
  61. return false;
  62. }
  63. // It's a sequence, now let's see if it's actually an RSA key.
  64. auto error = decoder.enter();
  65. if (error.is_error()) {
  66. // Shenanigans!
  67. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: {}", error.error());
  68. return false;
  69. }
  70. ScopeGuard leave { [&] {
  71. auto error = decoder.leave();
  72. if (error.is_error()) {
  73. dbgln_if(RSA_PARSE_DEBUG, "RSA key parse failed: {}", error.error());
  74. has_read_error = true;
  75. }
  76. } };
  77. // Now let's read the OID.
  78. auto oid_result = decoder.read<Vector<int>>();
  79. if (oid_result.is_error()) {
  80. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: {}", oid_result.error());
  81. return false;
  82. }
  83. auto oid = oid_result.release_value();
  84. // Now let's check that the OID matches "RSA key"
  85. if (oid != pkcs8_rsa_key_oid) {
  86. // Oh well. not an RSA key at all.
  87. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: Not an RSA key");
  88. return false;
  89. }
  90. return true;
  91. };
  92. auto integer_result = decoder.read<UnsignedBigInteger>();
  93. if (!integer_result.is_error()) {
  94. auto first_integer = integer_result.release_value();
  95. // It's either a PKCS#1 key, or a PKCS#8 private key.
  96. // Check for the PKCS#8 private key right away.
  97. if (check_if_pkcs8_rsa_key()) {
  98. if (has_read_error)
  99. return keypair;
  100. // Now read the private key, which is actually an octet string containing the PKCS#1 encoded private key.
  101. auto data_result = decoder.read<StringView>();
  102. if (data_result.is_error()) {
  103. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 private key parse failed: {}", data_result.error());
  104. return keypair;
  105. }
  106. return parse_rsa_key(data_result.value().bytes());
  107. }
  108. if (has_read_error)
  109. return keypair;
  110. // It's not a PKCS#8 key, so it's a PKCS#1 key (or something we don't support)
  111. // if the first integer is zero or one, it's a private key.
  112. if (first_integer == 0) {
  113. // This is a private key, parse the rest.
  114. auto modulus_result = decoder.read<UnsignedBigInteger>();
  115. if (modulus_result.is_error()) {
  116. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 private key parse failed: {}", modulus_result.error());
  117. return keypair;
  118. }
  119. auto modulus = modulus_result.release_value();
  120. auto public_exponent_result = decoder.read<UnsignedBigInteger>();
  121. if (public_exponent_result.is_error()) {
  122. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 private key parse failed: {}", public_exponent_result.error());
  123. return keypair;
  124. }
  125. auto public_exponent = public_exponent_result.release_value();
  126. auto private_exponent_result = decoder.read<UnsignedBigInteger>();
  127. if (private_exponent_result.is_error()) {
  128. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 private key parse failed: {}", private_exponent_result.error());
  129. return keypair;
  130. }
  131. auto private_exponent = private_exponent_result.release_value();
  132. // Drop the rest of the fields on the floor, we don't use them.
  133. // FIXME: Actually use them...
  134. keypair.private_key = { modulus, move(private_exponent), public_exponent };
  135. keypair.public_key = { move(modulus), move(public_exponent) };
  136. return keypair;
  137. } else if (first_integer == 1) {
  138. // This is a multi-prime key, we don't support that.
  139. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 private key parse failed: Multi-prime key not supported");
  140. return keypair;
  141. } else {
  142. auto&& modulus = move(first_integer);
  143. // Try reading a public key, `first_integer` is the modulus.
  144. auto public_exponent_result = decoder.read<UnsignedBigInteger>();
  145. if (public_exponent_result.is_error()) {
  146. // Bad public key.
  147. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 public key parse failed: {}", public_exponent_result.error());
  148. return keypair;
  149. }
  150. auto public_exponent = public_exponent_result.release_value();
  151. keypair.public_key.set(move(modulus), move(public_exponent));
  152. return keypair;
  153. }
  154. } else {
  155. // It wasn't a PKCS#1 key, let's try our luck with PKCS#8.
  156. if (!check_if_pkcs8_rsa_key())
  157. return keypair;
  158. if (has_read_error)
  159. return keypair;
  160. // Now we have a bit string, which contains the PKCS#1 encoded public key.
  161. auto data_result = decoder.read<BitmapView>();
  162. if (data_result.is_error()) {
  163. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#8 public key parse failed: {}", data_result.error());
  164. return keypair;
  165. }
  166. // Now just read it as a PKCS#1 DER.
  167. auto data = data_result.release_value();
  168. // FIXME: This is pretty awkward, maybe just generate a zero'd out ByteBuffer from the parser instead?
  169. auto padded_data_result = ByteBuffer::create_zeroed(data.size_in_bytes());
  170. if (padded_data_result.is_error()) {
  171. dbgln_if(RSA_PARSE_DEBUG, "RSA PKCS#1 key parse failed: Not enough memory");
  172. return keypair;
  173. }
  174. auto padded_data = padded_data_result.release_value();
  175. padded_data.overwrite(0, data.data(), data.size_in_bytes());
  176. return parse_rsa_key(padded_data.bytes());
  177. }
  178. }
  179. void RSA::encrypt(ReadonlyBytes in, Bytes& out)
  180. {
  181. dbgln_if(CRYPTO_DEBUG, "in size: {}", in.size());
  182. auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size());
  183. if (!(in_integer < m_public_key.modulus())) {
  184. dbgln("value too large for key");
  185. out = {};
  186. return;
  187. }
  188. auto exp = NumberTheory::ModularPower(in_integer, m_public_key.public_exponent(), m_public_key.modulus());
  189. auto size = exp.export_data(out);
  190. auto outsize = out.size();
  191. if (size != outsize) {
  192. dbgln("POSSIBLE RSA BUG!!! Size mismatch: {} requested but {} bytes generated", outsize, size);
  193. out = out.slice(outsize - size, size);
  194. }
  195. }
  196. void RSA::decrypt(ReadonlyBytes in, Bytes& out)
  197. {
  198. // FIXME: Actually use the private key properly
  199. auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size());
  200. auto exp = NumberTheory::ModularPower(in_integer, m_private_key.private_exponent(), m_private_key.modulus());
  201. auto size = exp.export_data(out);
  202. auto align = m_private_key.length();
  203. auto aligned_size = (size + align - 1) / align * align;
  204. for (auto i = size; i < aligned_size; ++i)
  205. out[out.size() - i - 1] = 0; // zero the non-aligned values
  206. out = out.slice(out.size() - aligned_size, aligned_size);
  207. }
  208. void RSA::sign(ReadonlyBytes in, Bytes& out)
  209. {
  210. auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size());
  211. auto exp = NumberTheory::ModularPower(in_integer, m_private_key.private_exponent(), m_private_key.modulus());
  212. auto size = exp.export_data(out);
  213. out = out.slice(out.size() - size, size);
  214. }
  215. void RSA::verify(ReadonlyBytes in, Bytes& out)
  216. {
  217. auto in_integer = UnsignedBigInteger::import_data(in.data(), in.size());
  218. auto exp = NumberTheory::ModularPower(in_integer, m_public_key.public_exponent(), m_public_key.modulus());
  219. auto size = exp.export_data(out);
  220. out = out.slice(out.size() - size, size);
  221. }
  222. void RSA::import_private_key(ReadonlyBytes bytes, bool pem)
  223. {
  224. ByteBuffer buffer;
  225. if (pem) {
  226. buffer = decode_pem(bytes);
  227. bytes = buffer;
  228. }
  229. auto key = parse_rsa_key(bytes);
  230. if (!key.private_key.length()) {
  231. dbgln("We expected to see a private key, but we found none");
  232. VERIFY_NOT_REACHED();
  233. }
  234. m_private_key = key.private_key;
  235. }
  236. void RSA::import_public_key(ReadonlyBytes bytes, bool pem)
  237. {
  238. ByteBuffer buffer;
  239. if (pem) {
  240. buffer = decode_pem(bytes);
  241. bytes = buffer;
  242. }
  243. auto key = parse_rsa_key(bytes);
  244. if (!key.public_key.length()) {
  245. dbgln("We expected to see a public key, but we found none");
  246. VERIFY_NOT_REACHED();
  247. }
  248. m_public_key = key.public_key;
  249. }
  250. template<typename HashFunction>
  251. void RSA_EMSA_PSS<HashFunction>::sign(ReadonlyBytes in, Bytes& out)
  252. {
  253. // -- encode via EMSA_PSS
  254. auto mod_bits = m_rsa.private_key().modulus().trimmed_length() * sizeof(u32) * 8;
  255. Vector<u8, 2048> EM;
  256. EM.resize(mod_bits);
  257. auto EM_buf = Bytes { EM };
  258. m_emsa_pss.encode(in, EM_buf, mod_bits - 1);
  259. // -- sign via RSA
  260. m_rsa.sign(EM_buf, out);
  261. }
  262. template<typename HashFunction>
  263. VerificationConsistency RSA_EMSA_PSS<HashFunction>::verify(ReadonlyBytes in)
  264. {
  265. auto mod_bytes = m_rsa.public_key().modulus().trimmed_length() * sizeof(u32);
  266. if (in.size() != mod_bytes)
  267. return VerificationConsistency::Inconsistent;
  268. Vector<u8, 256> EM;
  269. EM.resize(mod_bytes);
  270. auto EM_buf = Bytes { EM };
  271. // -- verify via RSA
  272. m_rsa.verify(in, EM_buf);
  273. // -- verify via EMSA_PSS
  274. return m_emsa_pss.verify(in, EM, mod_bytes * 8 - 1);
  275. }
  276. void RSA_PKCS1_EME::encrypt(ReadonlyBytes in, Bytes& out)
  277. {
  278. auto mod_len = (m_public_key.modulus().trimmed_length() * sizeof(u32) * 8 + 7) / 8;
  279. dbgln_if(CRYPTO_DEBUG, "key size: {}", mod_len);
  280. if (in.size() > mod_len - 11) {
  281. dbgln("message too long :(");
  282. out = out.trim(0);
  283. return;
  284. }
  285. if (out.size() < mod_len) {
  286. dbgln("output buffer too small");
  287. return;
  288. }
  289. auto ps_length = mod_len - in.size() - 3;
  290. Vector<u8, 8096> ps;
  291. ps.resize(ps_length);
  292. fill_with_random(ps);
  293. // since fill_with_random can create zeros (shocking!)
  294. // we have to go through and un-zero the zeros
  295. for (size_t i = 0; i < ps_length; ++i) {
  296. while (!ps[i])
  297. ps[i] = get_random<u8>();
  298. }
  299. u8 paddings[] { 0x00, 0x02 };
  300. out.overwrite(0, paddings, 2);
  301. out.overwrite(2, ps.data(), ps_length);
  302. out.overwrite(2 + ps_length, paddings, 1);
  303. out.overwrite(3 + ps_length, in.data(), in.size());
  304. out = out.trim(3 + ps_length + in.size()); // should be a single block
  305. dbgln_if(CRYPTO_DEBUG, "padded output size: {} buffer size: {}", 3 + ps_length + in.size(), out.size());
  306. RSA::encrypt(out, out);
  307. }
  308. void RSA_PKCS1_EME::decrypt(ReadonlyBytes in, Bytes& out)
  309. {
  310. auto mod_len = (m_public_key.modulus().trimmed_length() * sizeof(u32) * 8 + 7) / 8;
  311. if (in.size() != mod_len) {
  312. dbgln("decryption error: wrong amount of data: {}", in.size());
  313. out = out.trim(0);
  314. return;
  315. }
  316. RSA::decrypt(in, out);
  317. if (out.size() < RSA::output_size()) {
  318. dbgln("decryption error: not enough data after decryption: {}", out.size());
  319. out = out.trim(0);
  320. return;
  321. }
  322. if (out[0] != 0x00) {
  323. dbgln("invalid padding byte 0 : {}", out[0]);
  324. return;
  325. }
  326. if (out[1] != 0x02) {
  327. dbgln("invalid padding byte 1 : {}", out[1]);
  328. return;
  329. }
  330. size_t offset = 2;
  331. while (offset < out.size() && out[offset])
  332. ++offset;
  333. if (offset == out.size()) {
  334. dbgln("garbage data, no zero to split padding");
  335. return;
  336. }
  337. ++offset;
  338. if (offset - 3 < 8) {
  339. dbgln("PS too small");
  340. return;
  341. }
  342. out = out.slice(offset, out.size() - offset);
  343. }
  344. void RSA_PKCS1_EME::sign(ReadonlyBytes, Bytes&)
  345. {
  346. dbgln("FIXME: RSA_PKCS_EME::sign");
  347. }
  348. void RSA_PKCS1_EME::verify(ReadonlyBytes, Bytes&)
  349. {
  350. dbgln("FIXME: RSA_PKCS_EME::verify");
  351. }
  352. }