Add a test for OAEP labels and custom digests. It was pointed out that we have no test coverage of this. Fix this. Test vector generated using Go's implementation. Change-Id: Iddbc50d3b422e853f8afd50117492f4666a47373 Reviewed-on: https://boringssl-review.googlesource.com/19964 Commit-Queue: Steven Valdez <svaldez@google.com> Reviewed-by: Steven Valdez <svaldez@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/crypto/evp/evp_test.cc b/crypto/evp/evp_test.cc index de72107..911c596 100644 --- a/crypto/evp/evp_test.cc +++ b/crypto/evp/evp_test.cc
@@ -70,6 +70,7 @@ #include <gtest/gtest.h> +#include <openssl/buf.h> #include <openssl/bytestring.h> #include <openssl/crypto.h> #include <openssl/digest.h> @@ -206,6 +207,27 @@ return false; } } + if (t->HasAttribute("OAEPDigest")) { + const EVP_MD *digest = GetDigest(t, t->GetAttributeOrDie("OAEPDigest")); + if (digest == nullptr || !EVP_PKEY_CTX_set_rsa_oaep_md(ctx, digest)) { + return false; + } + } + if (t->HasAttribute("OAEPLabel")) { + std::vector<uint8_t> label; + if (!t->GetBytes(&label, "OAEPLabel")) { + return false; + } + // For historical reasons, |EVP_PKEY_CTX_set0_rsa_oaep_label| expects to be + // take ownership of the input. + bssl::UniquePtr<uint8_t> buf( + reinterpret_cast<uint8_t *>(BUF_memdup(label.data(), label.size()))); + if (!buf || + !EVP_PKEY_CTX_set0_rsa_oaep_label(ctx, buf.get(), label.size())) { + return false; + } + buf.release(); + } return true; }
diff --git a/crypto/evp/evp_tests.txt b/crypto/evp/evp_tests.txt index 5e69a4e..ed8dc42 100644 --- a/crypto/evp/evp_tests.txt +++ b/crypto/evp/evp_tests.txt
@@ -482,6 +482,14 @@ Input = 458708dfbd42a1297ce7a9c86c7087ab80b1754810929b89c5107ca55368587686986fce94d86cc1595b3fb736223a656ec0f34d18ba1cc5665593610f56c58e26b272d584f3d983a5c91085700755aebd921fb280bba3eda7046ec07b43e7298e52d59edc92be4639a8ce08b2f85976ecf6d98cc469eeb9d5d8e2a32ea8a6626edafe1038b3df455668a9f3c77cad8b92fb872e00058c3d2a7ede1a1f03fc5622084ae04d9d24f6bf0995c58d35b93b699b9763595e123f2ab0863cc9229eb290e2ede7715c7a8f39e0b9a3e2e1b56ebb62f1cbfbb5986fb212ebd785b83d01d968b11d1756c7337f70c1f1a63bff03608e24f3a2fd44e67f832a8701c5d5af Output = "Hello World" +# OAEP padding with label and custom hash. +Decrypt = RSA-2048 +RSAPadding = OAEP +OAEPDigest = SHA512 +OAEPLabel = 00112233445566778899aabbccddeeff +Input = 48b956c22b8e40cc38f0893672ddf488fc806cf1fcc6239c66dd8345eb543d6b5cac589e6c7ae86dac1c2436c4d72c48009a737b2c649e6000dbab17203e4d9c078bd70b649700a0830d4ddc396af0c48973177a229e48259d93247f04f76474c7611b530c66f020c4da2cc861c2e4104831ecc0336e0cb10d6520fdefd0b33606f5cdd736dd439583b9b6011cce99623c93caf5f76e21e9fefab414795dd5ac12cba551be74ebf266834fcffab182c5e7c9b6c064df154cb26ddfd4fe2fd87590005f4bf45e776a0082803e9f68995b8eeb4c6802c67b5ef349e5b2dc0cf7a12fc097030f2bd28f0253f17129b04c82993a12957728b35880fdd2f8d0cc469f +Output = "Hello World" + # OAEP padding, corrupted ciphertext Decrypt = RSA-2048 RSAPadding = OAEP