|
11 | 11 | #include <openssl/cmac.h>
|
12 | 12 | #include <openssl/crypto.h>
|
13 | 13 | #include <openssl/ctrdrbg.h>
|
| 14 | +#include <openssl/curve25519.h> |
14 | 15 | #include <openssl/dh.h>
|
15 | 16 | #include <openssl/digest.h>
|
16 | 17 | #include <openssl/ec.h>
|
@@ -4557,6 +4558,69 @@ TEST_P(KBKDFCtrHmacIndicatorTest, KBKDF) {
|
4557 | 4558 | ASSERT_EQ(vector.expectation, approved);
|
4558 | 4559 | }
|
4559 | 4560 |
|
| 4561 | +TEST(ServiceIndicatorTest, ED25519KeyGen) { |
| 4562 | + FIPSStatus approved = AWSLC_NOT_APPROVED; |
| 4563 | + uint8_t private_key[ED25519_PRIVATE_KEY_LEN] = {0}; |
| 4564 | + uint8_t public_key[ED25519_PUBLIC_KEY_LEN] = {0}; |
| 4565 | + CALL_SERVICE_AND_CHECK_APPROVED(approved, |
| 4566 | + ED25519_keypair(public_key, private_key)); |
| 4567 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4568 | + |
| 4569 | + approved = AWSLC_NOT_APPROVED; |
| 4570 | + |
| 4571 | + bssl::UniquePtr<EVP_PKEY_CTX> ctx( |
| 4572 | + EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, nullptr)); |
| 4573 | + EVP_PKEY *raw = nullptr; |
| 4574 | + bssl::UniquePtr<EVP_PKEY> pkey(raw); |
| 4575 | + ASSERT_TRUE(EVP_PKEY_keygen_init(ctx.get())); |
| 4576 | + CALL_SERVICE_AND_CHECK_APPROVED( |
| 4577 | + approved, ASSERT_TRUE(EVP_PKEY_keygen(ctx.get(), &raw))); |
| 4578 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4579 | + pkey.reset(raw); |
| 4580 | +} |
| 4581 | + |
| 4582 | +TEST(ServiceIndicatorTest, ED25519SigGenVerify) { |
| 4583 | + const uint8_t MESSAGE[15] = {'E', 'D', '2', '5', '5', '1', '9', ' ', |
| 4584 | + 'M', 'E', 'S', 'S', 'A', 'G', 'E'}; |
| 4585 | + uint8_t private_key[ED25519_PRIVATE_KEY_LEN] = {0}; |
| 4586 | + uint8_t public_key[ED25519_PUBLIC_KEY_LEN] = {0}; |
| 4587 | + uint8_t signature[ED25519_SIGNATURE_LEN] = {0}; |
| 4588 | + ED25519_keypair(public_key, private_key); |
| 4589 | + |
| 4590 | + FIPSStatus approved = AWSLC_NOT_APPROVED; |
| 4591 | + CALL_SERVICE_AND_CHECK_APPROVED( |
| 4592 | + approved, ASSERT_TRUE(ED25519_sign(&signature[0], &MESSAGE[0], |
| 4593 | + sizeof(MESSAGE), private_key))); |
| 4594 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4595 | + |
| 4596 | + approved = AWSLC_NOT_APPROVED; |
| 4597 | + CALL_SERVICE_AND_CHECK_APPROVED( |
| 4598 | + approved, ASSERT_TRUE(ED25519_verify(&MESSAGE[0], sizeof(MESSAGE), |
| 4599 | + signature, public_key))); |
| 4600 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4601 | + |
| 4602 | + bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new_raw_private_key( |
| 4603 | + EVP_PKEY_ED25519, NULL, &private_key[0], ED25519_PRIVATE_KEY_SEED_LEN)); |
| 4604 | + |
| 4605 | + bssl::UniquePtr<EVP_MD_CTX> mdctx(EVP_MD_CTX_new()); |
| 4606 | + ASSERT_TRUE(EVP_DigestSignInit(mdctx.get(), NULL, NULL, NULL, pkey.get())); |
| 4607 | + size_t sig_out_len = sizeof(signature); |
| 4608 | + CALL_SERVICE_AND_CHECK_APPROVED( |
| 4609 | + approved, |
| 4610 | + ASSERT_TRUE(EVP_DigestSign(mdctx.get(), &signature[0], &sig_out_len, |
| 4611 | + &MESSAGE[0], sizeof(MESSAGE)))); |
| 4612 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4613 | + ASSERT_EQ(sizeof(signature), sig_out_len); |
| 4614 | + |
| 4615 | + mdctx.reset(EVP_MD_CTX_new()); |
| 4616 | + ASSERT_TRUE(EVP_DigestVerifyInit(mdctx.get(), NULL, NULL, NULL, pkey.get())); |
| 4617 | + CALL_SERVICE_AND_CHECK_APPROVED( |
| 4618 | + approved, ASSERT_TRUE(EVP_DigestVerify(mdctx.get(), &signature[0], |
| 4619 | + sizeof(signature), &MESSAGE[0], |
| 4620 | + sizeof(MESSAGE)))); |
| 4621 | + ASSERT_EQ(AWSLC_APPROVED, approved); |
| 4622 | +} |
| 4623 | + |
4560 | 4624 | // Verifies that the awslc_version_string is as expected.
|
4561 | 4625 | // Since this is running in FIPS mode it should end in FIPS
|
4562 | 4626 | // Update this when the AWS-LC version number is modified
|
|
0 commit comments