1 /* 2 * Copyright 2016-2025 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 10 /* 11 * HMAC low level APIs are deprecated for public use, but still ok for internal 12 * use. 13 */ 14 #include "internal/deprecated.h" 15 16 #include <stdlib.h> 17 #include <stdarg.h> 18 #include <string.h> 19 #include <openssl/hmac.h> 20 #include <openssl/evp.h> 21 #include <openssl/kdf.h> 22 #include <openssl/core_names.h> 23 #include <openssl/proverr.h> 24 #include "internal/cryptlib.h" 25 #include "internal/numbers.h" 26 #include "internal/packet.h" 27 #include "crypto/evp.h" 28 #include "prov/provider_ctx.h" 29 #include "prov/providercommon.h" 30 #include "prov/implementations.h" 31 #include "prov/provider_util.h" 32 #include "prov/securitycheck.h" 33 #include "internal/e_os.h" 34 #include "internal/params.h" 35 36 #define HKDF_MAXBUF 2048 37 #define HKDF_MAXINFO (32 * 1024) 38 39 static OSSL_FUNC_kdf_newctx_fn kdf_hkdf_new; 40 static OSSL_FUNC_kdf_dupctx_fn kdf_hkdf_dup; 41 static OSSL_FUNC_kdf_freectx_fn kdf_hkdf_free; 42 static OSSL_FUNC_kdf_reset_fn kdf_hkdf_reset; 43 static OSSL_FUNC_kdf_derive_fn kdf_hkdf_derive; 44 static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_hkdf_settable_ctx_params; 45 static OSSL_FUNC_kdf_set_ctx_params_fn kdf_hkdf_set_ctx_params; 46 static OSSL_FUNC_kdf_gettable_ctx_params_fn kdf_hkdf_gettable_ctx_params; 47 static OSSL_FUNC_kdf_get_ctx_params_fn kdf_hkdf_get_ctx_params; 48 static OSSL_FUNC_kdf_derive_fn kdf_tls1_3_derive; 49 static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_tls1_3_settable_ctx_params; 50 static OSSL_FUNC_kdf_set_ctx_params_fn kdf_tls1_3_set_ctx_params; 51 static OSSL_FUNC_kdf_gettable_ctx_params_fn kdf_tls1_3_gettable_ctx_params; 52 static OSSL_FUNC_kdf_get_ctx_params_fn kdf_tls1_3_get_ctx_params; 53 54 static int HKDF(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md, 55 const unsigned char *salt, size_t salt_len, 56 const unsigned char *key, size_t key_len, 57 const unsigned char *info, size_t info_len, 58 unsigned char *okm, size_t okm_len); 59 static int HKDF_Extract(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md, 60 const unsigned char *salt, size_t salt_len, 61 const unsigned char *ikm, size_t ikm_len, 62 unsigned char *prk, size_t prk_len); 63 static int HKDF_Expand(const EVP_MD *evp_md, 64 const unsigned char *prk, size_t prk_len, 65 const unsigned char *info, size_t info_len, 66 unsigned char *okm, size_t okm_len); 67 68 /* Settable context parameters that are common across HKDF and the TLS KDF */ 69 #define HKDF_COMMON_SETTABLES \ 70 OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_MODE, NULL, 0), \ 71 OSSL_PARAM_int(OSSL_KDF_PARAM_MODE, NULL), \ 72 OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0), \ 73 OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0), \ 74 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_KEY, NULL, 0), \ 75 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SALT, NULL, 0) 76 77 /* Gettable context parameters that are common across HKDF and the TLS KDF */ 78 #define HKDF_COMMON_GETTABLES \ 79 OSSL_PARAM_size_t(OSSL_KDF_PARAM_SIZE, NULL), \ 80 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0) 81 82 typedef struct { 83 void *provctx; 84 int mode; 85 PROV_DIGEST digest; 86 unsigned char *salt; 87 size_t salt_len; 88 unsigned char *key; 89 size_t key_len; 90 unsigned char *prefix; 91 size_t prefix_len; 92 unsigned char *label; 93 size_t label_len; 94 unsigned char *data; 95 size_t data_len; 96 unsigned char *info; 97 size_t info_len; 98 OSSL_FIPS_IND_DECLARE 99 } KDF_HKDF; 100 101 static void *kdf_hkdf_new(void *provctx) 102 { 103 KDF_HKDF *ctx; 104 105 if (!ossl_prov_is_running()) 106 return NULL; 107 108 if ((ctx = OPENSSL_zalloc(sizeof(*ctx))) != NULL) { 109 ctx->provctx = provctx; 110 OSSL_FIPS_IND_INIT(ctx) 111 } 112 return ctx; 113 } 114 115 static void kdf_hkdf_free(void *vctx) 116 { 117 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 118 119 if (ctx != NULL) { 120 kdf_hkdf_reset(ctx); 121 OPENSSL_free(ctx); 122 } 123 } 124 125 static void kdf_hkdf_reset(void *vctx) 126 { 127 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 128 void *provctx = ctx->provctx; 129 130 ossl_prov_digest_reset(&ctx->digest); 131 #ifdef OPENSSL_PEDANTIC_ZEROIZATION 132 OPENSSL_clear_free(ctx->salt, ctx->salt_len); 133 #else 134 OPENSSL_free(ctx->salt); 135 #endif 136 OPENSSL_free(ctx->prefix); 137 OPENSSL_free(ctx->label); 138 OPENSSL_clear_free(ctx->data, ctx->data_len); 139 OPENSSL_clear_free(ctx->key, ctx->key_len); 140 OPENSSL_clear_free(ctx->info, ctx->info_len); 141 memset(ctx, 0, sizeof(*ctx)); 142 ctx->provctx = provctx; 143 } 144 145 static void *kdf_hkdf_dup(void *vctx) 146 { 147 const KDF_HKDF *src = (const KDF_HKDF *)vctx; 148 KDF_HKDF *dest; 149 150 dest = kdf_hkdf_new(src->provctx); 151 if (dest != NULL) { 152 if (!ossl_prov_memdup(src->salt, src->salt_len, &dest->salt, 153 &dest->salt_len) 154 || !ossl_prov_memdup(src->key, src->key_len, 155 &dest->key, &dest->key_len) 156 || !ossl_prov_memdup(src->prefix, src->prefix_len, 157 &dest->prefix, &dest->prefix_len) 158 || !ossl_prov_memdup(src->label, src->label_len, 159 &dest->label, &dest->label_len) 160 || !ossl_prov_memdup(src->data, src->data_len, 161 &dest->data, &dest->data_len) 162 || !ossl_prov_memdup(src->info, src->info_len, 163 &dest->info, &dest->info_len) 164 || !ossl_prov_digest_copy(&dest->digest, &src->digest)) 165 goto err; 166 dest->mode = src->mode; 167 OSSL_FIPS_IND_COPY(dest, src) 168 } 169 return dest; 170 171 err: 172 kdf_hkdf_free(dest); 173 return NULL; 174 } 175 176 static size_t kdf_hkdf_size(KDF_HKDF *ctx) 177 { 178 int sz; 179 const EVP_MD *md = ossl_prov_digest_md(&ctx->digest); 180 181 if (ctx->mode != EVP_KDF_HKDF_MODE_EXTRACT_ONLY) 182 return SIZE_MAX; 183 184 if (md == NULL) { 185 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); 186 return 0; 187 } 188 sz = EVP_MD_get_size(md); 189 if (sz <= 0) 190 return 0; 191 192 return sz; 193 } 194 195 #ifdef FIPS_MODULE 196 static int fips_hkdf_key_check_passed(KDF_HKDF *ctx) 197 { 198 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx); 199 int key_approved = ossl_kdf_check_key_size(ctx->key_len); 200 201 if (!key_approved) { 202 if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0, 203 libctx, "HKDF", "Key size", 204 ossl_fips_config_hkdf_key_check)) { 205 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH); 206 return 0; 207 } 208 } 209 return 1; 210 } 211 #endif 212 213 static int kdf_hkdf_derive(void *vctx, unsigned char *key, size_t keylen, 214 const OSSL_PARAM params[]) 215 { 216 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 217 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx); 218 const EVP_MD *md; 219 220 if (!ossl_prov_is_running() || !kdf_hkdf_set_ctx_params(ctx, params)) 221 return 0; 222 223 md = ossl_prov_digest_md(&ctx->digest); 224 if (md == NULL) { 225 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); 226 return 0; 227 } 228 if (ctx->key == NULL) { 229 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_KEY); 230 return 0; 231 } 232 if (keylen == 0) { 233 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH); 234 return 0; 235 } 236 237 switch (ctx->mode) { 238 case EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND: 239 default: 240 return HKDF(libctx, md, ctx->salt, ctx->salt_len, 241 ctx->key, ctx->key_len, ctx->info, ctx->info_len, key, keylen); 242 243 case EVP_KDF_HKDF_MODE_EXTRACT_ONLY: 244 return HKDF_Extract(libctx, md, ctx->salt, ctx->salt_len, 245 ctx->key, ctx->key_len, key, keylen); 246 247 case EVP_KDF_HKDF_MODE_EXPAND_ONLY: 248 return HKDF_Expand(md, ctx->key, ctx->key_len, ctx->info, 249 ctx->info_len, key, keylen); 250 } 251 } 252 253 static int hkdf_common_set_ctx_params(KDF_HKDF *ctx, const OSSL_PARAM params[]) 254 { 255 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx); 256 const OSSL_PARAM *p; 257 int n; 258 259 if (ossl_param_is_empty(params)) 260 return 1; 261 262 if (OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_DIGEST) != NULL) { 263 const EVP_MD *md = NULL; 264 265 if (!ossl_prov_digest_load_from_params(&ctx->digest, params, libctx)) 266 return 0; 267 268 md = ossl_prov_digest_md(&ctx->digest); 269 if (EVP_MD_xof(md)) { 270 ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED); 271 return 0; 272 } 273 } 274 275 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_MODE)) != NULL) { 276 if (p->data_type == OSSL_PARAM_UTF8_STRING) { 277 if (OPENSSL_strcasecmp(p->data, "EXTRACT_AND_EXPAND") == 0) { 278 ctx->mode = EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND; 279 } else if (OPENSSL_strcasecmp(p->data, "EXTRACT_ONLY") == 0) { 280 ctx->mode = EVP_KDF_HKDF_MODE_EXTRACT_ONLY; 281 } else if (OPENSSL_strcasecmp(p->data, "EXPAND_ONLY") == 0) { 282 ctx->mode = EVP_KDF_HKDF_MODE_EXPAND_ONLY; 283 } else { 284 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE); 285 return 0; 286 } 287 } else if (OSSL_PARAM_get_int(p, &n)) { 288 if (n != EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND 289 && n != EVP_KDF_HKDF_MODE_EXTRACT_ONLY 290 && n != EVP_KDF_HKDF_MODE_EXPAND_ONLY) { 291 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE); 292 return 0; 293 } 294 ctx->mode = n; 295 } else { 296 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE); 297 return 0; 298 } 299 } 300 301 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY)) != NULL) { 302 OPENSSL_clear_free(ctx->key, ctx->key_len); 303 ctx->key = NULL; 304 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->key, 0, 305 &ctx->key_len)) 306 return 0; 307 } 308 309 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_SALT)) != NULL) { 310 OPENSSL_free(ctx->salt); 311 ctx->salt = NULL; 312 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->salt, 0, 313 &ctx->salt_len)) 314 return 0; 315 } 316 317 return 1; 318 } 319 320 static int kdf_hkdf_set_ctx_params(void *vctx, const OSSL_PARAM params[]) 321 { 322 KDF_HKDF *ctx = vctx; 323 324 if (ossl_param_is_empty(params)) 325 return 1; 326 327 if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, params, 328 OSSL_KDF_PARAM_FIPS_KEY_CHECK)) 329 return 0; 330 331 if (!hkdf_common_set_ctx_params(ctx, params)) 332 return 0; 333 334 if (ossl_param_get1_concat_octet_string(params, OSSL_KDF_PARAM_INFO, 335 &ctx->info, &ctx->info_len, 336 HKDF_MAXINFO) 337 == 0) 338 return 0; 339 340 #ifdef FIPS_MODULE 341 if (OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY) != NULL) 342 if (!fips_hkdf_key_check_passed(ctx)) 343 return 0; 344 #endif 345 346 return 1; 347 } 348 349 static const OSSL_PARAM *kdf_hkdf_settable_ctx_params(ossl_unused void *ctx, 350 ossl_unused void *provctx) 351 { 352 static const OSSL_PARAM known_settable_ctx_params[] = { 353 HKDF_COMMON_SETTABLES, 354 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0), 355 OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_KEY_CHECK) 356 OSSL_PARAM_END 357 }; 358 return known_settable_ctx_params; 359 } 360 361 static int hkdf_common_get_ctx_params(KDF_HKDF *ctx, OSSL_PARAM params[]) 362 { 363 OSSL_PARAM *p; 364 365 if (ossl_param_is_empty(params)) 366 return 1; 367 368 if ((p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_SIZE)) != NULL) { 369 size_t sz = kdf_hkdf_size(ctx); 370 371 if (sz == 0) 372 return 0; 373 if (!OSSL_PARAM_set_size_t(p, sz)) 374 return 0; 375 } 376 377 if ((p = OSSL_PARAM_locate(params, OSSL_KDF_PARAM_INFO)) != NULL) { 378 if (ctx->info == NULL || ctx->info_len == 0) 379 p->return_size = 0; 380 else if (!OSSL_PARAM_set_octet_string(p, ctx->info, ctx->info_len)) 381 return 0; 382 } 383 384 return 1; 385 } 386 387 static int kdf_hkdf_get_ctx_params(void *vctx, OSSL_PARAM params[]) 388 { 389 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 390 391 if (ossl_param_is_empty(params)) 392 return 1; 393 394 if (!hkdf_common_get_ctx_params(ctx, params)) 395 return 0; 396 397 if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, params)) 398 return 0; 399 400 return 1; 401 } 402 403 static const OSSL_PARAM *kdf_hkdf_gettable_ctx_params(ossl_unused void *ctx, 404 ossl_unused void *provctx) 405 { 406 static const OSSL_PARAM known_gettable_ctx_params[] = { 407 HKDF_COMMON_GETTABLES, 408 OSSL_FIPS_IND_GETTABLE_CTX_PARAM() 409 OSSL_PARAM_END 410 }; 411 return known_gettable_ctx_params; 412 } 413 414 const OSSL_DISPATCH ossl_kdf_hkdf_functions[] = { 415 { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_hkdf_new }, 416 { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))kdf_hkdf_dup }, 417 { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_hkdf_free }, 418 { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_hkdf_reset }, 419 { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_hkdf_derive }, 420 { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS, 421 (void (*)(void))kdf_hkdf_settable_ctx_params }, 422 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_hkdf_set_ctx_params }, 423 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, 424 (void (*)(void))kdf_hkdf_gettable_ctx_params }, 425 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_hkdf_get_ctx_params }, 426 OSSL_DISPATCH_END 427 }; 428 429 /* 430 * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)" 431 * Section 2 (https://tools.ietf.org/html/rfc5869#section-2) and 432 * "Cryptographic Extraction and Key Derivation: The HKDF Scheme" 433 * Section 4.2 (https://eprint.iacr.org/2010/264.pdf). 434 * 435 * From the paper: 436 * The scheme HKDF is specified as: 437 * HKDF(XTS, SKM, CTXinfo, L) = K(1) | K(2) | ... | K(t) 438 * 439 * where: 440 * SKM is source key material 441 * XTS is extractor salt (which may be null or constant) 442 * CTXinfo is context information (may be null) 443 * L is the number of key bits to be produced by KDF 444 * k is the output length in bits of the hash function used with HMAC 445 * t = ceil(L/k) 446 * the value K(t) is truncated to its first d = L mod k bits. 447 * 448 * From RFC 5869: 449 * 2.2. Step 1: Extract 450 * HKDF-Extract(salt, IKM) -> PRK 451 * 2.3. Step 2: Expand 452 * HKDF-Expand(PRK, info, L) -> OKM 453 */ 454 static int HKDF(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md, 455 const unsigned char *salt, size_t salt_len, 456 const unsigned char *ikm, size_t ikm_len, 457 const unsigned char *info, size_t info_len, 458 unsigned char *okm, size_t okm_len) 459 { 460 unsigned char prk[EVP_MAX_MD_SIZE]; 461 int ret, sz; 462 size_t prk_len; 463 464 sz = EVP_MD_get_size(evp_md); 465 if (sz <= 0) 466 return 0; 467 prk_len = (size_t)sz; 468 469 /* Step 1: HKDF-Extract(salt, IKM) -> PRK */ 470 if (!HKDF_Extract(libctx, evp_md, 471 salt, salt_len, ikm, ikm_len, prk, prk_len)) 472 return 0; 473 474 /* Step 2: HKDF-Expand(PRK, info, L) -> OKM */ 475 ret = HKDF_Expand(evp_md, prk, prk_len, info, info_len, okm, okm_len); 476 OPENSSL_cleanse(prk, sizeof(prk)); 477 478 return ret; 479 } 480 481 /* 482 * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)" 483 * Section 2.2 (https://tools.ietf.org/html/rfc5869#section-2.2). 484 * 485 * 2.2. Step 1: Extract 486 * 487 * HKDF-Extract(salt, IKM) -> PRK 488 * 489 * Options: 490 * Hash a hash function; HashLen denotes the length of the 491 * hash function output in octets 492 * 493 * Inputs: 494 * salt optional salt value (a non-secret random value); 495 * if not provided, it is set to a string of HashLen zeros. 496 * IKM input keying material 497 * 498 * Output: 499 * PRK a pseudorandom key (of HashLen octets) 500 * 501 * The output PRK is calculated as follows: 502 * 503 * PRK = HMAC-Hash(salt, IKM) 504 */ 505 static int HKDF_Extract(OSSL_LIB_CTX *libctx, const EVP_MD *evp_md, 506 const unsigned char *salt, size_t salt_len, 507 const unsigned char *ikm, size_t ikm_len, 508 unsigned char *prk, size_t prk_len) 509 { 510 int sz = EVP_MD_get_size(evp_md); 511 512 if (sz <= 0) 513 return 0; 514 if (prk_len != (size_t)sz) { 515 ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_OUTPUT_BUFFER_SIZE); 516 return 0; 517 } 518 /* calc: PRK = HMAC-Hash(salt, IKM) */ 519 return EVP_Q_mac(libctx, "HMAC", NULL, EVP_MD_get0_name(evp_md), NULL, salt, 520 salt_len, ikm, ikm_len, prk, EVP_MD_get_size(evp_md), NULL) 521 != NULL; 522 } 523 524 /* 525 * Refer to "HMAC-based Extract-and-Expand Key Derivation Function (HKDF)" 526 * Section 2.3 (https://tools.ietf.org/html/rfc5869#section-2.3). 527 * 528 * 2.3. Step 2: Expand 529 * 530 * HKDF-Expand(PRK, info, L) -> OKM 531 * 532 * Options: 533 * Hash a hash function; HashLen denotes the length of the 534 * hash function output in octets 535 * 536 * Inputs: 537 * PRK a pseudorandom key of at least HashLen octets 538 * (usually, the output from the extract step) 539 * info optional context and application specific information 540 * (can be a zero-length string) 541 * L length of output keying material in octets 542 * (<= 255*HashLen) 543 * 544 * Output: 545 * OKM output keying material (of L octets) 546 * 547 * The output OKM is calculated as follows: 548 * 549 * N = ceil(L/HashLen) 550 * T = T(1) | T(2) | T(3) | ... | T(N) 551 * OKM = first L octets of T 552 * 553 * where: 554 * T(0) = empty string (zero length) 555 * T(1) = HMAC-Hash(PRK, T(0) | info | 0x01) 556 * T(2) = HMAC-Hash(PRK, T(1) | info | 0x02) 557 * T(3) = HMAC-Hash(PRK, T(2) | info | 0x03) 558 * ... 559 * 560 * (where the constant concatenated to the end of each T(n) is a 561 * single octet.) 562 */ 563 static int HKDF_Expand(const EVP_MD *evp_md, 564 const unsigned char *prk, size_t prk_len, 565 const unsigned char *info, size_t info_len, 566 unsigned char *okm, size_t okm_len) 567 { 568 HMAC_CTX *hmac; 569 int ret = 0, sz; 570 unsigned int i; 571 unsigned char prev[EVP_MAX_MD_SIZE]; 572 size_t done_len = 0, dig_len, n; 573 574 sz = EVP_MD_get_size(evp_md); 575 if (sz <= 0) 576 return 0; 577 dig_len = (size_t)sz; 578 579 /* calc: N = ceil(L/HashLen) */ 580 n = okm_len / dig_len; 581 if (okm_len % dig_len) 582 n++; 583 584 if (n > 255 || okm == NULL) 585 return 0; 586 587 if ((hmac = HMAC_CTX_new()) == NULL) 588 return 0; 589 590 if (!HMAC_Init_ex(hmac, prk, prk_len, evp_md, NULL)) 591 goto err; 592 593 for (i = 1; i <= n; i++) { 594 size_t copy_len; 595 const unsigned char ctr = i; 596 597 /* calc: T(i) = HMAC-Hash(PRK, T(i - 1) | info | i) */ 598 if (i > 1) { 599 if (!HMAC_Init_ex(hmac, NULL, 0, NULL, NULL)) 600 goto err; 601 602 if (!HMAC_Update(hmac, prev, dig_len)) 603 goto err; 604 } 605 606 if (!HMAC_Update(hmac, info, info_len)) 607 goto err; 608 609 if (!HMAC_Update(hmac, &ctr, 1)) 610 goto err; 611 612 if (!HMAC_Final(hmac, prev, NULL)) 613 goto err; 614 615 copy_len = (dig_len > okm_len - done_len) ? okm_len - done_len : dig_len; 616 617 memcpy(okm + done_len, prev, copy_len); 618 619 done_len += copy_len; 620 } 621 ret = 1; 622 623 err: 624 OPENSSL_cleanse(prev, sizeof(prev)); 625 HMAC_CTX_free(hmac); 626 return ret; 627 } 628 629 /* 630 * TLS uses slight variations of the above and for FIPS validation purposes, 631 * they need to be present here. 632 * Refer to RFC 8446 section 7 for specific details. 633 */ 634 635 /* 636 * Given a |secret|; a |label| of length |labellen|; and |data| of length 637 * |datalen| (e.g. typically a hash of the handshake messages), derive a new 638 * secret |outlen| bytes long and store it in the location pointed to be |out|. 639 * The |data| value may be zero length. Returns 1 on success and 0 on failure. 640 */ 641 static int prov_tls13_hkdf_expand(const EVP_MD *md, 642 const unsigned char *key, size_t keylen, 643 const unsigned char *prefix, size_t prefixlen, 644 const unsigned char *label, size_t labellen, 645 const unsigned char *data, size_t datalen, 646 unsigned char *out, size_t outlen) 647 { 648 size_t hkdflabellen; 649 unsigned char hkdflabel[HKDF_MAXBUF]; 650 WPACKET pkt; 651 652 /* 653 * 2 bytes for length of derived secret + 1 byte for length of combined 654 * prefix and label + bytes for the label itself + 1 byte length of hash 655 * + bytes for the hash itself. We've got the maximum the KDF can handle 656 * which should always be sufficient. 657 */ 658 if (!WPACKET_init_static_len(&pkt, hkdflabel, sizeof(hkdflabel), 0) 659 || !WPACKET_put_bytes_u16(&pkt, outlen) 660 || !WPACKET_start_sub_packet_u8(&pkt) 661 || !WPACKET_memcpy(&pkt, prefix, prefixlen) 662 || !WPACKET_memcpy(&pkt, label, labellen) 663 || !WPACKET_close(&pkt) 664 || !WPACKET_sub_memcpy_u8(&pkt, data, (data == NULL) ? 0 : datalen) 665 || !WPACKET_get_total_written(&pkt, &hkdflabellen) 666 || !WPACKET_finish(&pkt)) { 667 WPACKET_cleanup(&pkt); 668 return 0; 669 } 670 671 return HKDF_Expand(md, key, keylen, hkdflabel, hkdflabellen, 672 out, outlen); 673 } 674 675 static int prov_tls13_hkdf_generate_secret(OSSL_LIB_CTX *libctx, 676 const EVP_MD *md, 677 const unsigned char *prevsecret, 678 size_t prevsecretlen, 679 const unsigned char *insecret, 680 size_t insecretlen, 681 const unsigned char *prefix, 682 size_t prefixlen, 683 const unsigned char *label, 684 size_t labellen, 685 unsigned char *out, size_t outlen) 686 { 687 size_t mdlen; 688 int ret; 689 unsigned char preextractsec[EVP_MAX_MD_SIZE]; 690 /* Always filled with zeros */ 691 static const unsigned char default_zeros[EVP_MAX_MD_SIZE]; 692 693 ret = EVP_MD_get_size(md); 694 /* Ensure cast to size_t is safe */ 695 if (ret <= 0) 696 return 0; 697 mdlen = (size_t)ret; 698 699 if (insecret == NULL) { 700 insecret = default_zeros; 701 insecretlen = mdlen; 702 } 703 if (prevsecret == NULL) { 704 prevsecret = default_zeros; 705 prevsecretlen = mdlen; 706 } else { 707 EVP_MD_CTX *mctx = EVP_MD_CTX_new(); 708 unsigned char hash[EVP_MAX_MD_SIZE]; 709 710 /* The pre-extract derive step uses a hash of no messages */ 711 if (mctx == NULL 712 || EVP_DigestInit_ex(mctx, md, NULL) <= 0 713 || EVP_DigestFinal_ex(mctx, hash, NULL) <= 0) { 714 EVP_MD_CTX_free(mctx); 715 return 0; 716 } 717 EVP_MD_CTX_free(mctx); 718 719 /* Generate the pre-extract secret */ 720 if (!prov_tls13_hkdf_expand(md, prevsecret, prevsecretlen, 721 prefix, prefixlen, label, labellen, 722 hash, mdlen, preextractsec, mdlen)) 723 return 0; 724 prevsecret = preextractsec; 725 prevsecretlen = mdlen; 726 } 727 728 ret = HKDF_Extract(libctx, md, prevsecret, prevsecretlen, 729 insecret, insecretlen, out, outlen); 730 731 if (prevsecret == preextractsec) 732 OPENSSL_cleanse(preextractsec, mdlen); 733 return ret; 734 } 735 736 #ifdef FIPS_MODULE 737 static int fips_tls1_3_digest_check_passed(KDF_HKDF *ctx, const EVP_MD *md) 738 { 739 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx); 740 /* 741 * Perform digest check 742 * 743 * According to RFC 8446 appendix B.4, the valid hash functions are 744 * specified in FIPS 180-4. However, it only lists SHA2-256 and SHA2-384 in 745 * the table. ACVP also only lists the same set of hash functions. 746 */ 747 int digest_unapproved = !EVP_MD_is_a(md, SN_sha256) 748 && !EVP_MD_is_a(md, SN_sha384); 749 750 if (digest_unapproved) { 751 if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0, 752 libctx, "TLS13 KDF", "Digest", 753 ossl_fips_config_tls13_kdf_digest_check)) { 754 ERR_raise(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED); 755 return 0; 756 } 757 } 758 return 1; 759 } 760 761 /* 762 * Calculate the correct length of the secret key. 763 * 764 * RFC 8446: 765 * If a given secret is not available, then the 0-value consisting of a 766 * string of Hash.length bytes set to zeros is used. 767 */ 768 static size_t fips_tls1_3_key_size(KDF_HKDF *ctx) 769 { 770 const EVP_MD *md = ossl_prov_digest_md(&ctx->digest); 771 size_t key_size = 0; 772 773 if (ctx->key != NULL) 774 key_size = ctx->key_len; 775 else if (md != NULL) 776 key_size = EVP_MD_size(md); 777 778 return key_size; 779 } 780 781 static int fips_tls1_3_key_check_passed(KDF_HKDF *ctx) 782 { 783 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx); 784 int key_approved = ossl_kdf_check_key_size(fips_tls1_3_key_size(ctx)); 785 786 if (!key_approved) { 787 if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE1, 788 libctx, "TLS13 KDF", "Key size", 789 ossl_fips_config_tls13_kdf_key_check)) { 790 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH); 791 return 0; 792 } 793 } 794 return 1; 795 } 796 #endif 797 798 static int kdf_tls1_3_derive(void *vctx, unsigned char *key, size_t keylen, 799 const OSSL_PARAM params[]) 800 { 801 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 802 const EVP_MD *md; 803 804 if (!ossl_prov_is_running() || !kdf_tls1_3_set_ctx_params(ctx, params)) 805 return 0; 806 807 md = ossl_prov_digest_md(&ctx->digest); 808 if (md == NULL) { 809 ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST); 810 return 0; 811 } 812 813 switch (ctx->mode) { 814 default: 815 return 0; 816 817 case EVP_KDF_HKDF_MODE_EXTRACT_ONLY: 818 return prov_tls13_hkdf_generate_secret(PROV_LIBCTX_OF(ctx->provctx), 819 md, 820 ctx->salt, ctx->salt_len, 821 ctx->key, ctx->key_len, 822 ctx->prefix, ctx->prefix_len, 823 ctx->label, ctx->label_len, 824 key, keylen); 825 826 case EVP_KDF_HKDF_MODE_EXPAND_ONLY: 827 return prov_tls13_hkdf_expand(md, ctx->key, ctx->key_len, 828 ctx->prefix, ctx->prefix_len, 829 ctx->label, ctx->label_len, 830 ctx->data, ctx->data_len, 831 key, keylen); 832 } 833 } 834 835 static int kdf_tls1_3_set_ctx_params(void *vctx, const OSSL_PARAM params[]) 836 { 837 const OSSL_PARAM *p; 838 KDF_HKDF *ctx = vctx; 839 840 if (ossl_param_is_empty(params)) 841 return 1; 842 843 if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, params, 844 OSSL_KDF_PARAM_FIPS_DIGEST_CHECK)) 845 return 0; 846 if (!OSSL_FIPS_IND_SET_CTX_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1, params, 847 OSSL_KDF_PARAM_FIPS_KEY_CHECK)) 848 return 0; 849 850 if (!hkdf_common_set_ctx_params(ctx, params)) 851 return 0; 852 853 if (ctx->mode == EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND) { 854 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE); 855 return 0; 856 } 857 858 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_PREFIX)) != NULL) { 859 OPENSSL_free(ctx->prefix); 860 ctx->prefix = NULL; 861 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->prefix, 0, 862 &ctx->prefix_len)) 863 return 0; 864 } 865 866 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_LABEL)) != NULL) { 867 OPENSSL_free(ctx->label); 868 ctx->label = NULL; 869 if (!OSSL_PARAM_get_octet_string(p, (void **)&ctx->label, 0, 870 &ctx->label_len)) 871 return 0; 872 } 873 874 OPENSSL_clear_free(ctx->data, ctx->data_len); 875 ctx->data = NULL; 876 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_DATA)) != NULL 877 && !OSSL_PARAM_get_octet_string(p, (void **)&ctx->data, 0, 878 &ctx->data_len)) 879 return 0; 880 881 #ifdef FIPS_MODULE 882 if (OSSL_PARAM_locate_const(params, OSSL_ALG_PARAM_DIGEST) != NULL) { 883 const EVP_MD *md = ossl_prov_digest_md(&ctx->digest); 884 885 if (!fips_tls1_3_digest_check_passed(ctx, md)) 886 return 0; 887 } 888 889 if ((p = OSSL_PARAM_locate_const(params, OSSL_KDF_PARAM_KEY)) != NULL) 890 if (!fips_tls1_3_key_check_passed(ctx)) 891 return 0; 892 #endif 893 894 return 1; 895 } 896 897 static const OSSL_PARAM *kdf_tls1_3_settable_ctx_params(ossl_unused void *ctx, 898 ossl_unused void *provctx) 899 { 900 static const OSSL_PARAM known_settable_ctx_params[] = { 901 HKDF_COMMON_SETTABLES, 902 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_PREFIX, NULL, 0), 903 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_LABEL, NULL, 0), 904 OSSL_PARAM_octet_string(OSSL_KDF_PARAM_DATA, NULL, 0), 905 OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_DIGEST_CHECK) 906 OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_KDF_PARAM_FIPS_KEY_CHECK) 907 OSSL_PARAM_END 908 }; 909 return known_settable_ctx_params; 910 } 911 912 static int kdf_tls1_3_get_ctx_params(void *vctx, OSSL_PARAM params[]) 913 { 914 KDF_HKDF *ctx = (KDF_HKDF *)vctx; 915 916 if (ossl_param_is_empty(params)) 917 return 1; 918 919 if (!hkdf_common_get_ctx_params(ctx, params)) 920 return 0; 921 922 if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, params)) 923 return 0; 924 925 return 1; 926 } 927 928 static const OSSL_PARAM *kdf_tls1_3_gettable_ctx_params(ossl_unused void *ctx, 929 ossl_unused void *provctx) 930 { 931 static const OSSL_PARAM known_gettable_ctx_params[] = { 932 HKDF_COMMON_GETTABLES, 933 OSSL_FIPS_IND_GETTABLE_CTX_PARAM() 934 OSSL_PARAM_END 935 }; 936 return known_gettable_ctx_params; 937 } 938 939 const OSSL_DISPATCH ossl_kdf_tls1_3_kdf_functions[] = { 940 { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_hkdf_new }, 941 { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))kdf_hkdf_dup }, 942 { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_hkdf_free }, 943 { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_hkdf_reset }, 944 { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_tls1_3_derive }, 945 { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS, 946 (void (*)(void))kdf_tls1_3_settable_ctx_params }, 947 { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_tls1_3_set_ctx_params }, 948 { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS, 949 (void (*)(void))kdf_tls1_3_gettable_ctx_params }, 950 { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_tls1_3_get_ctx_params }, 951 OSSL_DISPATCH_END 952 }; 953