Coverage Report

Created: 2026-05-06 07:07

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
    else 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
    else 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
    else 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
    else 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
    else 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
    else 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
    else 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
    else 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
0
    int value = 0;
285
286
0
    if (!ossl_prov_is_running() || !kdf_ikev2kdf_set_ctx_params(ctx, params))
287
0
        return 0;
288
289
0
    md = ossl_prov_digest_md(&ctx->digest);
290
0
    if (md == NULL) {
291
0
        ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
292
0
        return 0;
293
0
    }
294
0
    value = EVP_MD_size(md);
295
0
    if (value <= 0)
296
0
        return 0;
297
0
    md_size = (size_t)value;
298
299
0
    if (!ikev2_common_check_ctx_params(ctx))
300
0
        return 0;
301
302
0
    switch (ctx->mode) {
303
0
    case EVP_KDF_IKEV2_MODE_GEN:
304
0
        if ((ctx->secret == NULL) || (ctx->secret_len == 0)) {
305
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
306
0
            return 0;
307
0
        }
308
0
        if (keylen != md_size) {
309
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
310
0
            return 0;
311
0
        }
312
0
        if (!ikev2_check_secret_and_pad(ctx))
313
0
            return 0;
314
0
        return (IKEV2_GEN(ctx->libctx, key, keylen, (char *)EVP_MD_name(md),
315
0
            ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
316
0
            ctx->secret, ctx->secret_len));
317
318
0
    case EVP_KDF_IKEV2_MODE_DKM:
319
        /*
320
         * if spi_init != NULL and spi_resp != NULL and shared_secret = NULL
321
         *    and seedkey != NULL
322
         *    calculate DKM
323
         * else if spi_init == NULL and spi_resp == NULL and shared_secret != NULL
324
         *    and sk_d != NULL
325
         *    calculate DKM(Child_DH)
326
         * else if spi_init == NULL and spi_resp == NULL and shared_secret == NULL
327
         *    and sk_d != NULL
328
         *    calculate DKM(Child_SA)
329
         * endif
330
         */
331
0
        if ((ctx->spii != NULL) && (ctx->spii_len != 0)
332
0
            && (ctx->spir != NULL) && (ctx->spir_len != 0)
333
0
            && (ctx->secret == NULL) && (ctx->secret_len == 0)) {
334
0
            if ((ctx->seedkey == NULL) || (ctx->seedkey_len == 0)) {
335
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_KEY);
336
0
                return 0;
337
0
            }
338
0
            if (ctx->seedkey_len != md_size) {
339
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
340
0
                return 0;
341
0
            }
342
0
            if ((keylen < md_size) || (keylen > IKEV2KDF_MAX_DKM_LENGTH)) {
343
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
344
0
                return 0;
345
0
            }
346
            /* calculate DKM */
347
0
            return (IKEV2_DKM(ctx->libctx, key, keylen, md, ctx->seedkey, ctx->seedkey_len,
348
0
                ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
349
0
                ctx->spii, ctx->spii_len, ctx->spir, ctx->spir_len,
350
0
                NULL, 0));
351
0
        } else if ((ctx->spii == NULL) && (ctx->spir == NULL)
352
0
            && (ctx->spii_len == 0) && (ctx->spir_len == 0)) {
353
0
            if ((ctx->sk_d == NULL) || (ctx->sk_d_len == 0)) {
354
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_DKM);
355
0
                return 0;
356
0
            }
357
0
            if ((keylen < md_size) || (keylen > IKEV2KDF_MAX_DKM_LENGTH)) {
358
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
359
0
                return 0;
360
0
            }
361
            /* If Child_DH is intended, require secret_len > 0 */
362
0
            if ((ctx->secret != NULL && ctx->secret_len == 0)
363
0
                || (ctx->secret == NULL && ctx->secret_len != 0)) {
364
0
                ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
365
0
                return 0;
366
0
            }
367
0
            if (!ikev2_check_secret_and_pad(ctx))
368
0
                return 0;
369
            /* calculate DKM(Child_SA) or DKM(Child_DH) */
370
0
            return (IKEV2_DKM(ctx->libctx, key, keylen, md, ctx->sk_d, ctx->sk_d_len,
371
0
                ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
372
0
                NULL, 0, NULL, 0,
373
0
                ctx->secret, ctx->secret_len));
374
0
        } else {
375
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_PARAMETERS_FOR_DKM);
376
0
            return 0;
377
0
        }
378
0
    case EVP_KDF_IKEV2_MODE_REKEY:
379
0
        if ((ctx->secret == NULL) || (ctx->secret_len == 0)) {
380
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_SECRET);
381
0
            return 0;
382
0
        }
383
0
        if ((ctx->sk_d == NULL) || (ctx->sk_d_len == 0)) {
384
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_DKM);
385
0
            return 0;
386
0
        }
387
0
        if (ctx->sk_d_len != md_size) {
388
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
389
0
            return 0;
390
0
        }
391
0
        if (keylen != md_size) {
392
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
393
0
            return 0;
394
0
        }
395
0
        if (!ikev2_check_secret_and_pad(ctx))
396
0
            return 0;
397
0
        return (IKEV2_REKEY(ctx->libctx, key, keylen, (char *)EVP_MD_name(md),
398
0
            ctx->ni, ctx->ni_len, ctx->nr, ctx->nr_len,
399
0
            ctx->secret, ctx->secret_len, ctx->sk_d, ctx->sk_d_len));
400
0
    default:
401
        /* This error is already checked in set_ctx_params */
402
0
        ;
403
0
    }
404
0
    return 0;
405
0
}
406
407
static int kdf_ikev2kdf_set_ctx_params(void *vctx, const OSSL_PARAM params[])
408
0
{
409
0
    struct ikev2_set_ctx_params_st p;
410
0
    KDF_IKEV2KDF *ctx = vctx;
411
0
    const EVP_MD *md;
412
413
0
    if (params == NULL)
414
0
        return 1;
415
416
0
    if (ctx == NULL || !ikev2_set_ctx_params_decoder(params, &p))
417
0
        return 0;
418
419
0
    if (p.digest != NULL) {
420
0
        if (!ossl_prov_digest_load(&ctx->digest, p.digest, p.propq, ctx->libctx))
421
0
            return 0;
422
0
        md = ossl_prov_digest_md(&ctx->digest);
423
0
        if (md == NULL) {
424
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
425
0
            return 0;
426
0
        }
427
428
0
        if (!EVP_MD_is_a(md, SN_sha1)
429
0
            && !EVP_MD_is_a(md, SN_sha224)
430
0
            && !EVP_MD_is_a(md, SN_sha256)
431
0
            && !EVP_MD_is_a(md, SN_sha384)
432
0
            && !EVP_MD_is_a(md, SN_sha512))
433
0
            return 0;
434
0
    }
435
0
    if (p.ni != NULL) {
436
0
        if (!ikev2kdf_set_membuf(&ctx->ni, &ctx->ni_len, p.ni))
437
0
            return 0;
438
0
        if ((ctx->ni_len < IKEV2KDF_MIN_NONCE_LENGTH)
439
0
            || (ctx->ni_len > IKEV2KDF_MAX_NONCE_LENGTH)) {
440
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_NONCE_LENGTH);
441
0
            return 0;
442
0
        }
443
0
    }
444
0
    if (p.nr != NULL) {
445
0
        if (!ikev2kdf_set_membuf(&ctx->nr, &ctx->nr_len, p.nr))
446
0
            return 0;
447
0
        if ((ctx->nr_len < IKEV2KDF_MIN_NONCE_LENGTH)
448
0
            || (ctx->nr_len > IKEV2KDF_MAX_NONCE_LENGTH)) {
449
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_NONCE_LENGTH);
450
0
            return 0;
451
0
        }
452
0
    }
453
0
    if (p.spii != NULL)
454
0
        if (!ikev2kdf_set_membuf(&ctx->spii, &ctx->spii_len, p.spii))
455
0
            return 0;
456
0
    if (p.spir != NULL)
457
0
        if (!ikev2kdf_set_membuf(&ctx->spir, &ctx->spir_len, p.spir))
458
0
            return 0;
459
0
    if (p.secret != NULL)
460
0
        if (!ikev2kdf_set_membuf(&ctx->secret, &ctx->secret_len, p.secret))
461
0
            return 0;
462
0
    if (p.seedkey != NULL)
463
0
        if (!ikev2kdf_set_membuf(&ctx->seedkey, &ctx->seedkey_len, p.seedkey))
464
0
            return 0;
465
0
    if (p.sk_d != NULL)
466
0
        if (!ikev2kdf_set_membuf(&ctx->sk_d, &ctx->sk_d_len, p.sk_d))
467
0
            return 0;
468
0
    if (p.mode != NULL) {
469
0
        if (!OSSL_PARAM_get_int(p.mode, &ctx->mode))
470
0
            return 0;
471
0
        if ((ctx->mode != EVP_KDF_IKEV2_MODE_GEN)
472
0
            && (ctx->mode != EVP_KDF_IKEV2_MODE_DKM)
473
0
            && (ctx->mode != EVP_KDF_IKEV2_MODE_REKEY)) {
474
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MODE);
475
0
            return 0;
476
0
        }
477
0
    }
478
0
    return 1;
479
0
}
480
481
static const OSSL_PARAM *kdf_ikev2kdf_settable_ctx_params(ossl_unused void *ctx,
482
    ossl_unused void *p_ctx)
483
0
{
484
0
    return ikev2_set_ctx_params_list;
485
0
}
486
487
static int kdf_ikev2kdf_get_ctx_params(void *vctx, OSSL_PARAM params[])
488
0
{
489
0
    struct ikev2_get_ctx_params_st p;
490
0
    KDF_IKEV2KDF *ctx = vctx;
491
492
0
    if (ctx == NULL || !ikev2_get_ctx_params_decoder(params, &p))
493
0
        return 0;
494
495
0
    if (p.size != NULL) {
496
0
        int sz = 0;
497
0
        const EVP_MD *md = NULL;
498
499
0
        md = ossl_prov_digest_md(&ctx->digest);
500
0
        if (md == NULL) {
501
0
            ERR_raise(ERR_LIB_PROV, PROV_R_MISSING_MESSAGE_DIGEST);
502
0
            return 0;
503
0
        }
504
0
        sz = EVP_MD_size(md);
505
0
        if (sz <= 0)
506
0
            return 0;
507
0
        if (!OSSL_PARAM_set_size_t(p.size, (size_t)sz))
508
0
            return 0;
509
0
    }
510
0
    return 1;
511
0
}
512
513
static const OSSL_PARAM *kdf_ikev2kdf_gettable_ctx_params(ossl_unused void *ctx,
514
    ossl_unused void *p_ctx)
515
0
{
516
0
    return ikev2_get_ctx_params_list;
517
0
}
518
519
const OSSL_DISPATCH ossl_kdf_ikev2kdf_functions[] = {
520
    { OSSL_FUNC_KDF_NEWCTX, (void (*)(void))kdf_ikev2kdf_new },
521
    { OSSL_FUNC_KDF_DUPCTX, (void (*)(void))kdf_ikev2kdf_dup },
522
    { OSSL_FUNC_KDF_FREECTX, (void (*)(void))kdf_ikev2kdf_free },
523
    { OSSL_FUNC_KDF_RESET, (void (*)(void))kdf_ikev2kdf_reset },
524
    { OSSL_FUNC_KDF_DERIVE, (void (*)(void))kdf_ikev2kdf_derive },
525
    { OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS,
526
        (void (*)(void))kdf_ikev2kdf_settable_ctx_params },
527
    { OSSL_FUNC_KDF_SET_CTX_PARAMS, (void (*)(void))kdf_ikev2kdf_set_ctx_params },
528
    { OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS,
529
        (void (*)(void))kdf_ikev2kdf_gettable_ctx_params },
530
    { OSSL_FUNC_KDF_GET_CTX_PARAMS, (void (*)(void))kdf_ikev2kdf_get_ctx_params },
531
    { 0, NULL }
532
};
533
534
/*
535
 * IKEV2_GEN - KDF in compliance with SP800-135 for IKEv2,
536
 *             generate the seedkey.
537
 *
538
 * algorithm: HMAC(ni || nr, shared_secret)
539
 *
540
 * Inputs:
541
 *   libctx - provider LIB context
542
 *   seedkey - pointer to output for seedkey
543
 *   keylen - length of seedkey(in bytes)
544
 *   md_name - name of the SHA digest
545
 *   ni - pointer to initiator nonce input
546
 *   ni_len - initiator nonce length(in bytes)
547
 *   nr - pointer to responder nonce input
548
 *   nr_len - nonce length(in bytes)
549
 *   shared_secret - pointer to secret input
550
 *   shared_secret_len - secret length(in bytes)
551
 * Outputs:
552
 *   return - 1 pass, 0 fail
553
 *   seedkey - output seedkey when passing.
554
 */
555
static int IKEV2_GEN(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
556
    char *md_name, const unsigned char *ni, const size_t ni_len,
557
    const unsigned char *nr, const size_t nr_len,
558
    const unsigned char *shared_secret, const size_t shared_secret_len)
559
0
{
560
0
    EVP_MAC_CTX *ctx = NULL;
561
0
    EVP_MAC *mac = NULL;
562
0
    size_t outl = 0;
563
0
    int ret = 0;
564
0
    unsigned char *nonce = NULL;
565
0
    OSSL_PARAM params[] = {
566
0
        OSSL_PARAM_construct_utf8_string("digest", md_name, 0),
567
0
        OSSL_PARAM_construct_end()
568
0
    };
569
570
0
    nonce = OPENSSL_malloc(ni_len + nr_len);
571
0
    if (nonce == NULL)
572
0
        return ret;
573
0
    memcpy(nonce, ni, ni_len);
574
0
    memcpy(nonce + ni_len, nr, nr_len);
575
576
0
    mac = EVP_MAC_fetch(libctx, (char *)"HMAC", NULL);
577
0
    if ((mac == NULL)
578
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL)
579
0
        || (!EVP_MAC_init(ctx, nonce, ni_len + nr_len, params))
580
0
        || (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
581
0
        || (!EVP_MAC_final(ctx, seedkey, &outl, keylen))
582
0
        || (outl != keylen))
583
0
        goto err;
584
585
0
    ret = 1;
586
0
err:
587
0
    OPENSSL_clear_free(nonce, ni_len + nr_len);
588
0
    EVP_MAC_CTX_free(ctx);
589
0
    EVP_MAC_free(mac);
590
0
    return ret;
591
0
}
592
593
/*
594
 * IKEV2_REKEY - KDF in compliance with SP800-135 for IKEv2,
595
 *               re-generate the seedkey.
596
 *
597
 * algorithm:  HMAC(sk_d, new secret || Ni || Nr )
598
 *
599
 * Inputs:
600
 *   libctx - provider LIB context
601
 *   seedkey - pointer to output for seedkey
602
 *   keylen - length of seedkey(in bytes)
603
 *   md_name - name of the SHA digest
604
 *   ni - pointer to initiator nonce input
605
 *   ni_len - initiator nonce length(in bytes)
606
 *   nr - pointer to responder nonce input
607
 *   nr_len - responder nonce length(in bytes)
608
 *   shared_secret - (new) pointer to secret input
609
 *   shared_secret_len - (new)secret length(in bytes)
610
 *   sk_d - pointer to sk_d portion of DKM
611
 *   skd_len - length of sk_d (in bytes)
612
 * Outputs:
613
 *   return = 1 pass, 0 fail
614
 *   seedkey - output seedkey when passing.
615
 */
616
static int IKEV2_REKEY(OSSL_LIB_CTX *libctx, unsigned char *seedkey, const size_t keylen,
617
    char *md_name, const unsigned char *ni, const size_t ni_len,
618
    const unsigned char *nr, const size_t nr_len,
619
    const unsigned char *shared_secret, const size_t shared_secret_len,
620
    const unsigned char *sk_d, const size_t sk_d_len)
621
0
{
622
0
    EVP_MAC_CTX *ctx = NULL;
623
0
    EVP_MAC *mac = NULL;
624
0
    size_t outl = 0;
625
0
    int ret = 0;
626
0
    OSSL_PARAM params[] = {
627
0
        OSSL_PARAM_construct_utf8_string("digest", md_name, 0),
628
0
        OSSL_PARAM_construct_end()
629
0
    };
630
631
0
    mac = EVP_MAC_fetch(libctx, "HMAC", NULL);
632
0
    if ((mac == NULL)
633
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL)
634
0
        || (!EVP_MAC_init(ctx, sk_d, sk_d_len, params))
635
0
        || (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
636
0
        || (!EVP_MAC_update(ctx, ni, ni_len))
637
0
        || (!EVP_MAC_update(ctx, nr, nr_len))
638
0
        || (!EVP_MAC_final(ctx, seedkey, &outl, keylen))
639
0
        || (outl != keylen))
640
0
        goto err;
641
642
0
    ret = 1;
643
644
0
err:
645
0
    EVP_MAC_CTX_free(ctx);
646
0
    EVP_MAC_free(mac);
647
0
    return ret;
648
0
}
649
650
/*
651
 * IKEV2_DKM - KDF in compliance with SP800-135 for IKEv2,
652
 *             generate the Derived Keying Material(DKM),
653
 *             DKM(Child SA) and DKM(Child SA DH).
654
 * algorithm:
655
 *   if spii != NULL and spir != NULL and shared_secret == NULL
656
 *     and seedkey != NULL
657
 *     calculate DKM:
658
 *       HMAC(seedkey, ni || nr || spii || spir)
659
 *   else if spii == NULL and spir == NULL and shared_secret == NULL
660
 *     calculate DKM(Child_SA):
661
 *       HMAC(sk_d, ni || nr)
662
 *   else if spii == NULL and spir == NULL and shared_secret != NULL
663
 *     calculate DKM(Child_DH):
664
 *       HMAC(sk_d, ni || nr || new_shared_secret)
665
 *   endif
666
 *
667
 * Inputs:
668
 *   libctx - provider LIB context
669
 *   dkm - pointer to output dkm
670
 *   len_out - output length(in bytes)
671
 *   evp_md - pointer to SHA digest
672
 *   seekkey - pointer to seedkey (seekkey for DKM, sk_d for Child_SA/DH)
673
 *   seedkey_len - length of seedkey(in bytes)
674
 *   ni - pointer to initiator nonce
675
 *   ni_len - initiator nonce length(in bytes)
676
 *   nr - pointer to responder nonce
677
 *   nr_len - responder nonce length(in bytes)
678
 *   shared_secret - pointer to secret input
679
 *   shared_secret_len - secret length(in bytes)
680
 * Outputs:
681
 *   return - 1 pass, 0 fail
682
 *   dkm - output dkm when passing.
683
 */
684
static int IKEV2_DKM(OSSL_LIB_CTX *libctx, unsigned char *dkm, const size_t len_out,
685
    const EVP_MD *evp_md,
686
    const unsigned char *seedkey, const size_t seedkey_len,
687
    const unsigned char *ni, const size_t ni_len,
688
    const unsigned char *nr, const size_t nr_len,
689
    const unsigned char *spii, const size_t spii_len,
690
    const unsigned char *spir, const size_t spir_len,
691
    const unsigned char *shared_secret, const size_t shared_secret_len)
692
0
{
693
0
    EVP_MAC_CTX *ctx = NULL;
694
0
    EVP_MAC *mac = NULL;
695
0
    size_t outl = 0, hmac_len = 0, ii;
696
0
    unsigned char *hmac = NULL;
697
0
    int ret = 0;
698
0
    size_t md_size = 0;
699
0
    int value = 0;
700
0
    unsigned char counter = 1;
701
0
    OSSL_PARAM params[] = {
702
0
        OSSL_PARAM_construct_utf8_string("digest", (char *)EVP_MD_name(evp_md), 0),
703
0
        OSSL_PARAM_construct_end()
704
0
    };
705
706
0
    value = EVP_MD_size(evp_md);
707
0
    if (value <= 0)
708
0
        return 0;
709
0
    md_size = (size_t)value;
710
    /* len_out may not fit the last hmac, round up */
711
0
    hmac_len = ((len_out + md_size - 1) / md_size) * md_size;
712
0
    hmac = OPENSSL_malloc(hmac_len);
713
0
    if (hmac == NULL)
714
0
        return 0;
715
716
0
    mac = EVP_MAC_fetch(libctx, "HMAC", NULL);
717
0
    if ((mac == NULL)
718
0
        || ((ctx = EVP_MAC_CTX_new(mac)) == NULL))
719
0
        goto err;
720
721
    /*
722
     * len_out <= IKEV2_MAX_DKM_LEN
723
     * loop count will fit in 1 byte value
724
     */
725
0
    for (ii = 0; ii < len_out; ii += md_size) {
726
0
        if (!EVP_MAC_init(ctx, seedkey, seedkey_len, params))
727
0
            goto err;
728
0
        if (ii != 0)
729
0
            if (!EVP_MAC_update(ctx, &hmac[ii - md_size], md_size))
730
0
                goto err;
731
0
        if (shared_secret != NULL)
732
0
            if (!EVP_MAC_update(ctx, shared_secret, shared_secret_len))
733
0
                goto err;
734
0
        if (!EVP_MAC_update(ctx, ni, ni_len)
735
0
            || !EVP_MAC_update(ctx, nr, nr_len))
736
0
            goto err;
737
0
        if (spii != NULL)
738
0
            if (!EVP_MAC_update(ctx, spii, spii_len)
739
0
                || !EVP_MAC_update(ctx, spir, spir_len))
740
0
                goto err;
741
0
        if (!EVP_MAC_update(ctx, &counter, 1))
742
0
            goto err;
743
0
        if (!EVP_MAC_final(ctx, &hmac[ii], &outl, md_size))
744
0
            goto err;
745
0
        counter++;
746
0
    }
747
748
0
    memcpy(dkm, hmac, len_out);
749
0
    ret = 1;
750
0
err:
751
0
    OPENSSL_clear_free(hmac, hmac_len);
752
0
    EVP_MAC_CTX_free(ctx);
753
0
    EVP_MAC_free(mac);
754
0
    return ret;
755
0
}