Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/kdfs/sskdf.c
Line
Count
Source
1
/*
2
 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright (c) 2019, Oracle and/or its affiliates.  All rights reserved.
4
 *
5
 * Licensed under the Apache License 2.0 (the "License").  You may not use
6
 * this file except in compliance with the License.  You can obtain a copy
7
 * in the file LICENSE in the source distribution or at
8
 * https://www.openssl.org/source/license.html
9
 */
10
/* clang-format off */
11
12
/* clang-format on */
13
14
/*
15
 * Refer to https://csrc.nist.gov/publications/detail/sp/800-56c/rev-1/final
16
 * Section 4.1.
17
 *
18
 * The Single Step KDF algorithm is given by:
19
 *
20
 * Result(0) = empty bit string (i.e., the null string).
21
 * For i = 1 to reps, do the following:
22
 *   Increment counter by 1.
23
 *   Result(i) = Result(i - 1) || H(counter || Z || FixedInfo).
24
 * DKM = LeftmostBits(Result(reps), L))
25
 *
26
 * NOTES:
27
 *   Z is a shared secret required to produce the derived key material.
28
 *   counter is a 4 byte buffer.
29
 *   FixedInfo is a bit string containing context specific data.
30
 *   DKM is the output derived key material.
31
 *   L is the required size of the DKM.
32
 *   reps = [L / H_outputBits]
33
 *   H(x) is the auxiliary function that can be either a hash, HMAC or KMAC.
34
 *   H_outputBits is the length of the output of the auxiliary function H(x).
35
 *
36
 * Currently there is not a comprehensive list of test vectors for this
37
 * algorithm, especially for H(x) = HMAC and H(x) = KMAC.
38
 * Test vectors for H(x) = Hash are indirectly used by CAVS KAS tests.
39
 */
40
#include <stdlib.h>
41
#include <stdarg.h>
42
#include <string.h>
43
#include <openssl/hmac.h>
44
#include <openssl/evp.h>
45
#include <openssl/kdf.h>
46
#include <openssl/core_names.h>
47
#include <openssl/params.h>
48
#include <openssl/proverr.h>
49
#include "internal/cryptlib.h"
50
#include "internal/numbers.h"
51
#include "crypto/evp.h"
52
#include "prov/provider_ctx.h"
53
#include "prov/providercommon.h"
54
#include "prov/implementations.h"
55
#include "prov/provider_util.h"
56
#include "prov/securitycheck.h"
57
#include "internal/params.h"
58
59
typedef struct {
60
    void *provctx;
61
    EVP_MAC_CTX *macctx; /* H(x) = HMAC_hash OR H(x) = KMAC */
62
    PROV_DIGEST digest; /* H(x) = hash(x) */
63
    unsigned char *secret;
64
    size_t secret_len;
65
    unsigned char *info;
66
    size_t info_len;
67
    unsigned char *salt;
68
    size_t salt_len;
69
    size_t out_len; /* optional KMAC parameter */
70
    int is_kmac;
71
    OSSL_FIPS_IND_DECLARE
72
} KDF_SSKDF;
73
74
294
#define SSKDF_MAX_INLEN (1 << 30)
75
3
#define SSKDF_KMAC128_DEFAULT_SALT_SIZE (168 - 4)
76
35
#define SSKDF_KMAC256_DEFAULT_SALT_SIZE (136 - 4)
77
78
0
#define SSKDF_MAX_INFOS 5
79
80
/* KMAC uses a Customisation string of 'KDF' */
81
static const unsigned char kmac_custom_str[] = { 0x4B, 0x44, 0x46 };
82
83
static OSSL_FUNC_kdf_newctx_fn sskdf_new;
84
static OSSL_FUNC_kdf_dupctx_fn sskdf_dup;
85
static OSSL_FUNC_kdf_freectx_fn sskdf_free;
86
static OSSL_FUNC_kdf_reset_fn sskdf_reset;
87
static OSSL_FUNC_kdf_derive_fn sskdf_derive;
88
static OSSL_FUNC_kdf_settable_ctx_params_fn sskdf_settable_ctx_params;
89
static OSSL_FUNC_kdf_set_ctx_params_fn sskdf_set_ctx_params;
90
static OSSL_FUNC_kdf_gettable_ctx_params_fn sskdf_common_gettable_ctx_params;
91
static OSSL_FUNC_kdf_get_ctx_params_fn sskdf_common_get_ctx_params;
92
static OSSL_FUNC_kdf_derive_fn x963kdf_derive;
93
static OSSL_FUNC_kdf_settable_ctx_params_fn x963kdf_settable_ctx_params;
94
static OSSL_FUNC_kdf_set_ctx_params_fn x963kdf_set_ctx_params;
95
96
/*
97
 * Refer to https://csrc.nist.gov/publications/detail/sp/800-56c/rev-1/final
98
 * Section 4. One-Step Key Derivation using H(x) = hash(x)
99
 * Note: X9.63 also uses this code with the only difference being that the
100
 * counter is appended to the secret 'z'.
101
 * i.e.
102
 *   result[i] = Hash(counter || z || info) for One Step OR
103
 *   result[i] = Hash(z || counter || info) for X9.63.
104
 */
105
static int SSKDF_hash_kdm(const EVP_MD *kdf_md,
106
    const unsigned char *z, size_t z_len,
107
    const unsigned char *info, size_t info_len,
108
    unsigned int append_ctr,
109
    unsigned char *derived_key, size_t derived_key_len)
110
0
{
111
0
    int ret = 0, hlen;
112
0
    size_t counter, out_len, len = derived_key_len;
113
0
    unsigned char c[4];
114
0
    unsigned char mac[EVP_MAX_MD_SIZE];
115
0
    unsigned char *out = derived_key;
116
0
    EVP_MD_CTX *ctx = NULL, *ctx_init = NULL;
117
118
0
    if (z_len > SSKDF_MAX_INLEN || info_len > SSKDF_MAX_INLEN
119
0
        || derived_key_len > SSKDF_MAX_INLEN
120
0
        || derived_key_len == 0)
121
0
        return 0;
122
123
0
    hlen = EVP_MD_get_size(kdf_md);
124
0
    if (hlen <= 0)
125
0
        return 0;
126
0
    out_len = (size_t)hlen;
127
128
0
    ctx = EVP_MD_CTX_create();
129
0
    ctx_init = EVP_MD_CTX_create();
130
0
    if (ctx == NULL || ctx_init == NULL)
131
0
        goto end;
132
133
0
    if (!EVP_DigestInit(ctx_init, kdf_md))
134
0
        goto end;
135
136
0
    for (counter = 1;; counter++) {
137
0
        c[0] = (unsigned char)((counter >> 24) & 0xff);
138
0
        c[1] = (unsigned char)((counter >> 16) & 0xff);
139
0
        c[2] = (unsigned char)((counter >> 8) & 0xff);
140
0
        c[3] = (unsigned char)(counter & 0xff);
141
142
0
        if (!(EVP_MD_CTX_copy_ex(ctx, ctx_init)
143
0
                && (append_ctr || EVP_DigestUpdate(ctx, c, sizeof(c)))
144
0
                && EVP_DigestUpdate(ctx, z, z_len)
145
0
                && (!append_ctr || EVP_DigestUpdate(ctx, c, sizeof(c)))
146
0
                && EVP_DigestUpdate(ctx, info, info_len)))
147
0
            goto end;
148
0
        if (len >= out_len) {
149
0
            if (!EVP_DigestFinal_ex(ctx, out, NULL))
150
0
                goto end;
151
0
            out += out_len;
152
0
            len -= out_len;
153
0
            if (len == 0)
154
0
                break;
155
0
        } else {
156
0
            if (!EVP_DigestFinal_ex(ctx, mac, NULL))
157
0
                goto end;
158
0
            memcpy(out, mac, len);
159
0
            break;
160
0
        }
161
0
    }
162
0
    ret = 1;
163
0
end:
164
0
    EVP_MD_CTX_destroy(ctx);
165
0
    EVP_MD_CTX_destroy(ctx_init);
166
0
    OPENSSL_cleanse(mac, sizeof(mac));
167
0
    return ret;
168
0
}
169
170
static int kmac_init(EVP_MAC_CTX *ctx, const unsigned char *custom,
171
    size_t custom_len, size_t kmac_out_len,
172
    size_t derived_key_len, unsigned char **out)
173
49
{
174
49
    OSSL_PARAM params[2];
175
176
    /* Only KMAC has custom data - so return if not KMAC */
177
49
    if (custom == NULL)
178
11
        return 1;
179
180
38
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_CUSTOM,
181
38
        (void *)custom, custom_len);
182
38
    params[1] = OSSL_PARAM_construct_end();
183
184
38
    if (!EVP_MAC_CTX_set_params(ctx, params))
185
0
        return 0;
186
187
    /* By default only do one iteration if kmac_out_len is not specified */
188
38
    if (kmac_out_len == 0)
189
0
        kmac_out_len = derived_key_len;
190
    /* otherwise check the size is valid */
191
38
    else if (!(kmac_out_len == derived_key_len
192
34
                 || kmac_out_len == 20
193
20
                 || kmac_out_len == 28
194
18
                 || kmac_out_len == 32
195
18
                 || kmac_out_len == 48
196
13
                 || kmac_out_len == 64))
197
10
        return 0;
198
199
28
    params[0] = OSSL_PARAM_construct_size_t(OSSL_MAC_PARAM_SIZE,
200
28
        &kmac_out_len);
201
202
28
    if (EVP_MAC_CTX_set_params(ctx, params) <= 0)
203
0
        return 0;
204
205
    /*
206
     * For kmac the output buffer can be larger than EVP_MAX_MD_SIZE: so
207
     * alloc a buffer for this case.
208
     */
209
28
    if (kmac_out_len > EVP_MAX_MD_SIZE) {
210
0
        *out = OPENSSL_zalloc(kmac_out_len);
211
0
        if (*out == NULL)
212
0
            return 0;
213
0
    }
214
28
    return 1;
215
28
}
216
217
/*
218
 * Refer to https://csrc.nist.gov/publications/detail/sp/800-56c/rev-1/final
219
 * Section 4. One-Step Key Derivation using MAC: i.e either
220
 *     H(x) = HMAC-hash(salt, x) OR
221
 *     H(x) = KMAC#(salt, x, outbits, CustomString='KDF')
222
 */
223
static int SSKDF_mac_kdm(EVP_MAC_CTX *ctx_init,
224
    const unsigned char *kmac_custom,
225
    size_t kmac_custom_len, size_t kmac_out_len,
226
    const unsigned char *salt, size_t salt_len,
227
    const unsigned char *z, size_t z_len,
228
    const unsigned char *info, size_t info_len,
229
    unsigned char *derived_key, size_t derived_key_len)
230
49
{
231
49
    int ret = 0;
232
49
    size_t counter, out_len, len;
233
49
    unsigned char c[4];
234
49
    unsigned char mac_buf[EVP_MAX_MD_SIZE];
235
49
    unsigned char *out = derived_key;
236
49
    EVP_MAC_CTX *ctx = NULL;
237
49
    unsigned char *mac = mac_buf, *kmac_buffer = NULL;
238
239
49
    if (z_len > SSKDF_MAX_INLEN || info_len > SSKDF_MAX_INLEN
240
49
        || derived_key_len > SSKDF_MAX_INLEN
241
49
        || derived_key_len == 0)
242
0
        return 0;
243
244
49
    if (!kmac_init(ctx_init, kmac_custom, kmac_custom_len, kmac_out_len,
245
49
            derived_key_len, &kmac_buffer))
246
10
        goto end;
247
39
    if (kmac_buffer != NULL)
248
0
        mac = kmac_buffer;
249
250
39
    if (!EVP_MAC_init(ctx_init, salt, salt_len, NULL))
251
4
        goto end;
252
253
35
    out_len = EVP_MAC_CTX_get_mac_size(ctx_init); /* output size */
254
35
    if (out_len <= 0 || (mac == mac_buf && out_len > sizeof(mac_buf)))
255
0
        goto end;
256
35
    len = derived_key_len;
257
258
51
    for (counter = 1;; counter++) {
259
51
        c[0] = (unsigned char)((counter >> 24) & 0xff);
260
51
        c[1] = (unsigned char)((counter >> 16) & 0xff);
261
51
        c[2] = (unsigned char)((counter >> 8) & 0xff);
262
51
        c[3] = (unsigned char)(counter & 0xff);
263
264
51
        ctx = EVP_MAC_CTX_dup(ctx_init);
265
51
        if (!(ctx != NULL
266
51
                && EVP_MAC_update(ctx, c, sizeof(c))
267
51
                && EVP_MAC_update(ctx, z, z_len)
268
51
                && EVP_MAC_update(ctx, info, info_len)))
269
0
            goto end;
270
51
        if (len >= out_len) {
271
21
            if (!EVP_MAC_final(ctx, out, NULL, len))
272
0
                goto end;
273
21
            out += out_len;
274
21
            len -= out_len;
275
21
            if (len == 0)
276
5
                break;
277
30
        } else {
278
30
            if (!EVP_MAC_final(ctx, mac, NULL, out_len))
279
0
                goto end;
280
30
            memcpy(out, mac, len);
281
30
            break;
282
30
        }
283
16
        EVP_MAC_CTX_free(ctx);
284
16
        ctx = NULL;
285
16
    }
286
35
    ret = 1;
287
49
end:
288
49
    if (kmac_buffer != NULL)
289
0
        OPENSSL_clear_free(kmac_buffer, kmac_out_len);
290
49
    else
291
49
        OPENSSL_cleanse(mac_buf, sizeof(mac_buf));
292
293
49
    EVP_MAC_CTX_free(ctx);
294
49
    return ret;
295
35
}
296
297
static void *sskdf_new(void *provctx)
298
116
{
299
116
    KDF_SSKDF *ctx;
300
301
116
    if (!ossl_prov_is_running())
302
0
        return NULL;
303
304
116
    if ((ctx = OPENSSL_zalloc(sizeof(*ctx))) != NULL) {
305
116
        ctx->provctx = provctx;
306
116
        OSSL_FIPS_IND_INIT(ctx)
307
116
    }
308
116
    return ctx;
309
116
}
310
311
static void sskdf_reset(void *vctx)
312
116
{
313
116
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
314
116
    void *provctx = ctx->provctx;
315
316
116
    EVP_MAC_CTX_free(ctx->macctx);
317
116
    ossl_prov_digest_reset(&ctx->digest);
318
116
    OPENSSL_clear_free(ctx->secret, ctx->secret_len);
319
116
    OPENSSL_clear_free(ctx->info, ctx->info_len);
320
116
    OPENSSL_clear_free(ctx->salt, ctx->salt_len);
321
116
    memset(ctx, 0, sizeof(*ctx));
322
116
    ctx->provctx = provctx;
323
116
}
324
325
static void sskdf_free(void *vctx)
326
116
{
327
116
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
328
329
116
    if (ctx != NULL) {
330
116
        sskdf_reset(ctx);
331
116
        OPENSSL_free(ctx);
332
116
    }
333
116
}
334
335
static void *sskdf_dup(void *vctx)
336
0
{
337
0
    const KDF_SSKDF *src = (const KDF_SSKDF *)vctx;
338
0
    KDF_SSKDF *dest;
339
340
0
    dest = sskdf_new(src->provctx);
341
0
    if (dest != NULL) {
342
0
        if (src->macctx != NULL) {
343
0
            dest->macctx = EVP_MAC_CTX_dup(src->macctx);
344
0
            if (dest->macctx == NULL)
345
0
                goto err;
346
0
        }
347
0
        if (!ossl_prov_memdup(src->info, src->info_len,
348
0
                &dest->info, &dest->info_len)
349
0
            || !ossl_prov_memdup(src->salt, src->salt_len,
350
0
                &dest->salt, &dest->salt_len)
351
0
            || !ossl_prov_memdup(src->secret, src->secret_len,
352
0
                &dest->secret, &dest->secret_len)
353
0
            || !ossl_prov_digest_copy(&dest->digest, &src->digest))
354
0
            goto err;
355
0
        dest->out_len = src->out_len;
356
0
        dest->is_kmac = src->is_kmac;
357
0
        OSSL_FIPS_IND_COPY(dest, src)
358
0
    }
359
0
    return dest;
360
361
0
err:
362
0
    sskdf_free(dest);
363
0
    return NULL;
364
0
}
365
366
static size_t sskdf_size(KDF_SSKDF *ctx)
367
0
{
368
0
    int len;
369
0
    const EVP_MD *md = NULL;
370
371
0
    if (ctx->is_kmac)
372
0
        return SIZE_MAX;
373
374
0
    md = ossl_prov_digest_md(&ctx->digest);
375
0
    if (md == NULL) {
376
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
377
0
        return 0;
378
0
    }
379
0
    len = EVP_MD_get_size(md);
380
0
    return (len <= 0) ? 0 : (size_t)len;
381
0
}
382
383
#ifdef FIPS_MODULE
384
static int fips_sskdf_key_check_passed(KDF_SSKDF *ctx)
385
{
386
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
387
    int key_approved = ossl_kdf_check_key_size(ctx->secret_len);
388
389
    if (!key_approved) {
390
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
391
                libctx, "SSKDF", "Key size",
392
                ossl_fips_config_sskdf_key_check)) {
393
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
394
            return 0;
395
        }
396
    }
397
    return 1;
398
}
399
#endif
400
401
static int sskdf_derive(void *vctx, unsigned char *key, size_t keylen,
402
    const OSSL_PARAM params[])
403
55
{
404
55
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
405
55
    const EVP_MD *md;
406
407
55
    if (!ossl_prov_is_running() || !sskdf_set_ctx_params(ctx, params))
408
0
        return 0;
409
55
    if (ctx->secret == NULL) {
410
2
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
411
2
        return 0;
412
2
    }
413
414
53
    md = ossl_prov_digest_md(&ctx->digest);
415
416
53
    if (ctx->macctx != NULL) {
417
        /* H(x) = KMAC or H(x) = HMAC */
418
53
        int ret;
419
53
        const unsigned char *custom = NULL;
420
53
        size_t custom_len = 0;
421
53
        int default_salt_len;
422
53
        EVP_MAC *mac = EVP_MAC_CTX_get0_mac(ctx->macctx);
423
424
53
        if (EVP_MAC_is_a(mac, OSSL_MAC_NAME_HMAC)) {
425
            /* H(x) = HMAC(x, salt, hash) */
426
13
            if (md == NULL) {
427
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
428
0
                return 0;
429
0
            }
430
13
            default_salt_len = EVP_MD_get_size(md);
431
13
            if (default_salt_len <= 0)
432
2
                return 0;
433
40
        } else if (ctx->is_kmac) {
434
            /* H(x) = KMACzzz(x, salt, custom) */
435
38
            custom = kmac_custom_str;
436
38
            custom_len = sizeof(kmac_custom_str);
437
38
            if (EVP_MAC_is_a(mac, OSSL_MAC_NAME_KMAC128))
438
3
                default_salt_len = SSKDF_KMAC128_DEFAULT_SALT_SIZE;
439
35
            else
440
35
                default_salt_len = SSKDF_KMAC256_DEFAULT_SALT_SIZE;
441
38
        } else {
442
2
            ERR_raise(ERR_LIB_PROV, PROV_R_UNSUPPORTED_MAC_TYPE);
443
2
            return 0;
444
2
        }
445
        /* If no salt is set then use a default_salt of zeros */
446
49
        if (ctx->salt == NULL || ctx->salt_len <= 0) {
447
15
            ctx->salt = OPENSSL_zalloc(default_salt_len);
448
15
            if (ctx->salt == NULL)
449
0
                return 0;
450
15
            ctx->salt_len = default_salt_len;
451
15
        }
452
49
        ret = SSKDF_mac_kdm(ctx->macctx,
453
49
            custom, custom_len, ctx->out_len,
454
49
            ctx->salt, ctx->salt_len,
455
49
            ctx->secret, ctx->secret_len,
456
49
            ctx->info, ctx->info_len, key, keylen);
457
49
        return ret;
458
49
    } else {
459
        /* H(x) = hash */
460
0
        if (md == NULL) {
461
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
462
0
            return 0;
463
0
        }
464
0
        return SSKDF_hash_kdm(md, ctx->secret, ctx->secret_len,
465
0
            ctx->info, ctx->info_len, 0, key, keylen);
466
0
    }
467
53
}
468
469
#ifdef FIPS_MODULE
470
static int fips_x963kdf_digest_check_passed(KDF_SSKDF *ctx, const EVP_MD *md)
471
{
472
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
473
    /*
474
     * Perform digest check
475
     *
476
     * X963KDF is a KDF defined in ANSI-X9.63. According to ACVP specification
477
     * section 7.3.1, only SHA-2 and SHA-3 can be regarded as valid hash
478
     * functions.
479
     */
480
    int digest_unapproved = (ctx->is_kmac != 1) && EVP_MD_is_a(md, SN_sha1);
481
482
    if (digest_unapproved) {
483
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
484
                libctx, "X963KDF", "Digest",
485
                ossl_fips_config_x963kdf_digest_check)) {
486
            ERR_raise(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED);
487
            return 0;
488
        }
489
    }
490
    return 1;
491
}
492
493
static int fips_x963kdf_key_check_passed(KDF_SSKDF *ctx)
494
{
495
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
496
    int key_approved = ossl_kdf_check_key_size(ctx->secret_len);
497
498
    if (!key_approved) {
499
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE1,
500
                libctx, "X963KDF", "Key size",
501
                ossl_fips_config_x963kdf_key_check)) {
502
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
503
            return 0;
504
        }
505
    }
506
    return 1;
507
}
508
#endif
509
510
static int x963kdf_derive(void *vctx, unsigned char *key, size_t keylen,
511
    const OSSL_PARAM params[])
512
5
{
513
5
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
514
5
    const EVP_MD *md;
515
516
5
    if (!ossl_prov_is_running() || !x963kdf_set_ctx_params(ctx, params))
517
0
        return 0;
518
519
5
    if (ctx->secret == NULL) {
520
3
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
521
3
        return 0;
522
3
    }
523
524
2
    if (ctx->macctx != NULL) {
525
2
        ERR_raise(ERR_LIB_PROV, PROV_R_NOT_SUPPORTED);
526
2
        return 0;
527
2
    }
528
529
    /* H(x) = hash */
530
0
    md = ossl_prov_digest_md(&ctx->digest);
531
0
    if (md == NULL) {
532
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
533
0
        return 0;
534
0
    }
535
536
0
    return SSKDF_hash_kdm(md, ctx->secret, ctx->secret_len,
537
0
        ctx->info, ctx->info_len, 1, key, keylen);
538
0
}
539
540
struct sskdf_all_set_ctx_params_st {
541
    OSSL_PARAM *secret;
542
    OSSL_PARAM *propq;
543
    OSSL_PARAM *engine;
544
    OSSL_PARAM *digest;
545
    OSSL_PARAM *mac;
546
    OSSL_PARAM *salt;
547
    OSSL_PARAM *size;
548
#ifdef FIPS_MODULE
549
    OSSL_PARAM *ind_k;
550
    OSSL_PARAM *ind_d;
551
#endif
552
    OSSL_PARAM *info[SSKDF_MAX_INFOS];
553
    int num_info;
554
};
555
556
static int sskdf_common_set_ctx_params(KDF_SSKDF *ctx, struct sskdf_all_set_ctx_params_st *p,
557
    const OSSL_PARAM *params)
558
{
559
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(ctx->provctx);
560
    const EVP_MD *md = NULL;
561
    size_t sz;
562
    int r;
563
564
    if (!ossl_prov_macctx_load(&ctx->macctx,
565
            p->mac, NULL, p->digest, p->propq, p->engine,
566
            NULL, NULL, NULL, libctx))
567
        return 0;
568
    if (ctx->macctx != NULL) {
569
        if (EVP_MAC_is_a(EVP_MAC_CTX_get0_mac(ctx->macctx),
570
                OSSL_MAC_NAME_KMAC128)
571
            || EVP_MAC_is_a(EVP_MAC_CTX_get0_mac(ctx->macctx),
572
                OSSL_MAC_NAME_KMAC256)) {
573
            ctx->is_kmac = 1;
574
        }
575
    }
576
577
    if (p->digest != NULL) {
578
        if (!ossl_prov_digest_load(&ctx->digest, p->digest,
579
                p->propq, p->engine, libctx))
580
            return 0;
581
582
        md = ossl_prov_digest_md(&ctx->digest);
583
        if (EVP_MD_xof(md)) {
584
            ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
585
            return 0;
586
        }
587
    }
588
589
    r = ossl_param_get1_octet_string_from_param(p->secret, &ctx->secret,
590
        &ctx->secret_len);
591
    if (r == 0)
592
        return 0;
593
594
    if (ossl_param_get1_concat_octet_string(p->num_info, p->info, &ctx->info,
595
            &ctx->info_len)
596
        == 0)
597
        return 0;
598
599
    if (ossl_param_get1_octet_string_from_param(p->salt, &ctx->salt,
600
            &ctx->salt_len)
601
        == 0)
602
        return 0;
603
604
    if (p->size != NULL) {
605
        if (!OSSL_PARAM_get_size_t(p->size, &sz) || sz == 0)
606
            return 0;
607
        ctx->out_len = sz;
608
    }
609
    return 1;
610
}
611
612
#define sskdf_set_ctx_params_st sskdf_all_set_ctx_params_st
613
614
/* clang-format off */
615
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
616
#ifndef sskdf_set_ctx_params_list
617
static const OSSL_PARAM sskdf_set_ctx_params_list[] = {
618
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SECRET, NULL, 0),
619
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_KEY, NULL, 0),
620
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0),
621
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0),
622
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0),
623
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_MAC, NULL, 0),
624
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SALT, NULL, 0),
625
    OSSL_PARAM_size_t(OSSL_KDF_PARAM_MAC_SIZE, NULL),
626
# if defined(FIPS_MODULE)
627
    OSSL_PARAM_int(OSSL_KDF_PARAM_FIPS_KEY_CHECK, NULL),
628
# endif
629
    OSSL_PARAM_END
630
};
631
#endif
632
633
#ifndef sskdf_set_ctx_params_st
634
struct sskdf_set_ctx_params_st {
635
    OSSL_PARAM *digest;
636
    OSSL_PARAM *engine;
637
# if defined(FIPS_MODULE)
638
    OSSL_PARAM *ind_k;
639
# endif
640
    OSSL_PARAM *info[SSKDF_MAX_INFOS];
641
    int num_info;
642
    OSSL_PARAM *mac;
643
    OSSL_PARAM *propq;
644
    OSSL_PARAM *salt;
645
    OSSL_PARAM *secret;
646
    OSSL_PARAM *size;
647
};
648
#endif
649
650
#ifndef sskdf_set_ctx_params_decoder
651
static int sskdf_set_ctx_params_decoder
652
    (const OSSL_PARAM *p, struct sskdf_set_ctx_params_st *r)
653
3
{
654
3
    const char *s;
655
656
3
    memset(r, 0, sizeof(*r));
657
3
    if (p != NULL)
658
6
        for (; (s = p->key) != NULL; p++)
659
6
            switch(s[0]) {
660
0
            default:
661
0
                break;
662
0
            case 'd':
663
0
                if (ossl_likely(strcmp("igest", s + 1) == 0)) {
664
                    /* OSSL_KDF_PARAM_DIGEST */
665
0
                    if (ossl_unlikely(r->digest != NULL)) {
666
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
667
0
                                       "param %s is repeated", s);
668
0
                        return 0;
669
0
                    }
670
0
                    r->digest = (OSSL_PARAM *)p;
671
0
                }
672
0
                break;
673
0
            case 'e':
674
0
                if (ossl_likely(strcmp("ngine", s + 1) == 0)) {
675
                    /* OSSL_ALG_PARAM_ENGINE */
676
0
                    if (ossl_unlikely(r->engine != NULL)) {
677
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
678
0
                                       "param %s is repeated", s);
679
0
                        return 0;
680
0
                    }
681
0
                    r->engine = (OSSL_PARAM *)p;
682
0
                }
683
0
                break;
684
0
            case 'i':
685
0
                if (ossl_likely(strcmp("nfo", s + 1) == 0)) {
686
                    /* OSSL_KDF_PARAM_INFO */
687
0
                    if (ossl_unlikely(r->num_info >= SSKDF_MAX_INFOS)) {
688
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_TOO_MANY_RECORDS,
689
0
                                       "param %s present >%d times", s, SSKDF_MAX_INFOS);
690
0
                        return 0;
691
0
                    }
692
0
                    r->info[r->num_info++] = (OSSL_PARAM *)p;
693
0
                }
694
0
                break;
695
3
            case 'k':
696
3
                switch(s[1]) {
697
0
                default:
698
0
                    break;
699
3
                case 'e':
700
3
                    switch(s[2]) {
701
0
                    default:
702
0
                        break;
703
3
                    case 'y':
704
3
                        switch(s[3]) {
705
0
                        default:
706
0
                            break;
707
0
                        case '-':
708
# if defined(FIPS_MODULE)
709
                            if (ossl_likely(strcmp("check", s + 4) == 0)) {
710
                                /* OSSL_KDF_PARAM_FIPS_KEY_CHECK */
711
                                if (ossl_unlikely(r->ind_k != NULL)) {
712
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
713
                                                   "param %s is repeated", s);
714
                                    return 0;
715
                                }
716
                                r->ind_k = (OSSL_PARAM *)p;
717
                            }
718
# endif
719
0
                            break;
720
3
                        case '\0':
721
3
                            if (ossl_unlikely(r->secret != NULL)) {
722
3
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
723
3
                                               "param %s is repeated", s);
724
3
                                return 0;
725
3
                            }
726
0
                            r->secret = (OSSL_PARAM *)p;
727
3
                        }
728
3
                    }
729
3
                }
730
0
                break;
731
0
            case 'm':
732
0
                switch(s[1]) {
733
0
                default:
734
0
                    break;
735
0
                case 'a':
736
0
                    switch(s[2]) {
737
0
                    default:
738
0
                        break;
739
0
                    case 'c':
740
0
                        switch(s[3]) {
741
0
                        default:
742
0
                            break;
743
0
                        case 'l':
744
0
                            if (ossl_likely(strcmp("en", s + 4) == 0)) {
745
                                /* OSSL_KDF_PARAM_MAC_SIZE */
746
0
                                if (ossl_unlikely(r->size != NULL)) {
747
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
748
0
                                                   "param %s is repeated", s);
749
0
                                    return 0;
750
0
                                }
751
0
                                r->size = (OSSL_PARAM *)p;
752
0
                            }
753
0
                            break;
754
0
                        case '\0':
755
0
                            if (ossl_unlikely(r->mac != NULL)) {
756
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
757
0
                                               "param %s is repeated", s);
758
0
                                return 0;
759
0
                            }
760
0
                            r->mac = (OSSL_PARAM *)p;
761
0
                        }
762
0
                    }
763
0
                }
764
0
                break;
765
0
            case 'p':
766
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
767
                    /* OSSL_KDF_PARAM_PROPERTIES */
768
0
                    if (ossl_unlikely(r->propq != NULL)) {
769
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
770
0
                                       "param %s is repeated", s);
771
0
                        return 0;
772
0
                    }
773
0
                    r->propq = (OSSL_PARAM *)p;
774
0
                }
775
0
                break;
776
3
            case 's':
777
3
                switch(s[1]) {
778
0
                default:
779
0
                    break;
780
0
                case 'a':
781
0
                    if (ossl_likely(strcmp("lt", s + 2) == 0)) {
782
                        /* OSSL_KDF_PARAM_SALT */
783
0
                        if (ossl_unlikely(r->salt != NULL)) {
784
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
785
0
                                           "param %s is repeated", s);
786
0
                            return 0;
787
0
                        }
788
0
                        r->salt = (OSSL_PARAM *)p;
789
0
                    }
790
0
                    break;
791
3
                case 'e':
792
3
                    if (ossl_likely(strcmp("cret", s + 2) == 0)) {
793
                        /* OSSL_KDF_PARAM_SECRET */
794
3
                        if (ossl_unlikely(r->secret != NULL)) {
795
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
796
0
                                           "param %s is repeated", s);
797
0
                            return 0;
798
0
                        }
799
3
                        r->secret = (OSSL_PARAM *)p;
800
3
                    }
801
3
                }
802
6
            }
803
0
    return 1;
804
3
}
805
#endif
806
/* End of machine generated */
807
/* clang-format on */
808
809
static int sskdf_set_ctx_params(void *vctx, const OSSL_PARAM params[])
810
14
{
811
14
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
812
14
    struct sskdf_all_set_ctx_params_st p;
813
814
14
    if (ctx == NULL || !sskdf_set_ctx_params_decoder(params, &p))
815
14
        return 0;
816
817
0
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, p.ind_k))
818
0
        return 0;
819
820
0
    if (!sskdf_common_set_ctx_params(ctx, &p, params))
821
0
        return 0;
822
823
#ifdef FIPS_MODULE
824
    if (p.secret != NULL)
825
        if (!fips_sskdf_key_check_passed(ctx))
826
            return 0;
827
#endif
828
829
0
    return 1;
830
0
}
831
832
static const OSSL_PARAM *sskdf_settable_ctx_params(ossl_unused void *ctx,
833
    ossl_unused void *provctx)
834
91
{
835
91
    return sskdf_set_ctx_params_list;
836
91
}
837
838
/* clang-format off */
839
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
840
#ifndef sskdf_get_ctx_params_list
841
static const OSSL_PARAM sskdf_get_ctx_params_list[] = {
842
    OSSL_PARAM_size_t(OSSL_KDF_PARAM_SIZE, NULL),
843
# if defined(FIPS_MODULE)
844
    OSSL_PARAM_int(OSSL_KDF_PARAM_FIPS_APPROVED_INDICATOR, NULL),
845
# endif
846
    OSSL_PARAM_END
847
};
848
#endif
849
850
#ifndef sskdf_get_ctx_params_st
851
struct sskdf_get_ctx_params_st {
852
# if defined(FIPS_MODULE)
853
    OSSL_PARAM *ind;
854
# endif
855
    OSSL_PARAM *size;
856
};
857
#endif
858
859
#ifndef sskdf_get_ctx_params_decoder
860
static int sskdf_get_ctx_params_decoder
861
    (const OSSL_PARAM *p, struct sskdf_get_ctx_params_st *r)
862
0
{
863
0
    const char *s;
864
865
0
    memset(r, 0, sizeof(*r));
866
0
    if (p != NULL)
867
0
        for (; (s = p->key) != NULL; p++)
868
0
            switch(s[0]) {
869
0
            default:
870
0
                break;
871
0
            case 'f':
872
# if defined(FIPS_MODULE)
873
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
874
                    /* OSSL_KDF_PARAM_FIPS_APPROVED_INDICATOR */
875
                    if (ossl_unlikely(r->ind != NULL)) {
876
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
877
                                       "param %s is repeated", s);
878
                        return 0;
879
                    }
880
                    r->ind = (OSSL_PARAM *)p;
881
                }
882
# endif
883
0
                break;
884
0
            case 's':
885
0
                if (ossl_likely(strcmp("ize", s + 1) == 0)) {
886
                    /* OSSL_KDF_PARAM_SIZE */
887
0
                    if (ossl_unlikely(r->size != NULL)) {
888
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
889
0
                                       "param %s is repeated", s);
890
0
                        return 0;
891
0
                    }
892
0
                    r->size = (OSSL_PARAM *)p;
893
0
                }
894
0
            }
895
0
    return 1;
896
0
}
897
#endif
898
/* End of machine generated */
899
/* clang-format on */
900
901
static int sskdf_common_get_ctx_params(void *vctx, OSSL_PARAM params[])
902
0
{
903
0
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
904
0
    struct sskdf_get_ctx_params_st p;
905
906
0
    if (ctx == NULL || !sskdf_get_ctx_params_decoder(params, &p))
907
0
        return 0;
908
909
0
    if (p.size != NULL) {
910
0
        if (!OSSL_PARAM_set_size_t(p.size, sskdf_size(ctx)))
911
0
            return 0;
912
0
    }
913
914
0
    if (!OSSL_FIPS_IND_GET_CTX_PARAM(ctx, p.ind))
915
0
        return 0;
916
917
0
    return 1;
918
0
}
919
920
static const OSSL_PARAM *sskdf_common_gettable_ctx_params(ossl_unused void *ctx, ossl_unused void *provctx)
921
0
{
922
0
    return sskdf_get_ctx_params_list;
923
0
}
924
925
#define x963kdf_set_ctx_params_st sskdf_all_set_ctx_params_st
926
927
/* clang-format off */
928
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
929
#ifndef x963kdf_set_ctx_params_list
930
static const OSSL_PARAM x963kdf_set_ctx_params_list[] = {
931
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SECRET, NULL, 0),
932
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_KEY, NULL, 0),
933
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_INFO, NULL, 0),
934
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_PROPERTIES, NULL, 0),
935
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_DIGEST, NULL, 0),
936
    OSSL_PARAM_utf8_string(OSSL_KDF_PARAM_MAC, NULL, 0),
937
    OSSL_PARAM_octet_string(OSSL_KDF_PARAM_SALT, NULL, 0),
938
    OSSL_PARAM_size_t(OSSL_KDF_PARAM_MAC_SIZE, NULL),
939
# if defined(FIPS_MODULE)
940
    OSSL_PARAM_int(OSSL_KDF_PARAM_FIPS_DIGEST_CHECK, NULL),
941
# endif
942
# if defined(FIPS_MODULE)
943
    OSSL_PARAM_int(OSSL_KDF_PARAM_FIPS_KEY_CHECK, NULL),
944
# endif
945
    OSSL_PARAM_END
946
};
947
#endif
948
949
#ifndef x963kdf_set_ctx_params_st
950
struct x963kdf_set_ctx_params_st {
951
    OSSL_PARAM *digest;
952
    OSSL_PARAM *engine;
953
# if defined(FIPS_MODULE)
954
    OSSL_PARAM *ind_d;
955
# endif
956
# if defined(FIPS_MODULE)
957
    OSSL_PARAM *ind_k;
958
# endif
959
    OSSL_PARAM *info[SSKDF_MAX_INFOS];
960
    int num_info;
961
    OSSL_PARAM *mac;
962
    OSSL_PARAM *propq;
963
    OSSL_PARAM *salt;
964
    OSSL_PARAM *secret;
965
    OSSL_PARAM *size;
966
};
967
#endif
968
969
#ifndef x963kdf_set_ctx_params_decoder
970
static int x963kdf_set_ctx_params_decoder
971
    (const OSSL_PARAM *p, struct x963kdf_set_ctx_params_st *r)
972
2
{
973
2
    const char *s;
974
975
2
    memset(r, 0, sizeof(*r));
976
2
    if (p != NULL)
977
4
        for (; (s = p->key) != NULL; p++)
978
4
            switch(s[0]) {
979
0
            default:
980
0
                break;
981
0
            case 'd':
982
0
                switch(s[1]) {
983
0
                default:
984
0
                    break;
985
0
                case 'i':
986
0
                    switch(s[2]) {
987
0
                    default:
988
0
                        break;
989
0
                    case 'g':
990
0
                        switch(s[3]) {
991
0
                        default:
992
0
                            break;
993
0
                        case 'e':
994
0
                            switch(s[4]) {
995
0
                            default:
996
0
                                break;
997
0
                            case 's':
998
0
                                switch(s[5]) {
999
0
                                default:
1000
0
                                    break;
1001
0
                                case 't':
1002
0
                                    switch(s[6]) {
1003
0
                                    default:
1004
0
                                        break;
1005
0
                                    case '-':
1006
# if defined(FIPS_MODULE)
1007
                                        if (ossl_likely(strcmp("check", s + 7) == 0)) {
1008
                                            /* OSSL_KDF_PARAM_FIPS_DIGEST_CHECK */
1009
                                            if (ossl_unlikely(r->ind_d != NULL)) {
1010
                                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1011
                                                               "param %s is repeated", s);
1012
                                                return 0;
1013
                                            }
1014
                                            r->ind_d = (OSSL_PARAM *)p;
1015
                                        }
1016
# endif
1017
0
                                        break;
1018
0
                                    case '\0':
1019
0
                                        if (ossl_unlikely(r->digest != NULL)) {
1020
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1021
0
                                                           "param %s is repeated", s);
1022
0
                                            return 0;
1023
0
                                        }
1024
0
                                        r->digest = (OSSL_PARAM *)p;
1025
0
                                    }
1026
0
                                }
1027
0
                            }
1028
0
                        }
1029
0
                    }
1030
0
                }
1031
0
                break;
1032
0
            case 'e':
1033
0
                if (ossl_likely(strcmp("ngine", s + 1) == 0)) {
1034
                    /* OSSL_ALG_PARAM_ENGINE */
1035
0
                    if (ossl_unlikely(r->engine != NULL)) {
1036
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1037
0
                                       "param %s is repeated", s);
1038
0
                        return 0;
1039
0
                    }
1040
0
                    r->engine = (OSSL_PARAM *)p;
1041
0
                }
1042
0
                break;
1043
0
            case 'i':
1044
0
                if (ossl_likely(strcmp("nfo", s + 1) == 0)) {
1045
                    /* OSSL_KDF_PARAM_INFO */
1046
0
                    if (ossl_unlikely(r->num_info >= SSKDF_MAX_INFOS)) {
1047
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_TOO_MANY_RECORDS,
1048
0
                                       "param %s present >%d times", s, SSKDF_MAX_INFOS);
1049
0
                        return 0;
1050
0
                    }
1051
0
                    r->info[r->num_info++] = (OSSL_PARAM *)p;
1052
0
                }
1053
0
                break;
1054
2
            case 'k':
1055
2
                switch(s[1]) {
1056
0
                default:
1057
0
                    break;
1058
2
                case 'e':
1059
2
                    switch(s[2]) {
1060
0
                    default:
1061
0
                        break;
1062
2
                    case 'y':
1063
2
                        switch(s[3]) {
1064
0
                        default:
1065
0
                            break;
1066
0
                        case '-':
1067
# if defined(FIPS_MODULE)
1068
                            if (ossl_likely(strcmp("check", s + 4) == 0)) {
1069
                                /* OSSL_KDF_PARAM_FIPS_KEY_CHECK */
1070
                                if (ossl_unlikely(r->ind_k != NULL)) {
1071
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1072
                                                   "param %s is repeated", s);
1073
                                    return 0;
1074
                                }
1075
                                r->ind_k = (OSSL_PARAM *)p;
1076
                            }
1077
# endif
1078
0
                            break;
1079
2
                        case '\0':
1080
2
                            if (ossl_unlikely(r->secret != NULL)) {
1081
2
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1082
2
                                               "param %s is repeated", s);
1083
2
                                return 0;
1084
2
                            }
1085
0
                            r->secret = (OSSL_PARAM *)p;
1086
2
                        }
1087
2
                    }
1088
2
                }
1089
0
                break;
1090
0
            case 'm':
1091
0
                switch(s[1]) {
1092
0
                default:
1093
0
                    break;
1094
0
                case 'a':
1095
0
                    switch(s[2]) {
1096
0
                    default:
1097
0
                        break;
1098
0
                    case 'c':
1099
0
                        switch(s[3]) {
1100
0
                        default:
1101
0
                            break;
1102
0
                        case 'l':
1103
0
                            if (ossl_likely(strcmp("en", s + 4) == 0)) {
1104
                                /* OSSL_KDF_PARAM_MAC_SIZE */
1105
0
                                if (ossl_unlikely(r->size != NULL)) {
1106
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1107
0
                                                   "param %s is repeated", s);
1108
0
                                    return 0;
1109
0
                                }
1110
0
                                r->size = (OSSL_PARAM *)p;
1111
0
                            }
1112
0
                            break;
1113
0
                        case '\0':
1114
0
                            if (ossl_unlikely(r->mac != NULL)) {
1115
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1116
0
                                               "param %s is repeated", s);
1117
0
                                return 0;
1118
0
                            }
1119
0
                            r->mac = (OSSL_PARAM *)p;
1120
0
                        }
1121
0
                    }
1122
0
                }
1123
0
                break;
1124
0
            case 'p':
1125
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
1126
                    /* OSSL_KDF_PARAM_PROPERTIES */
1127
0
                    if (ossl_unlikely(r->propq != NULL)) {
1128
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1129
0
                                       "param %s is repeated", s);
1130
0
                        return 0;
1131
0
                    }
1132
0
                    r->propq = (OSSL_PARAM *)p;
1133
0
                }
1134
0
                break;
1135
2
            case 's':
1136
2
                switch(s[1]) {
1137
0
                default:
1138
0
                    break;
1139
0
                case 'a':
1140
0
                    if (ossl_likely(strcmp("lt", s + 2) == 0)) {
1141
                        /* OSSL_KDF_PARAM_SALT */
1142
0
                        if (ossl_unlikely(r->salt != NULL)) {
1143
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1144
0
                                           "param %s is repeated", s);
1145
0
                            return 0;
1146
0
                        }
1147
0
                        r->salt = (OSSL_PARAM *)p;
1148
0
                    }
1149
0
                    break;
1150
2
                case 'e':
1151
2
                    if (ossl_likely(strcmp("cret", s + 2) == 0)) {
1152
                        /* OSSL_KDF_PARAM_SECRET */
1153
2
                        if (ossl_unlikely(r->secret != NULL)) {
1154
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1155
0
                                           "param %s is repeated", s);
1156
0
                            return 0;
1157
0
                        }
1158
2
                        r->secret = (OSSL_PARAM *)p;
1159
2
                    }
1160
2
                }
1161
4
            }
1162
0
    return 1;
1163
2
}
1164
#endif
1165
/* End of machine generated */
1166
/* clang-format on */
1167
1168
static int x963kdf_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1169
7
{
1170
7
    KDF_SSKDF *ctx = (KDF_SSKDF *)vctx;
1171
7
    struct sskdf_all_set_ctx_params_st p;
1172
1173
7
    if (ctx == NULL || !x963kdf_set_ctx_params_decoder(params, &p))
1174
7
        return 0;
1175
1176
0
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0, p.ind_d))
1177
0
        return 0;
1178
0
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1, p.ind_k))
1179
0
        return 0;
1180
1181
0
    if (!sskdf_common_set_ctx_params(ctx, &p, params))
1182
0
        return 0;
1183
1184
#ifdef FIPS_MODULE
1185
    if (p.digest != NULL) {
1186
        const EVP_MD *md = ossl_prov_digest_md(&ctx->digest);
1187
1188
        if (!fips_x963kdf_digest_check_passed(ctx, md))
1189
            return 0;
1190
    }
1191
1192
    if (p.secret != NULL)
1193
        if (!fips_x963kdf_key_check_passed(ctx))
1194
            return 0;
1195
#endif
1196
1197
0
    return 1;
1198
0
}
1199
1200
static const OSSL_PARAM *x963kdf_settable_ctx_params(ossl_unused void *ctx,
1201
    ossl_unused void *provctx)
1202
25
{
1203
25
    return x963kdf_set_ctx_params_list;
1204
25
}
1205
1206
const OSSL_DISPATCH ossl_kdf_sskdf_functions[] = {
1207
    { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))sskdf_new },
1208
    { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))sskdf_dup },
1209
    { OSSL_FUNC_KDF_FREECTX, (void (*)(void))sskdf_free },
1210
    { OSSL_FUNC_KDF_RESET, (void (*)(void))sskdf_reset },
1211
    { OSSL_FUNC_KDF_DERIVE, (void (*)(void))sskdf_derive },
1212
    { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
1213
        (void (*)(void))sskdf_settable_ctx_params },
1214
    { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))sskdf_set_ctx_params },
1215
    { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
1216
        (void (*)(void))sskdf_common_gettable_ctx_params },
1217
    { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))sskdf_common_get_ctx_params },
1218
    OSSL_DISPATCH_END
1219
};
1220
1221
const OSSL_DISPATCH ossl_kdf_x963_kdf_functions[] = {
1222
    { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))sskdf_new },
1223
    { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))sskdf_dup },
1224
    { OSSL_FUNC_KDF_FREECTX, (void (*)(void))sskdf_free },
1225
    { OSSL_FUNC_KDF_RESET, (void (*)(void))sskdf_reset },
1226
    { OSSL_FUNC_KDF_DERIVE, (void (*)(void))x963kdf_derive },
1227
    { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
1228
        (void (*)(void))x963kdf_settable_ctx_params },
1229
    { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))x963kdf_set_ctx_params },
1230
    { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
1231
        (void (*)(void))sskdf_common_gettable_ctx_params },
1232
    { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))sskdf_common_get_ctx_params },
1233
    OSSL_DISPATCH_END
1234
};