TestRSA.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. /*
  2. * Copyright (c) 2021, Peter Bocan <me@pbocan.net>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibCrypto/ASN1/PEM.h>
  7. #include <LibCrypto/Certificate/Certificate.h>
  8. #include <LibCrypto/Hash/SHA2.h>
  9. #include <LibCrypto/PK/PK.h>
  10. #include <LibCrypto/PK/RSA.h>
  11. #include <LibTest/TestCase.h>
  12. #include <cstring>
  13. static ByteBuffer operator""_b(char const* string, size_t length)
  14. {
  15. return ByteBuffer::copy(string, length).release_value();
  16. }
  17. TEST_CASE(test_RSA_raw_encrypt)
  18. {
  19. ByteBuffer data { "hellohellohellohellohellohellohellohellohellohellohellohello123-"_b };
  20. u8 result[] { 0x6f, 0x7b, 0xe2, 0xd3, 0x95, 0xf8, 0x8d, 0x87, 0x6d, 0x10, 0x5e, 0xc3, 0xcd, 0xf7, 0xbb, 0xa6, 0x62, 0x8e, 0x45, 0xa0, 0xf1, 0xe5, 0x0f, 0xdf, 0x69, 0xcb, 0xb6, 0xd5, 0x42, 0x06, 0x7d, 0x72, 0xa9, 0x5e, 0xae, 0xbf, 0xbf, 0x0f, 0xe0, 0xeb, 0x31, 0x31, 0xca, 0x8a, 0x81, 0x1e, 0xb9, 0xec, 0x6d, 0xcc, 0xb8, 0xa4, 0xac, 0xa3, 0x31, 0x05, 0xa9, 0xac, 0xc9, 0xd3, 0xe6, 0x2a, 0x18, 0xfe };
  21. Crypto::PK::RSA rsa(Crypto::PK::RSAPublicKey<> {
  22. "8126832723025844890518845777858816391166654950553329127845898924164623511718747856014227624997335860970996746552094406240834082304784428582653994490504519"_bigint,
  23. "65537"_bigint,
  24. });
  25. u8 buffer[rsa.output_size()];
  26. auto buf = Bytes { buffer, sizeof(buffer) };
  27. rsa.encrypt(data, buf);
  28. EXPECT(memcmp(result, buf.data(), buf.size()) == 0);
  29. }
  30. // RSA PKCS #1 1.5
  31. TEST_CASE(test_RSA_PKCS_1_encrypt)
  32. {
  33. ByteBuffer data { "hellohellohellohellohellohellohellohellohello123-"_b };
  34. Crypto::PK::RSA_PKCS1_EME rsa(Crypto::PK::RSA::generate_key_pair(1024));
  35. u8 buffer[rsa.output_size()];
  36. auto buf = Bytes { buffer, sizeof(buffer) };
  37. rsa.encrypt(data, buf);
  38. rsa.decrypt(buf, buf);
  39. EXPECT(memcmp(buf.data(), "hellohellohellohellohellohellohellohellohello123-", 49) == 0);
  40. }
  41. // RSA | ASN1 PKCS1 DER / PEM encoded Key import
  42. TEST_CASE(test_RSA_ASN1_PKCS1_DER_PEM_parse)
  43. {
  44. auto privkey = R"(-----BEGIN RSA PRIVATE KEY-----
  45. MIIBOgIBAAJBAJsrIYHxs1YL9tpfodaWs1lJoMdF4kgFisUFSj6nvBhJUlmBh607AlgTaX0E
  46. DGPYycXYGZ2n6rqmms5lpDXBpUcCAwEAAQJAUNpPkmtEHDENxsoQBUXvXDYeXdePSiIBJhpU
  47. joNOYoR5R9z5oX2cpcyykQ58FC2vKKg+x8N6xczG7qO95tw5UQIhAN354CP/FA+uTeJ6KJ+i
  48. zCBCl58CjNCzO0s5HTc56el5AiEAsvPKXo5/9gS/S4UzDRP6abq7GreixTfjR8LXidk3FL8C
  49. IQCTjYI861Y+hjMnlORkGSdvWlTHUj6gjEOh4TlWeJzQoQIgAxMZOQKtxCZUuxFwzRq4xLRG
  50. nrDlBQpuxz7bwSyQO7UCIHrYMnDohgNbwtA5ZpW3H1cKKQQvueWm6sxW9P5sUrZ3
  51. -----END RSA PRIVATE KEY-----)"sv;
  52. Crypto::PK::RSA rsa(privkey);
  53. if (rsa.public_key().public_exponent() != 65537) {
  54. FAIL("Invalid public exponent");
  55. }
  56. if (rsa.private_key().private_exponent() != "4234603516465654167360850580101327813936403862038934287300450163438938741499875303761385527882335478349599685406941909381269804396099893549838642251053393"_bigint) {
  57. FAIL("Invalid private exponent");
  58. }
  59. }
  60. // RSA | ASN1 PKCS8 DER / PEM encoded Key import
  61. TEST_CASE(test_RSA_ASN1_PKCS8_DER_PEM_parse)
  62. {
  63. auto privkey = R"(-----BEGIN PRIVATE KEY-----
  64. MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7ZBYaG9+CcJP7
  65. WVFJRI/uw3hljc7WpzeYs8MN82/g9CG1gnEF3P3ZSBdWVr8gnbh05EsSGHKghIce
  66. CB7DNrM5Ab0ru04CuODdPx56xCj+4MmzTc/aq79ntmOt131NGHgq9yVwfJqnSpyl
  67. OoVw7j/Wg4ciwPDQaeLmD1BsE/W9UsF1km7DWasBpW5br82DpudKgJq2Ixf52+rY
  68. TCkMgyWcetx4MfXll4y5ZVtJXCnHJfkCS64EaCqXmClP4ovOuHH4khJ3rW9j4yuL
  69. e5ck3PSXOrtOTR43HZkCXzseCkbW7qKSmk/9ZreImOzOgu8vvw7ewLAQR9qYVS6X
  70. PXY8IilDAgMBAAECggEBAIV3ld5mt90Z/exqA2Fh+fofMyNxyz5Lv2d9sZHAL5FT
  71. kKbND18TtaIKnMSb6Gl8rKJk76slyo7Vlb8oHXEBBsm1mV0KfVenAlHS4QyjpmdT
  72. B5Yz97VR2nQuDfUFpHNC2GQRv5LMzQIWPFfaxKxYpRNOfvOb5Gks4bTmd2tjFAYR
  73. MCbHgPw1liKA9dYKk4NB0301EY05e4Zz8RjqYHkkmOPD7DnjFbHqcFUjVKK5E3vD
  74. WjxNXUbiSudCCN7WLEOyeHZNd+l6kSAVxZuCAp0G3Da5ndXgIStcy4hYi/fL3XQQ
  75. bNpxjfhsjlD3tdHNr3NNYDAqxcxpsyO1NCpCIW3ZVrECgYEA7l6gTZ3e9AiSNlMd
  76. 2O2vNnbQ6UZfsEfu2y7HmpCuNJkFkAnM/1h72Krejnn31rRuR6uCFn4YgQUN9Eq0
  77. E1PJCtTay2ucZw5rqtkewT9QzXvVD9eiGM+MF89UzSCC+dOW0/odkD+xP2evnPvG
  78. PbXztnuERC1pi0YWLj1YcsfsEX0CgYEAyUA2UtYjnvCcteIy+rURT0aoZ9tDMrG+
  79. Es42EURVv1sduVdUst5R+bXx1aDzpCkcdni3TyxeosvTGAZngI3O8ghh1GV7NPZR
  80. nkiPXjMnhL0Zf+X9gCA6TFANfPuWhMSGijYsCd46diKGDReGYUnmcN9XopeG1h6i
  81. 3JiOuVPAIb8CgYBmIcUtfGb6yHFdNV+kgrJ/84ivaqe1MBz3bKO5ZiQ+BRKNFKXx
  82. AkiOHSgeg8PdCpH1w1aJrJ1zKmdANIHThiKtsWXNot3wig03tq+mvSox4Mz5bLrX
  83. RpYP3ZXIDhYQVMhbKt9f3upi8FoeOQJHjp5Nob6aN5rxQaZfSYmMJHzRQQKBgQCO
  84. ALwUGTtLNBYvlKtKEadkG8RKfAFfbOFkXZLy/hfPDRjdJY0DJTIMk+BPT+F6rPOD
  85. eMxHllQ0ZMPPiP1RTT5/s4BsISsdhMy0dhiLbGbvF4s9nugPly3rmPTbgp6DkjQo
  86. o+7RC7iOkO+rnzTXwxBSBpXMiUTAIx/hrdfPVxQT+wKBgCh7N3OLIOH6EWcW1fif
  87. UoENh8rkt/kzm89G1JLwBhuBIBPXUEZt2dS/xSUempqVqFGONpP87gvqxkMTtgCA
  88. 73KXn/cxHWM2kmXyHA3kQlOYw6WHjpldQAxLE+TRHXO2JUtZ09Mu4rVXX7lmwbTm
  89. l3vmuDEF3/Bo1C1HTg0xRV/l
  90. -----END PRIVATE KEY-----)"sv;
  91. Crypto::PK::RSA rsa(privkey);
  92. if (rsa.public_key().public_exponent() != 65537) {
  93. FAIL("Invalid public exponent");
  94. }
  95. if (rsa.private_key().private_exponent() != "16848664331299797559656678180469464902267415922431923391961407795209879741791261105581093539484181644099608161661780611501562625272630894063592208758992911105496755004417051031019663332258403844985328863382168329621318366311519850803972480500782200178279692319955495383119697563295214236936264406600739633470565823022975212999060908747002623721589308539473108154612454595201561671949550531384574873324370774408913092560971930541734744950937900805812300970883306404011323308000168926094053141613790857814489531436452649384151085451448183385611208320292948291211969430321231180227006521681776197974694030147965578466993"_bigint) {
  96. FAIL("Invalid private exponent");
  97. }
  98. }
  99. TEST_CASE(test_RSA_keygen_enc)
  100. {
  101. auto keypem = R"(-----BEGIN PRIVATE KEY-----
  102. MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA5HMXMnY+RhEcYXsa
  103. OyB/YkcrO1nxIeyDCMqwg5MDrSXO8vPXSEb9AZUNMF1jKiFWPoHxZ+foRxrLv4d9
  104. sV/ETwIDAQABAkBpC37UJkjWQRHyxP83xuasExuO6/mT5sQN692kcppTJ9wHNWoD
  105. 9ZcREk4GGiklu4qx48/fYt8Cv6z6JuQ0ZQExAiEA9XRZVUnCJ2xOcCFCbyIF+d3F
  106. 9Kht5rR77F9KsRlgUbkCIQDuQ7YzLpQ8V8BJwKbDeXw1vQvcPEnyKnTOoALpF6bq
  107. RwIhAIDSm8Ajgf7m3RQEoLVrCe/l8WtCqsuWliOsr6rbQq4hAiEAx8R16wvOtZlN
  108. W4jvSU1+WwAaBZl21lfKf8OhLRXrmNkCIG9IRdcSiNR/Ut8QfD3N9Bb1HsUm+Bvz
  109. c8yGzl89pYST
  110. -----END PRIVATE KEY-----
  111. )"sv;
  112. auto decoded = Crypto::decode_pem(keypem.bytes());
  113. EXPECT_EQ(decoded.type, Crypto::PEMType::PrivateKey);
  114. auto decoder = Crypto::ASN1::Decoder { decoded.data };
  115. auto priv_key_info = MUST(Crypto::Certificate::parse_private_key_info(decoder, {}));
  116. auto keypair = MUST(Crypto::PK::RSA::parse_rsa_key(priv_key_info.raw_key, true, {}));
  117. auto priv_der = MUST(priv_key_info.rsa.export_as_der());
  118. auto rsa_encryption_oid = Array<int, 7> { 1, 2, 840, 113549, 1, 1, 1 };
  119. auto wrapped_priv_der = MUST(Crypto::PK::wrap_in_private_key_info(priv_key_info.raw_key, rsa_encryption_oid, nullptr));
  120. auto priv_pem = MUST(Crypto::encode_pem(wrapped_priv_der, Crypto::PEMType::PrivateKey));
  121. auto rsa_from_pair = Crypto::PK::RSA(keypair.public_key, keypair.private_key);
  122. auto rsa_from_pem = Crypto::PK::RSA(priv_pem);
  123. EXPECT_EQ(keypem, StringView(priv_pem));
  124. u8 enc_buffer[rsa_from_pair.output_size()];
  125. u8 dec_buffer[rsa_from_pair.output_size()];
  126. auto enc = Bytes { enc_buffer, rsa_from_pair.output_size() };
  127. auto dec = Bytes { dec_buffer, rsa_from_pair.output_size() };
  128. dec.overwrite(0, "WellHelloFriends", 16);
  129. rsa_from_pair.encrypt(dec, enc);
  130. rsa_from_pem.decrypt(enc, dec);
  131. EXPECT_EQ(memcmp(dec.data(), "WellHelloFriends", 16), 0);
  132. }
  133. TEST_CASE(test_RSA_encrypt_decrypt)
  134. {
  135. Crypto::PK::RSA rsa(Crypto::PK::RSA::generate_key_pair(1024));
  136. u8 enc_buffer[rsa.output_size()];
  137. u8 dec_buffer[rsa.output_size()];
  138. auto enc = Bytes { enc_buffer, rsa.output_size() };
  139. auto dec = Bytes { dec_buffer, rsa.output_size() };
  140. enc.overwrite(0, "WellHelloFriendsWellHelloFriendsWellHelloFriendsWellHelloFriends", 64);
  141. rsa.encrypt(enc, dec);
  142. rsa.decrypt(dec, enc);
  143. EXPECT(memcmp(enc.data(), "WellHelloFriendsWellHelloFriendsWellHelloFriendsWellHelloFriends", 64) == 0);
  144. }