Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/providers/implementations/kdfs/hkdf.c
106846 views
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
954