Coverage Report

Created: 2026-10-28 06:28

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