|
|
|
@ -62,13 +62,15 @@ class HPKETestVector { |
|
|
|
|
// Set up the sender.
|
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_s_x25519_for_test( |
|
|
|
|
sender_ctx.get(), kdf_id_, aead_id_, public_key_r_.data(), |
|
|
|
|
info_.data(), info_.size(), secret_key_e_.data(), |
|
|
|
|
public_key_e_.data())); |
|
|
|
|
public_key_r_.size(), info_.data(), info_.size(), |
|
|
|
|
secret_key_e_.data(), secret_key_e_.size(), public_key_e_.data(), |
|
|
|
|
public_key_e_.size())); |
|
|
|
|
|
|
|
|
|
// Set up the receiver.
|
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), kdf_id_, aead_id_, public_key_e_.data(), |
|
|
|
|
public_key_r_.data(), secret_key_r_.data(), info_.data(), |
|
|
|
|
public_key_e_.size(), public_key_r_.data(), public_key_r_.size(), |
|
|
|
|
secret_key_r_.data(), secret_key_r_.size(), info_.data(), |
|
|
|
|
info_.size())); |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
@ -80,14 +82,15 @@ class HPKETestVector { |
|
|
|
|
// Set up the sender.
|
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_psk_s_x25519_for_test( |
|
|
|
|
sender_ctx.get(), kdf_id_, aead_id_, public_key_r_.data(), |
|
|
|
|
info_.data(), info_.size(), psk_.data(), psk_.size(), |
|
|
|
|
psk_id_.data(), psk_id_.size(), secret_key_e_.data(), |
|
|
|
|
public_key_e_.data())); |
|
|
|
|
public_key_r_.size(), info_.data(), info_.size(), psk_.data(), |
|
|
|
|
psk_.size(), psk_id_.data(), psk_id_.size(), secret_key_e_.data(), |
|
|
|
|
secret_key_e_.size(), public_key_e_.data(), public_key_e_.size())); |
|
|
|
|
|
|
|
|
|
// Set up the receiver.
|
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
receiver_ctx.get(), kdf_id_, aead_id_, public_key_e_.data(), |
|
|
|
|
public_key_r_.data(), secret_key_r_.data(), info_.data(), |
|
|
|
|
public_key_e_.size(), public_key_r_.data(), public_key_r_.size(), |
|
|
|
|
secret_key_r_.data(), secret_key_r_.size(), info_.data(), |
|
|
|
|
info_.size(), psk_.data(), psk_.size(), psk_id_.data(), |
|
|
|
|
psk_id_.size())); |
|
|
|
|
break; |
|
|
|
@ -282,14 +285,15 @@ TEST(HPKETest, RoundTrip) { |
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, kdf_id, aead_id, public_key_r, info.data(), |
|
|
|
|
info.size())); |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), kdf_id, aead_id, public_key_r, |
|
|
|
|
sizeof(public_key_r), info.data(), info.size())); |
|
|
|
|
|
|
|
|
|
// Set up the receiver.
|
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), kdf_id, aead_id, enc, public_key_r, |
|
|
|
|
secret_key_r, info.data(), info.size())); |
|
|
|
|
receiver_ctx.get(), kdf_id, aead_id, enc, sizeof(enc), |
|
|
|
|
public_key_r, sizeof(public_key_r), secret_key_r, |
|
|
|
|
sizeof(secret_key_r), info.data(), info.size())); |
|
|
|
|
|
|
|
|
|
const char kCleartextPayload[] = "foobar"; |
|
|
|
|
|
|
|
|
@ -347,14 +351,15 @@ TEST(HPKETest, X25519EncapSmallOrderPoint) { |
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, kdf_id, aead_id, kSmallOrderPoint, nullptr, |
|
|
|
|
0)); |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), kdf_id, aead_id, kSmallOrderPoint, |
|
|
|
|
sizeof(kSmallOrderPoint), nullptr, 0)); |
|
|
|
|
|
|
|
|
|
// Set up the receiver, passing in kSmallOrderPoint as |enc|.
|
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), kdf_id, aead_id, kSmallOrderPoint, public_key_r, |
|
|
|
|
secret_key_r, nullptr, 0)); |
|
|
|
|
receiver_ctx.get(), kdf_id, aead_id, kSmallOrderPoint, |
|
|
|
|
sizeof(kSmallOrderPoint), public_key_r, sizeof(public_key_r), |
|
|
|
|
secret_key_r, sizeof(secret_key_r), nullptr, 0)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -373,7 +378,8 @@ TEST(HPKETest, ReceiverInvalidSeal) { |
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
kMockEnc, public_key_r, secret_key_r, nullptr, 0)); |
|
|
|
|
kMockEnc, sizeof(kMockEnc), public_key_r, sizeof(public_key_r), |
|
|
|
|
secret_key_r, sizeof(secret_key_r), nullptr, 0)); |
|
|
|
|
|
|
|
|
|
// Call Seal() on the receiver.
|
|
|
|
|
size_t ciphertext_len; |
|
|
|
@ -398,8 +404,9 @@ TEST(HPKETest, SenderInvalidOpen) { |
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
ASSERT_TRUE(EVP_HPKE_CTX_setup_base_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
public_key_r, nullptr, 0)); |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, public_key_r, sizeof(public_key_r), nullptr, |
|
|
|
|
0)); |
|
|
|
|
|
|
|
|
|
// Call Open() on the sender.
|
|
|
|
|
uint8_t cleartext[128]; |
|
|
|
@ -432,10 +439,11 @@ TEST(HPKETest, EmptyPSK) { |
|
|
|
|
|
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
ASSERT_EQ(EVP_HPKE_CTX_setup_psk_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, public_key_r, nullptr, 0, |
|
|
|
|
psk.data(), psk.size(), psk_id.data(), psk_id.size()), |
|
|
|
|
ASSERT_EQ( |
|
|
|
|
EVP_HPKE_CTX_setup_psk_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, public_key_r, sizeof(public_key_r), |
|
|
|
|
nullptr, 0, psk.data(), psk.size(), psk_id.data(), psk_id.size()), |
|
|
|
|
kExpectSuccess); |
|
|
|
|
|
|
|
|
|
if (!kExpectSuccess) { |
|
|
|
@ -446,11 +454,12 @@ TEST(HPKETest, EmptyPSK) { |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
|
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
ASSERT_EQ( |
|
|
|
|
EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
ASSERT_EQ(EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, kMockEnc, public_key_r, secret_key_r, |
|
|
|
|
nullptr, 0, psk.data(), psk.size(), psk_id.data(), psk_id.size()), |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, kMockEnc, sizeof(kMockEnc), |
|
|
|
|
public_key_r, sizeof(public_key_r), secret_key_r, |
|
|
|
|
sizeof(secret_key_r), nullptr, 0, psk.data(), psk.size(), |
|
|
|
|
psk_id.data(), psk_id.size()), |
|
|
|
|
kExpectSuccess); |
|
|
|
|
|
|
|
|
|
if (!kExpectSuccess) { |
|
|
|
@ -463,6 +472,165 @@ TEST(HPKETest, EmptyPSK) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(HPKETest, SetupSenderWrongLengthEnc) { |
|
|
|
|
uint8_t secret_key_r[X25519_PRIVATE_KEY_LEN]; |
|
|
|
|
uint8_t public_key_r[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
X25519_keypair(public_key_r, secret_key_r); |
|
|
|
|
|
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t bogus_enc[X25519_PUBLIC_VALUE_LEN + 5]; |
|
|
|
|
{ |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_s_x25519( |
|
|
|
|
sender_ctx.get(), bogus_enc, sizeof(bogus_enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, public_key_r, sizeof(public_key_r), nullptr, |
|
|
|
|
0)); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_BUFFER_SIZE, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
const uint8_t psk[] = {1, 2, 3, 4}; |
|
|
|
|
const uint8_t psk_id[] = {1, 2, 3, 4}; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_psk_s_x25519( |
|
|
|
|
sender_ctx.get(), bogus_enc, sizeof(bogus_enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, public_key_r, sizeof(public_key_r), nullptr, |
|
|
|
|
0, psk, sizeof(psk), psk_id, sizeof(psk_id))); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_BUFFER_SIZE, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(HPKETest, SetupReceiverWrongLengthEnc) { |
|
|
|
|
uint8_t private_key[X25519_PRIVATE_KEY_LEN]; |
|
|
|
|
uint8_t public_key[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
X25519_keypair(public_key, private_key); |
|
|
|
|
|
|
|
|
|
const uint8_t bogus_enc[X25519_PUBLIC_VALUE_LEN + 5] = {0xff}; |
|
|
|
|
|
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
{ |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
bogus_enc, sizeof(bogus_enc), public_key, sizeof(public_key), |
|
|
|
|
private_key, sizeof(private_key), nullptr, 0)); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_PEER_KEY, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
const uint8_t psk[] = {1, 2, 3, 4}; |
|
|
|
|
const uint8_t psk_id[] = {1, 2, 3, 4}; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
bogus_enc, sizeof(bogus_enc), public_key, sizeof(public_key), |
|
|
|
|
private_key, sizeof(private_key), nullptr, 0, psk, sizeof(psk), psk_id, |
|
|
|
|
sizeof(psk_id))); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_PEER_KEY, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(HPKETest, SetupSenderWrongLengthPeerPublicValue) { |
|
|
|
|
const uint8_t bogus_public_key_r[X25519_PRIVATE_KEY_LEN + 5] = {0xff}; |
|
|
|
|
ScopedEVP_HPKE_CTX sender_ctx; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
{ |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, bogus_public_key_r, |
|
|
|
|
sizeof(bogus_public_key_r), nullptr, 0)); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_PEER_KEY, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
const uint8_t psk[] = {1, 2, 3, 4}; |
|
|
|
|
const uint8_t psk_id[] = {1, 2, 3, 4}; |
|
|
|
|
|
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_psk_s_x25519( |
|
|
|
|
sender_ctx.get(), enc, sizeof(enc), EVP_HPKE_HKDF_SHA256, |
|
|
|
|
EVP_HPKE_AEAD_AES_GCM_128, bogus_public_key_r, |
|
|
|
|
sizeof(bogus_public_key_r), nullptr, 0, psk, sizeof(psk), psk_id, |
|
|
|
|
sizeof(psk_id))); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_INVALID_PEER_KEY, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(HPKETest, SetupReceiverWrongLengthKeys) { |
|
|
|
|
uint8_t private_key[X25519_PRIVATE_KEY_LEN]; |
|
|
|
|
uint8_t public_key[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
X25519_keypair(public_key, private_key); |
|
|
|
|
|
|
|
|
|
uint8_t unused[X25519_PRIVATE_KEY_LEN]; |
|
|
|
|
uint8_t enc[X25519_PUBLIC_VALUE_LEN]; |
|
|
|
|
X25519_keypair(enc, unused); |
|
|
|
|
|
|
|
|
|
const uint8_t bogus_public_key[X25519_PUBLIC_VALUE_LEN + 5] = {0xff}; |
|
|
|
|
const uint8_t bogus_private_key[X25519_PUBLIC_VALUE_LEN + 5] = {0xff}; |
|
|
|
|
|
|
|
|
|
ScopedEVP_HPKE_CTX receiver_ctx; |
|
|
|
|
{ |
|
|
|
|
// Test base mode with |bogus_public_key|.
|
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
enc, sizeof(enc), bogus_public_key, sizeof(bogus_public_key), |
|
|
|
|
private_key, sizeof(private_key), nullptr, 0)); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_DECODE_ERROR, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
// Test base mode with |bogus_private_key|.
|
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_base_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
enc, sizeof(enc), public_key, sizeof(public_key), bogus_private_key, |
|
|
|
|
sizeof(bogus_private_key), nullptr, 0)); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_DECODE_ERROR, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
// Test PSK mode with |bogus_public_key|.
|
|
|
|
|
const uint8_t psk[] = {1, 2, 3, 4}; |
|
|
|
|
const uint8_t psk_id[] = {1, 2, 3, 4}; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
enc, sizeof(enc), bogus_public_key, sizeof(bogus_public_key), |
|
|
|
|
private_key, sizeof(private_key), nullptr, 0, psk, sizeof(psk), psk_id, |
|
|
|
|
sizeof(psk_id))); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_DECODE_ERROR, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
{ |
|
|
|
|
// Test PSK mode with |bogus_private_key|.
|
|
|
|
|
const uint8_t psk[] = {1, 2, 3, 4}; |
|
|
|
|
const uint8_t psk_id[] = {1, 2, 3, 4}; |
|
|
|
|
ASSERT_FALSE(EVP_HPKE_CTX_setup_psk_r_x25519( |
|
|
|
|
receiver_ctx.get(), EVP_HPKE_HKDF_SHA256, EVP_HPKE_AEAD_AES_GCM_128, |
|
|
|
|
enc, sizeof(enc), public_key, sizeof(public_key), bogus_private_key, |
|
|
|
|
sizeof(bogus_private_key), nullptr, 0, psk, sizeof(psk), psk_id, |
|
|
|
|
sizeof(psk_id))); |
|
|
|
|
uint32_t err = ERR_get_error(); |
|
|
|
|
EXPECT_EQ(ERR_LIB_EVP, ERR_GET_LIB(err)); |
|
|
|
|
EXPECT_EQ(EVP_R_DECODE_ERROR, ERR_GET_REASON(err)); |
|
|
|
|
ERR_clear_error(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST(HPKETest, InternalParseIntSafe) { |
|
|
|
|
uint8_t u8 = 0xff; |
|
|
|
|
ASSERT_FALSE(ParseIntSafe(&u8, "-1")); |
|
|
|
|