xref: /freebsd/crypto/openssl/doc/man3/EVP_EncryptInit.pod (revision aa7957345732816fb0ba8308798d2f79f45597f9)
1e71b7053SJung-uk Kim=pod
2e71b7053SJung-uk Kim
3e71b7053SJung-uk Kim=head1 NAME
4e71b7053SJung-uk Kim
5b077aed3SPierre ProncheryEVP_CIPHER_fetch,
6b077aed3SPierre ProncheryEVP_CIPHER_up_ref,
7b077aed3SPierre ProncheryEVP_CIPHER_free,
8e71b7053SJung-uk KimEVP_CIPHER_CTX_new,
9e71b7053SJung-uk KimEVP_CIPHER_CTX_reset,
10e71b7053SJung-uk KimEVP_CIPHER_CTX_free,
11e71b7053SJung-uk KimEVP_EncryptInit_ex,
12b077aed3SPierre ProncheryEVP_EncryptInit_ex2,
13e71b7053SJung-uk KimEVP_EncryptUpdate,
14e71b7053SJung-uk KimEVP_EncryptFinal_ex,
15e71b7053SJung-uk KimEVP_DecryptInit_ex,
16b077aed3SPierre ProncheryEVP_DecryptInit_ex2,
17e71b7053SJung-uk KimEVP_DecryptUpdate,
18e71b7053SJung-uk KimEVP_DecryptFinal_ex,
19e71b7053SJung-uk KimEVP_CipherInit_ex,
20b077aed3SPierre ProncheryEVP_CipherInit_ex2,
21e71b7053SJung-uk KimEVP_CipherUpdate,
22e71b7053SJung-uk KimEVP_CipherFinal_ex,
23e71b7053SJung-uk KimEVP_CIPHER_CTX_set_key_length,
24e71b7053SJung-uk KimEVP_CIPHER_CTX_ctrl,
25e71b7053SJung-uk KimEVP_EncryptInit,
26e71b7053SJung-uk KimEVP_EncryptFinal,
27e71b7053SJung-uk KimEVP_DecryptInit,
28e71b7053SJung-uk KimEVP_DecryptFinal,
29e71b7053SJung-uk KimEVP_CipherInit,
30e71b7053SJung-uk KimEVP_CipherFinal,
31b077aed3SPierre ProncheryEVP_Cipher,
32e71b7053SJung-uk KimEVP_get_cipherbyname,
33e71b7053SJung-uk KimEVP_get_cipherbynid,
34e71b7053SJung-uk KimEVP_get_cipherbyobj,
35b077aed3SPierre ProncheryEVP_CIPHER_is_a,
36b077aed3SPierre ProncheryEVP_CIPHER_get0_name,
37b077aed3SPierre ProncheryEVP_CIPHER_get0_description,
38b077aed3SPierre ProncheryEVP_CIPHER_names_do_all,
39b077aed3SPierre ProncheryEVP_CIPHER_get0_provider,
40b077aed3SPierre ProncheryEVP_CIPHER_get_nid,
41b077aed3SPierre ProncheryEVP_CIPHER_get_params,
42b077aed3SPierre ProncheryEVP_CIPHER_gettable_params,
43b077aed3SPierre ProncheryEVP_CIPHER_get_block_size,
44b077aed3SPierre ProncheryEVP_CIPHER_get_key_length,
45b077aed3SPierre ProncheryEVP_CIPHER_get_iv_length,
46b077aed3SPierre ProncheryEVP_CIPHER_get_flags,
47b077aed3SPierre ProncheryEVP_CIPHER_get_mode,
48b077aed3SPierre ProncheryEVP_CIPHER_get_type,
49b077aed3SPierre ProncheryEVP_CIPHER_CTX_cipher,
50b077aed3SPierre ProncheryEVP_CIPHER_CTX_get0_cipher,
51b077aed3SPierre ProncheryEVP_CIPHER_CTX_get1_cipher,
52b077aed3SPierre ProncheryEVP_CIPHER_CTX_get0_name,
53b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_nid,
54b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params,
55b077aed3SPierre ProncheryEVP_CIPHER_gettable_ctx_params,
56b077aed3SPierre ProncheryEVP_CIPHER_CTX_gettable_params,
57b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_params,
58b077aed3SPierre ProncheryEVP_CIPHER_settable_ctx_params,
59b077aed3SPierre ProncheryEVP_CIPHER_CTX_settable_params,
60b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_block_size,
61b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_key_length,
62b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_iv_length,
63b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_tag_length,
64b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_app_data,
65b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_app_data,
66b077aed3SPierre ProncheryEVP_CIPHER_CTX_flags,
67b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_flags,
68b077aed3SPierre ProncheryEVP_CIPHER_CTX_clear_flags,
69b077aed3SPierre ProncheryEVP_CIPHER_CTX_test_flags,
70b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_type,
71b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_mode,
72b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_num,
73b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_num,
74b077aed3SPierre ProncheryEVP_CIPHER_CTX_is_encrypting,
75b077aed3SPierre ProncheryEVP_CIPHER_param_to_asn1,
76b077aed3SPierre ProncheryEVP_CIPHER_asn1_to_param,
77b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_padding,
78b077aed3SPierre ProncheryEVP_enc_null,
79b077aed3SPierre ProncheryEVP_CIPHER_do_all_provided,
80e71b7053SJung-uk KimEVP_CIPHER_nid,
81b077aed3SPierre ProncheryEVP_CIPHER_name,
82e71b7053SJung-uk KimEVP_CIPHER_block_size,
83e71b7053SJung-uk KimEVP_CIPHER_key_length,
84e71b7053SJung-uk KimEVP_CIPHER_iv_length,
85e71b7053SJung-uk KimEVP_CIPHER_flags,
86e71b7053SJung-uk KimEVP_CIPHER_mode,
87e71b7053SJung-uk KimEVP_CIPHER_type,
88b077aed3SPierre ProncheryEVP_CIPHER_CTX_encrypting,
89e71b7053SJung-uk KimEVP_CIPHER_CTX_nid,
90e71b7053SJung-uk KimEVP_CIPHER_CTX_block_size,
91e71b7053SJung-uk KimEVP_CIPHER_CTX_key_length,
92e71b7053SJung-uk KimEVP_CIPHER_CTX_iv_length,
93b077aed3SPierre ProncheryEVP_CIPHER_CTX_tag_length,
94b077aed3SPierre ProncheryEVP_CIPHER_CTX_num,
95e71b7053SJung-uk KimEVP_CIPHER_CTX_type,
96b077aed3SPierre ProncheryEVP_CIPHER_CTX_mode
97e71b7053SJung-uk Kim- EVP cipher routines
98e71b7053SJung-uk Kim
99e71b7053SJung-uk Kim=head1 SYNOPSIS
100e71b7053SJung-uk Kim
101b077aed3SPierre Pronchery=for openssl generic
102e71b7053SJung-uk Kim
103e71b7053SJung-uk Kim #include <openssl/evp.h>
104e71b7053SJung-uk Kim
105b077aed3SPierre Pronchery EVP_CIPHER *EVP_CIPHER_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
106b077aed3SPierre Pronchery                              const char *properties);
107b077aed3SPierre Pronchery int EVP_CIPHER_up_ref(EVP_CIPHER *cipher);
108b077aed3SPierre Pronchery void EVP_CIPHER_free(EVP_CIPHER *cipher);
109e71b7053SJung-uk Kim EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void);
110e71b7053SJung-uk Kim int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx);
111e71b7053SJung-uk Kim void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx);
112e71b7053SJung-uk Kim
113e71b7053SJung-uk Kim int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
114e71b7053SJung-uk Kim                        ENGINE *impl, const unsigned char *key, const unsigned char *iv);
115b077aed3SPierre Pronchery int EVP_EncryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
116b077aed3SPierre Pronchery                         const unsigned char *key, const unsigned char *iv,
117b077aed3SPierre Pronchery                         const OSSL_PARAM params[]);
118e71b7053SJung-uk Kim int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
119e71b7053SJung-uk Kim                       int *outl, const unsigned char *in, int inl);
120e71b7053SJung-uk Kim int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
121e71b7053SJung-uk Kim
122e71b7053SJung-uk Kim int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
123e71b7053SJung-uk Kim                        ENGINE *impl, const unsigned char *key, const unsigned char *iv);
124b077aed3SPierre Pronchery int EVP_DecryptInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
125b077aed3SPierre Pronchery                         const unsigned char *key, const unsigned char *iv,
126b077aed3SPierre Pronchery                         const OSSL_PARAM params[]);
127e71b7053SJung-uk Kim int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
128e71b7053SJung-uk Kim                       int *outl, const unsigned char *in, int inl);
129e71b7053SJung-uk Kim int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
130e71b7053SJung-uk Kim
131e71b7053SJung-uk Kim int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
132e71b7053SJung-uk Kim                       ENGINE *impl, const unsigned char *key, const unsigned char *iv, int enc);
133b077aed3SPierre Pronchery int EVP_CipherInit_ex2(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
134b077aed3SPierre Pronchery                        const unsigned char *key, const unsigned char *iv,
135b077aed3SPierre Pronchery                        int enc, const OSSL_PARAM params[]);
136e71b7053SJung-uk Kim int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out,
137e71b7053SJung-uk Kim                      int *outl, const unsigned char *in, int inl);
138e71b7053SJung-uk Kim int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
139e71b7053SJung-uk Kim
140e71b7053SJung-uk Kim int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
141e71b7053SJung-uk Kim                     const unsigned char *key, const unsigned char *iv);
142e71b7053SJung-uk Kim int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);
143e71b7053SJung-uk Kim
144e71b7053SJung-uk Kim int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
145e71b7053SJung-uk Kim                     const unsigned char *key, const unsigned char *iv);
146e71b7053SJung-uk Kim int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
147e71b7053SJung-uk Kim
148e71b7053SJung-uk Kim int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *type,
149e71b7053SJung-uk Kim                    const unsigned char *key, const unsigned char *iv, int enc);
150e71b7053SJung-uk Kim int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl);
151e71b7053SJung-uk Kim
152b077aed3SPierre Pronchery int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
153b077aed3SPierre Pronchery                const unsigned char *in, unsigned int inl);
154b077aed3SPierre Pronchery
155e71b7053SJung-uk Kim int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *x, int padding);
156e71b7053SJung-uk Kim int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *x, int keylen);
157b077aed3SPierre Pronchery int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int cmd, int p1, void *p2);
158e71b7053SJung-uk Kim int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key);
159b077aed3SPierre Pronchery void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags);
160b077aed3SPierre Pronchery void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags);
161b077aed3SPierre Pronchery int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags);
162e71b7053SJung-uk Kim
163e71b7053SJung-uk Kim const EVP_CIPHER *EVP_get_cipherbyname(const char *name);
164e71b7053SJung-uk Kim const EVP_CIPHER *EVP_get_cipherbynid(int nid);
165e71b7053SJung-uk Kim const EVP_CIPHER *EVP_get_cipherbyobj(const ASN1_OBJECT *a);
166e71b7053SJung-uk Kim
167b077aed3SPierre Pronchery int EVP_CIPHER_get_nid(const EVP_CIPHER *e);
168b077aed3SPierre Pronchery int EVP_CIPHER_is_a(const EVP_CIPHER *cipher, const char *name);
169b077aed3SPierre Pronchery int EVP_CIPHER_names_do_all(const EVP_CIPHER *cipher,
170b077aed3SPierre Pronchery                             void (*fn)(const char *name, void *data),
171b077aed3SPierre Pronchery                             void *data);
172b077aed3SPierre Pronchery const char *EVP_CIPHER_get0_name(const EVP_CIPHER *cipher);
173b077aed3SPierre Pronchery const char *EVP_CIPHER_get0_description(const EVP_CIPHER *cipher);
174b077aed3SPierre Pronchery const OSSL_PROVIDER *EVP_CIPHER_get0_provider(const EVP_CIPHER *cipher);
175b077aed3SPierre Pronchery int EVP_CIPHER_get_block_size(const EVP_CIPHER *e);
176b077aed3SPierre Pronchery int EVP_CIPHER_get_key_length(const EVP_CIPHER *e);
177b077aed3SPierre Pronchery int EVP_CIPHER_get_iv_length(const EVP_CIPHER *e);
178b077aed3SPierre Pronchery unsigned long EVP_CIPHER_get_flags(const EVP_CIPHER *e);
179b077aed3SPierre Pronchery unsigned long EVP_CIPHER_get_mode(const EVP_CIPHER *e);
180b077aed3SPierre Pronchery int EVP_CIPHER_get_type(const EVP_CIPHER *cipher);
181e71b7053SJung-uk Kim
182b077aed3SPierre Pronchery const EVP_CIPHER *EVP_CIPHER_CTX_get0_cipher(const EVP_CIPHER_CTX *ctx);
183b077aed3SPierre Pronchery EVP_CIPHER *EVP_CIPHER_CTX_get1_cipher(const EVP_CIPHER_CTX *ctx);
184b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_nid(const EVP_CIPHER_CTX *ctx);
185b077aed3SPierre Pronchery const char *EVP_CIPHER_CTX_get0_name(const EVP_CIPHER_CTX *ctx);
186b077aed3SPierre Pronchery
187b077aed3SPierre Pronchery int EVP_CIPHER_get_params(EVP_CIPHER *cipher, OSSL_PARAM params[]);
188b077aed3SPierre Pronchery int EVP_CIPHER_CTX_set_params(EVP_CIPHER_CTX *ctx, const OSSL_PARAM params[]);
189b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_params(EVP_CIPHER_CTX *ctx, OSSL_PARAM params[]);
190b077aed3SPierre Pronchery const OSSL_PARAM *EVP_CIPHER_gettable_params(const EVP_CIPHER *cipher);
191b077aed3SPierre Pronchery const OSSL_PARAM *EVP_CIPHER_settable_ctx_params(const EVP_CIPHER *cipher);
192b077aed3SPierre Pronchery const OSSL_PARAM *EVP_CIPHER_gettable_ctx_params(const EVP_CIPHER *cipher);
193b077aed3SPierre Pronchery const OSSL_PARAM *EVP_CIPHER_CTX_settable_params(EVP_CIPHER_CTX *ctx);
194b077aed3SPierre Pronchery const OSSL_PARAM *EVP_CIPHER_CTX_gettable_params(EVP_CIPHER_CTX *ctx);
195b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_block_size(const EVP_CIPHER_CTX *ctx);
196b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_key_length(const EVP_CIPHER_CTX *ctx);
197b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_iv_length(const EVP_CIPHER_CTX *ctx);
198b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_tag_length(const EVP_CIPHER_CTX *ctx);
199e71b7053SJung-uk Kim void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx);
200e71b7053SJung-uk Kim void EVP_CIPHER_CTX_set_app_data(const EVP_CIPHER_CTX *ctx, void *data);
201b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_type(const EVP_CIPHER_CTX *ctx);
202b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_mode(const EVP_CIPHER_CTX *ctx);
203b077aed3SPierre Pronchery int EVP_CIPHER_CTX_get_num(const EVP_CIPHER_CTX *ctx);
204b077aed3SPierre Pronchery int EVP_CIPHER_CTX_set_num(EVP_CIPHER_CTX *ctx, int num);
205b077aed3SPierre Pronchery int EVP_CIPHER_CTX_is_encrypting(const EVP_CIPHER_CTX *ctx);
206e71b7053SJung-uk Kim
207e71b7053SJung-uk Kim int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
208e71b7053SJung-uk Kim int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type);
209e71b7053SJung-uk Kim
210b077aed3SPierre Pronchery void EVP_CIPHER_do_all_provided(OSSL_LIB_CTX *libctx,
211b077aed3SPierre Pronchery                                 void (*fn)(EVP_CIPHER *cipher, void *arg),
212b077aed3SPierre Pronchery                                 void *arg);
213b077aed3SPierre Pronchery
214b077aed3SPierre Pronchery #define EVP_CIPHER_nid EVP_CIPHER_get_nid
215b077aed3SPierre Pronchery #define EVP_CIPHER_name EVP_CIPHER_get0_name
216b077aed3SPierre Pronchery #define EVP_CIPHER_block_size EVP_CIPHER_get_block_size
217b077aed3SPierre Pronchery #define EVP_CIPHER_key_length EVP_CIPHER_get_key_length
218b077aed3SPierre Pronchery #define EVP_CIPHER_iv_length EVP_CIPHER_get_iv_length
219b077aed3SPierre Pronchery #define EVP_CIPHER_flags EVP_CIPHER_get_flags
220b077aed3SPierre Pronchery #define EVP_CIPHER_mode EVP_CIPHER_get_mode
221b077aed3SPierre Pronchery #define EVP_CIPHER_type EVP_CIPHER_get_type
222b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_encrypting EVP_CIPHER_CTX_is_encrypting
223b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_nid EVP_CIPHER_CTX_get_nid
224b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_block_size EVP_CIPHER_CTX_get_block_size
225b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_key_length EVP_CIPHER_CTX_get_key_length
226b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_iv_length EVP_CIPHER_CTX_get_iv_length
227b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_tag_length EVP_CIPHER_CTX_get_tag_length
228b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_num EVP_CIPHER_CTX_get_num
229b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_type EVP_CIPHER_CTX_get_type
230b077aed3SPierre Pronchery #define EVP_CIPHER_CTX_mode EVP_CIPHER_CTX_get_mode
231b077aed3SPierre Pronchery
232b077aed3SPierre ProncheryThe following function has been deprecated since OpenSSL 3.0, and can be
233b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
234b077aed3SPierre Proncherysee L<openssl_user_macros(7)>:
235b077aed3SPierre Pronchery
236b077aed3SPierre Pronchery const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx);
237b077aed3SPierre Pronchery
238b077aed3SPierre ProncheryThe following function has been deprecated since OpenSSL 1.1.0, and can be
239b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value,
240b077aed3SPierre Proncherysee L<openssl_user_macros(7)>:
241b077aed3SPierre Pronchery
242b077aed3SPierre Pronchery int EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx);
243b077aed3SPierre Pronchery
244e71b7053SJung-uk Kim=head1 DESCRIPTION
245e71b7053SJung-uk Kim
24658f35182SJung-uk KimThe EVP cipher routines are a high-level interface to certain
247e71b7053SJung-uk Kimsymmetric ciphers.
248e71b7053SJung-uk Kim
249b077aed3SPierre ProncheryThe B<EVP_CIPHER> type is a structure for cipher method implementation.
250e71b7053SJung-uk Kim
251b077aed3SPierre Pronchery=over 4
252e71b7053SJung-uk Kim
253b077aed3SPierre Pronchery=item EVP_CIPHER_fetch()
254e71b7053SJung-uk Kim
255b077aed3SPierre ProncheryFetches the cipher implementation for the given I<algorithm> from any provider
256b077aed3SPierre Proncheryoffering it, within the criteria given by the I<properties>.
257b077aed3SPierre ProncherySee L<crypto(7)/ALGORITHM FETCHING> for further information.
258b077aed3SPierre Pronchery
259b077aed3SPierre ProncheryThe returned value must eventually be freed with EVP_CIPHER_free().
260b077aed3SPierre Pronchery
261b077aed3SPierre ProncheryFetched B<EVP_CIPHER> structures are reference counted.
262b077aed3SPierre Pronchery
263b077aed3SPierre Pronchery=item EVP_CIPHER_up_ref()
264b077aed3SPierre Pronchery
265b077aed3SPierre ProncheryIncrements the reference count for an B<EVP_CIPHER> structure.
266b077aed3SPierre Pronchery
267b077aed3SPierre Pronchery=item EVP_CIPHER_free()
268b077aed3SPierre Pronchery
269b077aed3SPierre ProncheryDecrements the reference count for the fetched B<EVP_CIPHER> structure.
270b077aed3SPierre ProncheryIf the reference count drops to 0 then the structure is freed.
271b077aed3SPierre Pronchery
272b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_new()
273b077aed3SPierre Pronchery
274b077aed3SPierre ProncheryAllocates and returns a cipher context.
275b077aed3SPierre Pronchery
276b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_free()
277b077aed3SPierre Pronchery
278b077aed3SPierre ProncheryClears all information from a cipher context and frees any allocated memory
279b077aed3SPierre Proncheryassociated with it, including I<ctx> itself. This function should be called after
280b077aed3SPierre Proncheryall operations using a cipher are complete so sensitive information does not
281b077aed3SPierre Proncheryremain in memory.
282b077aed3SPierre Pronchery
283b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_ctrl()
284b077aed3SPierre Pronchery
285b077aed3SPierre ProncheryI<This is a legacy method.> EVP_CIPHER_CTX_set_params() and
286b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params() is the mechanism that should be used to set and get
287b077aed3SPierre Proncheryparameters that are used by providers.
288b077aed3SPierre Pronchery
289b077aed3SPierre ProncheryPerforms cipher-specific control actions on context I<ctx>. The control command
290b077aed3SPierre Proncheryis indicated in I<cmd> and any additional arguments in I<p1> and I<p2>.
291b077aed3SPierre ProncheryEVP_CIPHER_CTX_ctrl() must be called after EVP_CipherInit_ex2(). Other restrictions
292b077aed3SPierre Proncherymay apply depending on the control type and cipher implementation.
293b077aed3SPierre Pronchery
294b077aed3SPierre ProncheryIf this function happens to be used with a fetched B<EVP_CIPHER>, it will
295b077aed3SPierre Proncherytranslate the controls that are known to OpenSSL into L<OSSL_PARAM(3)>
296b077aed3SPierre Proncheryparameters with keys defined by OpenSSL and call EVP_CIPHER_CTX_get_params() or
297b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_params() as is appropriate for each control command.
298b077aed3SPierre Pronchery
299b077aed3SPierre ProncherySee L</CONTROLS> below for more information, including what translations are
300b077aed3SPierre Proncherybeing done.
301b077aed3SPierre Pronchery
302b077aed3SPierre Pronchery=item EVP_CIPHER_get_params()
303b077aed3SPierre Pronchery
304b077aed3SPierre ProncheryRetrieves the requested list of algorithm I<params> from a CIPHER I<cipher>.
305b077aed3SPierre ProncherySee L</PARAMETERS> below for more information.
306b077aed3SPierre Pronchery
307b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_get_params()
308b077aed3SPierre Pronchery
309b077aed3SPierre ProncheryRetrieves the requested list of I<params> from CIPHER context I<ctx>.
310b077aed3SPierre ProncherySee L</PARAMETERS> below for more information.
311b077aed3SPierre Pronchery
312b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_set_params()
313b077aed3SPierre Pronchery
314b077aed3SPierre ProncherySets the list of I<params> into a CIPHER context I<ctx>.
315b077aed3SPierre ProncherySee L</PARAMETERS> below for more information.
316b077aed3SPierre Pronchery
317b077aed3SPierre Pronchery=item EVP_CIPHER_gettable_params()
318b077aed3SPierre Pronchery
319b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the retrievable parameters
320b077aed3SPierre Proncherythat can be used with EVP_CIPHER_get_params().
321b077aed3SPierre Pronchery
322b077aed3SPierre Pronchery=item EVP_CIPHER_gettable_ctx_params() and EVP_CIPHER_CTX_gettable_params()
323b077aed3SPierre Pronchery
324b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the retrievable parameters
325b077aed3SPierre Proncherythat can be used with EVP_CIPHER_CTX_get_params().
326b077aed3SPierre ProncheryEVP_CIPHER_gettable_ctx_params() returns the parameters that can be retrieved
327b077aed3SPierre Proncheryfrom the algorithm, whereas EVP_CIPHER_CTX_gettable_params() returns the
328b077aed3SPierre Proncheryparameters that can be retrieved in the context's current state.
329b077aed3SPierre Pronchery
330b077aed3SPierre Pronchery=item EVP_CIPHER_settable_ctx_params() and EVP_CIPHER_CTX_settable_params()
331b077aed3SPierre Pronchery
332b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the settable parameters
333b077aed3SPierre Proncherythat can be used with EVP_CIPHER_CTX_set_params().
334b077aed3SPierre ProncheryEVP_CIPHER_settable_ctx_params() returns the parameters that can be set from the
335b077aed3SPierre Proncheryalgorithm, whereas EVP_CIPHER_CTX_settable_params() returns the parameters that
336b077aed3SPierre Proncherycan be set in the context's current state.
337b077aed3SPierre Pronchery
338b077aed3SPierre Pronchery=item EVP_EncryptInit_ex2()
339b077aed3SPierre Pronchery
340b077aed3SPierre ProncherySets up cipher context I<ctx> for encryption with cipher I<type>. I<type> is
341b077aed3SPierre Proncherytypically supplied by calling EVP_CIPHER_fetch(). I<type> may also be set
342b077aed3SPierre Proncheryusing legacy functions such as EVP_aes_256_cbc(), but this is not recommended
343b077aed3SPierre Proncheryfor new applications. I<key> is the symmetric key to use and I<iv> is the IV to
344b077aed3SPierre Proncheryuse (if necessary), the actual number of bytes used for the key and IV depends
345b077aed3SPierre Proncheryon the cipher. The parameters I<params> will be set on the context after
346b077aed3SPierre Proncheryinitialisation. It is possible to set all parameters to NULL except I<type> in
347b077aed3SPierre Proncheryan initial call and supply the remaining parameters in subsequent calls, all of
348b077aed3SPierre Proncherywhich have I<type> set to NULL. This is done when the default cipher parameters
349b077aed3SPierre Proncheryare not appropriate.
350b077aed3SPierre ProncheryFor B<EVP_CIPH_GCM_MODE> the IV will be generated internally if it is not
351b077aed3SPierre Proncheryspecified.
352b077aed3SPierre Pronchery
353b077aed3SPierre Pronchery=item EVP_EncryptInit_ex()
354b077aed3SPierre Pronchery
355b077aed3SPierre ProncheryThis legacy function is similar to EVP_EncryptInit_ex2() when I<impl> is NULL.
356b077aed3SPierre ProncheryThe implementation of the I<type> from the I<impl> engine will be used if it
357b077aed3SPierre Proncheryexists.
358b077aed3SPierre Pronchery
359b077aed3SPierre Pronchery=item EVP_EncryptUpdate()
360b077aed3SPierre Pronchery
361b077aed3SPierre ProncheryEncrypts I<inl> bytes from the buffer I<in> and writes the encrypted version to
362b077aed3SPierre ProncheryI<out>. This function can be called multiple times to encrypt successive blocks
363b077aed3SPierre Proncheryof data. The amount of data written depends on the block alignment of the
364b077aed3SPierre Proncheryencrypted data.
36558f35182SJung-uk KimFor most ciphers and modes, the amount of data written can be anything
36658f35182SJung-uk Kimfrom zero bytes to (inl + cipher_block_size - 1) bytes.
36758f35182SJung-uk KimFor wrap cipher modes, the amount of data written can be anything
36858f35182SJung-uk Kimfrom zero bytes to (inl + cipher_block_size) bytes.
36958f35182SJung-uk KimFor stream ciphers, the amount of data written can be anything from zero
37058f35182SJung-uk Kimbytes to inl bytes.
371b077aed3SPierre ProncheryThus, I<out> should contain sufficient room for the operation being performed.
372b077aed3SPierre ProncheryThe actual number of bytes written is placed in I<outl>. It also
373b077aed3SPierre Proncherychecks if I<in> and I<out> are partially overlapping, and if they are
374e71b7053SJung-uk Kim0 is returned to indicate failure.
375e71b7053SJung-uk Kim
376e71b7053SJung-uk KimIf padding is enabled (the default) then EVP_EncryptFinal_ex() encrypts
377e71b7053SJung-uk Kimthe "final" data, that is any data that remains in a partial block.
378e71b7053SJung-uk KimIt uses standard block padding (aka PKCS padding) as described in
379e71b7053SJung-uk Kimthe NOTES section, below. The encrypted
380b077aed3SPierre Proncheryfinal data is written to I<out> which should have sufficient space for
381b077aed3SPierre Proncheryone cipher block. The number of bytes written is placed in I<outl>. After
382e71b7053SJung-uk Kimthis function is called the encryption operation is finished and no further
383e71b7053SJung-uk Kimcalls to EVP_EncryptUpdate() should be made.
384e71b7053SJung-uk Kim
385e71b7053SJung-uk KimIf padding is disabled then EVP_EncryptFinal_ex() will not encrypt any more
386e71b7053SJung-uk Kimdata and it will return an error if any data remains in a partial block:
387e71b7053SJung-uk Kimthat is if the total data length is not a multiple of the block size.
388e71b7053SJung-uk Kim
389b077aed3SPierre Pronchery=item EVP_DecryptInit_ex2(), EVP_DecryptInit_ex(), EVP_DecryptUpdate()
390b077aed3SPierre Proncheryand EVP_DecryptFinal_ex()
391e71b7053SJung-uk Kim
392b077aed3SPierre ProncheryThese functions are the corresponding decryption operations.
393b077aed3SPierre ProncheryEVP_DecryptFinal() will return an error code if padding is enabled and the
394b077aed3SPierre Proncheryfinal block is not correctly formatted. The parameters and restrictions are
395b077aed3SPierre Proncheryidentical to the encryption operations except that if padding is enabled the
396b077aed3SPierre Proncherydecrypted data buffer I<out> passed to EVP_DecryptUpdate() should have
397b077aed3SPierre Proncherysufficient room for (I<inl> + cipher_block_size) bytes unless the cipher block
398b077aed3SPierre Proncherysize is 1 in which case I<inl> bytes is sufficient.
399b077aed3SPierre Pronchery
400b077aed3SPierre Pronchery=item EVP_CipherInit_ex2(), EVP_CipherInit_ex(), EVP_CipherUpdate() and
401b077aed3SPierre ProncheryEVP_CipherFinal_ex()
402b077aed3SPierre Pronchery
403b077aed3SPierre ProncheryThese functions can be used for decryption or encryption. The operation
404b077aed3SPierre Proncheryperformed depends on the value of the I<enc> parameter. It should be set to 1
405b077aed3SPierre Proncheryfor encryption, 0 for decryption and -1 to leave the value unchanged
406e71b7053SJung-uk Kim(the actual value of 'enc' being supplied in a previous call).
407e71b7053SJung-uk Kim
408b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_reset()
409e71b7053SJung-uk Kim
410b077aed3SPierre ProncheryClears all information from a cipher context and free up any allocated memory
411b077aed3SPierre Proncheryassociated with it, except the I<ctx> itself. This function should be called
412b077aed3SPierre Proncheryanytime I<ctx> is reused by another
413b077aed3SPierre ProncheryEVP_CipherInit() / EVP_CipherUpdate() / EVP_CipherFinal() series of calls.
414e71b7053SJung-uk Kim
415b077aed3SPierre Pronchery=item EVP_EncryptInit(), EVP_DecryptInit() and EVP_CipherInit()
416b077aed3SPierre Pronchery
417b077aed3SPierre ProncheryBehave in a similar way to EVP_EncryptInit_ex(), EVP_DecryptInit_ex() and
418b077aed3SPierre ProncheryEVP_CipherInit_ex() except if the I<type> is not a fetched cipher they use the
419b077aed3SPierre Proncherydefault implementation of the I<type>.
420b077aed3SPierre Pronchery
421b077aed3SPierre Pronchery=item EVP_EncryptFinal(), EVP_DecryptFinal() and EVP_CipherFinal()
422b077aed3SPierre Pronchery
423b077aed3SPierre ProncheryIdentical to EVP_EncryptFinal_ex(), EVP_DecryptFinal_ex() and
424e71b7053SJung-uk KimEVP_CipherFinal_ex(). In previous releases they also cleaned up
425b077aed3SPierre Proncherythe I<ctx>, but this is no longer done and EVP_CIPHER_CTX_cleanup()
426e71b7053SJung-uk Kimmust be called to free any context resources.
427e71b7053SJung-uk Kim
428b077aed3SPierre Pronchery=item EVP_Cipher()
429e71b7053SJung-uk Kim
430b077aed3SPierre ProncheryEncrypts or decrypts a maximum I<inl> amount of bytes from I<in> and leaves the
431b077aed3SPierre Proncheryresult in I<out>.
432e71b7053SJung-uk Kim
433b077aed3SPierre ProncheryFor legacy ciphers - If the cipher doesn't have the flag
434b077aed3SPierre ProncheryB<EVP_CIPH_FLAG_CUSTOM_CIPHER> set, then I<inl> must be a multiple of
435b077aed3SPierre ProncheryEVP_CIPHER_get_block_size().  If it isn't, the result is undefined.  If the cipher
436b077aed3SPierre Proncheryhas that flag set, then I<inl> can be any size.
437b077aed3SPierre Pronchery
438b077aed3SPierre ProncheryDue to the constraints of the API contract of this function it shouldn't be used
439b077aed3SPierre Proncheryin applications, please consider using EVP_CipherUpdate() and
440b077aed3SPierre ProncheryEVP_CipherFinal_ex() instead.
441b077aed3SPierre Pronchery
442b077aed3SPierre Pronchery=item EVP_get_cipherbyname(), EVP_get_cipherbynid() and EVP_get_cipherbyobj()
443b077aed3SPierre Pronchery
444b077aed3SPierre ProncheryReturns an B<EVP_CIPHER> structure when passed a cipher name, a cipher B<NID> or
445b077aed3SPierre Proncheryan B<ASN1_OBJECT> structure respectively.
446b077aed3SPierre Pronchery
447b077aed3SPierre ProncheryEVP_get_cipherbyname() will return NULL for algorithms such as "AES-128-SIV",
448b077aed3SPierre Pronchery"AES-128-CBC-CTS" and "CAMELLIA-128-CBC-CTS" which were previously only
449b077aed3SPierre Proncheryaccessible via low level interfaces.
450b077aed3SPierre Pronchery
451b077aed3SPierre ProncheryThe EVP_get_cipherbyname() function is present for backwards compatibility with
452b077aed3SPierre ProncheryOpenSSL prior to version 3 and is different to the EVP_CIPHER_fetch() function
453b077aed3SPierre Proncherysince it does not attempt to "fetch" an implementation of the cipher.
454b077aed3SPierre ProncheryAdditionally, it only knows about ciphers that are built-in to OpenSSL and have
455b077aed3SPierre Proncheryan associated NID. Similarly EVP_get_cipherbynid() and EVP_get_cipherbyobj()
456b077aed3SPierre Proncheryalso return objects without an associated implementation.
457b077aed3SPierre Pronchery
458b077aed3SPierre ProncheryWhen the cipher objects returned by these functions are used (such as in a call
459b077aed3SPierre Proncheryto EVP_EncryptInit_ex()) an implementation of the cipher will be implicitly
460b077aed3SPierre Proncheryfetched from the loaded providers. This fetch could fail if no suitable
461b077aed3SPierre Proncheryimplementation is available. Use EVP_CIPHER_fetch() instead to explicitly fetch
462b077aed3SPierre Proncherythe algorithm and an associated implementation from a provider.
463b077aed3SPierre Pronchery
464b077aed3SPierre ProncherySee L<crypto(7)/ALGORITHM FETCHING> for more information about fetching.
465b077aed3SPierre Pronchery
466b077aed3SPierre ProncheryThe cipher objects returned from these functions do not need to be freed with
467b077aed3SPierre ProncheryEVP_CIPHER_free().
468b077aed3SPierre Pronchery
469b077aed3SPierre Pronchery=item EVP_CIPHER_get_nid() and EVP_CIPHER_CTX_get_nid()
470b077aed3SPierre Pronchery
471b077aed3SPierre ProncheryReturn the NID of a cipher when passed an B<EVP_CIPHER> or B<EVP_CIPHER_CTX>
472b077aed3SPierre Proncherystructure.  The actual NID value is an internal value which may not have a
473b077aed3SPierre Proncherycorresponding OBJECT IDENTIFIER.
474b077aed3SPierre Pronchery
475b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_set_flags(), EVP_CIPHER_CTX_clear_flags() and EVP_CIPHER_CTX_test_flags()
476b077aed3SPierre Pronchery
477b077aed3SPierre ProncherySets, clears and tests I<ctx> flags.  See L</FLAGS> below for more information.
478b077aed3SPierre Pronchery
479b077aed3SPierre ProncheryFor provided ciphers EVP_CIPHER_CTX_set_flags() should be called only after the
480b077aed3SPierre Proncheryfetched cipher has been assigned to the I<ctx>. It is recommended to use
481b077aed3SPierre ProncheryL</PARAMETERS> instead.
482b077aed3SPierre Pronchery
483b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_set_padding()
484b077aed3SPierre Pronchery
485b077aed3SPierre ProncheryEnables or disables padding. This function should be called after the context
486b077aed3SPierre Proncheryis set up for encryption or decryption with EVP_EncryptInit_ex2(),
487b077aed3SPierre ProncheryEVP_DecryptInit_ex2() or EVP_CipherInit_ex2(). By default encryption operations
488b077aed3SPierre Proncheryare padded using standard block padding and the padding is checked and removed
489b077aed3SPierre Proncherywhen decrypting. If the I<pad> parameter is zero then no padding is
490e71b7053SJung-uk Kimperformed, the total amount of data encrypted or decrypted must then
491e71b7053SJung-uk Kimbe a multiple of the block size or an error will occur.
492e71b7053SJung-uk Kim
493b077aed3SPierre Pronchery=item EVP_CIPHER_get_key_length() and EVP_CIPHER_CTX_get_key_length()
494e71b7053SJung-uk Kim
495b077aed3SPierre ProncheryReturn the key length of a cipher when passed an B<EVP_CIPHER> or
496b077aed3SPierre ProncheryB<EVP_CIPHER_CTX> structure. The constant B<EVP_MAX_KEY_LENGTH> is the maximum
497b077aed3SPierre Proncherykey length for all ciphers. Note: although EVP_CIPHER_get_key_length() is fixed for
498b077aed3SPierre Proncherya given cipher, the value of EVP_CIPHER_CTX_get_key_length() may be different for
499b077aed3SPierre Proncheryvariable key length ciphers.
500b077aed3SPierre Pronchery
501b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_set_key_length()
502b077aed3SPierre Pronchery
503b077aed3SPierre ProncherySets the key length of the cipher context.
504e71b7053SJung-uk KimIf the cipher is a fixed length cipher then attempting to set the key
505e71b7053SJung-uk Kimlength to any value other than the fixed value is an error.
506e71b7053SJung-uk Kim
507b077aed3SPierre Pronchery=item EVP_CIPHER_get_iv_length() and EVP_CIPHER_CTX_get_iv_length()
508e71b7053SJung-uk Kim
509b077aed3SPierre ProncheryReturn the IV length of a cipher when passed an B<EVP_CIPHER> or
510b077aed3SPierre ProncheryB<EVP_CIPHER_CTX>. It will return zero if the cipher does not use an IV.
511b077aed3SPierre ProncheryThe constant B<EVP_MAX_IV_LENGTH> is the maximum IV length for all ciphers.
512e71b7053SJung-uk Kim
513b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_get_tag_length()
514b077aed3SPierre Pronchery
515b077aed3SPierre ProncheryReturns the tag length of an AEAD cipher when passed a B<EVP_CIPHER_CTX>. It will
516b077aed3SPierre Proncheryreturn zero if the cipher does not support a tag. It returns a default value if
517b077aed3SPierre Proncherythe tag length has not been set.
518b077aed3SPierre Pronchery
519b077aed3SPierre Pronchery=item EVP_CIPHER_get_block_size() and EVP_CIPHER_CTX_get_block_size()
520b077aed3SPierre Pronchery
521b077aed3SPierre ProncheryReturn the block size of a cipher when passed an B<EVP_CIPHER> or
522b077aed3SPierre ProncheryB<EVP_CIPHER_CTX> structure. The constant B<EVP_MAX_BLOCK_LENGTH> is also the
523b077aed3SPierre Proncherymaximum block length for all ciphers.
524b077aed3SPierre Pronchery
525b077aed3SPierre Pronchery=item EVP_CIPHER_get_type() and EVP_CIPHER_CTX_get_type()
526b077aed3SPierre Pronchery
527b077aed3SPierre ProncheryReturn the type of the passed cipher or context. This "type" is the actual NID
528b077aed3SPierre Proncheryof the cipher OBJECT IDENTIFIER and as such it ignores the cipher parameters
529b077aed3SPierre Pronchery(40 bit RC2 and 128 bit RC2 have the same NID). If the cipher does not have an
530b077aed3SPierre Proncheryobject identifier or does not have ASN1 support this function will return
531e71b7053SJung-uk KimB<NID_undef>.
532e71b7053SJung-uk Kim
533b077aed3SPierre Pronchery=item EVP_CIPHER_is_a()
534e71b7053SJung-uk Kim
535b077aed3SPierre ProncheryReturns 1 if I<cipher> is an implementation of an algorithm that's identifiable
536b077aed3SPierre Proncherywith I<name>, otherwise 0. If I<cipher> is a legacy cipher (it's the return
537b077aed3SPierre Proncheryvalue from the likes of EVP_aes128() rather than the result of an
538b077aed3SPierre ProncheryEVP_CIPHER_fetch()), only cipher names registered with the default library
539b077aed3SPierre Proncherycontext (see L<OSSL_LIB_CTX(3)>) will be considered.
540b077aed3SPierre Pronchery
541b077aed3SPierre Pronchery=item EVP_CIPHER_get0_name() and EVP_CIPHER_CTX_get0_name()
542b077aed3SPierre Pronchery
543b077aed3SPierre ProncheryReturn the name of the passed cipher or context.  For fetched ciphers with
544b077aed3SPierre Proncherymultiple names, only one of them is returned. See also EVP_CIPHER_names_do_all().
545b077aed3SPierre Pronchery
546b077aed3SPierre Pronchery=item EVP_CIPHER_names_do_all()
547b077aed3SPierre Pronchery
548b077aed3SPierre ProncheryTraverses all names for the I<cipher>, and calls I<fn> with each name and
549b077aed3SPierre ProncheryI<data>.  This is only useful with fetched B<EVP_CIPHER>s.
550b077aed3SPierre Pronchery
551b077aed3SPierre Pronchery=item EVP_CIPHER_get0_description()
552b077aed3SPierre Pronchery
553b077aed3SPierre ProncheryReturns a description of the cipher, meant for display and human consumption.
554b077aed3SPierre ProncheryThe description is at the discretion of the cipher implementation.
555b077aed3SPierre Pronchery
556b077aed3SPierre Pronchery=item EVP_CIPHER_get0_provider()
557b077aed3SPierre Pronchery
558b077aed3SPierre ProncheryReturns an B<OSSL_PROVIDER> pointer to the provider that implements the given
559b077aed3SPierre ProncheryB<EVP_CIPHER>.
560b077aed3SPierre Pronchery
561b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_get0_cipher()
562b077aed3SPierre Pronchery
563b077aed3SPierre ProncheryReturns the B<EVP_CIPHER> structure when passed an B<EVP_CIPHER_CTX> structure.
564b077aed3SPierre ProncheryEVP_CIPHER_CTX_get1_cipher() is the same except the ownership is passed to
565b077aed3SPierre Proncherythe caller.
566b077aed3SPierre Pronchery
567b077aed3SPierre Pronchery=item EVP_CIPHER_get_mode() and EVP_CIPHER_CTX_get_mode()
568b077aed3SPierre Pronchery
569b077aed3SPierre ProncheryReturn the block cipher mode:
570e71b7053SJung-uk KimEVP_CIPH_ECB_MODE, EVP_CIPH_CBC_MODE, EVP_CIPH_CFB_MODE, EVP_CIPH_OFB_MODE,
571e71b7053SJung-uk KimEVP_CIPH_CTR_MODE, EVP_CIPH_GCM_MODE, EVP_CIPH_CCM_MODE, EVP_CIPH_XTS_MODE,
572b077aed3SPierre ProncheryEVP_CIPH_WRAP_MODE, EVP_CIPH_OCB_MODE or EVP_CIPH_SIV_MODE.
573b077aed3SPierre ProncheryIf the cipher is a stream cipher then EVP_CIPH_STREAM_CIPHER is returned.
574e71b7053SJung-uk Kim
575b077aed3SPierre Pronchery=item EVP_CIPHER_get_flags()
576e71b7053SJung-uk Kim
577b077aed3SPierre ProncheryReturns any flags associated with the cipher. See L</FLAGS>
578b077aed3SPierre Proncheryfor a list of currently defined flags.
579b077aed3SPierre Pronchery
580b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_get_num() and EVP_CIPHER_CTX_set_num()
581b077aed3SPierre Pronchery
582b077aed3SPierre ProncheryGets or sets the cipher specific "num" parameter for the associated I<ctx>.
583b077aed3SPierre ProncheryBuilt-in ciphers typically use this to track how much of the current underlying block
584b077aed3SPierre Proncheryhas been "used" already.
585b077aed3SPierre Pronchery
586b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_is_encrypting()
587b077aed3SPierre Pronchery
588b077aed3SPierre ProncheryReports whether the I<ctx> is being used for encryption or decryption.
589b077aed3SPierre Pronchery
590b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_flags()
591b077aed3SPierre Pronchery
592b077aed3SPierre ProncheryA deprecated macro calling C<EVP_CIPHER_get_flags(EVP_CIPHER_CTX_get0_cipher(ctx))>.
593b077aed3SPierre ProncheryDo not use.
594b077aed3SPierre Pronchery
595b077aed3SPierre Pronchery=item EVP_CIPHER_param_to_asn1()
596b077aed3SPierre Pronchery
597b077aed3SPierre ProncherySets the AlgorithmIdentifier "parameter" based on the passed cipher. This will
598b077aed3SPierre Proncherytypically include any parameters and an IV. The cipher IV (if any) must be set
599b077aed3SPierre Proncherywhen this call is made. This call should be made before the cipher is actually
600b077aed3SPierre Pronchery"used" (before any EVP_EncryptUpdate(), EVP_DecryptUpdate() calls for example).
601b077aed3SPierre ProncheryThis function may fail if the cipher does not have any ASN1 support.
602b077aed3SPierre Pronchery
603b077aed3SPierre Pronchery=item EVP_CIPHER_asn1_to_param()
604b077aed3SPierre Pronchery
605b077aed3SPierre ProncherySets the cipher parameters based on an ASN1 AlgorithmIdentifier "parameter".
606b077aed3SPierre ProncheryThe precise effect depends on the cipher. In the case of B<RC2>, for example,
607b077aed3SPierre Proncheryit will set the IV and effective key length.
608e71b7053SJung-uk KimThis function should be called after the base cipher type is set but before
609e71b7053SJung-uk Kimthe key is set. For example EVP_CipherInit() will be called with the IV and
610e71b7053SJung-uk Kimkey set to NULL, EVP_CIPHER_asn1_to_param() will be called and finally
611e71b7053SJung-uk KimEVP_CipherInit() again with all parameters except the key set to NULL. It is
612e71b7053SJung-uk Kimpossible for this function to fail if the cipher does not have any ASN1 support
613e71b7053SJung-uk Kimor the parameters cannot be set (for example the RC2 effective key length
614e71b7053SJung-uk Kimis not supported.
615e71b7053SJung-uk Kim
616b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_rand_key()
617e71b7053SJung-uk Kim
618b077aed3SPierre ProncheryGenerates a random key of the appropriate length based on the cipher context.
619b077aed3SPierre ProncheryThe B<EVP_CIPHER> can provide its own random key generation routine to support
620b077aed3SPierre Proncherykeys of a specific form. I<key> must point to a buffer at least as big as the
621b077aed3SPierre Proncheryvalue returned by EVP_CIPHER_CTX_get_key_length().
622b077aed3SPierre Pronchery
623b077aed3SPierre Pronchery=item EVP_CIPHER_do_all_provided()
624b077aed3SPierre Pronchery
625b077aed3SPierre ProncheryTraverses all ciphers implemented by all activated providers in the given
626b077aed3SPierre Proncherylibrary context I<libctx>, and for each of the implementations, calls the given
627b077aed3SPierre Proncheryfunction I<fn> with the implementation method and the given I<arg> as argument.
628b077aed3SPierre Pronchery
629b077aed3SPierre Pronchery=back
630b077aed3SPierre Pronchery
631b077aed3SPierre Pronchery=head1 PARAMETERS
632b077aed3SPierre Pronchery
633b077aed3SPierre ProncherySee L<OSSL_PARAM(3)> for information about passing parameters.
634b077aed3SPierre Pronchery
635b077aed3SPierre Pronchery=head2 Gettable EVP_CIPHER parameters
636b077aed3SPierre Pronchery
637b077aed3SPierre ProncheryWhen EVP_CIPHER_fetch() is called it internally calls EVP_CIPHER_get_params()
638b077aed3SPierre Proncheryand caches the results.
639b077aed3SPierre Pronchery
640b077aed3SPierre ProncheryEVP_CIPHER_get_params() can be used with the following L<OSSL_PARAM(3)> keys:
641b077aed3SPierre Pronchery
642b077aed3SPierre Pronchery=over 4
643b077aed3SPierre Pronchery
644b077aed3SPierre Pronchery=item "mode" (B<OSSL_CIPHER_PARAM_MODE>) <unsigned integer>
645b077aed3SPierre Pronchery
646b077aed3SPierre ProncheryGets the mode for the associated cipher algorithm I<cipher>.
647b077aed3SPierre ProncherySee L</EVP_CIPHER_get_mode() and EVP_CIPHER_CTX_get_mode()> for a list of valid modes.
648b077aed3SPierre ProncheryUse EVP_CIPHER_get_mode() to retrieve the cached value.
649b077aed3SPierre Pronchery
650b077aed3SPierre Pronchery=item "keylen" (B<OSSL_CIPHER_PARAM_KEYLEN>) <unsigned integer>
651b077aed3SPierre Pronchery
652b077aed3SPierre ProncheryGets the key length for the associated cipher algorithm I<cipher>.
653b077aed3SPierre ProncheryUse EVP_CIPHER_get_key_length() to retrieve the cached value.
654b077aed3SPierre Pronchery
655b077aed3SPierre Pronchery=item "ivlen" (B<OSSL_CIPHER_PARAM_IVLEN>) <unsigned integer>
656b077aed3SPierre Pronchery
657b077aed3SPierre ProncheryGets the IV length for the associated cipher algorithm I<cipher>.
658b077aed3SPierre ProncheryUse EVP_CIPHER_get_iv_length() to retrieve the cached value.
659b077aed3SPierre Pronchery
660b077aed3SPierre Pronchery=item "blocksize" (B<OSSL_CIPHER_PARAM_BLOCK_SIZE>) <unsigned integer>
661b077aed3SPierre Pronchery
662b077aed3SPierre ProncheryGets the block size for the associated cipher algorithm I<cipher>.
663b077aed3SPierre ProncheryThe block size should be 1 for stream ciphers.
664b077aed3SPierre ProncheryNote that the block size for a cipher may be different to the block size for
665b077aed3SPierre Proncherythe underlying encryption/decryption primitive.
666b077aed3SPierre ProncheryFor example AES in CTR mode has a block size of 1 (because it operates like a
667b077aed3SPierre Proncherystream cipher), even though AES has a block size of 16.
668*aa795734SPierre ProncheryUse EVP_CIPHER_get_block_size() to retrieve the cached value.
669b077aed3SPierre Pronchery
670b077aed3SPierre Pronchery=item "aead" (B<OSSL_CIPHER_PARAM_AEAD>) <integer>
671b077aed3SPierre Pronchery
672b077aed3SPierre ProncheryGets 1 if this is an AEAD cipher algorithm, otherwise it gets 0.
673b077aed3SPierre ProncheryUse (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER) to retrieve the
674b077aed3SPierre Proncherycached value.
675b077aed3SPierre Pronchery
676b077aed3SPierre Pronchery=item "custom-iv" (B<OSSL_CIPHER_PARAM_CUSTOM_IV>) <integer>
677b077aed3SPierre Pronchery
678b077aed3SPierre ProncheryGets 1 if the cipher algorithm I<cipher> has a custom IV, otherwise it gets 0.
679b077aed3SPierre ProncheryStoring and initializing the IV is left entirely to the implementation, if a
680b077aed3SPierre Proncherycustom IV is used.
681b077aed3SPierre ProncheryUse (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_CUSTOM_IV) to retrieve the
682b077aed3SPierre Proncherycached value.
683b077aed3SPierre Pronchery
684b077aed3SPierre Pronchery=item "cts" (B<OSSL_CIPHER_PARAM_CTS>) <integer>
685b077aed3SPierre Pronchery
686b077aed3SPierre ProncheryGets 1 if the cipher algorithm I<cipher> uses ciphertext stealing,
687b077aed3SPierre Proncheryotherwise it gets 0.
688b077aed3SPierre ProncheryThis is currently used to indicate that the cipher is a one shot that only
689b077aed3SPierre Proncheryallows a single call to EVP_CipherUpdate().
690b077aed3SPierre ProncheryUse (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_CTS) to retrieve the
691b077aed3SPierre Proncherycached value.
692b077aed3SPierre Pronchery
693b077aed3SPierre Pronchery=item "tls-multi" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK>) <integer>
694b077aed3SPierre Pronchery
695b077aed3SPierre ProncheryGets 1 if the cipher algorithm I<cipher> supports interleaving of crypto blocks,
696b077aed3SPierre Proncheryotherwise it gets 0. The interleaving is an optimization only applicable to certain
697b077aed3SPierre ProncheryTLS ciphers.
698b077aed3SPierre ProncheryUse (EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK) to retrieve the
699b077aed3SPierre Proncherycached value.
700b077aed3SPierre Pronchery
701b077aed3SPierre Pronchery=item "has-randkey" (B<OSSL_CIPHER_PARAM_HAS_RANDKEY>) <integer>
702b077aed3SPierre Pronchery
703b077aed3SPierre ProncheryGets 1 if the cipher algorithm I<cipher> supports the gettable EVP_CIPHER_CTX
704b077aed3SPierre Proncheryparameter B<OSSL_CIPHER_PARAM_RANDOM_KEY>. Only DES and 3DES set this to 1,
705b077aed3SPierre Proncheryall other OpenSSL ciphers return 0.
706b077aed3SPierre Pronchery
707b077aed3SPierre Pronchery=back
708b077aed3SPierre Pronchery
709b077aed3SPierre Pronchery=head2 Gettable and Settable EVP_CIPHER_CTX parameters
710b077aed3SPierre Pronchery
711b077aed3SPierre ProncheryThe following L<OSSL_PARAM(3)> keys can be used with both EVP_CIPHER_CTX_get_params()
712b077aed3SPierre Proncheryand EVP_CIPHER_CTX_set_params().
713b077aed3SPierre Pronchery
714b077aed3SPierre Pronchery=over 4
715b077aed3SPierre Pronchery
716b077aed3SPierre Pronchery=item "padding" (B<OSSL_CIPHER_PARAM_PADDING>) <unsigned integer>
717b077aed3SPierre Pronchery
718b077aed3SPierre ProncheryGets or sets the padding mode for the cipher context I<ctx>.
719b077aed3SPierre ProncheryPadding is enabled if the value is 1, and disabled if the value is 0.
720b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_set_padding().
721b077aed3SPierre Pronchery
722b077aed3SPierre Pronchery=item "num" (B<OSSL_CIPHER_PARAM_NUM>) <unsigned integer>
723b077aed3SPierre Pronchery
724b077aed3SPierre ProncheryGets or sets the cipher specific "num" parameter for the cipher context I<ctx>.
725b077aed3SPierre ProncheryBuilt-in ciphers typically use this to track how much of the current underlying
726b077aed3SPierre Proncheryblock has been "used" already.
727b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_num() and EVP_CIPHER_CTX_set_num().
728b077aed3SPierre Pronchery
729b077aed3SPierre Pronchery=item "keylen" (B<OSSL_CIPHER_PARAM_KEYLEN>) <unsigned integer>
730b077aed3SPierre Pronchery
731b077aed3SPierre ProncheryGets or sets the key length for the cipher context I<ctx>.
732b077aed3SPierre ProncheryThe length of the "keylen" parameter should not exceed that of a B<size_t>.
733b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_key_length() and EVP_CIPHER_CTX_set_key_length().
734b077aed3SPierre Pronchery
735b077aed3SPierre Pronchery=item "tag" (B<OSSL_CIPHER_PARAM_AEAD_TAG>) <octet string>
736b077aed3SPierre Pronchery
737b077aed3SPierre ProncheryGets or sets the AEAD tag for the associated cipher context I<ctx>.
738b077aed3SPierre ProncherySee L<EVP_EncryptInit(3)/AEAD Interface>.
739b077aed3SPierre Pronchery
740b077aed3SPierre Pronchery=item "keybits" (B<OSSL_CIPHER_PARAM_RC2_KEYBITS>) <unsigned integer>
741b077aed3SPierre Pronchery
742b077aed3SPierre ProncheryGets or sets the effective keybits used for a RC2 cipher.
743b077aed3SPierre ProncheryThe length of the "keybits" parameter should not exceed that of a B<size_t>.
744b077aed3SPierre Pronchery
745b077aed3SPierre Pronchery=item "rounds" (B<OSSL_CIPHER_PARAM_ROUNDS>) <unsigned integer>
746b077aed3SPierre Pronchery
747b077aed3SPierre ProncheryGets or sets the number of rounds to be used for a cipher.
748b077aed3SPierre ProncheryThis is used by the RC5 cipher.
749b077aed3SPierre Pronchery
750b077aed3SPierre Pronchery=item "alg_id_param" (B<OSSL_CIPHER_PARAM_ALGORITHM_ID_PARAMS>) <octet string>
751b077aed3SPierre Pronchery
752b077aed3SPierre ProncheryUsed to pass the DER encoded AlgorithmIdentifier parameter to or from
753b077aed3SPierre Proncherythe cipher implementation.  Functions like L<EVP_CIPHER_param_to_asn1(3)>
754b077aed3SPierre Proncheryand L<EVP_CIPHER_asn1_to_param(3)> use this parameter for any implementation
755b077aed3SPierre Proncherythat has the flag B<EVP_CIPH_FLAG_CUSTOM_ASN1> set.
756b077aed3SPierre Pronchery
757b077aed3SPierre Pronchery=item "cts_mode" (B<OSSL_CIPHER_PARAM_CTS_MODE>) <UTF8 string>
758b077aed3SPierre Pronchery
759b077aed3SPierre ProncheryGets or sets the cipher text stealing mode. For all modes the output size is the
760b077aed3SPierre Proncherysame as the input size. The input length must be greater than or equal to the
761b077aed3SPierre Proncheryblock size. (The block size for AES and CAMELLIA is 16 bytes).
762b077aed3SPierre Pronchery
763b077aed3SPierre ProncheryValid values for the mode are:
764b077aed3SPierre Pronchery
765b077aed3SPierre Pronchery=over 4
766b077aed3SPierre Pronchery
767b077aed3SPierre Pronchery=item "CS1"
768b077aed3SPierre Pronchery
769b077aed3SPierre ProncheryThe NIST variant of cipher text stealing.
770b077aed3SPierre ProncheryFor input lengths that are multiples of the block size it is equivalent to
771b077aed3SPierre Proncheryusing a "AES-XXX-CBC" or "CAMELLIA-XXX-CBC" cipher otherwise the second last
772b077aed3SPierre Proncherycipher text block is a partial block.
773b077aed3SPierre Pronchery
774b077aed3SPierre Pronchery=item "CS2"
775b077aed3SPierre Pronchery
776b077aed3SPierre ProncheryFor input lengths that are multiples of the block size it is equivalent to
777b077aed3SPierre Proncheryusing a "AES-XXX-CBC" or "CAMELLIA-XXX-CBC" cipher, otherwise it is the same as
778b077aed3SPierre Pronchery"CS3" mode.
779b077aed3SPierre Pronchery
780b077aed3SPierre Pronchery=item "CS3"
781b077aed3SPierre Pronchery
782b077aed3SPierre ProncheryThe Kerberos5 variant of cipher text stealing which always swaps the last
783b077aed3SPierre Proncherycipher text block with the previous block (which may be a partial or full block
784b077aed3SPierre Proncherydepending on the input length). If the input length is exactly one full block
785b077aed3SPierre Proncherythen this is equivalent to using a "AES-XXX-CBC" or "CAMELLIA-XXX-CBC" cipher.
786b077aed3SPierre Pronchery
787b077aed3SPierre Pronchery=back
788b077aed3SPierre Pronchery
789b077aed3SPierre ProncheryThe default is "CS1".
790b077aed3SPierre ProncheryThis is only supported for "AES-128-CBC-CTS", "AES-192-CBC-CTS", "AES-256-CBC-CTS",
791b077aed3SPierre Pronchery"CAMELLIA-128-CBC-CTS", "CAMELLIA-192-CBC-CTS" and "CAMELLIA-256-CBC-CTS".
792b077aed3SPierre Pronchery
793b077aed3SPierre Pronchery=item "tls1multi_interleave" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE>) <unsigned integer>
794b077aed3SPierre Pronchery
795b077aed3SPierre ProncherySets or gets the number of records being sent in one go for a tls1 multiblock
796b077aed3SPierre Proncherycipher operation (either 4 or 8 records).
797b077aed3SPierre Pronchery
798b077aed3SPierre Pronchery=back
799b077aed3SPierre Pronchery
800b077aed3SPierre Pronchery=head2 Gettable EVP_CIPHER_CTX parameters
801b077aed3SPierre Pronchery
802b077aed3SPierre ProncheryThe following L<OSSL_PARAM(3)> keys can be used with EVP_CIPHER_CTX_get_params():
803b077aed3SPierre Pronchery
804b077aed3SPierre Pronchery=over 4
805b077aed3SPierre Pronchery
806b077aed3SPierre Pronchery=item "ivlen" (B<OSSL_CIPHER_PARAM_IVLEN> and <B<OSSL_CIPHER_PARAM_AEAD_IVLEN>) <unsigned integer>
807b077aed3SPierre Pronchery
808b077aed3SPierre ProncheryGets the IV length for the cipher context I<ctx>.
809b077aed3SPierre ProncheryThe length of the "ivlen" parameter should not exceed that of a B<size_t>.
810b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_iv_length().
811b077aed3SPierre Pronchery
812b077aed3SPierre Pronchery=item "iv" (B<OSSL_CIPHER_PARAM_IV>) <octet string OR octet ptr>
813b077aed3SPierre Pronchery
814b077aed3SPierre ProncheryGets the IV used to initialize the associated cipher context I<ctx>.
815b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_original_iv().
816b077aed3SPierre Pronchery
817b077aed3SPierre Pronchery=item "updated-iv" (B<OSSL_CIPHER_PARAM_UPDATED_IV>) <octet string OR octet ptr>
818b077aed3SPierre Pronchery
819b077aed3SPierre ProncheryGets the updated pseudo-IV state for the associated cipher context, e.g.,
820b077aed3SPierre Proncherythe previous ciphertext block for CBC mode or the iteratively encrypted IV
821b077aed3SPierre Proncheryvalue for OFB mode.  Note that octet pointer access is deprecated and is
822b077aed3SPierre Proncheryprovided only for backwards compatibility with historical libcrypto APIs.
823b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_updated_iv().
824b077aed3SPierre Pronchery
825b077aed3SPierre Pronchery=item "randkey" (B<OSSL_CIPHER_PARAM_RANDOM_KEY>) <octet string>
826b077aed3SPierre Pronchery
827b077aed3SPierre ProncheryGets an implementation specific randomly generated key for the associated
828b077aed3SPierre Proncherycipher context I<ctx>. This is currently only supported by DES and 3DES (which set
829b077aed3SPierre Proncherythe key to odd parity).
830b077aed3SPierre Pronchery
831b077aed3SPierre Pronchery=item "taglen" (B<OSSL_CIPHER_PARAM_AEAD_TAGLEN>) <unsigned integer>
832b077aed3SPierre Pronchery
833b077aed3SPierre ProncheryGets the tag length to be used for an AEAD cipher for the associated cipher
834b077aed3SPierre Proncherycontext I<ctx>. It gets a default value if it has not been set.
835b077aed3SPierre ProncheryThe length of the "taglen" parameter should not exceed that of a B<size_t>.
836b077aed3SPierre ProncherySee also EVP_CIPHER_CTX_get_tag_length().
837b077aed3SPierre Pronchery
838b077aed3SPierre Pronchery=item "tlsaadpad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD>) <unsigned integer>
839b077aed3SPierre Pronchery
840b077aed3SPierre ProncheryGets the length of the tag that will be added to a TLS record for the AEAD
841b077aed3SPierre Proncherytag for the associated cipher context I<ctx>.
842b077aed3SPierre ProncheryThe length of the "tlsaadpad" parameter should not exceed that of a B<size_t>.
843b077aed3SPierre Pronchery
844b077aed3SPierre Pronchery=item "tlsivgen" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN>) <octet string>
845b077aed3SPierre Pronchery
846b077aed3SPierre ProncheryGets the invocation field generated for encryption.
847b077aed3SPierre ProncheryCan only be called after "tlsivfixed" is set.
848b077aed3SPierre ProncheryThis is only used for GCM mode.
849b077aed3SPierre Pronchery
850b077aed3SPierre Pronchery=item "tls1multi_enclen" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN>) <unsigned integer>
851b077aed3SPierre Pronchery
852b077aed3SPierre ProncheryGet the total length of the record returned from the "tls1multi_enc" operation.
853b077aed3SPierre Pronchery
854b077aed3SPierre Pronchery=item "tls1multi_maxbufsz" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE>) <unsigned integer>
855b077aed3SPierre Pronchery
856b077aed3SPierre ProncheryGets the maximum record length for a TLS1 multiblock cipher operation.
857b077aed3SPierre ProncheryThe length of the "tls1multi_maxbufsz" parameter should not exceed that of a B<size_t>.
858b077aed3SPierre Pronchery
859b077aed3SPierre Pronchery=item "tls1multi_aadpacklen" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN>) <unsigned integer>
860b077aed3SPierre Pronchery
861b077aed3SPierre ProncheryGets the result of running the "tls1multi_aad" operation.
862b077aed3SPierre Pronchery
863b077aed3SPierre Pronchery=item "tls-mac" (B<OSSL_CIPHER_PARAM_TLS_MAC>) <octet ptr>
864b077aed3SPierre Pronchery
865b077aed3SPierre ProncheryUsed to pass the TLS MAC data.
866b077aed3SPierre Pronchery
867b077aed3SPierre Pronchery=back
868b077aed3SPierre Pronchery
869b077aed3SPierre Pronchery=head2 Settable EVP_CIPHER_CTX parameters
870b077aed3SPierre Pronchery
871b077aed3SPierre ProncheryThe following L<OSSL_PARAM(3)> keys can be used with EVP_CIPHER_CTX_set_params():
872b077aed3SPierre Pronchery
873b077aed3SPierre Pronchery=over 4
874b077aed3SPierre Pronchery
875b077aed3SPierre Pronchery=item "mackey" (B<OSSL_CIPHER_PARAM_AEAD_MAC_KEY>) <octet string>
876b077aed3SPierre Pronchery
877b077aed3SPierre ProncherySets the MAC key used by composite AEAD ciphers such as AES-CBC-HMAC-SHA256.
878b077aed3SPierre Pronchery
879b077aed3SPierre Pronchery=item "speed" (B<OSSL_CIPHER_PARAM_SPEED>) <unsigned integer>
880b077aed3SPierre Pronchery
881b077aed3SPierre ProncherySets the speed option for the associated cipher context. This is only supported
882b077aed3SPierre Proncheryby AES SIV ciphers which disallow multiple operations by default.
883b077aed3SPierre ProncherySetting "speed" to 1 allows another encrypt or decrypt operation to be
884b077aed3SPierre Proncheryperformed. This is used for performance testing.
885b077aed3SPierre Pronchery
886b077aed3SPierre Pronchery=item "use-bits" (B<OSSL_CIPHER_PARAM_USE_BITS>) <unsigned integer>
887b077aed3SPierre Pronchery
888b077aed3SPierre ProncheryDetermines if the input length I<inl> passed to EVP_EncryptUpdate(),
889b077aed3SPierre ProncheryEVP_DecryptUpdate() and EVP_CipherUpdate() is the number of bits or number of bytes.
890b077aed3SPierre ProncherySetting "use-bits" to 1 uses bits. The default is in bytes.
891b077aed3SPierre ProncheryThis is only used for B<CFB1> ciphers.
892b077aed3SPierre Pronchery
893b077aed3SPierre ProncheryThis can be set using EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS).
894b077aed3SPierre Pronchery
895b077aed3SPierre Pronchery=item "tls-version" (B<OSSL_CIPHER_PARAM_TLS_VERSION>) <integer>
896b077aed3SPierre Pronchery
897b077aed3SPierre ProncherySets the TLS version.
898b077aed3SPierre Pronchery
899b077aed3SPierre Pronchery=item "tls-mac-size" (B<OSSL_CIPHER_PARAM_TLS_MAC_SIZE>) <unsigned integer>
900b077aed3SPierre Pronchery
901b077aed3SPierre ProncherySet the TLS MAC size.
902b077aed3SPierre Pronchery
903b077aed3SPierre Pronchery=item "tlsaad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD>) <octet string>
904b077aed3SPierre Pronchery
905b077aed3SPierre ProncherySets TLSv1.2 AAD information for the associated cipher context I<ctx>.
906b077aed3SPierre ProncheryTLSv1.2 AAD information is always 13 bytes in length and is as defined for the
907b077aed3SPierre Pronchery"additional_data" field described in section 6.2.3.3 of RFC5246.
908b077aed3SPierre Pronchery
909b077aed3SPierre Pronchery=item "tlsivfixed" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED>) <octet string>
910b077aed3SPierre Pronchery
911b077aed3SPierre ProncherySets the fixed portion of an IV for an AEAD cipher used in a TLS record
912b077aed3SPierre Proncheryencryption/ decryption for the associated cipher context.
913b077aed3SPierre ProncheryTLS record encryption/decryption always occurs "in place" so that the input and
914b077aed3SPierre Proncheryoutput buffers are always the same memory location.
915b077aed3SPierre ProncheryAEAD IVs in TLSv1.2 consist of an implicit "fixed" part and an explicit part
916b077aed3SPierre Proncherythat varies with every record.
917b077aed3SPierre ProncherySetting a TLS fixed IV changes a cipher to encrypt/decrypt TLS records.
918b077aed3SPierre ProncheryTLS records are encrypted/decrypted using a single OSSL_FUNC_cipher_cipher call per
919b077aed3SPierre Proncheryrecord.
920b077aed3SPierre ProncheryFor a record decryption the first bytes of the input buffer will be the explicit
921b077aed3SPierre Proncherypart of the IV and the final bytes of the input buffer will be the AEAD tag.
922b077aed3SPierre ProncheryThe length of the explicit part of the IV and the tag length will depend on the
923b077aed3SPierre Proncherycipher in use and will be defined in the RFC for the relevant ciphersuite.
924b077aed3SPierre ProncheryIn order to allow for "in place" decryption the plaintext output should be
925b077aed3SPierre Proncherywritten to the same location in the output buffer that the ciphertext payload
926b077aed3SPierre Proncherywas read from, i.e. immediately after the explicit IV.
927b077aed3SPierre Pronchery
928b077aed3SPierre ProncheryWhen encrypting a record the first bytes of the input buffer should be empty to
929b077aed3SPierre Proncheryallow space for the explicit IV, as will the final bytes where the tag will
930b077aed3SPierre Proncherybe written.
931b077aed3SPierre ProncheryThe length of the input buffer will include the length of the explicit IV, the
932b077aed3SPierre Proncherypayload, and the tag bytes.
933b077aed3SPierre ProncheryThe cipher implementation should generate the explicit IV and write it to the
934b077aed3SPierre Proncherybeginning of the output buffer, do "in place" encryption of the payload and
935b077aed3SPierre Proncherywrite that to the output buffer, and finally add the tag onto the end of the
936b077aed3SPierre Proncheryoutput buffer.
937b077aed3SPierre Pronchery
938b077aed3SPierre ProncheryWhether encrypting or decrypting the value written to I<*outl> in the
939b077aed3SPierre ProncheryOSSL_FUNC_cipher_cipher call should be the length of the payload excluding the explicit
940b077aed3SPierre ProncheryIV length and the tag length.
941b077aed3SPierre Pronchery
942b077aed3SPierre Pronchery=item "tlsivinv" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV>) <octet string>
943b077aed3SPierre Pronchery
944b077aed3SPierre ProncherySets the invocation field used for decryption.
945b077aed3SPierre ProncheryCan only be called after "tlsivfixed" is set.
946b077aed3SPierre ProncheryThis is only used for GCM mode.
947b077aed3SPierre Pronchery
948b077aed3SPierre Pronchery=item "tls1multi_enc" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC>) <octet string>
949b077aed3SPierre Pronchery
950b077aed3SPierre ProncheryTriggers a multiblock TLS1 encrypt operation for a TLS1 aware cipher that
951b077aed3SPierre Proncherysupports sending 4 or 8 records in one go.
952b077aed3SPierre ProncheryThe cipher performs both the MAC and encrypt stages and constructs the record
953b077aed3SPierre Proncheryheaders itself.
954b077aed3SPierre Pronchery"tls1multi_enc" supplies the output buffer for the encrypt operation,
955b077aed3SPierre Pronchery"tls1multi_encin" & "tls1multi_interleave" must also be set in order to supply
956b077aed3SPierre Proncheryvalues to the encrypt operation.
957b077aed3SPierre Pronchery
958b077aed3SPierre Pronchery=item "tls1multi_encin" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN>) <octet string>
959b077aed3SPierre Pronchery
960b077aed3SPierre ProncherySupplies the data to encrypt for a TLS1 multiblock cipher operation.
961b077aed3SPierre Pronchery
962b077aed3SPierre Pronchery=item "tls1multi_maxsndfrag" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT>) <unsigned integer>
963b077aed3SPierre Pronchery
964b077aed3SPierre ProncherySets the maximum send fragment size for a TLS1 multiblock cipher operation.
965b077aed3SPierre ProncheryIt must be set before using "tls1multi_maxbufsz".
966b077aed3SPierre ProncheryThe length of the "tls1multi_maxsndfrag" parameter should not exceed that of a B<size_t>.
967b077aed3SPierre Pronchery
968b077aed3SPierre Pronchery=item "tls1multi_aad" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD>) <octet string>
969b077aed3SPierre Pronchery
970b077aed3SPierre ProncherySets the authenticated additional data used by a TLS1 multiblock cipher operation.
971b077aed3SPierre ProncheryThe supplied data consists of 13 bytes of record data containing:
972b077aed3SPierre ProncheryBytes 0-7: The sequence number of the first record
973b077aed3SPierre ProncheryByte 8: The record type
974b077aed3SPierre ProncheryByte 9-10: The protocol version
975b077aed3SPierre ProncheryByte 11-12: Input length (Always 0)
976b077aed3SPierre Pronchery
977b077aed3SPierre Pronchery"tls1multi_interleave" must also be set for this operation.
978b077aed3SPierre Pronchery
979b077aed3SPierre Pronchery=back
980b077aed3SPierre Pronchery
981b077aed3SPierre Pronchery=head1 CONTROLS
982b077aed3SPierre Pronchery
983b077aed3SPierre ProncheryThe Mappings from EVP_CIPHER_CTX_ctrl() identifiers to PARAMETERS are listed
984b077aed3SPierre Proncheryin the following section. See the L</PARAMETERS> section for more details.
985b077aed3SPierre Pronchery
986b077aed3SPierre ProncheryEVP_CIPHER_CTX_ctrl() can be used to send the following standard controls:
987b077aed3SPierre Pronchery
988b077aed3SPierre Pronchery=over 4
989b077aed3SPierre Pronchery
990b077aed3SPierre Pronchery=item EVP_CTRL_AEAD_SET_IVLEN and EVP_CTRL_GET_IVLEN
991b077aed3SPierre Pronchery
992b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() and
993b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params() get called with an L<OSSL_PARAM(3)> item with the
994b077aed3SPierre Proncherykey "ivlen" (B<OSSL_CIPHER_PARAM_IVLEN>).
995b077aed3SPierre Pronchery
996b077aed3SPierre Pronchery=item EVP_CTRL_AEAD_SET_IV_FIXED
997b077aed3SPierre Pronchery
998b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
999b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "tlsivfixed"
1000b077aed3SPierre Pronchery(B<OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED>).
1001b077aed3SPierre Pronchery
1002b077aed3SPierre Pronchery=item EVP_CTRL_AEAD_SET_MAC_KEY
1003b077aed3SPierre Pronchery
1004b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1005b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "mackey"
1006b077aed3SPierre Pronchery(B<OSSL_CIPHER_PARAM_AEAD_MAC_KEY>).
1007b077aed3SPierre Pronchery
1008b077aed3SPierre Pronchery=item EVP_CTRL_AEAD_SET_TAG and EVP_CTRL_AEAD_GET_TAG
1009b077aed3SPierre Pronchery
1010b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() and
1011b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params() get called with an L<OSSL_PARAM(3)> item with the
1012b077aed3SPierre Proncherykey "tag" (B<OSSL_CIPHER_PARAM_AEAD_TAG>).
1013b077aed3SPierre Pronchery
1014b077aed3SPierre Pronchery=item EVP_CTRL_CCM_SET_L
1015b077aed3SPierre Pronchery
1016b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1017b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "ivlen" (B<OSSL_CIPHER_PARAM_IVLEN>)
1018b077aed3SPierre Proncherywith a value of (15 - L)
1019b077aed3SPierre Pronchery
1020b077aed3SPierre Pronchery=item EVP_CTRL_COPY
1021b077aed3SPierre Pronchery
1022b077aed3SPierre ProncheryThere is no OSSL_PARAM mapping for this. Use EVP_CIPHER_CTX_copy() instead.
1023b077aed3SPierre Pronchery
1024b077aed3SPierre Pronchery=item EVP_CTRL_GCM_SET_IV_INV
1025b077aed3SPierre Pronchery
1026b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1027b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "tlsivinv"
1028b077aed3SPierre Pronchery(B<OSSL_CIPHER_PARAM_AEAD_TLS1_SET_IV_INV>).
1029b077aed3SPierre Pronchery
1030b077aed3SPierre Pronchery=item EVP_CTRL_RAND_KEY
1031b077aed3SPierre Pronchery
1032b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1033b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "randkey"
1034b077aed3SPierre Pronchery(B<OSSL_CIPHER_PARAM_RANDOM_KEY>).
1035b077aed3SPierre Pronchery
1036b077aed3SPierre Pronchery=item EVP_CTRL_SET_KEY_LENGTH
1037b077aed3SPierre Pronchery
1038b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1039b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "keylen" (B<OSSL_CIPHER_PARAM_KEYLEN>).
1040b077aed3SPierre Pronchery
1041b077aed3SPierre Pronchery=item EVP_CTRL_SET_RC2_KEY_BITS and EVP_CTRL_GET_RC2_KEY_BITS
1042b077aed3SPierre Pronchery
1043b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() and
1044b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params() get called with an L<OSSL_PARAM(3)> item with the
1045b077aed3SPierre Proncherykey "keybits" (B<OSSL_CIPHER_PARAM_RC2_KEYBITS>).
1046b077aed3SPierre Pronchery
1047b077aed3SPierre Pronchery=item EVP_CTRL_SET_RC5_ROUNDS and EVP_CTRL_GET_RC5_ROUNDS
1048b077aed3SPierre Pronchery
1049b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() and
1050b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params() get called with an L<OSSL_PARAM(3)> item with the
1051b077aed3SPierre Proncherykey "rounds" (B<OSSL_CIPHER_PARAM_ROUNDS>).
1052b077aed3SPierre Pronchery
1053b077aed3SPierre Pronchery=item EVP_CTRL_SET_SPEED
1054b077aed3SPierre Pronchery
1055b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1056b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key "speed" (B<OSSL_CIPHER_PARAM_SPEED>).
1057b077aed3SPierre Pronchery
1058b077aed3SPierre Pronchery=item EVP_CTRL_GCM_IV_GEN
1059b077aed3SPierre Pronchery
1060b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_get_params() gets called
1061b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key
1062b077aed3SPierre Pronchery"tlsivgen" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_GET_IV_GEN>).
1063b077aed3SPierre Pronchery
1064b077aed3SPierre Pronchery=item EVP_CTRL_AEAD_TLS1_AAD
1065b077aed3SPierre Pronchery
1066b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() get called
1067b077aed3SPierre Proncherywith an L<OSSL_PARAM(3)> item with the key
1068b077aed3SPierre Pronchery"tlsaad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD>)
1069b077aed3SPierre Proncheryfollowed by EVP_CIPHER_CTX_get_params() with a key of
1070b077aed3SPierre Pronchery"tlsaadpad" (B<OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD>).
1071b077aed3SPierre Pronchery
1072b077aed3SPierre Pronchery=item EVP_CTRL_TLS1_1_MULTIBLOCK_MAX_BUFSIZE
1073b077aed3SPierre Pronchery
1074b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>,
1075b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_params() gets called with an L<OSSL_PARAM(3)> item with the
1076b077aed3SPierre Proncherykey OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_SEND_FRAGMENT
1077b077aed3SPierre Proncheryfollowed by EVP_CIPHER_CTX_get_params() with a key of
1078b077aed3SPierre Pronchery"tls1multi_maxbufsz" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_MAX_BUFSIZE>).
1079b077aed3SPierre Pronchery
1080b077aed3SPierre Pronchery=item EVP_CTRL_TLS1_1_MULTIBLOCK_AAD
1081b077aed3SPierre Pronchery
1082b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1083b077aed3SPierre Proncherywith L<OSSL_PARAM(3)> items with the keys
1084b077aed3SPierre Pronchery"tls1multi_aad" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD>) and
1085b077aed3SPierre Pronchery"tls1multi_interleave" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE>)
1086b077aed3SPierre Proncheryfollowed by EVP_CIPHER_CTX_get_params() with keys of
1087b077aed3SPierre Pronchery"tls1multi_aadpacklen" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_AAD_PACKLEN>) and
1088b077aed3SPierre Pronchery"tls1multi_interleave" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE>).
1089b077aed3SPierre Pronchery
1090b077aed3SPierre Pronchery=item EVP_CTRL_TLS1_1_MULTIBLOCK_ENCRYPT
1091b077aed3SPierre Pronchery
1092b077aed3SPierre ProncheryWhen used with a fetched B<EVP_CIPHER>, EVP_CIPHER_CTX_set_params() gets called
1093b077aed3SPierre Proncherywith L<OSSL_PARAM(3)> items with the keys
1094b077aed3SPierre Pronchery"tls1multi_enc" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC>),
1095b077aed3SPierre Pronchery"tls1multi_encin" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_IN>) and
1096b077aed3SPierre Pronchery"tls1multi_interleave" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_INTERLEAVE>),
1097b077aed3SPierre Proncheryfollowed by EVP_CIPHER_CTX_get_params() with a key of
1098b077aed3SPierre Pronchery"tls1multi_enclen" (B<OSSL_CIPHER_PARAM_TLS1_MULTIBLOCK_ENC_LEN>).
1099b077aed3SPierre Pronchery
1100b077aed3SPierre Pronchery=back
1101b077aed3SPierre Pronchery
1102b077aed3SPierre Pronchery=head1 FLAGS
1103b077aed3SPierre Pronchery
1104b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_flags(), EVP_CIPHER_CTX_clear_flags() and EVP_CIPHER_CTX_test_flags().
1105b077aed3SPierre Proncherycan be used to manipulate and test these B<EVP_CIPHER_CTX> flags:
1106b077aed3SPierre Pronchery
1107b077aed3SPierre Pronchery=over 4
1108b077aed3SPierre Pronchery
1109b077aed3SPierre Pronchery=item EVP_CIPH_NO_PADDING
1110b077aed3SPierre Pronchery
1111b077aed3SPierre ProncheryUsed by EVP_CIPHER_CTX_set_padding().
1112b077aed3SPierre Pronchery
1113b077aed3SPierre ProncherySee also L</Gettable and Settable EVP_CIPHER_CTX parameters> "padding"
1114b077aed3SPierre Pronchery
1115b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_LENGTH_BITS
1116b077aed3SPierre Pronchery
1117b077aed3SPierre ProncherySee L</Settable EVP_CIPHER_CTX parameters> "use-bits".
1118b077aed3SPierre Pronchery
1119b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_FLAG_WRAP_ALLOW
1120b077aed3SPierre Pronchery
1121b077aed3SPierre ProncheryUsed for Legacy purposes only. This flag needed to be set to indicate the
1122b077aed3SPierre Proncherycipher handled wrapping.
1123b077aed3SPierre Pronchery
1124b077aed3SPierre Pronchery=back
1125b077aed3SPierre Pronchery
1126b077aed3SPierre ProncheryEVP_CIPHER_flags() uses the following flags that
1127b077aed3SPierre Proncheryhave mappings to L</Gettable EVP_CIPHER parameters>:
1128b077aed3SPierre Pronchery
1129b077aed3SPierre Pronchery=over 4
1130b077aed3SPierre Pronchery
1131b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_AEAD_CIPHER
1132b077aed3SPierre Pronchery
1133b077aed3SPierre ProncherySee L</Gettable EVP_CIPHER parameters> "aead".
1134b077aed3SPierre Pronchery
1135b077aed3SPierre Pronchery=item EVP_CIPH_CUSTOM_IV
1136b077aed3SPierre Pronchery
1137b077aed3SPierre ProncherySee L</Gettable EVP_CIPHER parameters> "custom-iv".
1138b077aed3SPierre Pronchery
1139b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_CTS
1140b077aed3SPierre Pronchery
1141b077aed3SPierre ProncherySee L</Gettable EVP_CIPHER parameters> "cts".
1142b077aed3SPierre Pronchery
1143b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_TLS1_1_MULTIBLOCK;
1144b077aed3SPierre Pronchery
1145b077aed3SPierre ProncherySee L</Gettable EVP_CIPHER parameters> "tls-multi".
1146b077aed3SPierre Pronchery
1147b077aed3SPierre Pronchery=item EVP_CIPH_RAND_KEY
1148b077aed3SPierre Pronchery
1149b077aed3SPierre ProncherySee L</Gettable EVP_CIPHER parameters> "has-randkey".
1150b077aed3SPierre Pronchery
1151b077aed3SPierre Pronchery=back
1152b077aed3SPierre Pronchery
1153b077aed3SPierre ProncheryEVP_CIPHER_flags() uses the following flags for legacy purposes only:
1154b077aed3SPierre Pronchery
1155b077aed3SPierre Pronchery=over 4
1156b077aed3SPierre Pronchery
1157b077aed3SPierre Pronchery=item EVP_CIPH_VARIABLE_LENGTH
1158b077aed3SPierre Pronchery
1159b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_CUSTOM_CIPHER
1160b077aed3SPierre Pronchery
1161b077aed3SPierre Pronchery=item EVP_CIPH_ALWAYS_CALL_INIT
1162b077aed3SPierre Pronchery
1163b077aed3SPierre Pronchery=item EVP_CIPH_CTRL_INIT
1164b077aed3SPierre Pronchery
1165b077aed3SPierre Pronchery=item EVP_CIPH_CUSTOM_KEY_LENGTH
1166b077aed3SPierre Pronchery
1167b077aed3SPierre Pronchery=item EVP_CIPH_CUSTOM_COPY
1168b077aed3SPierre Pronchery
1169b077aed3SPierre Pronchery=item EVP_CIPH_FLAG_DEFAULT_ASN1
1170b077aed3SPierre Pronchery
1171b077aed3SPierre ProncherySee L<EVP_CIPHER_meth_set_flags(3)> for further information related to the above
1172b077aed3SPierre Proncheryflags.
1173b077aed3SPierre Pronchery
1174b077aed3SPierre Pronchery=back
1175e71b7053SJung-uk Kim
1176e71b7053SJung-uk Kim=head1 RETURN VALUES
1177e71b7053SJung-uk Kim
1178b077aed3SPierre ProncheryEVP_CIPHER_fetch() returns a pointer to a B<EVP_CIPHER> for success
1179b077aed3SPierre Proncheryand B<NULL> for failure.
1180b077aed3SPierre Pronchery
1181b077aed3SPierre ProncheryEVP_CIPHER_up_ref() returns 1 for success or 0 otherwise.
1182b077aed3SPierre Pronchery
1183e71b7053SJung-uk KimEVP_CIPHER_CTX_new() returns a pointer to a newly created
1184e71b7053SJung-uk KimB<EVP_CIPHER_CTX> for success and B<NULL> for failure.
1185e71b7053SJung-uk Kim
1186b077aed3SPierre ProncheryEVP_EncryptInit_ex2(), EVP_EncryptUpdate() and EVP_EncryptFinal_ex()
1187e71b7053SJung-uk Kimreturn 1 for success and 0 for failure.
1188e71b7053SJung-uk Kim
1189b077aed3SPierre ProncheryEVP_DecryptInit_ex2() and EVP_DecryptUpdate() return 1 for success and 0 for failure.
1190e71b7053SJung-uk KimEVP_DecryptFinal_ex() returns 0 if the decrypt failed or 1 for success.
1191e71b7053SJung-uk Kim
1192b077aed3SPierre ProncheryEVP_CipherInit_ex2() and EVP_CipherUpdate() return 1 for success and 0 for failure.
1193e71b7053SJung-uk KimEVP_CipherFinal_ex() returns 0 for a decryption failure or 1 for success.
1194e71b7053SJung-uk Kim
1195*aa795734SPierre ProncheryEVP_Cipher() returns 1 on success or 0 on failure, if the flag
1196b077aed3SPierre ProncheryB<EVP_CIPH_FLAG_CUSTOM_CIPHER> is not set for the cipher.
1197*aa795734SPierre ProncheryEVP_Cipher() returns the number of bytes written to I<out> for encryption / decryption, or
1198*aa795734SPierre Proncherythe number of bytes authenticated in a call specifying AAD for an AEAD cipher, if the flag
1199*aa795734SPierre ProncheryB<EVP_CIPH_FLAG_CUSTOM_CIPHER> is set for the cipher.
1200b077aed3SPierre Pronchery
1201e71b7053SJung-uk KimEVP_CIPHER_CTX_reset() returns 1 for success and 0 for failure.
1202e71b7053SJung-uk Kim
1203e71b7053SJung-uk KimEVP_get_cipherbyname(), EVP_get_cipherbynid() and EVP_get_cipherbyobj()
1204e71b7053SJung-uk Kimreturn an B<EVP_CIPHER> structure or NULL on error.
1205e71b7053SJung-uk Kim
1206b077aed3SPierre ProncheryEVP_CIPHER_get_nid() and EVP_CIPHER_CTX_get_nid() return a NID.
1207e71b7053SJung-uk Kim
1208b077aed3SPierre ProncheryEVP_CIPHER_get_block_size() and EVP_CIPHER_CTX_get_block_size() return the
1209b077aed3SPierre Proncheryblock size.
1210e71b7053SJung-uk Kim
1211b077aed3SPierre ProncheryEVP_CIPHER_get_key_length() and EVP_CIPHER_CTX_get_key_length() return the key
1212e71b7053SJung-uk Kimlength.
1213e71b7053SJung-uk Kim
1214e71b7053SJung-uk KimEVP_CIPHER_CTX_set_padding() always returns 1.
1215e71b7053SJung-uk Kim
1216b077aed3SPierre ProncheryEVP_CIPHER_get_iv_length() and EVP_CIPHER_CTX_get_iv_length() return the IV
1217b077aed3SPierre Proncherylength or zero if the cipher does not use an IV.
1218e71b7053SJung-uk Kim
1219b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_tag_length() return the tag length or zero if the cipher
1220b077aed3SPierre Proncherydoes not use a tag.
1221b077aed3SPierre Pronchery
1222b077aed3SPierre ProncheryEVP_CIPHER_get_type() and EVP_CIPHER_CTX_get_type() return the NID of the
1223b077aed3SPierre Proncherycipher's OBJECT IDENTIFIER or NID_undef if it has no defined
1224b077aed3SPierre ProncheryOBJECT IDENTIFIER.
1225e71b7053SJung-uk Kim
1226e71b7053SJung-uk KimEVP_CIPHER_CTX_cipher() returns an B<EVP_CIPHER> structure.
1227e71b7053SJung-uk Kim
1228b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_num() returns a nonnegative num value or
1229b077aed3SPierre ProncheryB<EVP_CTRL_RET_UNSUPPORTED> if the implementation does not support the call
1230b077aed3SPierre Proncheryor on any other error.
1231b077aed3SPierre Pronchery
1232b077aed3SPierre ProncheryEVP_CIPHER_CTX_set_num() returns 1 on success and 0 if the implementation
1233b077aed3SPierre Proncherydoes not support the call or on any other error.
1234b077aed3SPierre Pronchery
1235b077aed3SPierre ProncheryEVP_CIPHER_CTX_is_encrypting() returns 1 if the I<ctx> is set up for encryption
1236b077aed3SPierre Pronchery0 otherwise.
1237b077aed3SPierre Pronchery
1238e71b7053SJung-uk KimEVP_CIPHER_param_to_asn1() and EVP_CIPHER_asn1_to_param() return greater
1239e71b7053SJung-uk Kimthan zero for success and zero or a negative number on failure.
1240e71b7053SJung-uk Kim
1241b077aed3SPierre ProncheryEVP_CIPHER_CTX_rand_key() returns 1 for success and zero or a negative number
1242b077aed3SPierre Proncheryfor failure.
1243b077aed3SPierre Pronchery
1244b077aed3SPierre ProncheryEVP_CIPHER_names_do_all() returns 1 if the callback was called for all names.
1245b077aed3SPierre ProncheryA return value of 0 means that the callback was not called for any names.
1246e71b7053SJung-uk Kim
1247e71b7053SJung-uk Kim=head1 CIPHER LISTING
1248e71b7053SJung-uk Kim
1249e71b7053SJung-uk KimAll algorithms have a fixed key length unless otherwise stated.
1250e71b7053SJung-uk Kim
1251b077aed3SPierre ProncheryRefer to L</SEE ALSO> for the full list of ciphers available through the EVP
1252e71b7053SJung-uk Kiminterface.
1253e71b7053SJung-uk Kim
1254e71b7053SJung-uk Kim=over 4
1255e71b7053SJung-uk Kim
1256e71b7053SJung-uk Kim=item EVP_enc_null()
1257e71b7053SJung-uk Kim
1258e71b7053SJung-uk KimNull cipher: does nothing.
1259e71b7053SJung-uk Kim
1260e71b7053SJung-uk Kim=back
1261e71b7053SJung-uk Kim
1262b077aed3SPierre Pronchery=head1 AEAD INTERFACE
1263e71b7053SJung-uk Kim
1264e71b7053SJung-uk KimThe EVP interface for Authenticated Encryption with Associated Data (AEAD)
1265e71b7053SJung-uk Kimmodes are subtly altered and several additional I<ctrl> operations are supported
1266e71b7053SJung-uk Kimdepending on the mode specified.
1267e71b7053SJung-uk Kim
1268e71b7053SJung-uk KimTo specify additional authenticated data (AAD), a call to EVP_CipherUpdate(),
1269e71b7053SJung-uk KimEVP_EncryptUpdate() or EVP_DecryptUpdate() should be made with the output
1270*aa795734SPierre Proncheryparameter I<out> set to B<NULL>. In this case, on success, the parameter
1271*aa795734SPierre ProncheryI<outl> is set to the number of bytes authenticated.
1272e71b7053SJung-uk Kim
1273e71b7053SJung-uk KimWhen decrypting, the return value of EVP_DecryptFinal() or EVP_CipherFinal()
1274e71b7053SJung-uk Kimindicates whether the operation was successful. If it does not indicate success,
1275e71b7053SJung-uk Kimthe authentication operation has failed and any output data B<MUST NOT> be used
1276e71b7053SJung-uk Kimas it is corrupted.
1277e71b7053SJung-uk Kim
1278e71b7053SJung-uk Kim=head2 GCM and OCB Modes
1279e71b7053SJung-uk Kim
1280e71b7053SJung-uk KimThe following I<ctrl>s are supported in GCM and OCB modes.
1281e71b7053SJung-uk Kim
1282e71b7053SJung-uk Kim=over 4
1283e71b7053SJung-uk Kim
1284e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, ivlen, NULL)
1285e71b7053SJung-uk Kim
1286e71b7053SJung-uk KimSets the IV length. This call can only be made before specifying an IV. If
1287e71b7053SJung-uk Kimnot called a default IV length is used.
1288e71b7053SJung-uk Kim
1289e71b7053SJung-uk KimFor GCM AES and OCB AES the default is 12 (i.e. 96 bits). For OCB mode the
1290e71b7053SJung-uk Kimmaximum is 15.
1291e71b7053SJung-uk Kim
1292e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag)
1293e71b7053SJung-uk Kim
1294e71b7053SJung-uk KimWrites C<taglen> bytes of the tag value to the buffer indicated by C<tag>.
1295e71b7053SJung-uk KimThis call can only be made when encrypting data and B<after> all data has been
1296e71b7053SJung-uk Kimprocessed (e.g. after an EVP_EncryptFinal() call).
1297e71b7053SJung-uk Kim
1298e71b7053SJung-uk KimFor OCB, C<taglen> must either be 16 or the value previously set via
1299e71b7053SJung-uk KimB<EVP_CTRL_AEAD_SET_TAG>.
1300e71b7053SJung-uk Kim
1301e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, taglen, tag)
1302e71b7053SJung-uk Kim
1303b2bf0c7eSJung-uk KimWhen decrypting, this call sets the expected tag to C<taglen> bytes from C<tag>.
1304e71b7053SJung-uk KimC<taglen> must be between 1 and 16 inclusive.
1305b2bf0c7eSJung-uk KimThe tag must be set prior to any call to EVP_DecryptFinal() or
1306b2bf0c7eSJung-uk KimEVP_DecryptFinal_ex().
1307e71b7053SJung-uk Kim
1308e71b7053SJung-uk KimFor GCM, this call is only valid when decrypting data.
1309e71b7053SJung-uk Kim
1310e71b7053SJung-uk KimFor OCB, this call is valid when decrypting data to set the expected tag,
1311b2bf0c7eSJung-uk Kimand when encrypting to set the desired tag length.
1312e71b7053SJung-uk Kim
1313b2bf0c7eSJung-uk KimIn OCB mode, calling this when encrypting with C<tag> set to C<NULL> sets the
1314b2bf0c7eSJung-uk Kimtag length. The tag length can only be set before specifying an IV. If this is
1315b2bf0c7eSJung-uk Kimnot called prior to setting the IV during encryption, then a default tag length
1316b2bf0c7eSJung-uk Kimis used.
1317e71b7053SJung-uk Kim
1318e71b7053SJung-uk KimFor OCB AES, the default tag length is 16 (i.e. 128 bits).  It is also the
1319e71b7053SJung-uk Kimmaximum tag length for OCB.
1320e71b7053SJung-uk Kim
1321e71b7053SJung-uk Kim=back
1322e71b7053SJung-uk Kim
1323e71b7053SJung-uk Kim=head2 CCM Mode
1324e71b7053SJung-uk Kim
1325e71b7053SJung-uk KimThe EVP interface for CCM mode is similar to that of the GCM mode but with a
1326e71b7053SJung-uk Kimfew additional requirements and different I<ctrl> values.
1327e71b7053SJung-uk Kim
1328e71b7053SJung-uk KimFor CCM mode, the total plaintext or ciphertext length B<MUST> be passed to
1329e71b7053SJung-uk KimEVP_CipherUpdate(), EVP_EncryptUpdate() or EVP_DecryptUpdate() with the output
1330b077aed3SPierre Proncheryand input parameters (I<in> and I<out>) set to B<NULL> and the length passed in
1331b077aed3SPierre Proncherythe I<inl> parameter.
1332e71b7053SJung-uk Kim
1333e71b7053SJung-uk KimThe following I<ctrl>s are supported in CCM mode.
1334e71b7053SJung-uk Kim
1335e71b7053SJung-uk Kim=over 4
1336e71b7053SJung-uk Kim
1337e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, taglen, tag)
1338e71b7053SJung-uk Kim
1339e71b7053SJung-uk KimThis call is made to set the expected B<CCM> tag value when decrypting or
1340e71b7053SJung-uk Kimthe length of the tag (with the C<tag> parameter set to NULL) when encrypting.
1341e71b7053SJung-uk KimThe tag length is often referred to as B<M>. If not set a default value is
1342610a21fdSJung-uk Kimused (12 for AES). When decrypting, the tag needs to be set before passing
1343610a21fdSJung-uk Kimin data to be decrypted, but as in GCM and OCB mode, it can be set after
1344b077aed3SPierre Proncherypassing additional authenticated data (see L</AEAD INTERFACE>).
1345e71b7053SJung-uk Kim
1346e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_CCM_SET_L, ivlen, NULL)
1347e71b7053SJung-uk Kim
1348e71b7053SJung-uk KimSets the CCM B<L> value. If not set a default is used (8 for AES).
1349e71b7053SJung-uk Kim
1350e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, ivlen, NULL)
1351e71b7053SJung-uk Kim
1352b077aed3SPierre ProncherySets the CCM nonce (IV) length. This call can only be made before specifying a
1353b077aed3SPierre Proncherynonce value. The nonce length is given by B<15 - L> so it is 7 by default for
1354e71b7053SJung-uk KimAES.
1355e71b7053SJung-uk Kim
1356e71b7053SJung-uk Kim=back
1357e71b7053SJung-uk Kim
1358b077aed3SPierre Pronchery=head2 SIV Mode
1359b077aed3SPierre Pronchery
1360b077aed3SPierre ProncheryFor SIV mode ciphers the behaviour of the EVP interface is subtly
1361b077aed3SPierre Proncheryaltered and several additional ctrl operations are supported.
1362b077aed3SPierre Pronchery
1363b077aed3SPierre ProncheryTo specify any additional authenticated data (AAD) and/or a Nonce, a call to
1364b077aed3SPierre ProncheryEVP_CipherUpdate(), EVP_EncryptUpdate() or EVP_DecryptUpdate() should be made
1365b077aed3SPierre Proncherywith the output parameter I<out> set to B<NULL>.
1366b077aed3SPierre Pronchery
1367b077aed3SPierre ProncheryRFC5297 states that the Nonce is the last piece of AAD before the actual
1368b077aed3SPierre Proncheryencrypt/decrypt takes place. The API does not differentiate the Nonce from
1369b077aed3SPierre Proncheryother AAD.
1370b077aed3SPierre Pronchery
1371b077aed3SPierre ProncheryWhen decrypting the return value of EVP_DecryptFinal() or EVP_CipherFinal()
1372b077aed3SPierre Proncheryindicates if the operation was successful. If it does not indicate success
1373b077aed3SPierre Proncherythe authentication operation has failed and any output data B<MUST NOT>
1374b077aed3SPierre Proncherybe used as it is corrupted.
1375b077aed3SPierre Pronchery
1376b077aed3SPierre ProncheryThe API does not store the the SIV (Synthetic Initialization Vector) in
1377b077aed3SPierre Proncherythe cipher text. Instead, it is stored as the tag within the EVP_CIPHER_CTX.
1378b077aed3SPierre ProncheryThe SIV must be retrieved from the context after encryption, and set into
1379b077aed3SPierre Proncherythe context before decryption.
1380b077aed3SPierre Pronchery
1381b077aed3SPierre ProncheryThis differs from RFC5297 in that the cipher output from encryption, and
1382b077aed3SPierre Proncherythe cipher input to decryption, does not contain the SIV. This also means
1383b077aed3SPierre Proncherythat the plain text and cipher text lengths are identical.
1384b077aed3SPierre Pronchery
1385b077aed3SPierre ProncheryThe following ctrls are supported in SIV mode, and are used to get and set
1386b077aed3SPierre Proncherythe Synthetic Initialization Vector:
1387b077aed3SPierre Pronchery
1388b077aed3SPierre Pronchery=over 4
1389b077aed3SPierre Pronchery
1390b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag);
1391b077aed3SPierre Pronchery
1392b077aed3SPierre ProncheryWrites I<taglen> bytes of the tag value (the Synthetic Initialization Vector)
1393b077aed3SPierre Proncheryto the buffer indicated by I<tag>. This call can only be made when encrypting
1394b077aed3SPierre Proncherydata and B<after> all data has been processed (e.g. after an EVP_EncryptFinal()
1395b077aed3SPierre Proncherycall). For SIV mode the taglen must be 16.
1396b077aed3SPierre Pronchery
1397b077aed3SPierre Pronchery=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, taglen, tag);
1398b077aed3SPierre Pronchery
1399b077aed3SPierre ProncherySets the expected tag (the Synthetic Initialization Vector) to I<taglen>
1400b077aed3SPierre Proncherybytes from I<tag>. This call is only legal when decrypting data and must be
1401b077aed3SPierre Proncherymade B<before> any data is processed (e.g. before any EVP_DecryptUpdate()
1402b077aed3SPierre Proncherycalls). For SIV mode the taglen must be 16.
1403b077aed3SPierre Pronchery
1404b077aed3SPierre Pronchery=back
1405b077aed3SPierre Pronchery
1406b077aed3SPierre ProncherySIV mode makes two passes over the input data, thus, only one call to
1407b077aed3SPierre ProncheryEVP_CipherUpdate(), EVP_EncryptUpdate() or EVP_DecryptUpdate() should be made
1408b077aed3SPierre Proncherywith I<out> set to a non-B<NULL> value. A call to EVP_DecryptFinal() or
1409b077aed3SPierre ProncheryEVP_CipherFinal() is not required, but will indicate if the update
1410b077aed3SPierre Proncheryoperation succeeded.
1411b077aed3SPierre Pronchery
1412e71b7053SJung-uk Kim=head2 ChaCha20-Poly1305
1413e71b7053SJung-uk Kim
1414e71b7053SJung-uk KimThe following I<ctrl>s are supported for the ChaCha20-Poly1305 AEAD algorithm.
1415e71b7053SJung-uk Kim
1416e71b7053SJung-uk Kim=over 4
1417e71b7053SJung-uk Kim
1418e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_IVLEN, ivlen, NULL)
1419e71b7053SJung-uk Kim
1420b077aed3SPierre ProncherySets the nonce length. This call is now redundant since the only valid value
1421b077aed3SPierre Proncheryis the default length of 12 (i.e. 96 bits).
1422b077aed3SPierre ProncheryPrior to OpenSSL 3.0 a nonce of less than 12 bytes could be used to automatically
1423b077aed3SPierre Proncherypad the iv with leading 0 bytes to make it 12 bytes in length.
1424e71b7053SJung-uk Kim
1425e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_GET_TAG, taglen, tag)
1426e71b7053SJung-uk Kim
1427e71b7053SJung-uk KimWrites C<taglen> bytes of the tag value to the buffer indicated by C<tag>.
1428e71b7053SJung-uk KimThis call can only be made when encrypting data and B<after> all data has been
1429e71b7053SJung-uk Kimprocessed (e.g. after an EVP_EncryptFinal() call).
1430e71b7053SJung-uk Kim
1431e71b7053SJung-uk KimC<taglen> specified here must be 16 (B<POLY1305_BLOCK_SIZE>, i.e. 128-bits) or
1432e71b7053SJung-uk Kimless.
1433e71b7053SJung-uk Kim
1434e71b7053SJung-uk Kim=item EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG, taglen, tag)
1435e71b7053SJung-uk Kim
1436e71b7053SJung-uk KimSets the expected tag to C<taglen> bytes from C<tag>.
1437e71b7053SJung-uk KimThe tag length can only be set before specifying an IV.
1438e71b7053SJung-uk KimC<taglen> must be between 1 and 16 (B<POLY1305_BLOCK_SIZE>) inclusive.
1439e71b7053SJung-uk KimThis call is only valid when decrypting data.
1440e71b7053SJung-uk Kim
1441e71b7053SJung-uk Kim=back
1442e71b7053SJung-uk Kim
1443e71b7053SJung-uk Kim=head1 NOTES
1444e71b7053SJung-uk Kim
1445e71b7053SJung-uk KimWhere possible the B<EVP> interface to symmetric ciphers should be used in
144658f35182SJung-uk Kimpreference to the low-level interfaces. This is because the code then becomes
1447e71b7053SJung-uk Kimtransparent to the cipher used and much more flexible. Additionally, the
1448e71b7053SJung-uk KimB<EVP> interface will ensure the use of platform specific cryptographic
144958f35182SJung-uk Kimacceleration such as AES-NI (the low-level interfaces do not provide the
1450e71b7053SJung-uk Kimguarantee).
1451e71b7053SJung-uk Kim
1452e71b7053SJung-uk KimPKCS padding works by adding B<n> padding bytes of value B<n> to make the total
1453e71b7053SJung-uk Kimlength of the encrypted data a multiple of the block size. Padding is always
1454e71b7053SJung-uk Kimadded so if the data is already a multiple of the block size B<n> will equal
1455e71b7053SJung-uk Kimthe block size. For example if the block size is 8 and 11 bytes are to be
1456e71b7053SJung-uk Kimencrypted then 5 padding bytes of value 5 will be added.
1457e71b7053SJung-uk Kim
1458e71b7053SJung-uk KimWhen decrypting the final block is checked to see if it has the correct form.
1459e71b7053SJung-uk Kim
1460e71b7053SJung-uk KimAlthough the decryption operation can produce an error if padding is enabled,
1461e71b7053SJung-uk Kimit is not a strong test that the input data or key is correct. A random block
1462e71b7053SJung-uk Kimhas better than 1 in 256 chance of being of the correct format and problems with
1463e71b7053SJung-uk Kimthe input data earlier on will not produce a final decrypt error.
1464e71b7053SJung-uk Kim
1465e71b7053SJung-uk KimIf padding is disabled then the decryption operation will always succeed if
1466e71b7053SJung-uk Kimthe total amount of data decrypted is a multiple of the block size.
1467e71b7053SJung-uk Kim
1468b077aed3SPierre ProncheryThe functions EVP_EncryptInit(), EVP_EncryptInit_ex(),
1469b077aed3SPierre ProncheryEVP_EncryptFinal(), EVP_DecryptInit(), EVP_DecryptInit_ex(),
1470b077aed3SPierre ProncheryEVP_CipherInit(), EVP_CipherInit_ex() and EVP_CipherFinal() are obsolete
1471b077aed3SPierre Proncherybut are retained for compatibility with existing code. New code should
1472b077aed3SPierre Proncheryuse EVP_EncryptInit_ex2(), EVP_EncryptFinal_ex(), EVP_DecryptInit_ex2(),
1473b077aed3SPierre ProncheryEVP_DecryptFinal_ex(), EVP_CipherInit_ex2() and EVP_CipherFinal_ex()
1474b077aed3SPierre Proncherybecause they can reuse an existing context without allocating and freeing
1475b077aed3SPierre Proncheryit up on each call.
1476e71b7053SJung-uk Kim
147717f01e99SJung-uk KimThere are some differences between functions EVP_CipherInit() and
147817f01e99SJung-uk KimEVP_CipherInit_ex(), significant in some circumstances. EVP_CipherInit() fills
147917f01e99SJung-uk Kimthe passed context object with zeros.  As a consequence, EVP_CipherInit() does
148017f01e99SJung-uk Kimnot allow step-by-step initialization of the ctx when the I<key> and I<iv> are
148117f01e99SJung-uk Kimpassed in separate calls. It also means that the flags set for the CTX are
148217f01e99SJung-uk Kimremoved, and it is especially important for the
148317f01e99SJung-uk KimB<EVP_CIPHER_CTX_FLAG_WRAP_ALLOW> flag treated specially in
148417f01e99SJung-uk KimEVP_CipherInit_ex().
148517f01e99SJung-uk Kim
1486b077aed3SPierre ProncheryIgnoring failure returns of the B<EVP_CIPHER_CTX> initialization functions can
1487b077aed3SPierre Proncherylead to subsequent undefined behavior when calling the functions that update or
1488b077aed3SPierre Proncheryfinalize the context. The only valid calls on the B<EVP_CIPHER_CTX> when
1489b077aed3SPierre Proncheryinitialization fails are calls that attempt another initialization of the
1490b077aed3SPierre Proncherycontext or release the context.
1491b077aed3SPierre Pronchery
1492e71b7053SJung-uk KimEVP_get_cipherbynid(), and EVP_get_cipherbyobj() are implemented as macros.
1493e71b7053SJung-uk Kim
1494e71b7053SJung-uk Kim=head1 BUGS
1495e71b7053SJung-uk Kim
1496e71b7053SJung-uk KimB<EVP_MAX_KEY_LENGTH> and B<EVP_MAX_IV_LENGTH> only refer to the internal
1497e71b7053SJung-uk Kimciphers with default key lengths. If custom ciphers exceed these values the
1498e71b7053SJung-uk Kimresults are unpredictable. This is because it has become standard practice to
1499e71b7053SJung-uk Kimdefine a generic key as a fixed unsigned char array containing
1500e71b7053SJung-uk KimB<EVP_MAX_KEY_LENGTH> bytes.
1501e71b7053SJung-uk Kim
1502e71b7053SJung-uk KimThe ASN1 code is incomplete (and sometimes inaccurate) it has only been tested
1503e71b7053SJung-uk Kimfor certain common S/MIME ciphers (RC2, DES, triple DES) in CBC mode.
1504e71b7053SJung-uk Kim
1505e71b7053SJung-uk Kim=head1 EXAMPLES
1506e71b7053SJung-uk Kim
1507e71b7053SJung-uk KimEncrypt a string using IDEA:
1508e71b7053SJung-uk Kim
1509e71b7053SJung-uk Kim int do_crypt(char *outfile)
1510e71b7053SJung-uk Kim {
1511e71b7053SJung-uk Kim     unsigned char outbuf[1024];
1512e71b7053SJung-uk Kim     int outlen, tmplen;
1513e71b7053SJung-uk Kim     /*
1514e71b7053SJung-uk Kim      * Bogus key and IV: we'd normally set these from
1515e71b7053SJung-uk Kim      * another source.
1516e71b7053SJung-uk Kim      */
1517e71b7053SJung-uk Kim     unsigned char key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
1518e71b7053SJung-uk Kim     unsigned char iv[] = {1,2,3,4,5,6,7,8};
1519e71b7053SJung-uk Kim     char intext[] = "Some Crypto Text";
1520e71b7053SJung-uk Kim     EVP_CIPHER_CTX *ctx;
1521e71b7053SJung-uk Kim     FILE *out;
1522e71b7053SJung-uk Kim
1523e71b7053SJung-uk Kim     ctx = EVP_CIPHER_CTX_new();
1524b077aed3SPierre Pronchery     if (!EVP_EncryptInit_ex2(ctx, EVP_idea_cbc(), key, iv, NULL)) {
1525b077aed3SPierre Pronchery         /* Error */
1526b077aed3SPierre Pronchery         EVP_CIPHER_CTX_free(ctx);
1527b077aed3SPierre Pronchery         return 0;
1528b077aed3SPierre Pronchery     }
1529e71b7053SJung-uk Kim
1530e71b7053SJung-uk Kim     if (!EVP_EncryptUpdate(ctx, outbuf, &outlen, intext, strlen(intext))) {
1531e71b7053SJung-uk Kim         /* Error */
1532e71b7053SJung-uk Kim         EVP_CIPHER_CTX_free(ctx);
1533e71b7053SJung-uk Kim         return 0;
1534e71b7053SJung-uk Kim     }
1535e71b7053SJung-uk Kim     /*
1536e71b7053SJung-uk Kim      * Buffer passed to EVP_EncryptFinal() must be after data just
1537e71b7053SJung-uk Kim      * encrypted to avoid overwriting it.
1538e71b7053SJung-uk Kim      */
1539e71b7053SJung-uk Kim     if (!EVP_EncryptFinal_ex(ctx, outbuf + outlen, &tmplen)) {
1540e71b7053SJung-uk Kim         /* Error */
1541e71b7053SJung-uk Kim         EVP_CIPHER_CTX_free(ctx);
1542e71b7053SJung-uk Kim         return 0;
1543e71b7053SJung-uk Kim     }
1544e71b7053SJung-uk Kim     outlen += tmplen;
1545e71b7053SJung-uk Kim     EVP_CIPHER_CTX_free(ctx);
1546e71b7053SJung-uk Kim     /*
1547e71b7053SJung-uk Kim      * Need binary mode for fopen because encrypted data is
1548e71b7053SJung-uk Kim      * binary data. Also cannot use strlen() on it because
1549e71b7053SJung-uk Kim      * it won't be NUL terminated and may contain embedded
1550e71b7053SJung-uk Kim      * NULs.
1551e71b7053SJung-uk Kim      */
1552e71b7053SJung-uk Kim     out = fopen(outfile, "wb");
1553e71b7053SJung-uk Kim     if (out == NULL) {
1554e71b7053SJung-uk Kim         /* Error */
1555e71b7053SJung-uk Kim         return 0;
1556e71b7053SJung-uk Kim     }
1557e71b7053SJung-uk Kim     fwrite(outbuf, 1, outlen, out);
1558e71b7053SJung-uk Kim     fclose(out);
1559e71b7053SJung-uk Kim     return 1;
1560e71b7053SJung-uk Kim }
1561e71b7053SJung-uk Kim
1562e71b7053SJung-uk KimThe ciphertext from the above example can be decrypted using the B<openssl>
1563e71b7053SJung-uk Kimutility with the command line (shown on two lines for clarity):
1564e71b7053SJung-uk Kim
1565e71b7053SJung-uk Kim openssl idea -d \
1566e71b7053SJung-uk Kim     -K 000102030405060708090A0B0C0D0E0F -iv 0102030405060708 <filename
1567e71b7053SJung-uk Kim
1568e71b7053SJung-uk KimGeneral encryption and decryption function example using FILE I/O and AES128
1569e71b7053SJung-uk Kimwith a 128-bit key:
1570e71b7053SJung-uk Kim
1571e71b7053SJung-uk Kim int do_crypt(FILE *in, FILE *out, int do_encrypt)
1572e71b7053SJung-uk Kim {
1573e71b7053SJung-uk Kim     /* Allow enough space in output buffer for additional block */
1574e71b7053SJung-uk Kim     unsigned char inbuf[1024], outbuf[1024 + EVP_MAX_BLOCK_LENGTH];
1575e71b7053SJung-uk Kim     int inlen, outlen;
1576e71b7053SJung-uk Kim     EVP_CIPHER_CTX *ctx;
1577e71b7053SJung-uk Kim     /*
1578e71b7053SJung-uk Kim      * Bogus key and IV: we'd normally set these from
1579e71b7053SJung-uk Kim      * another source.
1580e71b7053SJung-uk Kim      */
1581e71b7053SJung-uk Kim     unsigned char key[] = "0123456789abcdeF";
1582e71b7053SJung-uk Kim     unsigned char iv[] = "1234567887654321";
1583e71b7053SJung-uk Kim
1584e71b7053SJung-uk Kim     /* Don't set key or IV right away; we want to check lengths */
1585e71b7053SJung-uk Kim     ctx = EVP_CIPHER_CTX_new();
1586b077aed3SPierre Pronchery     if (!EVP_CipherInit_ex2(ctx, EVP_aes_128_cbc(), NULL, NULL,
1587b077aed3SPierre Pronchery                             do_encrypt, NULL)) {
1588b077aed3SPierre Pronchery         /* Error */
1589b077aed3SPierre Pronchery         EVP_CIPHER_CTX_free(ctx);
1590b077aed3SPierre Pronchery         return 0;
1591b077aed3SPierre Pronchery     }
1592b077aed3SPierre Pronchery     OPENSSL_assert(EVP_CIPHER_CTX_get_key_length(ctx) == 16);
1593b077aed3SPierre Pronchery     OPENSSL_assert(EVP_CIPHER_CTX_get_iv_length(ctx) == 16);
1594e71b7053SJung-uk Kim
1595e71b7053SJung-uk Kim     /* Now we can set key and IV */
1596b077aed3SPierre Pronchery     if (!EVP_CipherInit_ex2(ctx, NULL, key, iv, do_encrypt, NULL)) {
1597b077aed3SPierre Pronchery         /* Error */
1598b077aed3SPierre Pronchery         EVP_CIPHER_CTX_free(ctx);
1599b077aed3SPierre Pronchery         return 0;
1600b077aed3SPierre Pronchery     }
1601e71b7053SJung-uk Kim
1602e71b7053SJung-uk Kim     for (;;) {
1603e71b7053SJung-uk Kim         inlen = fread(inbuf, 1, 1024, in);
1604e71b7053SJung-uk Kim         if (inlen <= 0)
1605e71b7053SJung-uk Kim             break;
1606e71b7053SJung-uk Kim         if (!EVP_CipherUpdate(ctx, outbuf, &outlen, inbuf, inlen)) {
1607e71b7053SJung-uk Kim             /* Error */
1608e71b7053SJung-uk Kim             EVP_CIPHER_CTX_free(ctx);
1609e71b7053SJung-uk Kim             return 0;
1610e71b7053SJung-uk Kim         }
1611e71b7053SJung-uk Kim         fwrite(outbuf, 1, outlen, out);
1612e71b7053SJung-uk Kim     }
1613e71b7053SJung-uk Kim     if (!EVP_CipherFinal_ex(ctx, outbuf, &outlen)) {
1614e71b7053SJung-uk Kim         /* Error */
1615e71b7053SJung-uk Kim         EVP_CIPHER_CTX_free(ctx);
1616e71b7053SJung-uk Kim         return 0;
1617e71b7053SJung-uk Kim     }
1618e71b7053SJung-uk Kim     fwrite(outbuf, 1, outlen, out);
1619e71b7053SJung-uk Kim
1620e71b7053SJung-uk Kim     EVP_CIPHER_CTX_free(ctx);
1621e71b7053SJung-uk Kim     return 1;
1622e71b7053SJung-uk Kim }
1623e71b7053SJung-uk Kim
1624b077aed3SPierre ProncheryEncryption using AES-CBC with a 256-bit key with "CS1" ciphertext stealing.
1625b077aed3SPierre Pronchery
1626b077aed3SPierre Pronchery int encrypt(const unsigned char *key, const unsigned char *iv,
1627b077aed3SPierre Pronchery             const unsigned char *msg, size_t msg_len, unsigned char *out)
1628b077aed3SPierre Pronchery {
1629b077aed3SPierre Pronchery    /*
1630b077aed3SPierre Pronchery     * This assumes that key size is 32 bytes and the iv is 16 bytes.
1631b077aed3SPierre Pronchery     * For ciphertext stealing mode the length of the ciphertext "out" will be
1632b077aed3SPierre Pronchery     * the same size as the plaintext size "msg_len".
1633b077aed3SPierre Pronchery     * The "msg_len" can be any size >= 16.
1634b077aed3SPierre Pronchery     */
1635b077aed3SPierre Pronchery     int ret = 0, encrypt = 1, outlen, len;
1636b077aed3SPierre Pronchery     EVP_CIPHER_CTX *ctx = NULL;
1637b077aed3SPierre Pronchery     EVP_CIPHER *cipher = NULL;
1638b077aed3SPierre Pronchery     OSSL_PARAM params[2];
1639b077aed3SPierre Pronchery
1640b077aed3SPierre Pronchery     ctx = EVP_CIPHER_CTX_new();
1641b077aed3SPierre Pronchery     cipher = EVP_CIPHER_fetch(NULL, "AES-256-CBC-CTS", NULL);
1642b077aed3SPierre Pronchery     if (ctx == NULL || cipher == NULL)
1643b077aed3SPierre Pronchery         goto err;
1644b077aed3SPierre Pronchery
1645b077aed3SPierre Pronchery     /*
1646b077aed3SPierre Pronchery      * The default is "CS1" so this is not really needed,
1647b077aed3SPierre Pronchery      * but would be needed to set either "CS2" or "CS3".
1648b077aed3SPierre Pronchery      */
1649b077aed3SPierre Pronchery     params[0] = OSSL_PARAM_construct_utf8_string(OSSL_CIPHER_PARAM_CTS_MODE,
1650b077aed3SPierre Pronchery                                                  "CS1", 0);
1651b077aed3SPierre Pronchery     params[1] = OSSL_PARAM_construct_end();
1652b077aed3SPierre Pronchery
1653b077aed3SPierre Pronchery     if (!EVP_CipherInit_ex2(ctx, cipher, key, iv, encrypt, params))
1654b077aed3SPierre Pronchery         goto err;
1655b077aed3SPierre Pronchery
1656b077aed3SPierre Pronchery     /* NOTE: CTS mode does not support multiple calls to EVP_CipherUpdate() */
1657b077aed3SPierre Pronchery     if (!EVP_CipherUpdate(ctx, out, &outlen, msg, msg_len))
1658b077aed3SPierre Pronchery         goto err;
1659b077aed3SPierre Pronchery      if (!EVP_CipherFinal_ex(ctx, out + outlen, &len))
1660b077aed3SPierre Pronchery         goto err;
1661b077aed3SPierre Pronchery     ret = 1;
1662b077aed3SPierre Pronchery err:
1663b077aed3SPierre Pronchery     EVP_CIPHER_free(cipher);
1664b077aed3SPierre Pronchery     EVP_CIPHER_CTX_free(ctx);
1665b077aed3SPierre Pronchery     return ret;
1666b077aed3SPierre Pronchery }
1667e71b7053SJung-uk Kim
1668e71b7053SJung-uk Kim=head1 SEE ALSO
1669e71b7053SJung-uk Kim
1670b077aed3SPierre ProncheryL<evp(7)>,
1671b077aed3SPierre ProncheryL<property(7)>,
1672b077aed3SPierre ProncheryL<crypto(7)/ALGORITHM FETCHING>,
1673b077aed3SPierre ProncheryL<provider-cipher(7)>,
1674b077aed3SPierre ProncheryL<life_cycle-cipher(7)>
1675e71b7053SJung-uk Kim
1676e71b7053SJung-uk KimSupported ciphers are listed in:
1677e71b7053SJung-uk Kim
1678b077aed3SPierre ProncheryL<EVP_aes_128_gcm(3)>,
1679b077aed3SPierre ProncheryL<EVP_aria_128_gcm(3)>,
1680b077aed3SPierre ProncheryL<EVP_bf_cbc(3)>,
1681b077aed3SPierre ProncheryL<EVP_camellia_128_ecb(3)>,
1682b077aed3SPierre ProncheryL<EVP_cast5_cbc(3)>,
1683e71b7053SJung-uk KimL<EVP_chacha20(3)>,
1684b077aed3SPierre ProncheryL<EVP_des_cbc(3)>,
1685b077aed3SPierre ProncheryL<EVP_desx_cbc(3)>,
1686b077aed3SPierre ProncheryL<EVP_idea_cbc(3)>,
1687b077aed3SPierre ProncheryL<EVP_rc2_cbc(3)>,
1688e71b7053SJung-uk KimL<EVP_rc4(3)>,
1689b077aed3SPierre ProncheryL<EVP_rc5_32_12_16_cbc(3)>,
1690b077aed3SPierre ProncheryL<EVP_seed_cbc(3)>,
1691b077aed3SPierre ProncheryL<EVP_sm4_cbc(3)>,
1692e71b7053SJung-uk Kim
1693e71b7053SJung-uk Kim=head1 HISTORY
1694e71b7053SJung-uk Kim
16956935a639SJung-uk KimSupport for OCB mode was added in OpenSSL 1.1.0.
1696e71b7053SJung-uk Kim
1697e71b7053SJung-uk KimB<EVP_CIPHER_CTX> was made opaque in OpenSSL 1.1.0.  As a result,
1698e71b7053SJung-uk KimEVP_CIPHER_CTX_reset() appeared and EVP_CIPHER_CTX_cleanup()
1699e71b7053SJung-uk Kimdisappeared.  EVP_CIPHER_CTX_init() remains as an alias for
1700e71b7053SJung-uk KimEVP_CIPHER_CTX_reset().
1701e71b7053SJung-uk Kim
1702b077aed3SPierre ProncheryThe EVP_CIPHER_CTX_cipher() function was deprecated in OpenSSL 3.0; use
1703b077aed3SPierre ProncheryEVP_CIPHER_CTX_get0_cipher() instead.
1704b077aed3SPierre Pronchery
1705b077aed3SPierre ProncheryThe EVP_EncryptInit_ex2(), EVP_DecryptInit_ex2(), EVP_CipherInit_ex2(),
1706b077aed3SPierre ProncheryEVP_CIPHER_fetch(), EVP_CIPHER_free(), EVP_CIPHER_up_ref(),
1707b077aed3SPierre ProncheryEVP_CIPHER_CTX_get0_cipher(), EVP_CIPHER_CTX_get1_cipher(),
1708b077aed3SPierre ProncheryEVP_CIPHER_get_params(), EVP_CIPHER_CTX_set_params(),
1709b077aed3SPierre ProncheryEVP_CIPHER_CTX_get_params(), EVP_CIPHER_gettable_params(),
1710b077aed3SPierre ProncheryEVP_CIPHER_settable_ctx_params(), EVP_CIPHER_gettable_ctx_params(),
1711b077aed3SPierre ProncheryEVP_CIPHER_CTX_settable_params() and EVP_CIPHER_CTX_gettable_params()
1712b077aed3SPierre Proncheryfunctions were added in 3.0.
1713b077aed3SPierre Pronchery
1714b077aed3SPierre ProncheryThe EVP_CIPHER_nid(), EVP_CIPHER_name(), EVP_CIPHER_block_size(),
1715b077aed3SPierre ProncheryEVP_CIPHER_key_length(), EVP_CIPHER_iv_length(), EVP_CIPHER_flags(),
1716b077aed3SPierre ProncheryEVP_CIPHER_mode(), EVP_CIPHER_type(), EVP_CIPHER_CTX_nid(),
1717b077aed3SPierre ProncheryEVP_CIPHER_CTX_block_size(), EVP_CIPHER_CTX_key_length(),
1718b077aed3SPierre ProncheryEVP_CIPHER_CTX_iv_length(), EVP_CIPHER_CTX_tag_length(),
1719b077aed3SPierre ProncheryEVP_CIPHER_CTX_num(), EVP_CIPHER_CTX_type(), and EVP_CIPHER_CTX_mode()
1720b077aed3SPierre Proncheryfunctions were renamed to include C<get> or C<get0> in their names in
1721b077aed3SPierre ProncheryOpenSSL 3.0, respectively. The old names are kept as non-deprecated
1722b077aed3SPierre Proncheryalias macros.
1723b077aed3SPierre Pronchery
1724b077aed3SPierre ProncheryThe EVP_CIPHER_CTX_encrypting() function was renamed to
1725b077aed3SPierre ProncheryEVP_CIPHER_CTX_is_encrypting() in OpenSSL 3.0. The old name is kept as
1726b077aed3SPierre Proncherynon-deprecated alias macro.
1727b077aed3SPierre Pronchery
1728b077aed3SPierre ProncheryThe EVP_CIPHER_CTX_flags() macro was deprecated in OpenSSL 1.1.0.
1729b077aed3SPierre Pronchery
1730e71b7053SJung-uk Kim=head1 COPYRIGHT
1731e71b7053SJung-uk Kim
1732b077aed3SPierre ProncheryCopyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
1733e71b7053SJung-uk Kim
1734b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License").  You may not use
1735e71b7053SJung-uk Kimthis file except in compliance with the License.  You can obtain a copy
1736e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at
1737e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>.
1738e71b7053SJung-uk Kim
1739e71b7053SJung-uk Kim=cut
1740