diff --git a/Tests/LibCrypto/TestRSA.cpp b/Tests/LibCrypto/TestRSA.cpp index 27b1ae048d..de438ceeb5 100644 --- a/Tests/LibCrypto/TestRSA.cpp +++ b/Tests/LibCrypto/TestRSA.cpp @@ -6,6 +6,7 @@ #include #include +#include #include #include #include @@ -119,14 +120,19 @@ sV/ETwIDAQABAkBpC37UJkjWQRHyxP83xuasExuO6/mT5sQN692kcppTJ9wHNWoD RwIhAIDSm8Ajgf7m3RQEoLVrCe/l8WtCqsuWliOsr6rbQq4hAiEAx8R16wvOtZlN W4jvSU1+WwAaBZl21lfKf8OhLRXrmNkCIG9IRdcSiNR/Ut8QfD3N9Bb1HsUm+Bvz c8yGzl89pYST ------END PRIVATE KEY-----)"sv; +-----END PRIVATE KEY----- +)"sv; auto decoded = Crypto::decode_pem(keypem.bytes()); auto keypair = Crypto::PK::RSA::parse_rsa_key(decoded); auto priv_der = MUST(keypair.private_key.export_as_der()); - auto priv_pem = MUST(Crypto::encode_pem(priv_der, Crypto::PEMType::PrivateKey)); + auto rsa_encryption_oid = Array { 1, 2, 840, 113549, 1, 1, 1 }; + auto wrapped_priv_der = MUST(Crypto::PK::wrap_in_private_key_info(keypair.private_key, rsa_encryption_oid)); + auto priv_pem = MUST(Crypto::encode_pem(wrapped_priv_der, Crypto::PEMType::PrivateKey)); auto rsa_from_pair = Crypto::PK::RSA(keypair.public_key, keypair.private_key); auto rsa_from_pem = Crypto::PK::RSA(priv_pem); + EXPECT_EQ(keypem, StringView(priv_pem)); + u8 enc_buffer[rsa_from_pair.output_size()]; u8 dec_buffer[rsa_from_pair.output_size()]; diff --git a/Userland/Libraries/LibCrypto/PK/PK.h b/Userland/Libraries/LibCrypto/PK/PK.h index 129328ec3e..eb3bbb081d 100644 --- a/Userland/Libraries/LibCrypto/PK/PK.h +++ b/Userland/Libraries/LibCrypto/PK/PK.h @@ -14,6 +14,36 @@ namespace Crypto::PK { +template +ErrorOr wrap_in_private_key_info(ExportableKey key, Span algorithm_identifier) +requires requires(ExportableKey k) { + k.export_as_der(); +} +{ + ASN1::Encoder encoder; + TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr { + TRY(encoder.write(0x00u)); // version + + // AlgorithmIdentifier + TRY(encoder.write_constructed(ASN1::Class::Universal, ASN1::Kind::Sequence, [&]() -> ErrorOr { + TRY(encoder.write(algorithm_identifier)); // algorithm + + // FIXME: This assumes we have a NULL parameter, this is not always the case + TRY(encoder.write(nullptr)); // parameters + + return {}; + })); + + // PrivateKey + auto data = TRY(key.export_as_der()); + TRY(encoder.write(data)); + + return {}; + })); + + return encoder.finish(); +} + // FIXME: Fixing name up for grabs template class PKSystem {