|
7 | 7 | #include <openssl/ec_key.h>
|
8 | 8 | #include <openssl/err.h>
|
9 | 9 | #include <openssl/evp.h>
|
| 10 | +#include <openssl/kdf.h> |
10 | 11 | #include <openssl/rsa.h>
|
11 | 12 |
|
12 | 13 | #include "../../internal.h"
|
@@ -236,3 +237,112 @@ TEST_F(EvpPkeyCtxCtrlStrTest, DhPad) {
|
236 | 237 |
|
237 | 238 | // There is no function to retrieve the DH pad value.
|
238 | 239 | }
|
| 240 | + |
| 241 | +static const char *hkdf_hexsalt = "000102030405060708090a0b0c"; |
| 242 | +static const char *hkdf_hexinfo = "f0f1f2f3f4f5f6f7f8f9"; |
| 243 | +static const char *hkdf_hexkey = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"; |
| 244 | +static const char *hkdf_hex_expected_okm = |
| 245 | + "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5" |
| 246 | + "b887185865"; |
| 247 | +static const char *hkdf_hex_expected_prk = |
| 248 | + "077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5"; |
| 249 | + |
| 250 | +TEST_F(EvpPkeyCtxCtrlStrTest, HkdfHex) { |
| 251 | + // Test Cases from RFC 5869. |
| 252 | + |
| 253 | + bssl::UniquePtr<EVP_PKEY_CTX> ctx( |
| 254 | + EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr)); |
| 255 | + ASSERT_TRUE(ctx); |
| 256 | + ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get())); |
| 257 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "mode", "EXTRACT_AND_EXPAND"), 1); |
| 258 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "md", "SHA256"), 1); |
| 259 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexsalt", hkdf_hexsalt), 1); |
| 260 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexinfo", hkdf_hexinfo), 1); |
| 261 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexkey", hkdf_hexkey), 1); |
| 262 | + |
| 263 | + size_t okm_len; |
| 264 | + bssl::UniquePtr<uint8_t> expected_okm( |
| 265 | + OPENSSL_hexstr2buf(hkdf_hex_expected_okm, &okm_len)); |
| 266 | + ASSERT_TRUE(expected_okm); |
| 267 | + |
| 268 | + bssl::UniquePtr<uint8_t> actual_okm( |
| 269 | + static_cast<uint8_t *>(OPENSSL_zalloc(okm_len))); |
| 270 | + ASSERT_TRUE(actual_okm); |
| 271 | + |
| 272 | + ASSERT_TRUE(EVP_PKEY_derive(ctx.get(), actual_okm.get(), &okm_len)); |
| 273 | + |
| 274 | + ASSERT_EQ(OPENSSL_memcmp(actual_okm.get(), expected_okm.get(), okm_len), 0); |
| 275 | +} |
| 276 | + |
| 277 | +TEST_F(EvpPkeyCtxCtrlStrTest, HkdfRaw) { |
| 278 | + // Test Cases from RFC 5869. |
| 279 | + |
| 280 | + bssl::UniquePtr<EVP_PKEY_CTX> ctx( |
| 281 | + EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr)); |
| 282 | + ASSERT_TRUE(ctx); |
| 283 | + ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get())); |
| 284 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "mode", "EXTRACT_AND_EXPAND"), 1); |
| 285 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "md", "SHA256"), 1); |
| 286 | + |
| 287 | + // The salt in the KAT contains a 0-byte so "salt" cannot be used. |
| 288 | + ASSERT_EQ( |
| 289 | + EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexsalt", "000102030405060708090a0b0c"), |
| 290 | + 1); |
| 291 | + |
| 292 | + |
| 293 | + size_t len; |
| 294 | + bssl::UniquePtr<uint8_t> info_parsed(OPENSSL_hexstr2buf(hkdf_hexinfo, &len)); |
| 295 | + bssl::UniquePtr<uint8_t> info((uint8_t*)OPENSSL_zalloc(len+1)); |
| 296 | + OPENSSL_memcpy(info.get(), info_parsed.get(), len); |
| 297 | + |
| 298 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "info", |
| 299 | + reinterpret_cast<const char *>(info.get())), |
| 300 | + 1); |
| 301 | + bssl::UniquePtr<uint8_t> key_parsed(OPENSSL_hexstr2buf(hkdf_hexkey, &len)); |
| 302 | + bssl::UniquePtr<uint8_t> key((uint8_t*)OPENSSL_zalloc(len+1)); |
| 303 | + OPENSSL_memcpy(key.get(), key_parsed.get(), len); |
| 304 | + |
| 305 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "key", |
| 306 | + reinterpret_cast<const char *>(key.get())), |
| 307 | + 1); |
| 308 | + |
| 309 | + size_t okm_len; |
| 310 | + bssl::UniquePtr<uint8_t> expected_okm( |
| 311 | + OPENSSL_hexstr2buf(hkdf_hex_expected_okm, &okm_len)); |
| 312 | + ASSERT_TRUE(expected_okm); |
| 313 | + |
| 314 | + bssl::UniquePtr<uint8_t> actual_okm( |
| 315 | + static_cast<uint8_t *>(OPENSSL_zalloc(okm_len))); |
| 316 | + ASSERT_TRUE(actual_okm); |
| 317 | + |
| 318 | + ASSERT_TRUE(EVP_PKEY_derive(ctx.get(), actual_okm.get(), &okm_len)); |
| 319 | + |
| 320 | + ASSERT_EQ(OPENSSL_memcmp(actual_okm.get(), expected_okm.get(), okm_len), 0); |
| 321 | +} |
| 322 | + |
| 323 | +TEST_F(EvpPkeyCtxCtrlStrTest, HkdfExtract) { |
| 324 | + // Test Cases from RFC 5869. |
| 325 | + |
| 326 | + bssl::UniquePtr<EVP_PKEY_CTX> ctx( |
| 327 | + EVP_PKEY_CTX_new_id(EVP_PKEY_HKDF, nullptr)); |
| 328 | + ASSERT_TRUE(ctx); |
| 329 | + ASSERT_TRUE(EVP_PKEY_derive_init(ctx.get())); |
| 330 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "mode", "EXTRACT_ONLY"), 1); |
| 331 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "md", "SHA256"), 1); |
| 332 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexsalt", hkdf_hexsalt), 1); |
| 333 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexinfo", hkdf_hexinfo), 1); |
| 334 | + ASSERT_EQ(EVP_PKEY_CTX_ctrl_str(ctx.get(), "hexkey", hkdf_hexkey), 1); |
| 335 | + |
| 336 | + size_t prk_len; |
| 337 | + bssl::UniquePtr<uint8_t> expected_prk( |
| 338 | + OPENSSL_hexstr2buf(hkdf_hex_expected_prk, &prk_len)); |
| 339 | + ASSERT_TRUE(expected_prk); |
| 340 | + |
| 341 | + bssl::UniquePtr<uint8_t> actual_prk( |
| 342 | + static_cast<uint8_t *>(OPENSSL_zalloc(prk_len))); |
| 343 | + ASSERT_TRUE(actual_prk); |
| 344 | + |
| 345 | + ASSERT_TRUE(EVP_PKEY_derive(ctx.get(), actual_prk.get(), &prk_len)); |
| 346 | + |
| 347 | + ASSERT_EQ(OPENSSL_memcmp(actual_prk.get(), expected_prk.get(), prk_len), 0); |
| 348 | +} |
0 commit comments