2 * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
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
11 * Generic dispatch table functions for ciphers.
14 /* For SSL3_VERSION */
15 #include <openssl/prov_ssl.h>
16 #include <openssl/proverr.h>
17 #include "ciphercommon_local.h"
18 #include "prov/provider_ctx.h"
19 #include "prov/providercommon.h"
22 * Generic cipher functions for OSSL_PARAM gettables and settables
24 static const OSSL_PARAM cipher_known_gettable_params
[] = {
25 OSSL_PARAM_uint(OSSL_CIPHER_PARAM_MODE
, NULL
),
26 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN
, NULL
),
27 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN
, NULL
),
28 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_BLOCK_SIZE
, NULL
),
29 OSSL_PARAM_int(OSSL_CIPHER_PARAM_AEAD
, NULL
),
30 OSSL_PARAM_int(OSSL_CIPHER_PARAM_CUSTOM_IV
, NULL
),
31 OSSL_PARAM_int(OSSL_CIPHER_PARAM_CTS
, NULL
),
32 OSSL_PARAM_int(OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK
, NULL
),
33 OSSL_PARAM_int(OSSL_CIPHER_PARAM_HAS_RAND_KEY
, NULL
),
36 const OSSL_PARAM
*ossl_cipher_generic_gettable_params(ossl_unused
void *provctx
)
38 return cipher_known_gettable_params
;
41 int ossl_cipher_generic_get_params(OSSL_PARAM params
[], unsigned int md
,
43 size_t kbits
, size_t blkbits
, size_t ivbits
)
47 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_MODE
);
48 if (p
!= NULL
&& !OSSL_PARAM_set_uint(p
, md
)) {
49 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
52 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_AEAD
);
54 && !OSSL_PARAM_set_int(p
, (flags
& PROV_CIPHER_FLAG_AEAD
) != 0)) {
55 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
58 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_CUSTOM_IV
);
60 && !OSSL_PARAM_set_int(p
, (flags
& PROV_CIPHER_FLAG_CUSTOM_IV
) != 0)) {
61 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
64 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_CTS
);
66 && !OSSL_PARAM_set_int(p
, (flags
& PROV_CIPHER_FLAG_CTS
) != 0)) {
67 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
70 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK
);
72 && !OSSL_PARAM_set_int(p
, (flags
& PROV_CIPHER_FLAG_TLS1_MULTIBLOCK
) != 0)) {
73 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
76 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_HAS_RAND_KEY
);
78 && !OSSL_PARAM_set_int(p
, (flags
& PROV_CIPHER_FLAG_RAND_KEY
) != 0)) {
79 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
82 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_KEYLEN
);
83 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, kbits
/ 8)) {
84 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
87 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_BLOCK_SIZE
);
88 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, blkbits
/ 8)) {
89 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
92 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_IVLEN
);
93 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ivbits
/ 8)) {
94 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
100 CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_START(ossl_cipher_generic
)
101 { OSSL_CIPHER_PARAM_TLS_MAC
, OSSL_PARAM_OCTET_PTR
, NULL
, 0, OSSL_PARAM_UNMODIFIED
},
102 CIPHER_DEFAULT_GETTABLE_CTX_PARAMS_END(ossl_cipher_generic
)
104 CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_START(ossl_cipher_generic
)
105 OSSL_PARAM_uint(OSSL_CIPHER_PARAM_USE_BITS
, NULL
),
106 OSSL_PARAM_uint(OSSL_CIPHER_PARAM_TLS_VERSION
, NULL
),
107 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE
, NULL
),
108 CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_END(ossl_cipher_generic
)
111 * Variable key length cipher functions for OSSL_PARAM settables
113 int ossl_cipher_var_keylen_set_ctx_params(void *vctx
, const OSSL_PARAM params
[])
115 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
121 if (!ossl_cipher_generic_set_ctx_params(vctx
, params
))
123 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_KEYLEN
);
127 if (!OSSL_PARAM_get_size_t(p
, &keylen
)) {
128 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
131 if (ctx
->keylen
!= keylen
) {
132 ctx
->keylen
= keylen
;
139 CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_START(ossl_cipher_var_keylen
)
140 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN
, NULL
),
141 CIPHER_DEFAULT_SETTABLE_CTX_PARAMS_END(ossl_cipher_var_keylen
)
144 * AEAD cipher functions for OSSL_PARAM gettables and settables
146 static const OSSL_PARAM cipher_aead_known_gettable_ctx_params
[] = {
147 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN
, NULL
),
148 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN
, NULL
),
149 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TAGLEN
, NULL
),
150 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV
, NULL
, 0),
151 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV
, NULL
, 0),
152 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG
, NULL
, 0),
153 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD
, NULL
),
154 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN
, NULL
, 0),
157 const OSSL_PARAM
*ossl_cipher_aead_gettable_ctx_params(
158 ossl_unused
void *cctx
, ossl_unused
void *provctx
161 return cipher_aead_known_gettable_ctx_params
;
164 static const OSSL_PARAM cipher_aead_known_settable_ctx_params
[] = {
165 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN
, NULL
),
166 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG
, NULL
, 0),
167 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD
, NULL
, 0),
168 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED
, NULL
, 0),
169 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV
, NULL
, 0),
172 const OSSL_PARAM
*ossl_cipher_aead_settable_ctx_params(
173 ossl_unused
void *cctx
, ossl_unused
void *provctx
176 return cipher_aead_known_settable_ctx_params
;
179 void ossl_cipher_generic_reset_ctx(PROV_CIPHER_CTX
*ctx
)
181 if (ctx
!= NULL
&& ctx
->alloced
) {
182 OPENSSL_free(ctx
->tlsmac
);
188 static int cipher_generic_init_internal(PROV_CIPHER_CTX
*ctx
,
189 const unsigned char *key
, size_t keylen
,
190 const unsigned char *iv
, size_t ivlen
,
191 const OSSL_PARAM params
[], int enc
)
196 ctx
->enc
= enc
? 1 : 0;
198 if (!ossl_prov_is_running())
201 if (iv
!= NULL
&& ctx
->mode
!= EVP_CIPH_ECB_MODE
) {
202 if (!ossl_cipher_generic_initiv(ctx
, iv
, ivlen
))
205 if (iv
== NULL
&& ctx
->iv_set
206 && (ctx
->mode
== EVP_CIPH_CBC_MODE
207 || ctx
->mode
== EVP_CIPH_CFB_MODE
208 || ctx
->mode
== EVP_CIPH_OFB_MODE
))
209 /* reset IV for these modes to keep compatibility with 1.1.1 */
210 memcpy(ctx
->iv
, ctx
->oiv
, ctx
->ivlen
);
213 if (ctx
->variable_keylength
== 0) {
214 if (keylen
!= ctx
->keylen
) {
215 ERR_raise(ERR_LIB_PROV
, PROV_R_INVALID_KEY_LENGTH
);
219 ctx
->keylen
= keylen
;
221 if (!ctx
->hw
->init(ctx
, key
, ctx
->keylen
))
225 return ossl_cipher_generic_set_ctx_params(ctx
, params
);
228 int ossl_cipher_generic_einit(void *vctx
, const unsigned char *key
,
229 size_t keylen
, const unsigned char *iv
,
230 size_t ivlen
, const OSSL_PARAM params
[])
232 return cipher_generic_init_internal((PROV_CIPHER_CTX
*)vctx
, key
, keylen
,
233 iv
, ivlen
, params
, 1);
236 int ossl_cipher_generic_dinit(void *vctx
, const unsigned char *key
,
237 size_t keylen
, const unsigned char *iv
,
238 size_t ivlen
, const OSSL_PARAM params
[])
240 return cipher_generic_init_internal((PROV_CIPHER_CTX
*)vctx
, key
, keylen
,
241 iv
, ivlen
, params
, 0);
244 /* Max padding including padding length byte */
245 #define MAX_PADDING 256
247 int ossl_cipher_generic_block_update(void *vctx
, unsigned char *out
,
248 size_t *outl
, size_t outsize
,
249 const unsigned char *in
, size_t inl
)
252 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
253 size_t blksz
= ctx
->blocksize
;
257 ERR_raise(ERR_LIB_PROV
, PROV_R_NO_KEY_SET
);
261 if (ctx
->tlsversion
> 0) {
263 * Each update call corresponds to a TLS record and is individually
267 /* Sanity check inputs */
272 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
277 unsigned char padval
;
282 padnum
= blksz
- (inl
% blksz
);
284 if (outsize
< inl
+ padnum
) {
285 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
289 if (padnum
> MAX_PADDING
) {
290 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
293 padval
= (unsigned char)(padnum
- 1);
294 if (ctx
->tlsversion
== SSL3_VERSION
) {
296 memset(out
+ inl
, 0, padnum
- 1);
297 *(out
+ inl
+ padnum
- 1) = padval
;
299 /* we need to add 'padnum' padding bytes of value padval */
300 for (loop
= inl
; loop
< inl
+ padnum
; loop
++)
306 if ((inl
% blksz
) != 0) {
307 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
312 /* Shouldn't normally fail */
313 if (!ctx
->hw
->cipher(ctx
, out
, in
, inl
)) {
314 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
319 OPENSSL_free(ctx
->tlsmac
);
324 /* This only fails if padding is publicly invalid */
327 && !ossl_cipher_tlsunpadblock(ctx
->libctx
, ctx
->tlsversion
,
329 blksz
, &ctx
->tlsmac
, &ctx
->alloced
,
330 ctx
->tlsmacsize
, 0)) {
331 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
338 nextblocks
= ossl_cipher_fillblock(ctx
->buf
, &ctx
->bufsz
, blksz
,
341 nextblocks
= inl
& ~(blksz
-1);
344 * If we're decrypting and we end an update on a block boundary we hold
345 * the last block back in case this is the last update call and the last
348 if (ctx
->bufsz
== blksz
&& (ctx
->enc
|| inl
> 0 || !ctx
->pad
)) {
349 if (outsize
< blksz
) {
350 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
353 if (!ctx
->hw
->cipher(ctx
, out
, ctx
->buf
, blksz
)) {
354 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
361 if (nextblocks
> 0) {
362 if (!ctx
->enc
&& ctx
->pad
&& nextblocks
== inl
) {
363 if (!ossl_assert(inl
>= blksz
)) {
364 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
369 outlint
+= nextblocks
;
370 if (outsize
< outlint
) {
371 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
375 if (nextblocks
> 0) {
376 if (!ctx
->hw
->cipher(ctx
, out
, in
, nextblocks
)) {
377 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
384 && !ossl_cipher_trailingdata(ctx
->buf
, &ctx
->bufsz
, blksz
, &in
, &inl
)) {
385 /* ERR_raise already called */
393 int ossl_cipher_generic_block_final(void *vctx
, unsigned char *out
,
394 size_t *outl
, size_t outsize
)
396 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
397 size_t blksz
= ctx
->blocksize
;
399 if (!ossl_prov_is_running())
403 ERR_raise(ERR_LIB_PROV
, PROV_R_NO_KEY_SET
);
407 if (ctx
->tlsversion
> 0) {
408 /* We never finalize TLS, so this is an error */
409 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
415 ossl_cipher_padblock(ctx
->buf
, &ctx
->bufsz
, blksz
);
416 } else if (ctx
->bufsz
== 0) {
419 } else if (ctx
->bufsz
!= blksz
) {
420 ERR_raise(ERR_LIB_PROV
, PROV_R_WRONG_FINAL_BLOCK_LENGTH
);
424 if (outsize
< blksz
) {
425 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
428 if (!ctx
->hw
->cipher(ctx
, out
, ctx
->buf
, blksz
)) {
429 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
438 if (ctx
->bufsz
!= blksz
) {
439 if (ctx
->bufsz
== 0 && !ctx
->pad
) {
443 ERR_raise(ERR_LIB_PROV
, PROV_R_WRONG_FINAL_BLOCK_LENGTH
);
447 if (!ctx
->hw
->cipher(ctx
, ctx
->buf
, ctx
->buf
, blksz
)) {
448 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
452 if (ctx
->pad
&& !ossl_cipher_unpadblock(ctx
->buf
, &ctx
->bufsz
, blksz
)) {
453 /* ERR_raise already called */
457 if (outsize
< ctx
->bufsz
) {
458 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
461 memcpy(out
, ctx
->buf
, ctx
->bufsz
);
467 int ossl_cipher_generic_stream_update(void *vctx
, unsigned char *out
,
468 size_t *outl
, size_t outsize
,
469 const unsigned char *in
, size_t inl
)
471 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
474 ERR_raise(ERR_LIB_PROV
, PROV_R_NO_KEY_SET
);
484 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
488 if (!ctx
->hw
->cipher(ctx
, out
, in
, inl
)) {
489 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
494 if (!ctx
->enc
&& ctx
->tlsversion
> 0) {
496 * Remove any TLS padding. Only used by cipher_aes_cbc_hmac_sha1_hw.c and
497 * cipher_aes_cbc_hmac_sha256_hw.c
499 if (ctx
->removetlspad
) {
501 * We should have already failed in the cipher() call above if this
504 if (!ossl_assert(*outl
>= (size_t)(out
[inl
- 1] + 1)))
506 /* The actual padding length */
507 *outl
-= out
[inl
- 1] + 1;
510 /* TLS MAC and explicit IV if relevant. We should have already failed
511 * in the cipher() call above if *outl is too short.
513 if (!ossl_assert(*outl
>= ctx
->removetlsfixed
))
515 *outl
-= ctx
->removetlsfixed
;
517 /* Extract the MAC if there is one */
518 if (ctx
->tlsmacsize
> 0) {
519 if (*outl
< ctx
->tlsmacsize
)
522 ctx
->tlsmac
= out
+ *outl
- ctx
->tlsmacsize
;
523 *outl
-= ctx
->tlsmacsize
;
529 int ossl_cipher_generic_stream_final(void *vctx
, unsigned char *out
,
530 size_t *outl
, size_t outsize
)
532 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
534 if (!ossl_prov_is_running())
538 ERR_raise(ERR_LIB_PROV
, PROV_R_NO_KEY_SET
);
546 int ossl_cipher_generic_cipher(void *vctx
, unsigned char *out
, size_t *outl
,
547 size_t outsize
, const unsigned char *in
,
550 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
552 if (!ossl_prov_is_running())
556 ERR_raise(ERR_LIB_PROV
, PROV_R_NO_KEY_SET
);
561 ERR_raise(ERR_LIB_PROV
, PROV_R_OUTPUT_BUFFER_TOO_SMALL
);
565 if (!ctx
->hw
->cipher(ctx
, out
, in
, inl
)) {
566 ERR_raise(ERR_LIB_PROV
, PROV_R_CIPHER_OPERATION_FAILED
);
574 int ossl_cipher_generic_get_ctx_params(void *vctx
, OSSL_PARAM params
[])
576 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
579 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_IVLEN
);
580 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ctx
->ivlen
)) {
581 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
584 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_PADDING
);
585 if (p
!= NULL
&& !OSSL_PARAM_set_uint(p
, ctx
->pad
)) {
586 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
589 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_IV
);
591 && !OSSL_PARAM_set_octet_ptr(p
, &ctx
->oiv
, ctx
->ivlen
)
592 && !OSSL_PARAM_set_octet_string(p
, &ctx
->oiv
, ctx
->ivlen
)) {
593 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
596 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_UPDATED_IV
);
598 && !OSSL_PARAM_set_octet_ptr(p
, &ctx
->iv
, ctx
->ivlen
)
599 && !OSSL_PARAM_set_octet_string(p
, &ctx
->iv
, ctx
->ivlen
)) {
600 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
603 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_NUM
);
604 if (p
!= NULL
&& !OSSL_PARAM_set_uint(p
, ctx
->num
)) {
605 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
608 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_KEYLEN
);
609 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ctx
->keylen
)) {
610 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
613 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_TLS_MAC
);
615 && !OSSL_PARAM_set_octet_ptr(p
, ctx
->tlsmac
, ctx
->tlsmacsize
)) {
616 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
622 int ossl_cipher_generic_set_ctx_params(void *vctx
, const OSSL_PARAM params
[])
624 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
630 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_PADDING
);
634 if (!OSSL_PARAM_get_uint(p
, &pad
)) {
635 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
638 ctx
->pad
= pad
? 1 : 0;
640 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_USE_BITS
);
644 if (!OSSL_PARAM_get_uint(p
, &bits
)) {
645 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
648 ctx
->use_bits
= bits
? 1 : 0;
650 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_TLS_VERSION
);
652 if (!OSSL_PARAM_get_uint(p
, &ctx
->tlsversion
)) {
653 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
657 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_TLS_MAC_SIZE
);
659 if (!OSSL_PARAM_get_size_t(p
, &ctx
->tlsmacsize
)) {
660 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
664 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_NUM
);
668 if (!OSSL_PARAM_get_uint(p
, &num
)) {
669 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
677 int ossl_cipher_generic_initiv(PROV_CIPHER_CTX
*ctx
, const unsigned char *iv
,
680 if (ivlen
!= ctx
->ivlen
681 || ivlen
> sizeof(ctx
->iv
)) {
682 ERR_raise(ERR_LIB_PROV
, PROV_R_INVALID_IV_LENGTH
);
686 memcpy(ctx
->iv
, iv
, ivlen
);
687 memcpy(ctx
->oiv
, iv
, ivlen
);
691 void ossl_cipher_generic_initkey(void *vctx
, size_t kbits
, size_t blkbits
,
692 size_t ivbits
, unsigned int mode
,
693 uint64_t flags
, const PROV_CIPHER_HW
*hw
,
696 PROV_CIPHER_CTX
*ctx
= (PROV_CIPHER_CTX
*)vctx
;
698 if ((flags
& PROV_CIPHER_FLAG_INVERSE_CIPHER
) != 0)
699 ctx
->inverse_cipher
= 1;
700 if ((flags
& PROV_CIPHER_FLAG_VARIABLE_LENGTH
) != 0)
701 ctx
->variable_keylength
= 1;
704 ctx
->keylen
= ((kbits
) / 8);
705 ctx
->ivlen
= ((ivbits
) / 8);
708 ctx
->blocksize
= blkbits
/ 8;
710 ctx
->libctx
= PROV_LIBCTX_OF(provctx
); /* used for rand */