Coverage Report

Created: 2026-04-08 06:20

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/providers/implementations/kdfs/ikev2kdf.c
Line
Count
Source
1
/*
2
 * Copyright 2026 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
#include <openssl/evp.h>
11
#include <openssl/kdf.h>
12
#include <openssl/core_names.h>
13
#include <openssl/proverr.h>
14
#include "internal/cryptlib.h"
15
#include "internal/fips.h"
16
#include "prov/provider_ctx.h"
17
#include "prov/providercommon.h"
18
#include "prov/implementations.h"
19
#include "prov/provider_util.h"
20
#include "providers/implementations/kdfs/ikev2kdf.inc"
21
22
/* The shared secret length: 28 ~ 1024 bytes */
23
0
#define IKEV2KDF_MIN_SECRET_LENGTH 28
24
0
#define IKEV2KDF_MAX_GROUP19_MODLEN 32 /* ECDH p256 */
25
0
#define IKEV2KDF_MAX_GROUP20_MODLEN 48 /* ECDH p384 */
26
0
#define IKEV2KDF_MAX_GROUP21_MODLEN 66 /* ECDH p521 */
27
0
#define IKEV2KDF_MAX_GROUP2_MODLEN 128 /* DH group 2, no longer secure */
28
0
#define IKEV2KDF_MAX_GROUP14_MODLEN 256
29
0
#define IKEV2KDF_MAX_GROUP15_MODLEN 384
30
0
#define IKEV2KDF_MAX_GROUP16_MODLEN 512
31
0
#define IKEV2KDF_MAX_GROUP17_MODLEN 768
32
0
#define IKEV2KDF_MAX_GROUP18_MODLEN 1024
33
0
#define IKEV2KDF_MIN_NONCE_LENGTH 8
34
0
#define IKEV2KDF_MAX_NONCE_LENGTH 256
35
0
#define IKEV2KDF_MAX_DKM_LENGTH 2048
36
37
static OSSL_FUNC_kdf_newctx_fn kdf_ikev2kdf_new;
38
static OSSL_FUNC_kdf_dupctx_fn kdf_ikev2kdf_dup;
39
static OSSL_FUNC_kdf_freectx_fn kdf_ikev2kdf_free;
40
static OSSL_FUNC_kdf_reset_fn kdf_ikev2kdf_reset;
41
static OSSL_FUNC_kdf_derive_fn kdf_ikev2kdf_derive;
42
static OSSL_FUNC_kdf_settable_ctx_params_fn kdf_ikev2kdf_settable_ctx_params;
43
static OSSL_FUNC_kdf_set_ctx_params_fn kdf_ikev2kdf_set_ctx_params;
44
static OSSL_FUNC_kdf_gettable_ctx_params_fn kdf_ikev2kdf_gettable_ctx_params;
45
static OSSL_FUNC_kdf_get_ctx_params_fn kdf_ikev2kdf_get_ctx_params;
46
47
static int IKEV2_GEN(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
48
    char *md_name, const unsigned char *ni, const size_t ni_len,
49
    const unsigned char *nr, const size_t nr_len,
50
    const unsigned char *shared_secret, const size_t shared_secret_len);
51
static int IKEV2_REKEY(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
52
    char *md_name, const unsigned char *ni, const size_t ni_len,
53
    const unsigned char *nr, const size_t nr_len,
54
    const unsigned char *shared_secret, const size_t shared_secret_len,
55
    const unsigned char *sk_d, const size_t skd_len);
56
static int IKEV2_DKM(OSSL_LIB_CTX *libctx, unsigned char *dkm, const size_t len_out,
57
    const EVP_MD *evp_md, const unsigned char *seedkey, const size_t seedkey_len,
58
    const unsigned char *ni, const size_t ni_len,
59
    const unsigned char *nr, const size_t nr_len,
60
    const unsigned char *spii, const size_t spii_len,
61
    const unsigned char *spir, const size_t spir_len,
62
    const unsigned char *shared_secret, const size_t shared_secret_len);
63
64
typedef struct {
65
    OSSL_LIB_CTX *libctx;
66
    PROV_DIGEST digest;
67
    uint8_t *secret;
68
    size_t secret_len;
69
    uint8_t *seedkey;
70
    size_t seedkey_len;
71
    uint8_t *ni;
72
    size_t ni_len;
73
    uint8_t *nr;
74
    size_t nr_len;
75
    uint8_t *spii;
76
    size_t spii_len;
77
    uint8_t *spir;
78
    size_t spir_len;
79
    uint8_t *sk_d;
80
    size_t sk_d_len;
81
    int mode;
82
} KDF_IKEV2KDF;
83
84
static void *kdf_ikev2kdf_new(void *provctx)
85
0
{
86
0
    KDF_IKEV2KDF *ctx;
87
88
0
    if (!ossl_prov_is_running())
89
0
        return NULL;
90
91
#ifdef FIPS_MODULE
92
    if (!ossl_deferred_self_test(PROV_LIBCTX_OF(provctx),
93
            ST_ID_KDF_IKEV2KDF_GEN))
94
        return NULL;
95
#endif
96
97
0
    if ((ctx = OPENSSL_zalloc(sizeof(*ctx))) != NULL)
98
0
        ctx->libctx = PROV_LIBCTX_OF(provctx);
99
0
    return ctx;
100
0
}
101
102
static void *kdf_ikev2kdf_dup(void *vctx)
103
0
{
104
0
    KDF_IKEV2KDF *src = (KDF_IKEV2KDF *)vctx;
105
0
    KDF_IKEV2KDF *dest = NULL;
106
107
0
    dest = OPENSSL_zalloc(sizeof(*src));
108
0
    if (dest != NULL) {
109
0
        dest->libctx = src->libctx;
110
0
        if ((src->secret != NULL)
111
0
            && (!ossl_prov_memdup(src->secret, src->secret_len,
112
0
                &dest->secret, &dest->secret_len)))
113
0
            goto err;
114
115
0
        if ((src->seedkey != NULL)
116
0
            && (!ossl_prov_memdup(src->seedkey, src->seedkey_len,
117
0
                &dest->seedkey, &dest->seedkey_len)))
118
0
            goto err;
119
120
0
        if ((src->ni != NULL)
121
0
            && (!ossl_prov_memdup(src->ni, src->ni_len, &dest->ni, &dest->ni_len)))
122
0
            goto err;
123
124
0
        if ((src->nr != NULL)
125
0
            && (!ossl_prov_memdup(src->nr, src->nr_len, &dest->nr, &dest->nr_len)))
126
0
            goto err;
127
0
        if ((src->spii != NULL)
128
0
            && (!ossl_prov_memdup(src->spii, src->spii_len, &dest->spii, &dest->spii_len)))
129
0
            goto err;
130
0
        if ((src->spir != NULL)
131
0
            && (!ossl_prov_memdup(src->spir, src->spir_len, &dest->spir, &dest->spir_len)))
132
0
            goto err;
133
134
0
        if ((src->sk_d != NULL)
135
0
            && (!ossl_prov_memdup(src->sk_d, src->sk_d_len,
136
0
                &dest->sk_d, &dest->sk_d_len)))
137
0
            goto err;
138
139
0
        if (!ossl_prov_digest_copy(&dest->digest, &src->digest))
140
0
            goto err;
141
0
        dest->mode = src->mode;
142
0
    }
143
0
    return dest;
144
145
0
err:
146
0
    kdf_ikev2kdf_free(dest);
147
0
    return NULL;
148
0
}
149
static void kdf_ikev2kdf_free(void *vctx)
150
0
{
151
0
    KDF_IKEV2KDF *ctx = (KDF_IKEV2KDF *)vctx;
152
153
0
    if (ctx != NULL) {
154
0
        kdf_ikev2kdf_reset(ctx);
155
0
        OPENSSL_free(ctx);
156
0
    }
157
0
}
158
159
static void kdf_ikev2kdf_reset(void *vctx)
160
0
{
161
0
    KDF_IKEV2KDF *ctx = (KDF_IKEV2KDF *)vctx;
162
0
    OSSL_LIB_CTX *libctx = ctx->libctx;
163
164
0
    ossl_prov_digest_reset(&ctx->digest);
165
0
    OPENSSL_clear_free(ctx->secret, ctx->secret_len);
166
0
    OPENSSL_clear_free(ctx->seedkey, ctx->seedkey_len);
167
0
    OPENSSL_clear_free(ctx->sk_d, ctx->sk_d_len);
168
0
    OPENSSL_clear_free(ctx->ni, ctx->ni_len);
169
0
    OPENSSL_clear_free(ctx->nr, ctx->nr_len);
170
0
    OPENSSL_clear_free(ctx->spii, ctx->spii_len);
171
0
    OPENSSL_clear_free(ctx->spir, ctx->spir_len);
172
0
    memset(ctx, 0, sizeof(*ctx));
173
0
    ctx->libctx = libctx;
174
0
}
175
176
static int ikev2kdf_set_membuf(unsigned char **dst, size_t *dst_len,
177
    const OSSL_PARAM *p)
178
0
{
179
0
    OPENSSL_clear_free(*dst, *dst_len);
180
0
    *dst = NULL;
181
0
    *dst_len = 0;
182
0
    return OSSL_PARAM_get_octet_string(p, (void **)dst, 0, dst_len);
183
0
}
184
185
static int ikev2_common_check_ctx_params(KDF_IKEV2KDF *ctx)
186
0
{
187
0
    if (ctx->ni == NULL) {
188
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_NONCE);
189
0
        return 0;
190
0
    }
191
192
0
    if (ctx->nr == NULL) {
193
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_NONCE);
194
0
        return 0;
195
0
    }
196
0
    return 1;
197
0
}
198
199
/*
200
 * RFC 7296: section 2.14
201
 * g^ir is represented as a string of octets in big endian order padded
202
 * with zeros if necessary to make it the length of the modulus.
203
 * The secret length is in range of 28 ~ 1024 bytes, and the padding length
204
 * is determined by the secret length:
205
 * ecdh group 19 32 bytes
206
 * ecdh group 20 48 bytes
207
 * ecdh group 21 66 bytes
208
 * dh group 2 128 bytes (no longer secure, but still supported for interoperability)
209
 * dh group 14 256 bytes
210
 * dh group 15 384 bytes
211
 * dh group 16 512 bytes
212
 * dh group 17 768 bytes
213
 * dh group 18 1024 bytes
214
 * secret is required for GEN, REKEY and DKM(Child_DH).
215
 */
216
static int ikev2_check_secret_and_pad(KDF_IKEV2KDF *ctx)
217
0
{
218
0
    size_t pad_len = 0;
219
0
    uint8_t *new_secret = NULL;
220
221
0
    if (ctx->secret_len == 0)
222
0
        return 1;
223
0
    if ((ctx->secret_len < IKEV2KDF_MIN_SECRET_LENGTH)
224
0
        || (ctx->secret_len > IKEV2KDF_MAX_GROUP18_MODLEN)) {
225
0
        ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SECRET_LENGTH);
226
0
        return 0;
227
0
    }
228
0
    if ((ctx->secret_len == IKEV2KDF_MAX_GROUP19_MODLEN)
229
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP20_MODLEN)
230
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP21_MODLEN)
231
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP2_MODLEN)
232
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP14_MODLEN)
233
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP15_MODLEN)
234
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP16_MODLEN)
235
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP17_MODLEN)
236
0
        || (ctx->secret_len == IKEV2KDF_MAX_GROUP18_MODLEN))
237
        /* no padding needed if secret_len is already valid */
238
0
        return 1;
239
240
0
    if (ctx->secret_len < IKEV2KDF_MAX_GROUP19_MODLEN)
241
0
        pad_len = IKEV2KDF_MAX_GROUP19_MODLEN - ctx->secret_len;
242
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP19_MODLEN)
243
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP20_MODLEN))
244
0
        pad_len = IKEV2KDF_MAX_GROUP20_MODLEN - ctx->secret_len;
245
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP20_MODLEN)
246
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP21_MODLEN))
247
0
        pad_len = IKEV2KDF_MAX_GROUP21_MODLEN - ctx->secret_len;
248
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP21_MODLEN)
249
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP2_MODLEN))
250
0
        pad_len = IKEV2KDF_MAX_GROUP2_MODLEN - ctx->secret_len;
251
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP2_MODLEN)
252
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP14_MODLEN))
253
0
        pad_len = IKEV2KDF_MAX_GROUP14_MODLEN - ctx->secret_len;
254
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP14_MODLEN)
255
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP15_MODLEN))
256
0
        pad_len = IKEV2KDF_MAX_GROUP15_MODLEN - ctx->secret_len;
257
0
    if ((ctx->secret_len > IKEV2KDF_MAX_GROUP15_MODLEN)
258
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP16_MODLEN))
259
0
        pad_len = IKEV2KDF_MAX_GROUP16_MODLEN - ctx->secret_len;
260
0
    if ((ctx->secret_len >= IKEV2KDF_MAX_GROUP16_MODLEN)
261
0
        && (ctx->secret_len < IKEV2KDF_MAX_GROUP17_MODLEN))
262
0
        pad_len = IKEV2KDF_MAX_GROUP17_MODLEN - ctx->secret_len;
263
0
    if (ctx->secret_len > IKEV2KDF_MAX_GROUP17_MODLEN)
264
0
        pad_len = IKEV2KDF_MAX_GROUP18_MODLEN - ctx->secret_len;
265
266
0
    new_secret = OPENSSL_zalloc(ctx->secret_len + pad_len);
267
0
    if (new_secret == NULL) {
268
0
        ERR_raise(ERR_LIB_PROV, ERR_R_MALLOC_FAILURE);
269
0
        return 0;
270
0
    }
271
0
    memcpy(new_secret + pad_len, ctx->secret, ctx->secret_len);
272
0
    OPENSSL_clear_free(ctx->secret, ctx->secret_len);
273
0
    ctx->secret = new_secret;
274
0
    ctx->secret_len += pad_len;
275
0
    return 1;
276
0
}
277
278
static int kdf_ikev2kdf_derive(void *vctx, unsigned char *key, size_t keylen,
279
    const OSSL_PARAM params[])
280
0
{
281
0
    KDF_IKEV2KDF *ctx = (KDF_IKEV2KDF *)vctx;
282
0
    const EVP_MD *md;
283
0
    size_t md_size;
284
285
0
    if (!ossl_prov_is_running() || !kdf_ikev2kdf_set_ctx_params(ctx, params))
286
0
        return 0;
287
288
0
    md = ossl_prov_digest_md(&ctx->digest);
289
0
    if (md == NULL) {
290
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
291
0
        return 0;
292
0
    }
293
0
    md_size = EVP_MD_size(md);
294
0
    if (md_size <= 0)
295
0
        return 0;
296
297
0
    if (!ikev2_common_check_ctx_params(ctx))
298
0
        return 0;
299
300
0
    switch (ctx->mode) {
301
0
    case EVP_KDF_IKEV2_MODE_GEN:
302
0
        if ((ctx->secret == NULL) || (ctx->secret_len == 0)) {
303
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
304
0
            return 0;
305
0
        }
306
0
        if (keylen != md_size) {
307
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
308
0
            return 0;
309
0
        }
310
0
        if (!ikev2_check_secret_and_pad(ctx))
311
0
            return 0;
312
0
        return (IKEV2_GEN(ctx->libctx, key, keylen, (char *)EVP_MD_name(md),
313
0
            ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
314
0
            ctx->secret, ctx->secret_len));
315
316
0
    case EVP_KDF_IKEV2_MODE_DKM:
317
        /*
318
         * if spi_init != NULL and spi_resp != NULL and shared_secret = NULL
319
         *    and seedkey != NULL
320
         *    calculate DKM
321
         * else if spi_init == NULL and spi_resp == NULL and shared_secret != NULL
322
         *    and sk_d != NULL
323
         *    calculate DKM(Child_DH)
324
         * else if spi_init == NULL and spi_resp == NULL and shared_secret == NULL
325
         *    and sk_d != NULL
326
         *    calculate DKM(Child_SA)
327
         * endif
328
         */
329
0
        if ((ctx->spii != NULL) && (ctx->spii_len != 0)
330
0
            && (ctx->spir != NULL) && (ctx->spir_len != 0)
331
0
            && (ctx->secret == NULL) && (ctx->secret_len == 0)) {
332
0
            if ((ctx->seedkey == NULL) || (ctx->seedkey_len == 0)) {
333
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_KEY);
334
0
                return 0;
335
0
            }
336
0
            if (ctx->seedkey_len != (size_t)md_size) {
337
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
338
0
                return 0;
339
0
            }
340
0
            if ((keylen < md_size) || (keylen > IKEV2KDF_MAX_DKM_LENGTH)) {
341
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
342
0
                return 0;
343
0
            }
344
            /* calculate DKM */
345
0
            return (IKEV2_DKM(ctx->libctx, key, keylen, md, ctx->seedkey, ctx->seedkey_len,
346
0
                ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
347
0
                ctx->spii, ctx->spii_len, ctx->spir, ctx->spir_len,
348
0
                NULL, 0));
349
0
        } else if ((ctx->spii == NULL) && (ctx->spir == NULL)
350
0
            && (ctx->spii_len == 0) && (ctx->spir_len == 0)) {
351
0
            if ((ctx->sk_d == NULL) || (ctx->sk_d_len == 0)) {
352
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_DKM);
353
0
                return 0;
354
0
            }
355
0
            if ((keylen < md_size) || (keylen > IKEV2KDF_MAX_DKM_LENGTH)) {
356
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
357
0
                return 0;
358
0
            }
359
            /* If Child_DH is intended, require secret_len > 0 */
360
0
            if ((ctx->secret != NULL && ctx->secret_len == 0)
361
0
                || (ctx->secret == NULL && ctx->secret_len != 0)) {
362
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
363
0
                return 0;
364
0
            }
365
0
            if (!ikev2_check_secret_and_pad(ctx))
366
0
                return 0;
367
            /* calculate DKM(Child_SA) or DKM(Child_DH) */
368
0
            return (IKEV2_DKM(ctx->libctx, key, keylen, md, ctx->sk_d, ctx->sk_d_len,
369
0
                ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
370
0
                NULL, 0, NULL, 0,
371
0
                ctx->secret, ctx->secret_len));
372
0
        } else {
373
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_PARAMETERS_FOR_DKM);
374
0
            return 0;
375
0
        }
376
0
    case EVP_KDF_IKEV2_MODE_REKEY:
377
0
        if ((ctx->secret == NULL) || (ctx->secret_len == 0)) {
378
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
379
0
            return 0;
380
0
        }
381
0
        if ((ctx->sk_d == NULL) || (ctx->sk_d_len == 0)) {
382
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_DKM);
383
0
            return 0;
384
0
        }
385
0
        if (ctx->sk_d_len != (size_t)md_size) {
386
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
387
0
            return 0;
388
0
        }
389
0
        if (keylen != md_size) {
390
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
391
0
            return 0;
392
0
        }
393
0
        if (!ikev2_check_secret_and_pad(ctx))
394
0
            return 0;
395
0
        return (IKEV2_REKEY(ctx->libctx, key, keylen, (char *)EVP_MD_name(md),
396
0
            ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
397
0
            ctx->secret, ctx->secret_len, ctx->sk_d, ctx->sk_d_len));
398
0
    default:
399
        /* This error is already checked in set_ctx_params */
400
0
        ;
401
0
    }
402
0
    return 0;
403
0
}
404
405
static int kdf_ikev2kdf_set_ctx_params(void *vctx, const OSSL_PARAM params[])
406
0
{
407
0
    struct ikev2_set_ctx_params_st p;
408
0
    KDF_IKEV2KDF *ctx = vctx;
409
0
    const EVP_MD *md;
410
411
0
    if (params == NULL)
412
0
        return 1;
413
414
0
    if (ctx == NULL || !ikev2_set_ctx_params_decoder(params, &p))
415
0
        return 0;
416
417
0
    if (p.digest != NULL) {
418
0
        if (!ossl_prov_digest_load(&ctx->digest, p.digest, p.propq, ctx->libctx))
419
0
            return 0;
420
0
        md = ossl_prov_digest_md(&ctx->digest);
421
0
        if (md == NULL) {
422
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
423
0
            return 0;
424
0
        }
425
426
0
        if (!EVP_MD_is_a(md, SN_sha1)
427
0
            && !EVP_MD_is_a(md, SN_sha224)
428
0
            && !EVP_MD_is_a(md, SN_sha256)
429
0
            && !EVP_MD_is_a(md, SN_sha384)
430
0
            && !EVP_MD_is_a(md, SN_sha512))
431
0
            return 0;
432
0
    }
433
0
    if (p.ni != NULL) {
434
0
        if (!ikev2kdf_set_membuf(&ctx->ni, &ctx->ni_len, p.ni))
435
0
            return 0;
436
0
        if ((ctx->ni_len < IKEV2KDF_MIN_NONCE_LENGTH)
437
0
            || (ctx->ni_len > IKEV2KDF_MAX_NONCE_LENGTH)) {
438
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_NONCE_LENGTH);
439
0
            return 0;
440
0
        }
441
0
    }
442
0
    if (p.nr != NULL) {
443
0
        if (!ikev2kdf_set_membuf(&ctx->nr, &ctx->nr_len, p.nr))
444
0
            return 0;
445
0
        if ((ctx->nr_len < IKEV2KDF_MIN_NONCE_LENGTH)
446
0
            || (ctx->nr_len > IKEV2KDF_MAX_NONCE_LENGTH)) {
447
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_NONCE_LENGTH);
448
0
            return 0;
449
0
        }
450
0
    }
451
0
    if (p.spii != NULL)
452
0
        if (!ikev2kdf_set_membuf(&ctx->spii, &ctx->spii_len, p.spii))
453
0
            return 0;
454
0
    if (p.spir != NULL)
455
0
        if (!ikev2kdf_set_membuf(&ctx->spir, &ctx->spir_len, p.spir))
456
0
            return 0;
457
0
    if (p.secret != NULL)
458
0
        if (!ikev2kdf_set_membuf(&ctx->secret, &ctx->secret_len, p.secret))
459
0
            return 0;
460
0
    if (p.seedkey != NULL)
461
0
        if (!ikev2kdf_set_membuf(&ctx->seedkey, &ctx->seedkey_len, p.seedkey))
462
0
            return 0;
463
0
    if (p.sk_d != NULL)
464
0
        if (!ikev2kdf_set_membuf(&ctx->sk_d, &ctx->sk_d_len, p.sk_d))
465
0
            return 0;
466
0
    if (p.mode != NULL) {
467
0
        if (!OSSL_PARAM_get_int(p.mode, &ctx->mode))
468
0
            return 0;
469
0
        if ((ctx->mode != EVP_KDF_IKEV2_MODE_GEN)
470
0
            && (ctx->mode != EVP_KDF_IKEV2_MODE_DKM)
471
0
            && (ctx->mode != EVP_KDF_IKEV2_MODE_REKEY)) {
472
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
473
0
            return 0;
474
0
        }
475
0
    }
476
0
    return 1;
477
0
}
478
479
static const OSSL_PARAM *kdf_ikev2kdf_settable_ctx_params(ossl_unused void *ctx,
480
    ossl_unused void *p_ctx)
481
0
{
482
0
    return ikev2_set_ctx_params_list;
483
0
}
484
485
static int kdf_ikev2kdf_get_ctx_params(void *vctx, OSSL_PARAM params[])
486
0
{
487
0
    struct ikev2_get_ctx_params_st p;
488
0
    KDF_IKEV2KDF *ctx = vctx;
489
490
0
    if (ctx == NULL || !ikev2_get_ctx_params_decoder(params, &p))
491
0
        return 0;
492
493
0
    if (p.size != NULL) {
494
0
        size_t sz = 0;
495
0
        const EVP_MD *md = NULL;
496
497
0
        md = ossl_prov_digest_md(&ctx->digest);
498
0
        if (md == NULL) {
499
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
500
0
            return 0;
501
0
        }
502
0
        sz = EVP_MD_size(md);
503
0
        if (sz <= 0)
504
0
            return 0;
505
0
        if (!OSSL_PARAM_set_size_t(p.size, sz))
506
0
            return 0;
507
0
    }
508
0
    return 1;
509
0
}
510
511
static const OSSL_PARAM *kdf_ikev2kdf_gettable_ctx_params(ossl_unused void *ctx,
512
    ossl_unused void *p_ctx)
513
0
{
514
0
    return ikev2_get_ctx_params_list;
515
0
}
516
517
const OSSL_DISPATCH ossl_kdf_ikev2kdf_functions[] = {
518
    { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_ikev2kdf_new },
519
    { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))kdf_ikev2kdf_dup },
520
    { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_ikev2kdf_free },
521
    { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_ikev2kdf_reset },
522
    { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_ikev2kdf_derive },
523
    { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
524
        (void (*)(void))kdf_ikev2kdf_settable_ctx_params },
525
    { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_ikev2kdf_set_ctx_params },
526
    { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
527
        (void (*)(void))kdf_ikev2kdf_gettable_ctx_params },
528
    { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_ikev2kdf_get_ctx_params },
529
    { 0, NULL }
530
};
531
532
/*
533
 * IKEV2_GEN - KDF in compliance with SP800-135 for IKEv2,
534
 *             generate the seedkey.
535
 *
536
 * algorithm: HMAC(ni || nr, shared_secret)
537
 *
538
 * Inputs:
539
 *   libctx - provider LIB context
540
 *   seedkey - pointer to output for seedkey
541
 *   keylen - length of seedkey(in bytes)
542
 *   md_name - name of the SHA digest
543
 *   ni - pointer to initiator nonce input
544
 *   ni_len - initiator nonce length(in bytes)
545
 *   nr - pointer to responder nonce input
546
 *   nr_len - nonce length(in bytes)
547
 *   shared_secret - pointer to secret input
548
 *   shared_secret_len - secret length(in bytes)
549
 * Outputs:
550
 *   return - 1 pass, 0 fail
551
 *   seedkey - output seedkey when passing.
552
 */
553
static int IKEV2_GEN(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
554
    char *md_name, const unsigned char *ni, const size_t ni_len,
555
    const unsigned char *nr, const size_t nr_len,
556
    const unsigned char *shared_secret, const size_t shared_secret_len)
557
0
{
558
0
    EVP_MAC_CTX *ctx = NULL;
559
0
    EVP_MAC *mac = NULL;
560
0
    size_t outl = 0;
561
0
    int ret = 0;
562
0
    unsigned char *nonce = NULL;
563
0
    OSSL_PARAM params[] = {
564
0
        OSSL_PARAM_construct_utf8_string("digest", md_name, 0),
565
0
        OSSL_PARAM_construct_end()
566
0
    };
567
568
0
    nonce = OPENSSL_malloc(ni_len + nr_len);
569
0
    if (nonce == NULL)
570
0
        return ret;
571
0
    memcpy(nonce, ni, ni_len);
572
0
    memcpy(nonce + ni_len, nr, nr_len);
573
574
0
    mac = EVP_MAC_fetch(libctx, (char *)"HMAC", NULL);
575
0
    if ((mac == NULL)
576
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL)
577
0
        || (!EVP_MAC_init(ctx, nonce, ni_len + nr_len, params))
578
0
        || (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
579
0
        || (!EVP_MAC_final(ctx, seedkey, &outl, keylen))
580
0
        || (outl != keylen))
581
0
        goto err;
582
583
0
    ret = 1;
584
0
err:
585
0
    OPENSSL_clear_free(nonce, ni_len + nr_len);
586
0
    EVP_MAC_CTX_free(ctx);
587
0
    EVP_MAC_free(mac);
588
0
    return ret;
589
0
}
590
591
/*
592
 * IKEV2_REKEY - KDF in compliance with SP800-135 for IKEv2,
593
 *               re-generate the seedkey.
594
 *
595
 * algorithm:  HMAC(sk_d, Ni || Nr || seedkey || (if dh==1 then shared_secret))
596
 *
597
 * Inputs:
598
 *   libctx - provider LIB context
599
 *   seedkey - pointer to output for seedkey
600
 *   keylen - length of seedkey(in bytes)
601
 *   md_name - name of the SHA digest
602
 *   ni - pointer to initiator nonce input
603
 *   ni_len - initiator nonce length(in bytes)
604
 *   nr - pointer to responder nonce input
605
 *   nr_len - responder nonce length(in bytes)
606
 *   shared_secret - (new) pointer to secret input
607
 *   shared_secret_len - (new)secret length(in bytes)
608
 *   sk_d - pointer to sk_d portion of DKM
609
 *   skd_len - length of sk_d (in bytes)
610
 * Outputs:
611
 *   return = 1 pass, 0 fail
612
 *   seedkey - output seedkey when passing.
613
 */
614
static int IKEV2_REKEY(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
615
    char *md_name, const unsigned char *ni, const size_t ni_len,
616
    const unsigned char *nr, const size_t nr_len,
617
    const unsigned char *shared_secret, const size_t shared_secret_len,
618
    const unsigned char *sk_d, const size_t sk_d_len)
619
0
{
620
0
    EVP_MAC_CTX *ctx = NULL;
621
0
    EVP_MAC *mac = NULL;
622
0
    size_t outl = 0;
623
0
    int ret = 0;
624
0
    OSSL_PARAM params[] = {
625
0
        OSSL_PARAM_construct_utf8_string("digest", md_name, 0),
626
0
        OSSL_PARAM_construct_end()
627
0
    };
628
629
0
    mac = EVP_MAC_fetch(libctx, "HMAC", NULL);
630
0
    if ((mac == NULL)
631
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL)
632
0
        || (!EVP_MAC_init(ctx, sk_d, sk_d_len, params))
633
0
        || (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
634
0
        || (!EVP_MAC_update(ctx, ni, ni_len))
635
0
        || (!EVP_MAC_update(ctx, nr, nr_len))
636
0
        || (!EVP_MAC_final(ctx, seedkey, &outl, keylen))
637
0
        || (outl != keylen))
638
0
        goto err;
639
640
0
    ret = 1;
641
642
0
err:
643
0
    EVP_MAC_CTX_free(ctx);
644
0
    EVP_MAC_free(mac);
645
0
    return ret;
646
0
}
647
648
/*
649
 * IKEV2_DKM - KDF in compliance with SP800-135 for IKEv2,
650
 *             generate the Derived Keying Material(DKM),
651
 *             DKM(Child SA) and DKM(Child SA DH).
652
 * algorithm:
653
 *   if spii != NULL and spir != NULL and shared_secret == NULL
654
 *     and seedkey != NULL
655
 *     calculate DKM:
656
 *       HMAC(seedkey, ni || nr || spii || spir)
657
 *   else if spii == NULL and spir == NULL and shared_secret == NULL
658
 *     calculate DKM(Child_SA):
659
 *       HMAC(sk_d, ni || nr)
660
 *   else if spii == NULL and spir == NULL and shared_secret != NULL
661
 *     calculate DKM(Child_DH):
662
 *       HMAC(sk_d, ni || nr || new_shared_secret)
663
 *   endif
664
 *
665
 * Inputs:
666
 *   libctx - provider LIB context
667
 *   dkm - pointer to output dkm
668
 *   len_out - output length(in bytes)
669
 *   evp_md - pointer to SHA digest
670
 *   seekkey - pointer to seedkey (seekkey for DKM, sk_d for Child_SA/DH)
671
 *   seedkey_len - length of seedkey(in bytes)
672
 *   ni - pointer to initiator nonce
673
 *   ni_len - initiator nonce length(in bytes)
674
 *   nr - pointer to responder nonce
675
 *   nr_len - responder nonce length(in bytes)
676
 *   shared_secret - pointer to secret input
677
 *   shared_secret_len - secret length(in bytes)
678
 * Outputs:
679
 *   return - 1 pass, 0 fail
680
 *   dkm - output dkm when passing.
681
 */
682
static int IKEV2_DKM(OSSL_LIB_CTX *libctx, unsigned char *dkm, const size_t len_out,
683
    const EVP_MD *evp_md,
684
    const unsigned char *seedkey, const size_t seedkey_len,
685
    const unsigned char *ni, const size_t ni_len,
686
    const unsigned char *nr, const size_t nr_len,
687
    const unsigned char *spii, const size_t spii_len,
688
    const unsigned char *spir, const size_t spir_len,
689
    const unsigned char *shared_secret, const size_t shared_secret_len)
690
0
{
691
0
    EVP_MAC_CTX *ctx = NULL;
692
0
    EVP_MAC *mac = NULL;
693
0
    size_t outl = 0, hmac_len = 0, ii;
694
0
    unsigned char *hmac = NULL;
695
0
    int ret = 0;
696
0
    int md_size = 0;
697
0
    unsigned char counter = 1;
698
0
    OSSL_PARAM params[] = {
699
0
        OSSL_PARAM_construct_utf8_string("digest", (char *)EVP_MD_name(evp_md), 0),
700
0
        OSSL_PARAM_construct_end()
701
0
    };
702
703
0
    md_size = EVP_MD_size(evp_md);
704
0
    if (md_size <= 0)
705
0
        return 0;
706
    /* len_out may not fit the last hmac, round up */
707
0
    hmac_len = ((len_out + md_size - 1) / md_size) * md_size;
708
0
    hmac = OPENSSL_malloc(hmac_len);
709
0
    if (hmac == NULL)
710
0
        return 0;
711
712
0
    mac = EVP_MAC_fetch(libctx, "HMAC", NULL);
713
0
    if ((mac == NULL)
714
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL))
715
0
        goto err;
716
717
    /*
718
     * len_out <= IKEV2_MAX_DKM_LEN
719
     * loop count will fit in 1 byte value
720
     */
721
0
    for (ii = 0; ii < len_out; ii += md_size) {
722
0
        if (!EVP_MAC_init(ctx, seedkey, seedkey_len, params))
723
0
            goto err;
724
0
        if (ii != 0)
725
0
            if (!EVP_MAC_update(ctx, &hmac[ii - md_size], md_size))
726
0
                goto err;
727
0
        if (shared_secret != NULL)
728
0
            if (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
729
0
                goto err;
730
0
        if (!EVP_MAC_update(ctx, ni, ni_len)
731
0
            || !EVP_MAC_update(ctx, nr, nr_len))
732
0
            goto err;
733
0
        if (spii != NULL)
734
0
            if (!EVP_MAC_update(ctx, spii, spii_len)
735
0
                || !EVP_MAC_update(ctx, spir, spir_len))
736
0
                goto err;
737
0
        if (!EVP_MAC_update(ctx, &counter, 1))
738
0
            goto err;
739
0
        if (!EVP_MAC_final(ctx, &hmac[ii], &outl, len_out))
740
0
            goto err;
741
0
        counter++;
742
0
    }
743
744
0
    memcpy(dkm, hmac, len_out);
745
0
    ret = 1;
746
0
err:
747
0
    OPENSSL_clear_free(hmac, hmac_len);
748
0
    EVP_MAC_CTX_free(ctx);
749
0
    EVP_MAC_free(mac);
750
0
    return ret;
751
0
}