Coverage Report

Created: 2025-07-11 06:57

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