Serenity Operating System
at master 137 lines 7.0 kB view raw
1/* 2 * Copyright (c) 2021, Peter Bocan <me@pbocan.net> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibCrypto/Hash/SHA2.h> 8#include <LibCrypto/PK/PK.h> 9#include <LibCrypto/PK/RSA.h> 10#include <LibTest/TestCase.h> 11#include <cstring> 12 13static ByteBuffer operator""_b(char const* string, size_t length) 14{ 15 return ByteBuffer::copy(string, length).release_value(); 16} 17 18TEST_CASE(test_RSA_raw_encrypt) 19{ 20 ByteBuffer data { "hellohellohellohellohellohellohellohellohellohellohellohello123-"_b }; 21 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 }; 22 Crypto::PK::RSA rsa( 23 "8126832723025844890518845777858816391166654950553329127845898924164623511718747856014227624997335860970996746552094406240834082304784428582653994490504519"_bigint, 24 "4234603516465654167360850580101327813936403862038934287300450163438938741499875303761385527882335478349599685406941909381269804396099893549838642251053393"_bigint, 25 "65537"_bigint); 26 u8 buffer[rsa.output_size()]; 27 auto buf = Bytes { buffer, sizeof(buffer) }; 28 rsa.encrypt(data, buf); 29 EXPECT(memcmp(result, buf.data(), buf.size()) == 0); 30} 31 32// RSA PKCS #1 1.5 33TEST_CASE(test_RSA_PKCS_1_encrypt) 34{ 35 ByteBuffer data { "hellohellohellohellohellohellohellohellohello123-"_b }; 36 Crypto::PK::RSA_PKCS1_EME rsa( 37 "8126832723025844890518845777858816391166654950553329127845898924164623511718747856014227624997335860970996746552094406240834082304784428582653994490504519"_bigint, 38 "4234603516465654167360850580101327813936403862038934287300450163438938741499875303761385527882335478349599685406941909381269804396099893549838642251053393"_bigint, 39 "65537"_bigint); 40 u8 buffer[rsa.output_size()]; 41 auto buf = Bytes { buffer, sizeof(buffer) }; 42 rsa.encrypt(data, buf); 43 rsa.decrypt(buf, buf); 44 45 EXPECT(memcmp(buf.data(), "hellohellohellohellohellohellohellohellohello123-", 49) == 0); 46} 47 48// RSA | ASN1 PKCS1 DER / PEM encoded Key import 49TEST_CASE(test_RSA_ASN1_PKCS1_DER_PEM_parse) 50{ 51 auto privkey = R"(-----BEGIN RSA PRIVATE KEY----- 52MIIBOgIBAAJBAJsrIYHxs1YL9tpfodaWs1lJoMdF4kgFisUFSj6nvBhJUlmBh607AlgTaX0E 53DGPYycXYGZ2n6rqmms5lpDXBpUcCAwEAAQJAUNpPkmtEHDENxsoQBUXvXDYeXdePSiIBJhpU 54joNOYoR5R9z5oX2cpcyykQ58FC2vKKg+x8N6xczG7qO95tw5UQIhAN354CP/FA+uTeJ6KJ+i 55zCBCl58CjNCzO0s5HTc56el5AiEAsvPKXo5/9gS/S4UzDRP6abq7GreixTfjR8LXidk3FL8C 56IQCTjYI861Y+hjMnlORkGSdvWlTHUj6gjEOh4TlWeJzQoQIgAxMZOQKtxCZUuxFwzRq4xLRG 57nrDlBQpuxz7bwSyQO7UCIHrYMnDohgNbwtA5ZpW3H1cKKQQvueWm6sxW9P5sUrZ3 58-----END RSA PRIVATE KEY-----)"sv; 59 60 Crypto::PK::RSA rsa(privkey); 61 if (rsa.public_key().public_exponent() != 65537) { 62 FAIL("Invalid public exponent"); 63 } 64 if (rsa.private_key().private_exponent() != "4234603516465654167360850580101327813936403862038934287300450163438938741499875303761385527882335478349599685406941909381269804396099893549838642251053393"_bigint) { 65 FAIL("Invalid private exponent"); 66 } 67} 68 69// RSA | ASN1 PKCS8 DER / PEM encoded Key import 70TEST_CASE(test_RSA_ASN1_PKCS8_DER_PEM_parse) 71{ 72 auto privkey = R"(-----BEGIN PRIVATE KEY----- 73MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC7ZBYaG9+CcJP7 74WVFJRI/uw3hljc7WpzeYs8MN82/g9CG1gnEF3P3ZSBdWVr8gnbh05EsSGHKghIce 75CB7DNrM5Ab0ru04CuODdPx56xCj+4MmzTc/aq79ntmOt131NGHgq9yVwfJqnSpyl 76OoVw7j/Wg4ciwPDQaeLmD1BsE/W9UsF1km7DWasBpW5br82DpudKgJq2Ixf52+rY 77TCkMgyWcetx4MfXll4y5ZVtJXCnHJfkCS64EaCqXmClP4ovOuHH4khJ3rW9j4yuL 78e5ck3PSXOrtOTR43HZkCXzseCkbW7qKSmk/9ZreImOzOgu8vvw7ewLAQR9qYVS6X 79PXY8IilDAgMBAAECggEBAIV3ld5mt90Z/exqA2Fh+fofMyNxyz5Lv2d9sZHAL5FT 80kKbND18TtaIKnMSb6Gl8rKJk76slyo7Vlb8oHXEBBsm1mV0KfVenAlHS4QyjpmdT 81B5Yz97VR2nQuDfUFpHNC2GQRv5LMzQIWPFfaxKxYpRNOfvOb5Gks4bTmd2tjFAYR 82MCbHgPw1liKA9dYKk4NB0301EY05e4Zz8RjqYHkkmOPD7DnjFbHqcFUjVKK5E3vD 83WjxNXUbiSudCCN7WLEOyeHZNd+l6kSAVxZuCAp0G3Da5ndXgIStcy4hYi/fL3XQQ 84bNpxjfhsjlD3tdHNr3NNYDAqxcxpsyO1NCpCIW3ZVrECgYEA7l6gTZ3e9AiSNlMd 852O2vNnbQ6UZfsEfu2y7HmpCuNJkFkAnM/1h72Krejnn31rRuR6uCFn4YgQUN9Eq0 86E1PJCtTay2ucZw5rqtkewT9QzXvVD9eiGM+MF89UzSCC+dOW0/odkD+xP2evnPvG 87PbXztnuERC1pi0YWLj1YcsfsEX0CgYEAyUA2UtYjnvCcteIy+rURT0aoZ9tDMrG+ 88Es42EURVv1sduVdUst5R+bXx1aDzpCkcdni3TyxeosvTGAZngI3O8ghh1GV7NPZR 89nkiPXjMnhL0Zf+X9gCA6TFANfPuWhMSGijYsCd46diKGDReGYUnmcN9XopeG1h6i 903JiOuVPAIb8CgYBmIcUtfGb6yHFdNV+kgrJ/84ivaqe1MBz3bKO5ZiQ+BRKNFKXx 91AkiOHSgeg8PdCpH1w1aJrJ1zKmdANIHThiKtsWXNot3wig03tq+mvSox4Mz5bLrX 92RpYP3ZXIDhYQVMhbKt9f3upi8FoeOQJHjp5Nob6aN5rxQaZfSYmMJHzRQQKBgQCO 93ALwUGTtLNBYvlKtKEadkG8RKfAFfbOFkXZLy/hfPDRjdJY0DJTIMk+BPT+F6rPOD 94eMxHllQ0ZMPPiP1RTT5/s4BsISsdhMy0dhiLbGbvF4s9nugPly3rmPTbgp6DkjQo 95o+7RC7iOkO+rnzTXwxBSBpXMiUTAIx/hrdfPVxQT+wKBgCh7N3OLIOH6EWcW1fif 96UoENh8rkt/kzm89G1JLwBhuBIBPXUEZt2dS/xSUempqVqFGONpP87gvqxkMTtgCA 9773KXn/cxHWM2kmXyHA3kQlOYw6WHjpldQAxLE+TRHXO2JUtZ09Mu4rVXX7lmwbTm 98l3vmuDEF3/Bo1C1HTg0xRV/l 99-----END PRIVATE KEY-----)"sv; 100 101 Crypto::PK::RSA rsa(privkey); 102 if (rsa.public_key().public_exponent() != 65537) { 103 FAIL("Invalid public exponent"); 104 } 105 106 if (rsa.private_key().private_exponent() != "16848664331299797559656678180469464902267415922431923391961407795209879741791261105581093539484181644099608161661780611501562625272630894063592208758992911105496755004417051031019663332258403844985328863382168329621318366311519850803972480500782200178279692319955495383119697563295214236936264406600739633470565823022975212999060908747002623721589308539473108154612454595201561671949550531384574873324370774408913092560971930541734744950937900805812300970883306404011323308000168926094053141613790857814489531436452649384151085451448183385611208320292948291211969430321231180227006521681776197974694030147965578466993"_bigint) { 107 FAIL("Invalid private exponent"); 108 } 109} 110 111TEST_CASE(test_RSA_encrypt_decrypt) 112{ 113 Crypto::PK::RSA rsa( 114 "9527497237087650398000977129550904920919162360737979403539302312977329868395261515707123424679295515888026193056908173564681660256268221509339074678416049"_bigint, 115 "39542231845947188736992321577701849924317746648774438832456325878966594812143638244746284968851807975097653255909707366086606867657273809465195392910913"_bigint, 116 "65537"_bigint); 117 118 u8 enc_buffer[rsa.output_size()]; 119 u8 dec_buffer[rsa.output_size()]; 120 121 auto enc = Bytes { enc_buffer, rsa.output_size() }; 122 auto dec = Bytes { dec_buffer, rsa.output_size() }; 123 124 enc.overwrite(0, "WellHelloFriendsWellHelloFriendsWellHelloFriendsWellHelloFriends", 64); 125 126 rsa.encrypt(enc, dec); 127 rsa.decrypt(dec, enc); 128 129 EXPECT(memcmp(enc.data(), "WellHelloFriendsWellHelloFriendsWellHelloFriendsWellHelloFriends", 64) == 0); 130} 131 132TEST_CASE(test_RSA_EMSA_PSS_construction) 133{ 134 // This is a template validity test 135 Crypto::PK::RSA rsa; 136 Crypto::PK::RSA_EMSA_PSS<Crypto::Hash::SHA256> rsa_esma_pss(rsa); 137}