Coverage Report

Created: 2026-09-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl41/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
10
/*
11
 * Generic dispatch table functions for ciphers.
12
 */
13
14
/* For SSL3_VERSION */
15
#include <string.h>
16
#include <openssl/prov_ssl.h>
17
#include <openssl/proverr.h>
18
#include "ciphercommon_local.h"
19
#include "prov/provider_ctx.h"
20
#include "prov/providercommon.h"
21
#include "internal/skey.h"
22
#include "internal/e_os.h"
23
#include "crypto/types.h"
24
25
#define ossl_cipher_generic_get_params_st ossl_cipher_get_param_list_st
26
#define cipher_generic_get_ctx_params_st ossl_cipher_get_ctx_param_list_st
27
#define cipher_generic_set_ctx_params_st ossl_cipher_set_ctx_param_list_st
28
#define cipher_var_keylen_set_ctx_params_st ossl_cipher_set_ctx_param_list_st
29
30
#include "providers/implementations/ciphers/ciphercommon.inc"
31
32
/*-
33
 * Generic cipher functions for OSSL_PARAM gettables and settables
34
 */
35
36
const OSSL_PARAM *ossl_cipher_generic_gettable_params(ossl_unused void *provctx)
37
0
{
38
0
    return ossl_cipher_generic_get_params_list;
39
0
}
40
41
int ossl_cipher_generic_get_params(OSSL_PARAM params[], unsigned int md,
42
    uint64_t flags,
43
    size_t kbits, size_t blkbits, size_t ivbits)
44
437k
{
45
437k
    struct ossl_cipher_get_param_list_st p;
46
47
437k
    if (!ossl_cipher_generic_get_params_decoder(params, &p))
48
0
        return 0;
49
50
437k
    return ossl_cipher_common_get_params(&p, md, flags, kbits, blkbits,
51
437k
        ivbits);
52
437k
}
53
54
int ossl_cipher_common_get_params(const struct ossl_cipher_get_param_list_st *p,
55
    unsigned int md, uint64_t flags, size_t kbits, size_t blkbits,
56
    size_t ivbits)
57
466k
{
58
466k
    if (p->mode != NULL && !OSSL_PARAM_set_uint(p->mode, md)) {
59
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
60
0
        return 0;
61
0
    }
62
466k
    if (p->aead != NULL
63
2.04k
        && !OSSL_PARAM_set_int(p->aead, (flags & PROV_CIPHER_FLAG_AEAD) != 0)) {
64
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
65
0
        return 0;
66
0
    }
67
466k
    if (p->custiv != NULL
68
2.21k
        && !OSSL_PARAM_set_int(p->custiv,
69
2.21k
            (flags & PROV_CIPHER_FLAG_CUSTOM_IV) != 0)) {
70
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
71
0
        return 0;
72
0
    }
73
466k
    if (p->cts != NULL
74
2.04k
        && !OSSL_PARAM_set_int(p->cts, (flags & PROV_CIPHER_FLAG_CTS) != 0)) {
75
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
76
0
        return 0;
77
0
    }
78
466k
    if (p->mb != NULL
79
2.04k
        && !OSSL_PARAM_set_int(p->mb,
80
2.04k
            (flags & PROV_CIPHER_FLAG_TLS1_MULTIBLOCK) != 0)) {
81
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
82
0
        return 0;
83
0
    }
84
466k
    if (p->rand != NULL
85
2.21k
        && !OSSL_PARAM_set_int(p->rand,
86
2.21k
            (flags & PROV_CIPHER_FLAG_RAND_KEY) != 0)) {
87
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
88
0
        return 0;
89
0
    }
90
466k
    if (p->etm != NULL
91
2.04k
        && !OSSL_PARAM_set_int(p->etm,
92
2.04k
            (flags & EVP_CIPH_FLAG_ENC_THEN_MAC) != 0)) {
93
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
94
0
        return 0;
95
0
    }
96
466k
    if (p->keylen != NULL
97
2.21k
        && !OSSL_PARAM_set_size_t(p->keylen, kbits / 8)) {
98
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
99
0
        return 0;
100
0
    }
101
466k
    if (p->bsize != NULL
102
2.21k
        && !OSSL_PARAM_set_size_t(p->bsize, blkbits / 8)) {
103
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
104
0
        return 0;
105
0
    }
106
466k
    if (p->ivlen != NULL
107
2.21k
        && !OSSL_PARAM_set_size_t(p->ivlen, ivbits / 8)) {
108
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
109
0
        return 0;
110
0
    }
111
466k
    return 1;
112
466k
}
113
114
const OSSL_PARAM *ossl_cipher_generic_gettable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
115
5.81k
{
116
5.81k
    return cipher_generic_get_ctx_params_list;
117
5.81k
}
118
119
const OSSL_PARAM *ossl_cipher_generic_settable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
120
250
{
121
250
    return cipher_generic_set_ctx_params_list;
122
250
}
123
124
/*
125
 * Variable key length cipher functions for OSSL_PARAM settables
126
 */
127
128
const OSSL_PARAM *ossl_cipher_var_keylen_settable_ctx_params(ossl_unused void *cctx, ossl_unused void *provctx)
129
0
{
130
0
    return cipher_var_keylen_set_ctx_params_list;
131
0
}
132
133
int ossl_cipher_var_keylen_set_ctx_params(void *vctx, const OSSL_PARAM params[])
134
0
{
135
0
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
136
0
    struct ossl_cipher_set_ctx_param_list_st p;
137
138
0
    if (ctx == NULL || !cipher_var_keylen_set_ctx_params_decoder(params, &p))
139
0
        return 0;
140
0
    return ossl_cipher_common_set_ctx_params(ctx, &p);
141
0
}
142
143
void ossl_cipher_generic_reset_ctx(PROV_CIPHER_CTX *ctx)
144
219k
{
145
219k
    if (ctx != NULL && ctx->alloced) {
146
3.34k
        OPENSSL_free(ctx->tlsmac);
147
3.34k
        ctx->alloced = 0;
148
3.34k
        ctx->tlsmac = NULL;
149
3.34k
    }
150
219k
}
151
152
/*
153
 * Deep-copy the tlsmac buffer after a shallow dupctx copy.
154
 * Must be called after OPENSSL_memdup or *dctx = *sctx to avoid
155
 * double-free when both contexts are freed.
156
 * Returns 1 on success, 0 on allocation failure.
157
 */
158
int ossl_cipher_generic_dupctx_tlsmac(PROV_CIPHER_CTX *dst,
159
    const PROV_CIPHER_CTX *src)
160
20
{
161
20
    if (src->tlsmac != NULL && src->alloced) {
162
0
        dst->tlsmac = OPENSSL_memdup(src->tlsmac, src->tlsmacsize);
163
0
        if (dst->tlsmac == NULL) {
164
0
            dst->alloced = 0;
165
0
            return 0;
166
0
        }
167
0
    }
168
20
    return 1;
169
20
}
170
171
static int cipher_generic_init_internal(PROV_CIPHER_CTX *ctx,
172
    const unsigned char *key, size_t keylen,
173
    const unsigned char *iv, size_t ivlen,
174
    const OSSL_PARAM params[], int enc)
175
2.48M
{
176
2.48M
    ctx->num = 0;
177
2.48M
    ctx->bufsz = 0;
178
2.48M
    ctx->updated = 0;
179
2.48M
    ctx->enc = enc ? 1 : 0;
180
181
2.48M
    if (!ossl_prov_is_running())
182
0
        return 0;
183
184
2.48M
    if (iv != NULL && ctx->mode != EVP_CIPH_ECB_MODE) {
185
555k
        if (!ossl_cipher_generic_initiv(ctx, iv, ivlen))
186
0
            return 0;
187
555k
    }
188
2.48M
    if (iv == NULL && ctx->iv_set
189
116k
        && (ctx->mode == EVP_CIPH_CBC_MODE
190
116k
            || ctx->mode == EVP_CIPH_CFB_MODE
191
116k
            || ctx->mode == EVP_CIPH_OFB_MODE))
192
        /* reset IV for these modes to keep compatibility with 1.1.1 */
193
242
        memcpy(ctx->iv, ctx->oiv, ctx->ivlen);
194
195
2.48M
    if (key != NULL) {
196
455k
        if (ctx->variable_keylength == 0) {
197
455k
            if (keylen != ctx->keylen) {
198
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
199
0
                return 0;
200
0
            }
201
455k
        } else {
202
0
            ctx->keylen = keylen;
203
0
        }
204
455k
        if (!ctx->hw->init(ctx, key, ctx->keylen))
205
0
            return 0;
206
455k
        ctx->key_set = 1;
207
455k
    }
208
2.48M
    return ossl_cipher_generic_set_ctx_params(ctx, params);
209
2.48M
}
210
211
int ossl_cipher_generic_einit(void *vctx, const unsigned char *key,
212
    size_t keylen, const unsigned char *iv,
213
    size_t ivlen, const OSSL_PARAM params[])
214
2.34M
{
215
2.34M
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
216
2.34M
        iv, ivlen, params, 1);
217
2.34M
}
218
219
int ossl_cipher_generic_dinit(void *vctx, const unsigned char *key,
220
    size_t keylen, const unsigned char *iv,
221
    size_t ivlen, const OSSL_PARAM params[])
222
143k
{
223
143k
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx, key, keylen,
224
143k
        iv, ivlen, params, 0);
225
143k
}
226
227
int ossl_cipher_generic_skey_einit(void *vctx, void *skeydata,
228
    const unsigned char *iv, size_t ivlen,
229
    const OSSL_PARAM params[])
230
0
{
231
0
    PROV_SKEY *key = skeydata;
232
233
0
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
234
0
        key->data, key->length,
235
0
        iv, ivlen, params, 1);
236
0
}
237
238
int ossl_cipher_generic_skey_dinit(void *vctx, void *skeydata,
239
    const unsigned char *iv, size_t ivlen,
240
    const OSSL_PARAM params[])
241
0
{
242
0
    PROV_SKEY *key = skeydata;
243
244
0
    return cipher_generic_init_internal((PROV_CIPHER_CTX *)vctx,
245
0
        key->data, key->length,
246
0
        iv, ivlen, params, 0);
247
0
}
248
249
/* Max padding including padding length byte */
250
2.00k
#define MAX_PADDING 256
251
252
int ossl_cipher_generic_block_update(void *vctx, unsigned char *out,
253
    size_t *outl, size_t outsize,
254
    const unsigned char *in, size_t inl)
255
1.35M
{
256
1.35M
    size_t outlint = 0;
257
1.35M
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
258
1.35M
    size_t blksz = ctx->blocksize;
259
1.35M
    size_t nextblocks;
260
261
1.35M
    if (!ctx->key_set) {
262
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
263
0
        return 0;
264
0
    }
265
266
1.35M
    if (ctx->tlsversion > 0) {
267
        /*
268
         * Each update call corresponds to a TLS record and is individually
269
         * padded
270
         */
271
272
        /* Sanity check inputs */
273
79.8k
        if (in == NULL
274
79.8k
            || in != out
275
79.8k
            || outsize < inl
276
79.8k
            || !ctx->pad) {
277
2
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
278
2
            return 0;
279
2
        }
280
281
79.8k
        if (ctx->enc) {
282
2.00k
            unsigned char padval;
283
2.00k
            size_t padnum, loop;
284
285
            /* Add padding */
286
287
2.00k
            padnum = blksz - (inl % blksz);
288
289
2.00k
            if (outsize < inl + padnum) {
290
0
                ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
291
0
                return 0;
292
0
            }
293
294
2.00k
            if (padnum > MAX_PADDING) {
295
0
                ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
296
0
                return 0;
297
0
            }
298
2.00k
            padval = (unsigned char)(padnum - 1);
299
            /* we need to add 'padnum' padding bytes of value padval */
300
19.0k
            for (loop = inl; loop < inl + padnum; loop++)
301
17.0k
                out[loop] = padval;
302
2.00k
            inl += padnum;
303
2.00k
        }
304
305
79.8k
        if ((inl % blksz) != 0) {
306
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
307
0
            return 0;
308
0
        }
309
310
        /* Shouldn't normally fail */
311
79.8k
        if (!ctx->hw->cipher(ctx, out, in, inl)) {
312
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
313
0
            return 0;
314
0
        }
315
316
79.8k
        if (ctx->alloced) {
317
55.3k
            OPENSSL_free(ctx->tlsmac);
318
55.3k
            ctx->alloced = 0;
319
55.3k
            ctx->tlsmac = NULL;
320
55.3k
        }
321
322
        /* This only fails if padding is publicly invalid */
323
79.8k
        *outl = inl;
324
79.8k
        if (!ctx->enc
325
77.7k
            && !ossl_cipher_tlsunpadblock(ctx->libctx, ctx->tlsversion,
326
77.7k
                out, outl,
327
77.7k
                blksz, &ctx->tlsmac, &ctx->alloced,
328
77.7k
                ctx->tlsmacsize, 0)) {
329
21.5k
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
330
21.5k
            return 0;
331
21.5k
        }
332
58.2k
        return 1;
333
79.8k
    }
334
335
1.27M
    if (ctx->bufsz != 0)
336
0
        nextblocks = ossl_cipher_fillblock(ctx->buf, &ctx->bufsz, blksz,
337
0
            &in, &inl);
338
1.27M
    else
339
1.27M
        nextblocks = inl & ~(blksz - 1);
340
341
    /*
342
     * If we're decrypting and we end an update on a block boundary we hold
343
     * the last block back in case this is the last update call and the last
344
     * block is padded.
345
     */
346
1.27M
    if (ctx->bufsz == blksz && (ctx->enc || inl > 0 || !ctx->pad)) {
347
0
        if (outsize < blksz) {
348
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
349
0
            return 0;
350
0
        }
351
0
        if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
352
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
353
0
            return 0;
354
0
        }
355
0
        ctx->bufsz = 0;
356
0
        outlint = blksz;
357
0
        out += blksz;
358
0
    }
359
1.27M
    if (nextblocks > 0) {
360
1.27M
        if (!ctx->enc && ctx->pad && nextblocks == inl) {
361
226
            if (!ossl_assert(inl >= blksz)) {
362
0
                ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
363
0
                return 0;
364
0
            }
365
226
            nextblocks -= blksz;
366
226
        }
367
1.27M
        outlint += nextblocks;
368
1.27M
        if (outsize < outlint) {
369
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
370
0
            return 0;
371
0
        }
372
1.27M
    }
373
1.27M
    if (nextblocks > 0) {
374
1.27M
        if (!ctx->hw->cipher(ctx, out, in, nextblocks)) {
375
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
376
0
            return 0;
377
0
        }
378
1.27M
        in += nextblocks;
379
1.27M
        inl -= nextblocks;
380
1.27M
    }
381
1.27M
    if (inl != 0
382
296
        && !ossl_cipher_trailingdata(ctx->buf, &ctx->bufsz, blksz, &in, &inl)) {
383
        /* ERR_raise already called */
384
0
        return 0;
385
0
    }
386
387
1.27M
    *outl = outlint;
388
1.27M
    return inl == 0;
389
1.27M
}
390
391
int ossl_cipher_generic_block_final(void *vctx, unsigned char *out,
392
    size_t *outl, size_t outsize)
393
1.19k
{
394
1.19k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
395
1.19k
    size_t blksz = ctx->blocksize;
396
397
1.19k
    if (!ossl_prov_is_running())
398
0
        return 0;
399
400
1.19k
    if (!ctx->key_set) {
401
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
402
0
        return 0;
403
0
    }
404
405
1.19k
    if (ctx->tlsversion > 0) {
406
        /* We never finalize TLS, so this is an error */
407
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
408
0
        return 0;
409
0
    }
410
411
1.19k
    if (ctx->enc) {
412
216
        if (ctx->pad) {
413
135
            ossl_cipher_padblock(ctx->buf, &ctx->bufsz, blksz);
414
135
        } else if (ctx->bufsz == 0) {
415
60
            *outl = 0;
416
60
            return 1;
417
60
        } else if (ctx->bufsz != blksz) {
418
21
            ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
419
21
            return 0;
420
21
        }
421
422
135
        if (outsize < blksz) {
423
0
            ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
424
0
            return 0;
425
0
        }
426
135
        if (!ctx->hw->cipher(ctx, out, ctx->buf, blksz)) {
427
0
            ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
428
0
            return 0;
429
0
        }
430
135
        ctx->bufsz = 0;
431
135
        *outl = blksz;
432
135
        return 1;
433
135
    }
434
435
    /* Decrypting */
436
981
    if (ctx->bufsz != blksz) {
437
34
        if (ctx->bufsz == 0 && !ctx->pad) {
438
0
            *outl = 0;
439
0
            return 1;
440
0
        }
441
34
        ERR_raise(ERR_LIB_PROV, PROV_R_WRONG_FINAL_BLOCK_LENGTH);
442
34
        return 0;
443
34
    }
444
445
947
    if (!ctx->hw->cipher(ctx, ctx->buf, ctx->buf, blksz)) {
446
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
447
0
        return 0;
448
0
    }
449
450
947
    if (ctx->pad && !ossl_cipher_unpadblock(ctx->buf, &ctx->bufsz, blksz)) {
451
        /* ERR_raise already called */
452
164
        return 0;
453
164
    }
454
455
783
    if (outsize < ctx->bufsz) {
456
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
457
0
        return 0;
458
0
    }
459
783
    memcpy(out, ctx->buf, ctx->bufsz);
460
783
    *outl = ctx->bufsz;
461
783
    ctx->bufsz = 0;
462
783
    return 1;
463
783
}
464
465
int ossl_cipher_generic_stream_update(void *vctx, unsigned char *out,
466
    size_t *outl, size_t outsize,
467
    const unsigned char *in, size_t inl)
468
224k
{
469
224k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
470
471
224k
    if (!ctx->key_set) {
472
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
473
0
        return 0;
474
0
    }
475
476
224k
    if (inl == 0) {
477
0
        *outl = 0;
478
0
        return 1;
479
0
    }
480
481
224k
    if (outsize < inl) {
482
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
483
0
        return 0;
484
0
    }
485
486
224k
    if (!ctx->hw->cipher(ctx, out, in, inl)) {
487
408
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
488
408
        return 0;
489
408
    }
490
491
223k
    *outl = inl;
492
223k
    if (!ctx->enc && ctx->tlsversion > 0) {
493
        /*
494
         * Remove any TLS padding. Only used by cipher_aes_cbc_hmac_sha1_hw.c and
495
         * cipher_aes_cbc_hmac_sha256_hw.c
496
         */
497
0
        if (ctx->removetlspad) {
498
            /*
499
             * We should have already failed in the cipher() call above if this
500
             * isn't true.
501
             */
502
0
            if (!ossl_assert(*outl >= (size_t)(out[inl - 1] + 1)))
503
0
                return 0;
504
            /* The actual padding length */
505
0
            *outl -= out[inl - 1] + 1;
506
0
        }
507
508
        /* TLS MAC and explicit IV if relevant. We should have already failed
509
         * in the cipher() call above if *outl is too short.
510
         */
511
0
        if (!ossl_assert(*outl >= ctx->removetlsfixed))
512
0
            return 0;
513
0
        *outl -= ctx->removetlsfixed;
514
515
        /* Extract the MAC if there is one */
516
0
        if (ctx->tlsmacsize > 0) {
517
0
            if (*outl < ctx->tlsmacsize)
518
0
                return 0;
519
520
0
            ctx->tlsmac = out + *outl - ctx->tlsmacsize;
521
0
            *outl -= ctx->tlsmacsize;
522
0
        }
523
0
    }
524
525
223k
    return 1;
526
223k
}
527
int ossl_cipher_generic_stream_final(void *vctx, unsigned char *out,
528
    size_t *outl, size_t outsize)
529
735
{
530
735
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
531
532
735
    if (!ossl_prov_is_running())
533
0
        return 0;
534
535
735
    if (!ctx->key_set) {
536
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
537
0
        return 0;
538
0
    }
539
540
735
    *outl = 0;
541
735
    return 1;
542
735
}
543
544
int ossl_cipher_generic_cipher(void *vctx, unsigned char *out, size_t *outl,
545
    size_t outsize, const unsigned char *in,
546
    size_t inl)
547
17.1k
{
548
17.1k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
549
550
17.1k
    if (!ossl_prov_is_running())
551
0
        return 0;
552
553
17.1k
    if (!ctx->key_set) {
554
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
555
0
        return 0;
556
0
    }
557
558
17.1k
    if (outsize < inl) {
559
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
560
0
        return 0;
561
0
    }
562
563
17.1k
    if (!ctx->hw->cipher(ctx, out, in, inl)) {
564
0
        ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
565
0
        return 0;
566
0
    }
567
568
17.1k
    *outl = inl;
569
17.1k
    return 1;
570
17.1k
}
571
572
int ossl_cipher_common_get_ctx_params(PROV_CIPHER_CTX *ctx, const struct ossl_cipher_get_ctx_param_list_st *p)
573
203k
{
574
203k
    if (p->ivlen != NULL && !OSSL_PARAM_set_size_t(p->ivlen, ctx->ivlen)) {
575
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
576
0
        return 0;
577
0
    }
578
579
203k
    if (p->pad != NULL && !OSSL_PARAM_set_uint(p->pad, ctx->pad)) {
580
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
581
0
        return 0;
582
0
    }
583
584
203k
    if (p->iv != NULL
585
0
        && !OSSL_PARAM_set_octet_string_or_ptr(p->iv, ctx->oiv, ctx->ivlen)) {
586
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
587
0
        return 0;
588
0
    }
589
590
203k
    if (p->updiv != NULL
591
0
        && !OSSL_PARAM_set_octet_string_or_ptr(p->updiv, ctx->iv, ctx->ivlen)) {
592
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
593
0
        return 0;
594
0
    }
595
596
203k
    if (p->num != NULL && !OSSL_PARAM_set_uint(p->num, ctx->num)) {
597
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
598
0
        return 0;
599
0
    }
600
601
203k
    if (p->keylen != NULL && !OSSL_PARAM_set_size_t(p->keylen, ctx->keylen)) {
602
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
603
0
        return 0;
604
0
    }
605
606
203k
    if (p->tlsmac != NULL
607
79.1k
        && !OSSL_PARAM_set_octet_ptr(p->tlsmac, ctx->tlsmac, ctx->tlsmacsize)) {
608
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
609
0
        return 0;
610
0
    }
611
203k
    return 1;
612
203k
}
613
614
int ossl_cipher_generic_get_ctx_params(void *vctx, OSSL_PARAM params[])
615
172k
{
616
172k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
617
172k
    struct ossl_cipher_get_ctx_param_list_st p;
618
619
172k
    if (ctx == NULL || !cipher_generic_get_ctx_params_decoder(params, &p))
620
0
        return 0;
621
172k
    return ossl_cipher_common_get_ctx_params(ctx, &p);
622
172k
}
623
624
int ossl_cipher_common_set_ctx_params(PROV_CIPHER_CTX *ctx, const struct ossl_cipher_set_ctx_param_list_st *p)
625
4.24k
{
626
4.24k
    if (p->pad != NULL) {
627
463
        unsigned int pad;
628
629
463
        if (!OSSL_PARAM_get_uint(p->pad, &pad)) {
630
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
631
0
            return 0;
632
0
        }
633
463
        ctx->pad = pad ? 1 : 0;
634
463
    }
635
636
4.24k
    if (p->bits != NULL) {
637
107
        unsigned int bits;
638
639
107
        if (!OSSL_PARAM_get_uint(p->bits, &bits)) {
640
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
641
0
            return 0;
642
0
        }
643
107
        ctx->use_bits = bits ? 1 : 0;
644
107
    }
645
646
4.24k
    if (p->tlsvers != NULL) {
647
2.69k
        if (!OSSL_PARAM_get_uint(p->tlsvers, &ctx->tlsversion)) {
648
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
649
0
            return 0;
650
0
        }
651
2.69k
    }
652
653
4.24k
    if (p->tlsmacsize != NULL) {
654
2.69k
        if (!OSSL_PARAM_get_size_t(p->tlsmacsize, &ctx->tlsmacsize)) {
655
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
656
0
            return 0;
657
0
        }
658
2.69k
    }
659
660
4.24k
    if (p->num != NULL) {
661
107
        unsigned int num;
662
663
107
        if (!OSSL_PARAM_get_uint(p->num, &num)) {
664
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
665
0
            return 0;
666
0
        }
667
107
        if (ctx->blocksize > 0 && num >= (unsigned int)ctx->blocksize) {
668
12
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
669
12
            return 0;
670
12
        }
671
95
        ctx->num = num;
672
95
    }
673
674
4.23k
    if (p->keylen != NULL) {
675
0
        size_t keylen;
676
677
0
        if (!OSSL_PARAM_get_size_t(p->keylen, &keylen)) {
678
0
            ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
679
0
            return 0;
680
0
        }
681
0
        if (ctx->keylen != keylen) {
682
0
            ctx->keylen = keylen;
683
0
            ctx->key_set = 0;
684
0
        }
685
0
    }
686
4.23k
    return 1;
687
4.23k
}
688
689
int ossl_cipher_generic_set_ctx_params(void *vctx, const OSSL_PARAM params[])
690
1.51M
{
691
1.51M
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
692
1.51M
    struct ossl_cipher_set_ctx_param_list_st p;
693
694
1.51M
    if (ossl_param_is_empty(params))
695
1.51M
        return 1;
696
697
3.52k
    if (ctx == NULL || !cipher_generic_set_ctx_params_decoder(params, &p))
698
0
        return 0;
699
3.52k
    return ossl_cipher_common_set_ctx_params(ctx, &p);
700
3.52k
}
701
702
int ossl_cipher_generic_initiv(PROV_CIPHER_CTX *ctx, const unsigned char *iv,
703
    size_t ivlen)
704
559k
{
705
559k
    if (ivlen != ctx->ivlen
706
559k
        || ivlen > sizeof(ctx->iv)) {
707
0
        ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
708
0
        return 0;
709
0
    }
710
559k
    ctx->iv_set = 1;
711
559k
    memcpy(ctx->iv, iv, ivlen);
712
559k
    memcpy(ctx->oiv, iv, ivlen);
713
559k
    return 1;
714
559k
}
715
716
void ossl_cipher_generic_initkey(void *vctx, size_t kbits, size_t blkbits,
717
    size_t ivbits, unsigned int mode,
718
    uint64_t flags, const PROV_CIPHER_HW *hw,
719
    void *provctx)
720
226k
{
721
226k
    PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx;
722
723
226k
    if ((flags & PROV_CIPHER_FLAG_INVERSE_CIPHER) != 0)
724
11
        ctx->inverse_cipher = 1;
725
226k
    if ((flags & PROV_CIPHER_FLAG_VARIABLE_LENGTH) != 0)
726
0
        ctx->variable_keylength = 1;
727
728
226k
    ctx->pad = 1;
729
226k
    ctx->keylen = ((kbits) / 8);
730
226k
    ctx->ivlen = ((ivbits) / 8);
731
226k
    ctx->hw = hw;
732
226k
    ctx->mode = mode;
733
226k
    ctx->blocksize = blkbits / 8;
734
226k
    if (provctx != NULL)
735
206k
        ctx->libctx = PROV_LIBCTX_OF(provctx); /* used for rand */
736
226k
}