Coverage Report

Created: 2026-09-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/ciphers/ciphercommon_gcm.c
Line
Count
Source
1
/*
2
 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
/* clang-format off */
10
11
/* clang-format on */
12
13
/* Dispatch functions for gcm mode */
14
15
#include <openssl/rand.h>
16
#include <openssl/proverr.h>
17
#include "prov/ciphercommon.h"
18
#include "prov/ciphercommon_gcm.h"
19
#include "prov/providercommon.h"
20
#include "prov/provider_ctx.h"
21
22
static int gcm_tls_init(PROV_GCM_CTX *dat, unsigned char *aad, size_t aad_len);
23
static int gcm_tls_iv_set_fixed(PROV_GCM_CTX *ctx, unsigned char *iv,
24
    size_t len);
25
static int gcm_tls_cipher(PROV_GCM_CTX *ctx, unsigned char *out, size_t *padlen,
26
    const unsigned char *in, size_t len);
27
static int gcm_cipher_internal(PROV_GCM_CTX *ctx, unsigned char *out,
28
    size_t *padlen, const unsigned char *in,
29
    size_t len);
30
31
/*
32
 * Called from EVP_CipherInit when there is currently no context via
33
 * the new_ctx() function
34
 */
35
void ossl_gcm_initctx(void *provctx, PROV_GCM_CTX *ctx, size_t keybits,
36
    const PROV_GCM_HW *hw)
37
721k
{
38
721k
    ctx->pad = 1;
39
721k
    ctx->mode = EVP_CIPH_GCM_MODE;
40
721k
    ctx->taglen = UNINITIALISED_SIZET;
41
721k
    ctx->tls_aad_len = UNINITIALISED_SIZET;
42
721k
    ctx->ivlen = (EVP_GCM_TLS_FIXED_IV_LEN + EVP_GCM_TLS_EXPLICIT_IV_LEN);
43
721k
    ctx->keylen = keybits / 8;
44
721k
    ctx->hw = hw;
45
721k
    ctx->libctx = PROV_LIBCTX_OF(provctx);
46
721k
}
47
48
/*
49
 * Called by EVP_CipherInit via the _einit and _dinit functions
50
 */
51
static int gcm_init(void *vctx, const unsigned char *key, size_t keylen,
52
    const unsigned char *iv, size_t ivlen,
53
    const OSSL_PARAM params[], int enc)
54
2.29M
{
55
2.29M
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
56
57
2.29M
    if (!ossl_prov_is_running())
58
0
        return 0;
59
60
2.29M
    ctx->enc = enc;
61
62
2.29M
    if (iv != NULL) {
63
2.21M
        if (ivlen == 0 || ivlen > sizeof(ctx->iv)) {
64
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
65
0
            return 0;
66
0
        }
67
2.21M
        ctx->ivlen = ivlen;
68
2.21M
        memcpy(ctx->iv, iv, ivlen);
69
2.21M
        ctx->iv_state = IV_STATE_BUFFERED;
70
2.21M
    }
71
72
2.29M
    if (key != NULL) {
73
721k
        if (keylen != ctx->keylen) {
74
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
75
0
            return 0;
76
0
        }
77
721k
        if (!ctx->hw->setkey(ctx, key, ctx->keylen))
78
0
            return 0;
79
721k
        ctx->tls_enc_records = 0;
80
721k
    }
81
2.29M
    return ossl_gcm_set_ctx_params(ctx, params);
82
2.29M
}
83
84
int ossl_gcm_einit(void *vctx, const unsigned char *key, size_t keylen,
85
    const unsigned char *iv, size_t ivlen,
86
    const OSSL_PARAM params[])
87
1.35M
{
88
1.35M
    return gcm_init(vctx, key, keylen, iv, ivlen, params, 1);
89
1.35M
}
90
91
int ossl_gcm_dinit(void *vctx, const unsigned char *key, size_t keylen,
92
    const unsigned char *iv, size_t ivlen,
93
    const OSSL_PARAM params[])
94
945k
{
95
945k
    return gcm_init(vctx, key, keylen, iv, ivlen, params, 0);
96
945k
}
97
98
/* increment counter (64-bit int) by 1 */
99
static void ctr64_inc(unsigned char *counter)
100
1.90k
{
101
1.90k
    int n = 8;
102
1.90k
    unsigned char c;
103
104
1.90k
    do {
105
1.90k
        --n;
106
1.90k
        c = counter[n];
107
1.90k
        ++c;
108
1.90k
        counter[n] = c;
109
1.90k
        if (c > 0)
110
1.90k
            return;
111
1.90k
    } while (n > 0);
112
1.90k
}
113
114
static int getivgen(PROV_GCM_CTX *ctx, unsigned char *out, size_t olen)
115
1.90k
{
116
1.90k
    if (!ctx->iv_gen
117
1.90k
        || !ctx->key_set
118
1.90k
        || !ctx->hw->setiv(ctx, ctx->iv, ctx->ivlen))
119
0
        return 0;
120
1.90k
    if (olen == 0 || olen > ctx->ivlen)
121
0
        olen = ctx->ivlen;
122
1.90k
    memcpy(out, ctx->iv + ctx->ivlen - olen, olen);
123
    /*
124
     * Invocation field will be at least 8 bytes in size and so no need
125
     * to check wrap around or increment more than last 8 bytes.
126
     */
127
1.90k
    ctr64_inc(ctx->iv + ctx->ivlen - 8);
128
1.90k
    ctx->iv_state = IV_STATE_COPIED;
129
1.90k
    return 1;
130
1.90k
}
131
132
static int setivinv(PROV_GCM_CTX *ctx, unsigned char *in, size_t inl)
133
101k
{
134
101k
    if (!ctx->iv_gen
135
101k
        || !ctx->key_set
136
101k
        || ctx->enc)
137
0
        return 0;
138
139
101k
    memcpy(ctx->iv + ctx->ivlen - inl, in, inl);
140
101k
    if (!ctx->hw->setiv(ctx, ctx->iv, ctx->ivlen))
141
0
        return 0;
142
101k
    ctx->iv_state = IV_STATE_COPIED;
143
101k
    return 1;
144
101k
}
145
146
/* clang-format off */
147
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
148
#ifndef ossl_cipher_gcm_get_ctx_params_list
149
static const OSSL_PARAM ossl_cipher_gcm_get_ctx_params_list[] = {
150
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
151
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
152
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TAGLEN, NULL),
153
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV, NULL, 0),
154
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV, NULL, 0),
155
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
156
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD, NULL),
157
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN, NULL, 0),
158
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_AEAD_IV_GENERATED, NULL),
159
    OSSL_PARAM_END
160
};
161
#endif
162
163
#ifndef ossl_cipher_gcm_get_ctx_params_st
164
struct ossl_cipher_gcm_get_ctx_params_st {
165
    OSSL_PARAM *gen;
166
    OSSL_PARAM *iv;
167
    OSSL_PARAM *ivgen;
168
    OSSL_PARAM *ivlen;
169
    OSSL_PARAM *keylen;
170
    OSSL_PARAM *pad;
171
    OSSL_PARAM *tag;
172
    OSSL_PARAM *taglen;
173
    OSSL_PARAM *updiv;
174
};
175
#endif
176
177
#ifndef ossl_cipher_gcm_get_ctx_params_decoder
178
static int ossl_cipher_gcm_get_ctx_params_decoder
179
    (const OSSL_PARAM *p, struct ossl_cipher_gcm_get_ctx_params_st *r)
180
1.45M
{
181
1.45M
    const char *s;
182
183
1.45M
    memset(r, 0, sizeof(*r));
184
1.45M
    if (p != NULL)
185
2.91M
        for (; (s = p->key) != NULL; p++)
186
1.45M
            switch(s[0]) {
187
0
            default:
188
0
                break;
189
335k
            case 'i':
190
335k
                switch(s[1]) {
191
0
                default:
192
0
                    break;
193
335k
                case 'v':
194
335k
                    switch(s[2]) {
195
0
                    default:
196
0
                        break;
197
0
                    case '-':
198
0
                        if (ossl_likely(strcmp("generated", s + 3) == 0)) {
199
                            /* OSSL_CIPHER_PARAM_AEAD_IV_GENERATED */
200
0
                            if (ossl_unlikely(r->gen != NULL)) {
201
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
202
0
                                               "param %s is repeated", s);
203
0
                                return 0;
204
0
                            }
205
0
                            r->gen = (OSSL_PARAM *)p;
206
0
                        }
207
0
                        break;
208
335k
                    case 'l':
209
335k
                        if (ossl_likely(strcmp("en", s + 3) == 0)) {
210
                            /* OSSL_CIPHER_PARAM_IVLEN */
211
335k
                            if (ossl_unlikely(r->ivlen != NULL)) {
212
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
213
0
                                               "param %s is repeated", s);
214
0
                                return 0;
215
0
                            }
216
335k
                            r->ivlen = (OSSL_PARAM *)p;
217
335k
                        }
218
335k
                        break;
219
335k
                    case '\0':
220
0
                        if (ossl_unlikely(r->iv != NULL)) {
221
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
222
0
                                           "param %s is repeated", s);
223
0
                            return 0;
224
0
                        }
225
0
                        r->iv = (OSSL_PARAM *)p;
226
335k
                    }
227
335k
                }
228
335k
                break;
229
363k
            case 'k':
230
363k
                if (ossl_likely(strcmp("eylen", s + 1) == 0)) {
231
                    /* OSSL_CIPHER_PARAM_KEYLEN */
232
363k
                    if (ossl_unlikely(r->keylen != NULL)) {
233
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
234
0
                                       "param %s is repeated", s);
235
0
                        return 0;
236
0
                    }
237
363k
                    r->keylen = (OSSL_PARAM *)p;
238
363k
                }
239
363k
                break;
240
755k
            case 't':
241
755k
                switch(s[1]) {
242
0
                default:
243
0
                    break;
244
708k
                case 'a':
245
708k
                    switch(s[2]) {
246
0
                    default:
247
0
                        break;
248
708k
                    case 'g':
249
708k
                        switch(s[3]) {
250
0
                        default:
251
0
                            break;
252
0
                        case 'l':
253
0
                            if (ossl_likely(strcmp("en", s + 4) == 0)) {
254
                                /* OSSL_CIPHER_PARAM_AEAD_TAGLEN */
255
0
                                if (ossl_unlikely(r->taglen != NULL)) {
256
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
257
0
                                                   "param %s is repeated", s);
258
0
                                    return 0;
259
0
                                }
260
0
                                r->taglen = (OSSL_PARAM *)p;
261
0
                            }
262
0
                            break;
263
708k
                        case '\0':
264
708k
                            if (ossl_unlikely(r->tag != NULL)) {
265
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
266
0
                                               "param %s is repeated", s);
267
0
                                return 0;
268
0
                            }
269
708k
                            r->tag = (OSSL_PARAM *)p;
270
708k
                        }
271
708k
                    }
272
708k
                    break;
273
708k
                case 'l':
274
47.3k
                    switch(s[2]) {
275
0
                    default:
276
0
                        break;
277
47.3k
                    case 's':
278
47.3k
                        switch(s[3]) {
279
17
                        default:
280
17
                            break;
281
47.3k
                        case 'a':
282
47.3k
                            if (ossl_likely(strcmp("adpad", s + 4) == 0)) {
283
                                /* OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD */
284
47.3k
                                if (ossl_unlikely(r->pad != NULL)) {
285
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
286
0
                                                   "param %s is repeated", s);
287
0
                                    return 0;
288
0
                                }
289
47.3k
                                r->pad = (OSSL_PARAM *)p;
290
47.3k
                            }
291
47.3k
                            break;
292
47.3k
                        case 'i':
293
0
                            if (ossl_likely(strcmp("vgen", s + 4) == 0)) {
294
                                /* OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN */
295
0
                                if (ossl_unlikely(r->ivgen != NULL)) {
296
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
297
0
                                                   "param %s is repeated", s);
298
0
                                    return 0;
299
0
                                }
300
0
                                r->ivgen = (OSSL_PARAM *)p;
301
0
                            }
302
47.3k
                        }
303
47.3k
                    }
304
755k
                }
305
755k
                break;
306
755k
            case 'u':
307
0
                if (ossl_likely(strcmp("pdated-iv", s + 1) == 0)) {
308
                    /* OSSL_CIPHER_PARAM_UPDATED_IV */
309
0
                    if (ossl_unlikely(r->updiv != NULL)) {
310
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
311
0
                                       "param %s is repeated", s);
312
0
                        return 0;
313
0
                    }
314
0
                    r->updiv = (OSSL_PARAM *)p;
315
0
                }
316
1.45M
            }
317
1.45M
    return 1;
318
1.45M
}
319
#endif
320
/* End of machine generated */
321
/* clang-format on */
322
323
const OSSL_PARAM *ossl_gcm_gettable_ctx_params(
324
    ossl_unused void *cctx, ossl_unused void *provctx)
325
308
{
326
308
    return ossl_cipher_gcm_get_ctx_params_list;
327
308
}
328
329
int ossl_gcm_get_ctx_params(void *vctx, OSSL_PARAM params[])
330
415k
{
331
415k
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
332
415k
    size_t sz;
333
415k
    struct ossl_cipher_gcm_get_ctx_params_st p;
334
335
415k
    if (ctx == NULL || !ossl_cipher_gcm_get_ctx_params_decoder(params, &p))
336
0
        return 0;
337
338
415k
    if (p.ivlen != NULL && !OSSL_PARAM_set_size_t(p.ivlen, ctx->ivlen)) {
339
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
340
0
        return 0;
341
0
    }
342
343
415k
    if (p.keylen != NULL && !OSSL_PARAM_set_size_t(p.keylen, ctx->keylen)) {
344
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
345
0
        return 0;
346
0
    }
347
348
415k
    if (p.taglen != NULL) {
349
0
        size_t taglen = (ctx->taglen != UNINITIALISED_SIZET) ? ctx->taglen : GCM_TAG_MAX_SIZE;
350
351
0
        if (!OSSL_PARAM_set_size_t(p.taglen, taglen)) {
352
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
353
0
            return 0;
354
0
        }
355
0
    }
356
357
415k
    if (p.iv != NULL) {
358
0
        if (ctx->iv_state == IV_STATE_UNINITIALISED)
359
0
            return 0;
360
0
        if (p.iv->data != NULL && ctx->ivlen > p.iv->data_size) {
361
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
362
0
            return 0;
363
0
        }
364
0
        if (!OSSL_PARAM_set_octet_string_or_ptr(p.iv, ctx->iv, ctx->ivlen)) {
365
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
366
0
            return 0;
367
0
        }
368
0
    }
369
370
415k
    if (p.updiv != NULL) {
371
0
        if (ctx->iv_state == IV_STATE_UNINITIALISED)
372
0
            return 0;
373
0
        if (p.updiv->data != NULL && ctx->ivlen > p.updiv->data_size) {
374
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
375
0
            return 0;
376
0
        }
377
0
        if (!OSSL_PARAM_set_octet_string_or_ptr(p.updiv, ctx->iv, ctx->ivlen)) {
378
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
379
0
            return 0;
380
0
        }
381
0
    }
382
383
415k
    if (p.pad != NULL && !OSSL_PARAM_set_size_t(p.pad, ctx->tls_aad_pad_sz)) {
384
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
385
0
        return 0;
386
0
    }
387
388
415k
    if (p.tag != NULL) {
389
235k
        if (!ctx->enc || ctx->taglen == UNINITIALISED_SIZET) {
390
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG);
391
0
            return 0;
392
0
        }
393
235k
        if (p.tag->data == NULL) {
394
            /* size query: report the tag length, as for the iv above */
395
0
            sz = ctx->taglen;
396
235k
        } else {
397
235k
            sz = p.tag->data_size;
398
235k
            if (sz > EVP_GCM_TLS_TAG_LEN || sz == 0) {
399
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG);
400
0
                return 0;
401
0
            }
402
235k
        }
403
404
235k
        if (!OSSL_PARAM_set_octet_string(p.tag, ctx->buf, sz)) {
405
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
406
0
            return 0;
407
0
        }
408
235k
    }
409
410
415k
    if (p.ivgen != NULL)
411
0
        if (p.ivgen->data == NULL
412
0
            || p.ivgen->data_type != OSSL_PARAM_OCTET_STRING
413
0
            || !getivgen(ctx, p.ivgen->data, p.ivgen->data_size))
414
0
            return 0;
415
416
415k
    if (p.gen != NULL && !OSSL_PARAM_set_uint(p.gen, ctx->iv_gen_rand))
417
0
        return 0;
418
419
415k
    return 1;
420
415k
}
421
422
/* clang-format off */
423
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
424
#ifndef ossl_cipher_gcm_set_ctx_params_list
425
static const OSSL_PARAM ossl_cipher_gcm_set_ctx_params_list[] = {
426
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, NULL),
427
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
428
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD, NULL, 0),
429
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED, NULL, 0),
430
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV, NULL, 0),
431
    OSSL_PARAM_END
432
};
433
#endif
434
435
#ifndef ossl_cipher_gcm_set_ctx_params_st
436
struct ossl_cipher_gcm_set_ctx_params_st {
437
    OSSL_PARAM *aad;
438
    OSSL_PARAM *fixed;
439
    OSSL_PARAM *inviv;
440
    OSSL_PARAM *ivlen;
441
    OSSL_PARAM *tag;
442
};
443
#endif
444
445
#ifndef ossl_cipher_gcm_set_ctx_params_decoder
446
static int ossl_cipher_gcm_set_ctx_params_decoder
447
    (const OSSL_PARAM *p, struct ossl_cipher_gcm_set_ctx_params_st *r)
448
1.83M
{
449
1.83M
    const char *s;
450
451
1.83M
    memset(r, 0, sizeof(*r));
452
1.83M
    if (p != NULL)
453
1.02M
        for (; (s = p->key) != NULL; p++)
454
514k
            switch(s[0]) {
455
290
            default:
456
290
                break;
457
2.57k
            case 'i':
458
2.57k
                if (ossl_likely(strcmp("vlen", s + 1) == 0)) {
459
                    /* OSSL_CIPHER_PARAM_AEAD_IVLEN */
460
2.57k
                    if (ossl_unlikely(r->ivlen != NULL)) {
461
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
462
0
                                       "param %s is repeated", s);
463
0
                        return 0;
464
0
                    }
465
2.57k
                    r->ivlen = (OSSL_PARAM *)p;
466
2.57k
                }
467
2.57k
                break;
468
512k
            case 't':
469
512k
                switch(s[1]) {
470
0
                default:
471
0
                    break;
472
459k
                case 'a':
473
459k
                    if (ossl_likely(strcmp("g", s + 2) == 0)) {
474
                        /* OSSL_CIPHER_PARAM_AEAD_TAG */
475
459k
                        if (ossl_unlikely(r->tag != NULL)) {
476
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
477
0
                                           "param %s is repeated", s);
478
0
                            return 0;
479
0
                        }
480
459k
                        r->tag = (OSSL_PARAM *)p;
481
459k
                    }
482
459k
                    break;
483
459k
                case 'l':
484
52.1k
                    switch(s[2]) {
485
0
                    default:
486
0
                        break;
487
52.1k
                    case 's':
488
52.1k
                        switch(s[3]) {
489
3.14k
                        default:
490
3.14k
                            break;
491
47.4k
                        case 'a':
492
47.4k
                            if (ossl_likely(strcmp("ad", s + 4) == 0)) {
493
                                /* OSSL_CIPHER_PARAM_AEAD_TLS1_AAD */
494
47.4k
                                if (ossl_unlikely(r->aad != NULL)) {
495
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
496
0
                                                   "param %s is repeated", s);
497
0
                                    return 0;
498
0
                                }
499
47.4k
                                r->aad = (OSSL_PARAM *)p;
500
47.4k
                            }
501
47.4k
                            break;
502
47.4k
                        case 'i':
503
1.59k
                            switch(s[4]) {
504
0
                            default:
505
0
                                break;
506
1.59k
                            case 'v':
507
1.59k
                                switch(s[5]) {
508
0
                                default:
509
0
                                    break;
510
1.58k
                                case 'f':
511
1.58k
                                    if (ossl_likely(strcmp("ixed", s + 6) == 0)) {
512
                                        /* OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED */
513
1.58k
                                        if (ossl_unlikely(r->fixed != NULL)) {
514
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
515
0
                                                           "param %s is repeated", s);
516
0
                                            return 0;
517
0
                                        }
518
1.58k
                                        r->fixed = (OSSL_PARAM *)p;
519
1.58k
                                    }
520
1.58k
                                    break;
521
1.58k
                                case 'i':
522
9
                                    if (ossl_likely(strcmp("nv", s + 6) == 0)) {
523
                                        /* OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV */
524
9
                                        if (ossl_unlikely(r->inviv != NULL)) {
525
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
526
0
                                                           "param %s is repeated", s);
527
0
                                            return 0;
528
0
                                        }
529
9
                                        r->inviv = (OSSL_PARAM *)p;
530
9
                                    }
531
1.59k
                                }
532
1.59k
                            }
533
52.1k
                        }
534
52.1k
                    }
535
512k
                }
536
514k
            }
537
1.83M
    return 1;
538
1.83M
}
539
#endif
540
/* End of machine generated */
541
/* clang-format on */
542
543
const OSSL_PARAM *ossl_gcm_settable_ctx_params(
544
    ossl_unused void *cctx, ossl_unused void *provctx)
545
12
{
546
12
    return ossl_cipher_gcm_set_ctx_params_list;
547
12
}
548
549
int ossl_gcm_set_ctx_params(void *vctx, const OSSL_PARAM params[])
550
1.07M
{
551
1.07M
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
552
1.07M
    size_t sz;
553
1.07M
    void *vp;
554
1.07M
    struct ossl_cipher_gcm_set_ctx_params_st p;
555
556
1.07M
    if (ctx == NULL || !ossl_cipher_gcm_set_ctx_params_decoder(params, &p))
557
0
        return 0;
558
559
1.07M
    if (p.tag != NULL) {
560
292k
        vp = ctx->buf;
561
292k
        if (!OSSL_PARAM_get_octet_string(p.tag, &vp, EVP_GCM_TLS_TAG_LEN, &sz)) {
562
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
563
0
            return 0;
564
0
        }
565
292k
        if (sz == 0 || ctx->enc) {
566
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG);
567
0
            return 0;
568
0
        }
569
292k
        ctx->taglen = sz;
570
292k
    }
571
572
1.07M
    if (p.ivlen != NULL) {
573
1.47k
        if (!OSSL_PARAM_get_size_t(p.ivlen, &sz)) {
574
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
575
0
            return 0;
576
0
        }
577
1.47k
        if (sz == 0 || sz > sizeof(ctx->iv)) {
578
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
579
0
            return 0;
580
0
        }
581
1.47k
        if (ctx->ivlen != sz) {
582
            /* If the iv was already set or autogenerated, it is invalid. */
583
0
            if (ctx->iv_state != IV_STATE_UNINITIALISED)
584
0
                ctx->iv_state = IV_STATE_FINISHED;
585
0
            ctx->ivlen = sz;
586
0
        }
587
1.47k
    }
588
589
1.07M
    if (p.aad != NULL) {
590
12.3k
        if (p.aad->data_type != OSSL_PARAM_OCTET_STRING) {
591
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
592
0
            return 0;
593
0
        }
594
12.3k
        sz = gcm_tls_init(ctx, p.aad->data, p.aad->data_size);
595
12.3k
        if (sz == 0) {
596
40
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_AAD);
597
40
            return 0;
598
40
        }
599
12.2k
        ctx->tls_aad_pad_sz = sz;
600
12.2k
    }
601
602
1.07M
    if (p.fixed != NULL) {
603
627
        if (p.fixed->data_type != OSSL_PARAM_OCTET_STRING) {
604
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
605
0
            return 0;
606
0
        }
607
627
        if (gcm_tls_iv_set_fixed(ctx, p.fixed->data, p.fixed->data_size) == 0) {
608
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
609
0
            return 0;
610
0
        }
611
627
    }
612
613
1.07M
    if (p.inviv != NULL)
614
0
        if (p.inviv->data == NULL
615
0
            || p.inviv->data_type != OSSL_PARAM_OCTET_STRING
616
0
            || !setivinv(ctx, p.inviv->data, p.inviv->data_size))
617
0
            return 0;
618
619
1.07M
    return 1;
620
1.07M
}
621
622
int ossl_gcm_stream_update(void *vctx, unsigned char *out, size_t *outl,
623
    size_t outsize, const unsigned char *in, size_t inl)
624
4.64M
{
625
4.64M
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
626
627
4.64M
    if (inl == 0) {
628
0
        *outl = 0;
629
0
        return 1;
630
0
    }
631
632
4.64M
    if (outsize < inl) {
633
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
634
0
        return 0;
635
0
    }
636
637
4.64M
    if (gcm_cipher_internal(ctx, out, outl, in, inl) <= 0) {
638
101k
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
639
101k
        return 0;
640
101k
    }
641
4.53M
    return 1;
642
4.64M
}
643
644
int ossl_gcm_stream_final(void *vctx, unsigned char *out, size_t *outl,
645
    size_t outsize)
646
2.04M
{
647
2.04M
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
648
2.04M
    int i;
649
650
2.04M
    if (!ossl_prov_is_running())
651
0
        return 0;
652
653
2.04M
    i = gcm_cipher_internal(ctx, out, outl, NULL, 0);
654
2.04M
    if (i <= 0)
655
762k
        return 0;
656
657
1.27M
    *outl = 0;
658
1.27M
    return 1;
659
2.04M
}
660
661
int ossl_gcm_cipher(void *vctx,
662
    unsigned char *out, size_t *outl, size_t outsize,
663
    const unsigned char *in, size_t inl)
664
0
{
665
0
    PROV_GCM_CTX *ctx = (PROV_GCM_CTX *)vctx;
666
667
0
    if (!ossl_prov_is_running())
668
0
        return 0;
669
670
0
    if (outsize < inl) {
671
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
672
0
        return 0;
673
0
    }
674
675
0
    if (gcm_cipher_internal(ctx, out, outl, in, inl) <= 0)
676
0
        return 0;
677
678
0
    *outl = inl;
679
0
    return 1;
680
0
}
681
682
/*
683
 * See SP800-38D (GCM) Section 8 "Uniqueness requirement on IVS and keys"
684
 *
685
 * See also 8.2.2 RBG-based construction.
686
 * Random construction consists of a free field (which can be NULL) and a
687
 * random field which will use a DRBG that can return at least 96 bits of
688
 * entropy strength. (The DRBG must be seeded by the FIPS module).
689
 */
690
static int gcm_iv_generate(PROV_GCM_CTX *ctx, int offset)
691
416
{
692
416
    int sz = (int)(ctx->ivlen - offset);
693
694
    /* Must be at least 96 bits */
695
416
    if (sz <= 0 || ctx->ivlen < GCM_IV_DEFAULT_SIZE)
696
0
        return 0;
697
698
    /* Use DRBG to generate random iv */
699
416
    if (RAND_bytes_ex(ctx->libctx, ctx->iv + offset, sz, 0) <= 0)
700
0
        return 0;
701
416
    ctx->iv_state = IV_STATE_BUFFERED;
702
416
    ctx->iv_gen_rand = 1;
703
416
    return 1;
704
416
}
705
706
static int gcm_cipher_internal(PROV_GCM_CTX *ctx, unsigned char *out,
707
    size_t *padlen, const unsigned char *in,
708
    size_t len)
709
5.04M
{
710
5.04M
    size_t olen = 0;
711
5.04M
    int rv = 0;
712
5.04M
    const PROV_GCM_HW *hw = ctx->hw;
713
714
5.04M
    if (ctx->tls_aad_len != UNINITIALISED_SIZET)
715
68.1k
        return gcm_tls_cipher(ctx, out, padlen, in, len);
716
717
4.97M
    if (!ctx->key_set || ctx->iv_state == IV_STATE_FINISHED)
718
0
        goto err;
719
720
    /*
721
     * FIPS requires generation of AES-GCM IV's inside the FIPS module.
722
     * The IV can still be set externally (the security policy will state that
723
     * this is not FIPS compliant). There are some applications
724
     * where setting the IV externally is the only option available.
725
     */
726
4.97M
    if (ctx->iv_state == IV_STATE_UNINITIALISED) {
727
128
        if (!ctx->enc || !gcm_iv_generate(ctx, 0))
728
0
            goto err;
729
128
    }
730
731
4.97M
    if (ctx->iv_state == IV_STATE_BUFFERED) {
732
1.53M
        if (!hw->setiv(ctx, ctx->iv, ctx->ivlen))
733
0
            goto err;
734
1.53M
        ctx->iv_state = IV_STATE_COPIED;
735
1.53M
    }
736
737
4.97M
    if (in != NULL) {
738
        /*  The input is AAD if out is NULL */
739
3.43M
        if (out == NULL) {
740
1.87M
            if (!hw->aadupdate(ctx, in, len))
741
0
                goto err;
742
1.87M
        } else {
743
            /* The input is ciphertext OR plaintext */
744
1.55M
            if (!hw->cipherupdate(ctx, in, len, out))
745
0
                goto err;
746
1.55M
        }
747
3.43M
    } else {
748
        /* The tag must be set before actually decrypting data */
749
1.53M
        if (!ctx->enc && ctx->taglen == UNINITIALISED_SIZET)
750
0
            goto err;
751
1.53M
        if (!hw->cipherfinal(ctx, ctx->buf))
752
595k
            goto err;
753
943k
        ctx->iv_state = IV_STATE_FINISHED; /* Don't reuse the IV */
754
943k
        goto finish;
755
1.53M
    }
756
3.43M
    olen = len;
757
4.37M
finish:
758
4.37M
    rv = 1;
759
4.97M
err:
760
4.97M
    *padlen = olen;
761
4.97M
    return rv;
762
4.37M
}
763
764
static int gcm_tls_init(PROV_GCM_CTX *dat, unsigned char *aad, size_t aad_len)
765
103k
{
766
103k
    unsigned char *buf;
767
103k
    size_t len;
768
769
103k
    if (!ossl_prov_is_running() || aad_len != EVP_AEAD_TLS1_AAD_LEN)
770
0
        return 0;
771
772
    /* Save the aad for later use. */
773
103k
    buf = dat->buf;
774
103k
    memcpy(buf, aad, aad_len);
775
103k
    dat->tls_aad_len = aad_len;
776
777
103k
    len = buf[aad_len - 2] << 8 | buf[aad_len - 1];
778
    /* Correct length for explicit iv. */
779
103k
    if (len < EVP_GCM_TLS_EXPLICIT_IV_LEN)
780
87
        return 0;
781
103k
    len -= EVP_GCM_TLS_EXPLICIT_IV_LEN;
782
783
    /* If decrypting correct for tag too. */
784
103k
    if (!dat->enc) {
785
101k
        if (len < EVP_GCM_TLS_TAG_LEN)
786
62
            return 0;
787
101k
        len -= EVP_GCM_TLS_TAG_LEN;
788
101k
    }
789
103k
    buf[aad_len - 2] = (unsigned char)(len >> 8);
790
103k
    buf[aad_len - 1] = (unsigned char)(len & 0xff);
791
    /* Extra padding: tag appended to record. */
792
103k
    return EVP_GCM_TLS_TAG_LEN;
793
103k
}
794
795
static int gcm_tls_iv_set_fixed(PROV_GCM_CTX *ctx, unsigned char *iv,
796
    size_t len)
797
2.73k
{
798
    /* Special case: -1 length restores whole IV */
799
2.73k
    if (len == (size_t)-1) {
800
0
        memcpy(ctx->iv, iv, ctx->ivlen);
801
0
        ctx->iv_gen = 1;
802
0
        ctx->iv_state = IV_STATE_BUFFERED;
803
0
        return 1;
804
0
    }
805
    /* Fixed field must be at least 4 bytes and invocation field at least 8 */
806
2.73k
    if ((len < EVP_GCM_TLS_FIXED_IV_LEN)
807
2.73k
        || (ctx->ivlen - (int)len) < EVP_GCM_TLS_EXPLICIT_IV_LEN)
808
0
        return 0;
809
2.73k
    if (len > 0)
810
2.73k
        memcpy(ctx->iv, iv, len);
811
2.73k
    if (ctx->enc) {
812
1.17k
        if (RAND_bytes_ex(ctx->libctx, ctx->iv + len, ctx->ivlen - len, 0) <= 0)
813
0
            return 0;
814
1.17k
        ctx->iv_gen_rand = 1;
815
1.17k
    }
816
2.73k
    ctx->iv_gen = 1;
817
2.73k
    ctx->iv_state = IV_STATE_BUFFERED;
818
2.73k
    return 1;
819
2.73k
}
820
821
/*
822
 * Handle TLS GCM packet format. This consists of the last portion of the IV
823
 * followed by the payload and finally the tag. On encrypt generate IV,
824
 * encrypt payload and write the tag. On verify retrieve IV, decrypt payload
825
 * and verify tag.
826
 */
827
static int gcm_tls_cipher(PROV_GCM_CTX *ctx, unsigned char *out, size_t *padlen,
828
    const unsigned char *in, size_t len)
829
103k
{
830
103k
    int rv = 0;
831
103k
    size_t arg = EVP_GCM_TLS_EXPLICIT_IV_LEN;
832
103k
    size_t plen = 0;
833
103k
    unsigned char *tag = NULL;
834
835
103k
    if (!ossl_prov_is_running() || !ctx->key_set)
836
0
        goto err;
837
838
    /* Encrypt/decrypt must be performed in place */
839
103k
    if (out != in || len < (EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN))
840
0
        goto err;
841
842
    /*
843
     * Check for too many keys as per FIPS 140-2 IG A.5 "Key/IV Pair Uniqueness
844
     * Requirements from SP 800-38D".  The requirements is for one party to the
845
     * communication to fail after 2^64 - 1 keys.  We do this on the encrypting
846
     * side only.
847
     */
848
103k
    if (ctx->enc && ++ctx->tls_enc_records == 0) {
849
0
        ERR_raise(ERR_LIB_PROV, PROV_R_TOO_MANY_RECORDS);
850
0
        goto err;
851
0
    }
852
853
    /*
854
     * Set IV from start of buffer or generate IV and write to start of
855
     * buffer.
856
     */
857
103k
    if (ctx->enc) {
858
1.90k
        if (!getivgen(ctx, out, arg))
859
0
            goto err;
860
101k
    } else {
861
101k
        if (!setivinv(ctx, out, arg))
862
0
            goto err;
863
101k
    }
864
865
    /* Fix buffer and length to point to payload */
866
103k
    in += EVP_GCM_TLS_EXPLICIT_IV_LEN;
867
103k
    out += EVP_GCM_TLS_EXPLICIT_IV_LEN;
868
103k
    len -= EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
869
870
103k
    tag = ctx->enc ? out + len : (unsigned char *)in + len;
871
103k
    if (!ctx->hw->oneshot(ctx, ctx->buf, ctx->tls_aad_len, in, len, out, tag,
872
103k
            EVP_GCM_TLS_TAG_LEN)) {
873
101k
        if (!ctx->enc)
874
101k
            OPENSSL_cleanse(out, len);
875
101k
        goto err;
876
101k
    }
877
2.04k
    if (ctx->enc)
878
1.90k
        plen = len + EVP_GCM_TLS_EXPLICIT_IV_LEN + EVP_GCM_TLS_TAG_LEN;
879
138
    else
880
138
        plen = len;
881
882
2.04k
    rv = 1;
883
103k
err:
884
103k
    ctx->iv_state = IV_STATE_FINISHED;
885
103k
    ctx->tls_aad_len = UNINITIALISED_SIZET;
886
103k
    *padlen = plen;
887
103k
    return rv;
888
2.04k
}