Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/ciphers/ciphercommon.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
/*
14
 * Generic dispatch table functions for ciphers.
15
 */
16
17
/* For SSL3_VERSION */
18
#include <string.h>
19
#include <openssl/prov_ssl.h>
20
#include <openssl/proverr.h>
21
#include "ciphercommon_local.h"
22
#include "prov/provider_ctx.h"
23
#include "prov/providercommon.h"
24
#include "internal/skey.h"
25
#include "internal/e_os.h"
26
#include "crypto/types.h"
27
28
/*-
29
 * Generic cipher functions for OSSL_PARAM gettables and settables
30
 */
31
/* clang-format off */
32
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
33
#ifndef ossl_cipher_generic_get_params_list
34
static const OSSL_PARAM ossl_cipher_generic_get_params_list[] = {
35
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_MODE, NULL),
36
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
37
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
38
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_BLOCK_SIZE, NULL),
39
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_AEAD, NULL),
40
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_CUSTOM_IV, NULL),
41
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_CTS, NULL),
42
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK, NULL),
43
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_HAS_RAND_KEY, NULL),
44
    OSSL_PARAM_int(OSSL_CIPHER_PARAM_ENCRYPT_THEN_MAC, NULL),
45
    OSSL_PARAM_END
46
};
47
#endif
48
49
#ifndef ossl_cipher_generic_get_params_st
50
struct ossl_cipher_generic_get_params_st {
51
    OSSL_PARAM *aead;
52
    OSSL_PARAM *bsize;
53
    OSSL_PARAM *cts;
54
    OSSL_PARAM *custiv;
55
    OSSL_PARAM *etm;
56
    OSSL_PARAM *ivlen;
57
    OSSL_PARAM *keylen;
58
    OSSL_PARAM *mb;
59
    OSSL_PARAM *mode;
60
    OSSL_PARAM *rand;
61
};
62
#endif
63
64
#ifndef ossl_cipher_generic_get_params_decoder
65
static int ossl_cipher_generic_get_params_decoder
66
    (const OSSL_PARAM *p, struct ossl_cipher_generic_get_params_st *r)
67
819k
{
68
819k
    const char *s;
69
70
819k
    memset(r, 0, sizeof(*r));
71
819k
    if (p != NULL)
72
1.67M
        for (; (s = p->key) != NULL; p++)
73
853k
            switch(s[0]) {
74
815k
            default:
75
815k
                break;
76
815k
            case 'a':
77
3.77k
                if (ossl_likely(strcmp("ead", s + 1) == 0)) {
78
                    /* OSSL_CIPHER_PARAM_AEAD */
79
3.77k
                    if (ossl_unlikely(r->aead != NULL)) {
80
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
81
0
                                       "param %s is repeated", s);
82
0
                        return 0;
83
0
                    }
84
3.77k
                    r->aead = (OSSL_PARAM *)p;
85
3.77k
                }
86
3.77k
                break;
87
3.77k
            case 'b':
88
3.77k
                if (ossl_likely(strcmp("locksize", s + 1) == 0)) {
89
                    /* OSSL_CIPHER_PARAM_BLOCK_SIZE */
90
3.77k
                    if (ossl_unlikely(r->bsize != NULL)) {
91
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
92
0
                                       "param %s is repeated", s);
93
0
                        return 0;
94
0
                    }
95
3.77k
                    r->bsize = (OSSL_PARAM *)p;
96
3.77k
                }
97
3.77k
                break;
98
7.54k
            case 'c':
99
7.54k
                switch(s[1]) {
100
0
                default:
101
0
                    break;
102
3.77k
                case 't':
103
3.77k
                    if (ossl_likely(strcmp("s", s + 2) == 0)) {
104
                        /* OSSL_CIPHER_PARAM_CTS */
105
3.77k
                        if (ossl_unlikely(r->cts != NULL)) {
106
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
107
0
                                           "param %s is repeated", s);
108
0
                            return 0;
109
0
                        }
110
3.77k
                        r->cts = (OSSL_PARAM *)p;
111
3.77k
                    }
112
3.77k
                    break;
113
3.77k
                case 'u':
114
3.77k
                    if (ossl_likely(strcmp("stom-iv", s + 2) == 0)) {
115
                        /* OSSL_CIPHER_PARAM_CUSTOM_IV */
116
3.77k
                        if (ossl_unlikely(r->custiv != NULL)) {
117
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
118
0
                                           "param %s is repeated", s);
119
0
                            return 0;
120
0
                        }
121
3.77k
                        r->custiv = (OSSL_PARAM *)p;
122
3.77k
                    }
123
7.54k
                }
124
7.54k
                break;
125
7.54k
            case 'e':
126
3.77k
                if (ossl_likely(strcmp("ncrypt-then-mac", s + 1) == 0)) {
127
                    /* OSSL_CIPHER_PARAM_ENCRYPT_THEN_MAC */
128
3.77k
                    if (ossl_unlikely(r->etm != NULL)) {
129
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
130
0
                                       "param %s is repeated", s);
131
0
                        return 0;
132
0
                    }
133
3.77k
                    r->etm = (OSSL_PARAM *)p;
134
3.77k
                }
135
3.77k
                break;
136
3.77k
            case 'h':
137
3.77k
                if (ossl_likely(strcmp("as-randkey", s + 1) == 0)) {
138
                    /* OSSL_CIPHER_PARAM_HAS_RAND_KEY */
139
3.77k
                    if (ossl_unlikely(r->rand != NULL)) {
140
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
141
0
                                       "param %s is repeated", s);
142
0
                        return 0;
143
0
                    }
144
3.77k
                    r->rand = (OSSL_PARAM *)p;
145
3.77k
                }
146
3.77k
                break;
147
3.77k
            case 'i':
148
3.77k
                if (ossl_likely(strcmp("vlen", s + 1) == 0)) {
149
                    /* OSSL_CIPHER_PARAM_IVLEN */
150
3.77k
                    if (ossl_unlikely(r->ivlen != NULL)) {
151
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
152
0
                                       "param %s is repeated", s);
153
0
                        return 0;
154
0
                    }
155
3.77k
                    r->ivlen = (OSSL_PARAM *)p;
156
3.77k
                }
157
3.77k
                break;
158
3.77k
            case 'k':
159
3.77k
                if (ossl_likely(strcmp("eylen", s + 1) == 0)) {
160
                    /* OSSL_CIPHER_PARAM_KEYLEN */
161
3.77k
                    if (ossl_unlikely(r->keylen != NULL)) {
162
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
163
0
                                       "param %s is repeated", s);
164
0
                        return 0;
165
0
                    }
166
3.77k
                    r->keylen = (OSSL_PARAM *)p;
167
3.77k
                }
168
3.77k
                break;
169
3.77k
            case 'm':
170
3.77k
                if (ossl_likely(strcmp("ode", s + 1) == 0)) {
171
                    /* OSSL_CIPHER_PARAM_MODE */
172
3.77k
                    if (ossl_unlikely(r->mode != NULL)) {
173
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
174
0
                                       "param %s is repeated", s);
175
0
                        return 0;
176
0
                    }
177
3.77k
                    r->mode = (OSSL_PARAM *)p;
178
3.77k
                }
179
3.77k
                break;
180
3.77k
            case 't':
181
3.77k
                if (ossl_likely(strcmp("ls-multi", s + 1) == 0)) {
182
                    /* OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK */
183
3.77k
                    if (ossl_unlikely(r->mb != NULL)) {
184
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
185
0
                                       "param %s is repeated", s);
186
0
                        return 0;
187
0
                    }
188
3.77k
                    r->mb = (OSSL_PARAM *)p;
189
3.77k
                }
190
853k
            }
191
819k
    return 1;
192
819k
}
193
#endif
194
/* End of machine generated */
195
/* clang-format on */
196
197
const OSSL_PARAM *ossl_cipher_generic_gettable_params(ossl_unused void *provctx)
198
0
{
199
0
    return ossl_cipher_generic_get_params_list;
200
0
}
201
202
int ossl_cipher_generic_get_params(OSSL_PARAM params[], unsigned int md,
203
    uint64_t flags,
204
    size_t kbits, size_t blkbits, size_t ivbits)
205
819k
{
206
819k
    struct ossl_cipher_generic_get_params_st p;
207
208
819k
    if (!ossl_cipher_generic_get_params_decoder(params, &p))
209
0
        return 0;
210
211
819k
    if (p.mode != NULL && !OSSL_PARAM_set_uint(p.mode, md)) {
212
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
213
0
        return 0;
214
0
    }
215
819k
    if (p.aead != NULL
216
3.77k
        && !OSSL_PARAM_set_int(p.aead, (flags & PROV_CIPHER_FLAG_AEAD) != 0)) {
217
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
218
0
        return 0;
219
0
    }
220
819k
    if (p.custiv != NULL
221
3.77k
        && !OSSL_PARAM_set_int(p.custiv, (flags & PROV_CIPHER_FLAG_CUSTOM_IV) != 0)) {
222
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
223
0
        return 0;
224
0
    }
225
819k
    if (p.cts != NULL
226
3.77k
        && !OSSL_PARAM_set_int(p.cts, (flags & PROV_CIPHER_FLAG_CTS) != 0)) {
227
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
228
0
        return 0;
229
0
    }
230
819k
    if (p.mb != NULL
231
3.77k
        && !OSSL_PARAM_set_int(p.mb, (flags & PROV_CIPHER_FLAG_TLS1_MULTIBLOCK) != 0)) {
232
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
233
0
        return 0;
234
0
    }
235
819k
    if (p.rand != NULL
236
3.77k
        && !OSSL_PARAM_set_int(p.rand, (flags & PROV_CIPHER_FLAG_RAND_KEY) != 0)) {
237
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
238
0
        return 0;
239
0
    }
240
819k
    if (p.etm != NULL
241
3.77k
        && !OSSL_PARAM_set_int(p.etm, (flags & EVP_CIPH_FLAG_ENC_THEN_MAC) != 0)) {
242
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
243
0
        return 0;
244
0
    }
245
819k
    if (p.keylen != NULL && !OSSL_PARAM_set_size_t(p.keylen, kbits / 8)) {
246
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
247
0
        return 0;
248
0
    }
249
819k
    if (p.bsize != NULL && !OSSL_PARAM_set_size_t(p.bsize, blkbits / 8)) {
250
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
251
0
        return 0;
252
0
    }
253
819k
    if (p.ivlen != NULL && !OSSL_PARAM_set_size_t(p.ivlen, ivbits / 8)) {
254
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
255
0
        return 0;
256
0
    }
257
819k
    return 1;
258
819k
}
259
260
#define cipher_generic_get_ctx_params_st ossl_cipher_get_ctx_param_list_st
261
262
/* clang-format off */
263
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
264
#ifndef cipher_generic_get_ctx_params_list
265
static const OSSL_PARAM cipher_generic_get_ctx_params_list[] = {
266
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
267
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
268
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_PADDING, NULL),
269
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_NUM, NULL),
270
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV, NULL, 0),
271
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV, NULL, 0),
272
    OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_TLS_MAC, NULL, 0),
273
    OSSL_PARAM_END
274
};
275
#endif
276
277
#ifndef cipher_generic_get_ctx_params_st
278
struct cipher_generic_get_ctx_params_st {
279
    OSSL_PARAM *iv;
280
    OSSL_PARAM *ivlen;
281
    OSSL_PARAM *keylen;
282
    OSSL_PARAM *num;
283
    OSSL_PARAM *pad;
284
    OSSL_PARAM *tlsmac;
285
    OSSL_PARAM *updiv;
286
};
287
#endif
288
289
#ifndef cipher_generic_get_ctx_params_decoder
290
static int cipher_generic_get_ctx_params_decoder
291
    (const OSSL_PARAM *p, struct cipher_generic_get_ctx_params_st *r)
292
157k
{
293
157k
    const char *s;
294
295
157k
    memset(r, 0, sizeof(*r));
296
157k
    if (p != NULL)
297
314k
        for (; (s = p->key) != NULL; p++)
298
157k
            switch(s[0]) {
299
0
            default:
300
0
                break;
301
2.78k
            case 'i':
302
2.78k
                switch(s[1]) {
303
0
                default:
304
0
                    break;
305
2.78k
                case 'v':
306
2.78k
                    switch(s[2]) {
307
0
                    default:
308
0
                        break;
309
2.78k
                    case 'l':
310
2.78k
                        if (ossl_likely(strcmp("en", s + 3) == 0)) {
311
                            /* OSSL_CIPHER_PARAM_IVLEN */
312
2.78k
                            if (ossl_unlikely(r->ivlen != NULL)) {
313
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
314
0
                                               "param %s is repeated", s);
315
0
                                return 0;
316
0
                            }
317
2.78k
                            r->ivlen = (OSSL_PARAM *)p;
318
2.78k
                        }
319
2.78k
                        break;
320
2.78k
                    case '\0':
321
0
                        if (ossl_unlikely(r->iv != NULL)) {
322
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
323
0
                                           "param %s is repeated", s);
324
0
                            return 0;
325
0
                        }
326
0
                        r->iv = (OSSL_PARAM *)p;
327
2.78k
                    }
328
2.78k
                }
329
2.78k
                break;
330
95.8k
            case 'k':
331
95.8k
                if (ossl_likely(strcmp("eylen", s + 1) == 0)) {
332
                    /* OSSL_CIPHER_PARAM_KEYLEN */
333
95.8k
                    if (ossl_unlikely(r->keylen != NULL)) {
334
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
335
0
                                       "param %s is repeated", s);
336
0
                        return 0;
337
0
                    }
338
95.8k
                    r->keylen = (OSSL_PARAM *)p;
339
95.8k
                }
340
95.8k
                break;
341
95.8k
            case 'n':
342
0
                if (ossl_likely(strcmp("um", s + 1) == 0)) {
343
                    /* OSSL_CIPHER_PARAM_NUM */
344
0
                    if (ossl_unlikely(r->num != NULL)) {
345
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
346
0
                                       "param %s is repeated", s);
347
0
                        return 0;
348
0
                    }
349
0
                    r->num = (OSSL_PARAM *)p;
350
0
                }
351
0
                break;
352
0
            case 'p':
353
0
                if (ossl_likely(strcmp("adding", s + 1) == 0)) {
354
                    /* OSSL_CIPHER_PARAM_PADDING */
355
0
                    if (ossl_unlikely(r->pad != NULL)) {
356
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
357
0
                                       "param %s is repeated", s);
358
0
                        return 0;
359
0
                    }
360
0
                    r->pad = (OSSL_PARAM *)p;
361
0
                }
362
0
                break;
363
58.3k
            case 't':
364
58.3k
                if (ossl_likely(strcmp("ls-mac", s + 1) == 0)) {
365
                    /* OSSL_CIPHER_PARAM_TLS_MAC */
366
58.3k
                    if (ossl_unlikely(r->tlsmac != NULL)) {
367
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
368
0
                                       "param %s is repeated", s);
369
0
                        return 0;
370
0
                    }
371
58.3k
                    r->tlsmac = (OSSL_PARAM *)p;
372
58.3k
                }
373
58.3k
                break;
374
58.3k
            case 'u':
375
0
                if (ossl_likely(strcmp("pdated-iv", s + 1) == 0)) {
376
                    /* OSSL_CIPHER_PARAM_UPDATED_IV */
377
0
                    if (ossl_unlikely(r->updiv != NULL)) {
378
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
379
0
                                       "param %s is repeated", s);
380
0
                        return 0;
381
0
                    }
382
0
                    r->updiv = (OSSL_PARAM *)p;
383
0
                }
384
157k
            }
385
157k
    return 1;
386
157k
}
387
#endif
388
/* End of machine generated */
389
/* clang-format on */
390
391
const OSSL_PARAM *ossl_cipher_generic_gettable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
392
5.30k
{
393
5.30k
    return cipher_generic_get_ctx_params_list;
394
5.30k
}
395
396
#define cipher_generic_set_ctx_params_st ossl_cipher_set_ctx_param_list_st
397
398
/* clang-format off */
399
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
400
#ifndef cipher_generic_set_ctx_params_list
401
static const OSSL_PARAM cipher_generic_set_ctx_params_list[] = {
402
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_PADDING, NULL),
403
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_NUM, NULL),
404
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_USE_BITS, NULL),
405
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_TLS_VERSION, NULL),
406
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE, NULL),
407
    OSSL_PARAM_END
408
};
409
#endif
410
411
#ifndef cipher_generic_set_ctx_params_st
412
struct cipher_generic_set_ctx_params_st {
413
    OSSL_PARAM *bits;
414
    OSSL_PARAM *num;
415
    OSSL_PARAM *pad;
416
    OSSL_PARAM *tlsmacsize;
417
    OSSL_PARAM *tlsvers;
418
};
419
#endif
420
421
#ifndef cipher_generic_set_ctx_params_decoder
422
static int cipher_generic_set_ctx_params_decoder
423
    (const OSSL_PARAM *p, struct cipher_generic_set_ctx_params_st *r)
424
2.55k
{
425
2.55k
    const char *s;
426
427
2.55k
    memset(r, 0, sizeof(*r));
428
2.55k
    if (p != NULL)
429
7.32k
        for (; (s = p->key) != NULL; p++)
430
4.77k
            switch(s[0]) {
431
0
            default:
432
0
                break;
433
0
            case 'n':
434
0
                if (ossl_likely(strcmp("um", s + 1) == 0)) {
435
                    /* OSSL_CIPHER_PARAM_NUM */
436
0
                    if (ossl_unlikely(r->num != NULL)) {
437
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
438
0
                                       "param %s is repeated", s);
439
0
                        return 0;
440
0
                    }
441
0
                    r->num = (OSSL_PARAM *)p;
442
0
                }
443
0
                break;
444
333
            case 'p':
445
333
                if (ossl_likely(strcmp("adding", s + 1) == 0)) {
446
                    /* OSSL_CIPHER_PARAM_PADDING */
447
333
                    if (ossl_unlikely(r->pad != NULL)) {
448
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
449
0
                                       "param %s is repeated", s);
450
0
                        return 0;
451
0
                    }
452
333
                    r->pad = (OSSL_PARAM *)p;
453
333
                }
454
333
                break;
455
4.43k
            case 't':
456
4.43k
                switch(s[1]) {
457
0
                default:
458
0
                    break;
459
4.43k
                case 'l':
460
4.43k
                    switch(s[2]) {
461
0
                    default:
462
0
                        break;
463
4.43k
                    case 's':
464
4.43k
                        switch(s[3]) {
465
0
                        default:
466
0
                            break;
467
4.43k
                        case '-':
468
4.43k
                            switch(s[4]) {
469
0
                            default:
470
0
                                break;
471
2.21k
                            case 'm':
472
2.21k
                                if (ossl_likely(strcmp("ac-size", s + 5) == 0)) {
473
                                    /* OSSL_CIPHER_PARAM_TLS_MAC_SIZE */
474
2.21k
                                    if (ossl_unlikely(r->tlsmacsize != NULL)) {
475
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
476
0
                                                       "param %s is repeated", s);
477
0
                                        return 0;
478
0
                                    }
479
2.21k
                                    r->tlsmacsize = (OSSL_PARAM *)p;
480
2.21k
                                }
481
2.21k
                                break;
482
2.21k
                            case 'v':
483
2.21k
                                if (ossl_likely(strcmp("ersion", s + 5) == 0)) {
484
                                    /* OSSL_CIPHER_PARAM_TLS_VERSION */
485
2.21k
                                    if (ossl_unlikely(r->tlsvers != NULL)) {
486
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
487
0
                                                       "param %s is repeated", s);
488
0
                                        return 0;
489
0
                                    }
490
2.21k
                                    r->tlsvers = (OSSL_PARAM *)p;
491
2.21k
                                }
492
4.43k
                            }
493
4.43k
                        }
494
4.43k
                    }
495
4.43k
                }
496
4.43k
                break;
497
4.43k
            case 'u':
498
0
                if (ossl_likely(strcmp("se-bits", s + 1) == 0)) {
499
                    /* OSSL_CIPHER_PARAM_USE_BITS */
500
0
                    if (ossl_unlikely(r->bits != NULL)) {
501
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
502
0
                                       "param %s is repeated", s);
503
0
                        return 0;
504
0
                    }
505
0
                    r->bits = (OSSL_PARAM *)p;
506
0
                }
507
4.77k
            }
508
2.55k
    return 1;
509
2.55k
}
510
#endif
511
/* End of machine generated */
512
/* clang-format on */
513
514
const OSSL_PARAM *ossl_cipher_generic_settable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
515
169
{
516
169
    return cipher_generic_set_ctx_params_list;
517
169
}
518
519
/*
520
 * Variable key length cipher functions for OSSL_PARAM settables
521
 */
522
#define cipher_var_keylen_set_ctx_params_st ossl_cipher_set_ctx_param_list_st
523
524
/* clang-format off */
525
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
526
#ifndef cipher_var_keylen_set_ctx_params_list
527
static const OSSL_PARAM cipher_var_keylen_set_ctx_params_list[] = {
528
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_PADDING, NULL),
529
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_NUM, NULL),
530
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_USE_BITS, NULL),
531
    OSSL_PARAM_uint(OSSL_CIPHER_PARAM_TLS_VERSION, NULL),
532
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE, NULL),
533
    OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
534
    OSSL_PARAM_END
535
};
536
#endif
537
538
#ifndef cipher_var_keylen_set_ctx_params_st
539
struct cipher_var_keylen_set_ctx_params_st {
540
    OSSL_PARAM *bits;
541
    OSSL_PARAM *keylen;
542
    OSSL_PARAM *num;
543
    OSSL_PARAM *pad;
544
    OSSL_PARAM *tlsmacsize;
545
    OSSL_PARAM *tlsvers;
546
};
547
#endif
548
549
#ifndef cipher_var_keylen_set_ctx_params_decoder
550
static int cipher_var_keylen_set_ctx_params_decoder
551
    (const OSSL_PARAM *p, struct cipher_var_keylen_set_ctx_params_st *r)
552
0
{
553
0
    const char *s;
554
555
0
    memset(r, 0, sizeof(*r));
556
0
    if (p != NULL)
557
0
        for (; (s = p->key) != NULL; p++)
558
0
            switch(s[0]) {
559
0
            default:
560
0
                break;
561
0
            case 'k':
562
0
                if (ossl_likely(strcmp("eylen", s + 1) == 0)) {
563
                    /* OSSL_CIPHER_PARAM_KEYLEN */
564
0
                    if (ossl_unlikely(r->keylen != NULL)) {
565
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
566
0
                                       "param %s is repeated", s);
567
0
                        return 0;
568
0
                    }
569
0
                    r->keylen = (OSSL_PARAM *)p;
570
0
                }
571
0
                break;
572
0
            case 'n':
573
0
                if (ossl_likely(strcmp("um", s + 1) == 0)) {
574
                    /* OSSL_CIPHER_PARAM_NUM */
575
0
                    if (ossl_unlikely(r->num != NULL)) {
576
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
577
0
                                       "param %s is repeated", s);
578
0
                        return 0;
579
0
                    }
580
0
                    r->num = (OSSL_PARAM *)p;
581
0
                }
582
0
                break;
583
0
            case 'p':
584
0
                if (ossl_likely(strcmp("adding", s + 1) == 0)) {
585
                    /* OSSL_CIPHER_PARAM_PADDING */
586
0
                    if (ossl_unlikely(r->pad != NULL)) {
587
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
588
0
                                       "param %s is repeated", s);
589
0
                        return 0;
590
0
                    }
591
0
                    r->pad = (OSSL_PARAM *)p;
592
0
                }
593
0
                break;
594
0
            case 't':
595
0
                switch(s[1]) {
596
0
                default:
597
0
                    break;
598
0
                case 'l':
599
0
                    switch(s[2]) {
600
0
                    default:
601
0
                        break;
602
0
                    case 's':
603
0
                        switch(s[3]) {
604
0
                        default:
605
0
                            break;
606
0
                        case '-':
607
0
                            switch(s[4]) {
608
0
                            default:
609
0
                                break;
610
0
                            case 'm':
611
0
                                if (ossl_likely(strcmp("ac-size", s + 5) == 0)) {
612
                                    /* OSSL_CIPHER_PARAM_TLS_MAC_SIZE */
613
0
                                    if (ossl_unlikely(r->tlsmacsize != NULL)) {
614
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
615
0
                                                       "param %s is repeated", s);
616
0
                                        return 0;
617
0
                                    }
618
0
                                    r->tlsmacsize = (OSSL_PARAM *)p;
619
0
                                }
620
0
                                break;
621
0
                            case 'v':
622
0
                                if (ossl_likely(strcmp("ersion", s + 5) == 0)) {
623
                                    /* OSSL_CIPHER_PARAM_TLS_VERSION */
624
0
                                    if (ossl_unlikely(r->tlsvers != NULL)) {
625
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
626
0
                                                       "param %s is repeated", s);
627
0
                                        return 0;
628
0
                                    }
629
0
                                    r->tlsvers = (OSSL_PARAM *)p;
630
0
                                }
631
0
                            }
632
0
                        }
633
0
                    }
634
0
                }
635
0
                break;
636
0
            case 'u':
637
0
                if (ossl_likely(strcmp("se-bits", s + 1) == 0)) {
638
                    /* OSSL_CIPHER_PARAM_USE_BITS */
639
0
                    if (ossl_unlikely(r->bits != NULL)) {
640
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
641
0
                                       "param %s is repeated", s);
642
0
                        return 0;
643
0
                    }
644
0
                    r->bits = (OSSL_PARAM *)p;
645
0
                }
646
0
            }
647
0
    return 1;
648
0
}
649
#endif
650
/* End of machine generated */
651
/* clang-format on */
652
653
const OSSL_PARAM *ossl_cipher_var_keylen_settable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
654
0
{
655
0
    return cipher_var_keylen_set_ctx_params_list;
656
0
}
657
658
int ossl_cipher_var_keylen_set_ctx_params(void *vctx, const OSSL_PARAM params[])
659
0
{
660
0
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
661
0
    struct ossl_cipher_set_ctx_param_list_st p;
662
663
0
    if (ctx == NULL
664
0
        || !cipher_var_keylen_set_ctx_params_decoder(params, &p)
665
0
        || !ossl_cipher_common_set_ctx_params(ctx, &p))
666
0
        return 0;
667
668
0
    if (p.keylen != NULL) {
669
0
        size_t keylen;
670
671
0
        if (!OSSL_PARAM_get_size_t(p.keylen, &keylen)) {
672
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
673
0
            return 0;
674
0
        }
675
0
        if (ctx->keylen != keylen) {
676
0
            ctx->keylen = keylen;
677
0
            ctx->key_set = 0;
678
0
        }
679
0
    }
680
0
    return 1;
681
0
}
682
683
void ossl_cipher_generic_reset_ctx(PROV_CIPHER_CTX *ctx)
684
257k
{
685
257k
    if (ctx != NULL && ctx->alloced) {
686
3.46k
        OPENSSL_free(ctx->tlsmac);
687
3.46k
        ctx->alloced = 0;
688
3.46k
        ctx->tlsmac = NULL;
689
3.46k
    }
690
257k
}
691
692
static int cipher_generic_init_internal(PROV_CIPHER_CTX *ctx,
693
    const unsigned char *key, size_t keylen,
694
    const unsigned char *iv, size_t ivlen,
695
    const OSSL_PARAM params[], int enc)
696
4.22M
{
697
4.22M
    ctx->num = 0;
698
4.22M
    ctx->bufsz = 0;
699
4.22M
    ctx->updated = 0;
700
4.22M
    ctx->enc = enc ? 1 : 0;
701
702
4.22M
    if (!ossl_prov_is_running())
703
0
        return 0;
704
705
4.22M
    if (iv != NULL && ctx->mode != EVP_CIPH_ECB_MODE) {
706
576k
        if (!ossl_cipher_generic_initiv(ctx, iv, ivlen))
707
0
            return 0;
708
576k
    }
709
4.22M
    if (iv == NULL && ctx->iv_set
710
114k
        && (ctx->mode == EVP_CIPH_CBC_MODE
711
114k
            || ctx->mode == EVP_CIPH_CFB_MODE
712
114k
            || ctx->mode == EVP_CIPH_OFB_MODE))
713
        /* reset IV for these modes to keep compatibility with 1.1.1 */
714
0
        memcpy(ctx->iv, ctx->oiv, ctx->ivlen);
715
716
4.22M
    if (key != NULL) {
717
491k
        if (ctx->variable_keylength == 0) {
718
491k
            if (keylen != ctx->keylen) {
719
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
720
0
                return 0;
721
0
            }
722
491k
        } else {
723
0
            ctx->keylen = keylen;
724
0
        }
725
491k
        if (!ctx->hw->init(ctx, key, ctx->keylen))
726
0
            return 0;
727
491k
        ctx->key_set = 1;
728
491k
    }
729
4.22M
    return ossl_cipher_generic_set_ctx_params(ctx, params);
730
4.22M
}
731
732
int ossl_cipher_generic_einit(void *vctx, const unsigned char *key,
733
    size_t keylen, const unsigned char *iv,
734
    size_t ivlen, const OSSL_PARAM params[])
735
4.05M
{
736
4.05M
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
737
4.05M
        iv, ivlen, params, 1);
738
4.05M
}
739
740
int ossl_cipher_generic_dinit(void *vctx, const unsigned char *key,
741
    size_t keylen, const unsigned char *iv,
742
    size_t ivlen, const OSSL_PARAM params[])
743
175k
{
744
175k
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
745
175k
        iv, ivlen, params, 0);
746
175k
}
747
748
int ossl_cipher_generic_skey_einit(void *vctx, void *skeydata,
749
    const unsigned char *iv, size_t ivlen,
750
    const OSSL_PARAM params[])
751
0
{
752
0
    PROV_SKEY *key = skeydata;
753
754
0
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
755
0
        key->data, key->length,
756
0
        iv, ivlen, params, 1);
757
0
}
758
759
int ossl_cipher_generic_skey_dinit(void *vctx, void *skeydata,
760
    const unsigned char *iv, size_t ivlen,
761
    const OSSL_PARAM params[])
762
0
{
763
0
    PROV_SKEY *key = skeydata;
764
765
0
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
766
0
        key->data, key->length,
767
0
        iv, ivlen, params, 0);
768
0
}
769
770
/* Max padding including padding length byte */
771
4.93k
#define MAX_PADDING 256
772
773
int ossl_cipher_generic_block_update(void *vctx, unsigned char *out,
774
    size_t *outl, size_t outsize,
775
    const unsigned char *in, size_t inl)
776
9.12M
{
777
9.12M
    size_t outlint = 0;
778
9.12M
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
779
9.12M
    size_t blksz = ctx->blocksize;
780
9.12M
    size_t nextblocks;
781
782
9.12M
    if (!ctx->key_set) {
783
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
784
0
        return 0;
785
0
    }
786
787
9.12M
    if (ctx->tlsversion > 0) {
788
        /*
789
         * Each update call corresponds to a TLS record and is individually
790
         * padded
791
         */
792
793
        /* Sanity check inputs */
794
198k
        if (in == NULL
795
198k
            || in != out
796
198k
            || outsize < inl
797
198k
            || !ctx->pad) {
798
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
799
0
            return 0;
800
0
        }
801
802
198k
        if (ctx->enc) {
803
4.93k
            unsigned char padval;
804
4.93k
            size_t padnum, loop;
805
806
            /* Add padding */
807
808
4.93k
            padnum = blksz - (inl % blksz);
809
810
4.93k
            if (outsize < inl + padnum) {
811
0
                ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
812
0
                return 0;
813
0
            }
814
815
4.93k
            if (padnum > MAX_PADDING) {
816
0
                ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
817
0
                return 0;
818
0
            }
819
4.93k
            padval = (unsigned char)(padnum - 1);
820
4.93k
            if (ctx->tlsversion == SSL3_VERSION) {
821
0
                if (padnum > 1)
822
0
                    memset(out + inl, 0, padnum - 1);
823
0
                *(out + inl + padnum - 1) = padval;
824
4.93k
            } else {
825
                /* we need to add 'padnum' padding bytes of value padval */
826
42.4k
                for (loop = inl; loop < inl + padnum; loop++)
827
37.4k
                    out[loop] = padval;
828
4.93k
            }
829
4.93k
            inl += padnum;
830
4.93k
        }
831
832
198k
        if ((inl % blksz) != 0) {
833
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
834
0
            return 0;
835
0
        }
836
837
        /* Shouldn't normally fail */
838
198k
        if (!ctx->hw->cipher(ctx, out, in, inl)) {
839
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
840
0
            return 0;
841
0
        }
842
843
198k
        if (ctx->alloced) {
844
160k
            OPENSSL_free(ctx->tlsmac);
845
160k
            ctx->alloced = 0;
846
160k
            ctx->tlsmac = NULL;
847
160k
        }
848
849
        /* This only fails if padding is publicly invalid */
850
198k
        *outl = inl;
851
198k
        if (!ctx->enc
852
193k
            && !ossl_cipher_tlsunpadblock(ctx->libctx, ctx->tlsversion,
853
193k
                out, outl,
854
193k
                blksz, &ctx->tlsmac, &ctx->alloced,
855
193k
                ctx->tlsmacsize, 0)) {
856
29.5k
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
857
29.5k
            return 0;
858
29.5k
        }
859
168k
        return 1;
860
198k
    }
861
862
8.92M
    if (ctx->bufsz != 0)
863
0
        nextblocks = ossl_cipher_fillblock(ctx->buf, &ctx->bufsz, blksz,
864
0
            &in, &inl);
865
8.92M
    else
866
8.92M
        nextblocks = inl & ~(blksz - 1);
867
868
    /*
869
     * If we're decrypting and we end an update on a block boundary we hold
870
     * the last block back in case this is the last update call and the last
871
     * block is padded.
872
     */
873
8.92M
    if (ctx->bufsz == blksz && (ctx->enc || inl > 0 || !ctx->pad)) {
874
0
        if (outsize < blksz) {
875
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
876
0
            return 0;
877
0
        }
878
0
        if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
879
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
880
0
            return 0;
881
0
        }
882
0
        ctx->bufsz = 0;
883
0
        outlint = blksz;
884
0
        out += blksz;
885
0
    }
886
8.92M
    if (nextblocks > 0) {
887
8.92M
        if (!ctx->enc && ctx->pad && nextblocks == inl) {
888
1.01k
            if (!ossl_assert(inl >= blksz)) {
889
0
                ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
890
0
                return 0;
891
0
            }
892
1.01k
            nextblocks -= blksz;
893
1.01k
        }
894
8.92M
        outlint += nextblocks;
895
8.92M
        if (outsize < outlint) {
896
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
897
0
            return 0;
898
0
        }
899
8.92M
    }
900
8.92M
    if (nextblocks > 0) {
901
8.92M
        if (!ctx->hw->cipher(ctx, out, in, nextblocks)) {
902
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
903
0
            return 0;
904
0
        }
905
8.92M
        in += nextblocks;
906
8.92M
        inl -= nextblocks;
907
8.92M
    }
908
8.92M
    if (inl != 0
909
1.07k
        && !ossl_cipher_trailingdata(ctx->buf, &ctx->bufsz, blksz, &in, &inl)) {
910
        /* ERR_raise already called */
911
0
        return 0;
912
0
    }
913
914
8.92M
    *outl = outlint;
915
8.92M
    return inl == 0;
916
8.92M
}
917
918
int ossl_cipher_generic_block_final(void *vctx, unsigned char *out,
919
    size_t *outl, size_t outsize)
920
1.12k
{
921
1.12k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
922
1.12k
    size_t blksz = ctx->blocksize;
923
924
1.12k
    if (!ossl_prov_is_running())
925
0
        return 0;
926
927
1.12k
    if (!ctx->key_set) {
928
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
929
0
        return 0;
930
0
    }
931
932
1.12k
    if (ctx->tlsversion > 0) {
933
        /* We never finalize TLS, so this is an error */
934
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
935
0
        return 0;
936
0
    }
937
938
1.12k
    if (ctx->enc) {
939
85
        if (ctx->pad) {
940
37
            ossl_cipher_padblock(ctx->buf, &ctx->bufsz, blksz);
941
48
        } else if (ctx->bufsz == 0) {
942
48
            *outl = 0;
943
48
            return 1;
944
48
        } else if (ctx->bufsz != blksz) {
945
0
            ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
946
0
            return 0;
947
0
        }
948
949
37
        if (outsize < blksz) {
950
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
951
0
            return 0;
952
0
        }
953
37
        if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
954
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
955
0
            return 0;
956
0
        }
957
37
        ctx->bufsz = 0;
958
37
        *outl = blksz;
959
37
        return 1;
960
37
    }
961
962
    /* Decrypting */
963
1.03k
    if (ctx->bufsz != blksz) {
964
26
        if (ctx->bufsz == 0 && !ctx->pad) {
965
0
            *outl = 0;
966
0
            return 1;
967
0
        }
968
26
        ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
969
26
        return 0;
970
26
    }
971
972
1.01k
    if (!ctx->hw->cipher(ctx, ctx->buf, ctx->buf, blksz)) {
973
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
974
0
        return 0;
975
0
    }
976
977
1.01k
    if (ctx->pad && !ossl_cipher_unpadblock(ctx->buf, &ctx->bufsz, blksz)) {
978
        /* ERR_raise already called */
979
40
        return 0;
980
40
    }
981
982
971
    if (outsize < ctx->bufsz) {
983
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
984
0
        return 0;
985
0
    }
986
971
    memcpy(out, ctx->buf, ctx->bufsz);
987
971
    *outl = ctx->bufsz;
988
971
    ctx->bufsz = 0;
989
971
    return 1;
990
971
}
991
992
int ossl_cipher_generic_stream_update(void *vctx, unsigned char *out,
993
    size_t *outl, size_t outsize,
994
    const unsigned char *in, size_t inl)
995
222k
{
996
222k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
997
998
222k
    if (!ctx->key_set) {
999
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
1000
0
        return 0;
1001
0
    }
1002
1003
222k
    if (inl == 0) {
1004
0
        *outl = 0;
1005
0
        return 1;
1006
0
    }
1007
1008
222k
    if (outsize < inl) {
1009
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
1010
0
        return 0;
1011
0
    }
1012
1013
222k
    if (!ctx->hw->cipher(ctx, out, in, inl)) {
1014
506
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
1015
506
        return 0;
1016
506
    }
1017
1018
221k
    *outl = inl;
1019
221k
    if (!ctx->enc && ctx->tlsversion > 0) {
1020
        /*
1021
         * Remove any TLS padding. Only used by cipher_aes_cbc_hmac_sha1_hw.c and
1022
         * cipher_aes_cbc_hmac_sha256_hw.c
1023
         */
1024
0
        if (ctx->removetlspad) {
1025
            /*
1026
             * We should have already failed in the cipher() call above if this
1027
             * isn't true.
1028
             */
1029
0
            if (!ossl_assert(*outl >= (size_t)(out[inl - 1] + 1)))
1030
0
                return 0;
1031
            /* The actual padding length */
1032
0
            *outl -= out[inl - 1] + 1;
1033
0
        }
1034
1035
        /* TLS MAC and explicit IV if relevant. We should have already failed
1036
         * in the cipher() call above if *outl is too short.
1037
         */
1038
0
        if (!ossl_assert(*outl >= ctx->removetlsfixed))
1039
0
            return 0;
1040
0
        *outl -= ctx->removetlsfixed;
1041
1042
        /* Extract the MAC if there is one */
1043
0
        if (ctx->tlsmacsize > 0) {
1044
0
            if (*outl < ctx->tlsmacsize)
1045
0
                return 0;
1046
1047
0
            ctx->tlsmac = out + *outl - ctx->tlsmacsize;
1048
0
            *outl -= ctx->tlsmacsize;
1049
0
        }
1050
0
    }
1051
1052
221k
    return 1;
1053
221k
}
1054
int ossl_cipher_generic_stream_final(void *vctx, unsigned char *out,
1055
    size_t *outl, size_t outsize)
1056
494
{
1057
494
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
1058
1059
494
    if (!ossl_prov_is_running())
1060
0
        return 0;
1061
1062
494
    if (!ctx->key_set) {
1063
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
1064
0
        return 0;
1065
0
    }
1066
1067
494
    *outl = 0;
1068
494
    return 1;
1069
494
}
1070
1071
int ossl_cipher_generic_cipher(void *vctx, unsigned char *out, size_t *outl,
1072
    size_t outsize, const unsigned char *in,
1073
    size_t inl)
1074
5.23k
{
1075
5.23k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
1076
1077
5.23k
    if (!ossl_prov_is_running())
1078
0
        return 0;
1079
1080
5.23k
    if (!ctx->key_set) {
1081
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
1082
0
        return 0;
1083
0
    }
1084
1085
5.23k
    if (outsize < inl) {
1086
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
1087
0
        return 0;
1088
0
    }
1089
1090
5.23k
    if (!ctx->hw->cipher(ctx, out, in, inl)) {
1091
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
1092
0
        return 0;
1093
0
    }
1094
1095
5.23k
    *outl = inl;
1096
5.23k
    return 1;
1097
5.23k
}
1098
1099
int ossl_cipher_common_get_ctx_params(PROV_CIPHER_CTX *ctx, const struct ossl_cipher_get_ctx_param_list_st *p)
1100
157k
{
1101
157k
    if (p->ivlen != NULL && !OSSL_PARAM_set_size_t(p->ivlen, ctx->ivlen)) {
1102
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1103
0
        return 0;
1104
0
    }
1105
1106
157k
    if (p->pad != NULL && !OSSL_PARAM_set_uint(p->pad, ctx->pad)) {
1107
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1108
0
        return 0;
1109
0
    }
1110
1111
157k
    if (p->iv != NULL
1112
0
        && !OSSL_PARAM_set_octet_string_or_ptr(p->iv, ctx->oiv, ctx->ivlen)) {
1113
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1114
0
        return 0;
1115
0
    }
1116
1117
157k
    if (p->updiv != NULL
1118
0
        && !OSSL_PARAM_set_octet_string_or_ptr(p->updiv, ctx->iv, ctx->ivlen)) {
1119
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1120
0
        return 0;
1121
0
    }
1122
1123
157k
    if (p->num != NULL && !OSSL_PARAM_set_uint(p->num, ctx->num)) {
1124
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1125
0
        return 0;
1126
0
    }
1127
1128
157k
    if (p->keylen != NULL && !OSSL_PARAM_set_size_t(p->keylen, ctx->keylen)) {
1129
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1130
0
        return 0;
1131
0
    }
1132
1133
157k
    if (p->tlsmac != NULL
1134
58.3k
        && !OSSL_PARAM_set_octet_ptr(p->tlsmac, ctx->tlsmac, ctx->tlsmacsize)) {
1135
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
1136
0
        return 0;
1137
0
    }
1138
157k
    return 1;
1139
157k
}
1140
1141
int ossl_cipher_generic_get_ctx_params(void *vctx, OSSL_PARAM params[])
1142
157k
{
1143
157k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
1144
157k
    struct ossl_cipher_get_ctx_param_list_st p;
1145
1146
157k
    if (ctx == NULL || !cipher_generic_get_ctx_params_decoder(params, &p))
1147
0
        return 0;
1148
157k
    return ossl_cipher_common_get_ctx_params(ctx, &p);
1149
157k
}
1150
1151
int ossl_cipher_common_set_ctx_params(PROV_CIPHER_CTX *ctx, const struct ossl_cipher_set_ctx_param_list_st *p)
1152
2.55k
{
1153
2.55k
    if (p->pad != NULL) {
1154
333
        unsigned int pad;
1155
1156
333
        if (!OSSL_PARAM_get_uint(p->pad, &pad)) {
1157
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
1158
0
            return 0;
1159
0
        }
1160
333
        ctx->pad = pad ? 1 : 0;
1161
333
    }
1162
1163
2.55k
    if (p->bits != NULL) {
1164
0
        unsigned int bits;
1165
1166
0
        if (!OSSL_PARAM_get_uint(p->bits, &bits)) {
1167
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
1168
0
            return 0;
1169
0
        }
1170
0
        ctx->use_bits = bits ? 1 : 0;
1171
0
    }
1172
1173
2.55k
    if (p->tlsvers != NULL) {
1174
2.21k
        if (!OSSL_PARAM_get_uint(p->tlsvers, &ctx->tlsversion)) {
1175
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
1176
0
            return 0;
1177
0
        }
1178
2.21k
    }
1179
1180
2.55k
    if (p->tlsmacsize != NULL) {
1181
2.21k
        if (!OSSL_PARAM_get_size_t(p->tlsmacsize, &ctx->tlsmacsize)) {
1182
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
1183
0
            return 0;
1184
0
        }
1185
2.21k
    }
1186
1187
2.55k
    if (p->num != NULL) {
1188
0
        unsigned int num;
1189
1190
0
        if (!OSSL_PARAM_get_uint(p->num, &num)) {
1191
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
1192
0
            return 0;
1193
0
        }
1194
0
        ctx->num = num;
1195
0
    }
1196
2.55k
    return 1;
1197
2.55k
}
1198
1199
int ossl_cipher_generic_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1200
1.91M
{
1201
1.91M
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
1202
1.91M
    struct ossl_cipher_set_ctx_param_list_st p;
1203
1204
1.91M
    if (ossl_param_is_empty(params))
1205
1.91M
        return 1;
1206
1207
2.55k
    if (ctx == NULL || !cipher_generic_set_ctx_params_decoder(params, &p))
1208
0
        return 0;
1209
2.55k
    return ossl_cipher_common_set_ctx_params(ctx, &p);
1210
2.55k
}
1211
1212
int ossl_cipher_generic_initiv(PROV_CIPHER_CTX *ctx, const unsigned char *iv,
1213
    size_t ivlen)
1214
580k
{
1215
580k
    if (ivlen != ctx->ivlen
1216
580k
        || ivlen > sizeof(ctx->iv)) {
1217
0
        ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
1218
0
        return 0;
1219
0
    }
1220
580k
    ctx->iv_set = 1;
1221
580k
    memcpy(ctx->iv, iv, ivlen);
1222
580k
    memcpy(ctx->oiv, iv, ivlen);
1223
580k
    return 1;
1224
580k
}
1225
1226
void ossl_cipher_generic_initkey(void *vctx, size_t kbits, size_t blkbits,
1227
    size_t ivbits, unsigned int mode,
1228
    uint64_t flags, const PROV_CIPHER_HW *hw,
1229
    void *provctx)
1230
266k
{
1231
266k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
1232
1233
266k
    if ((flags & PROV_CIPHER_FLAG_INVERSE_CIPHER) != 0)
1234
0
        ctx->inverse_cipher = 1;
1235
266k
    if ((flags & PROV_CIPHER_FLAG_VARIABLE_LENGTH) != 0)
1236
0
        ctx->variable_keylength = 1;
1237
1238
266k
    ctx->pad = 1;
1239
266k
    ctx->keylen = ((kbits) / 8);
1240
266k
    ctx->ivlen = ((ivbits) / 8);
1241
266k
    ctx->hw = hw;
1242
266k
    ctx->mode = mode;
1243
266k
    ctx->blocksize = blkbits / 8;
1244
266k
    if (provctx != NULL)
1245
244k
        ctx->libctx = PROV_LIBCTX_OF(provctx); /* used for rand */
1246
266k
}