xref: /freebsd-src/crypto/openssl/crypto/evp/cmeth_lib.c (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
1e71b7053SJung-uk Kim /*
2*b077aed3SPierre Pronchery  * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
3e71b7053SJung-uk Kim  *
4*b077aed3SPierre Pronchery  * Licensed under the Apache License 2.0 (the "License").  You may not use
5e71b7053SJung-uk Kim  * this file except in compliance with the License.  You can obtain a copy
6e71b7053SJung-uk Kim  * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim  * https://www.openssl.org/source/license.html
8e71b7053SJung-uk Kim  */
9e71b7053SJung-uk Kim 
10*b077aed3SPierre Pronchery /*
11*b077aed3SPierre Pronchery  * EVP _meth_ APIs are deprecated for public use, but still ok for
12*b077aed3SPierre Pronchery  * internal use.
13*b077aed3SPierre Pronchery  */
14*b077aed3SPierre Pronchery #include "internal/deprecated.h"
15*b077aed3SPierre Pronchery 
16e71b7053SJung-uk Kim #include <string.h>
17e71b7053SJung-uk Kim 
18e71b7053SJung-uk Kim #include <openssl/evp.h>
1917f01e99SJung-uk Kim #include "crypto/evp.h"
20*b077aed3SPierre Pronchery #include "internal/provider.h"
2117f01e99SJung-uk Kim #include "evp_local.h"
22e71b7053SJung-uk Kim 
EVP_CIPHER_meth_new(int cipher_type,int block_size,int key_len)23e71b7053SJung-uk Kim EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len)
24e71b7053SJung-uk Kim {
25*b077aed3SPierre Pronchery     EVP_CIPHER *cipher = evp_cipher_new();
26e71b7053SJung-uk Kim 
27e71b7053SJung-uk Kim     if (cipher != NULL) {
28e71b7053SJung-uk Kim         cipher->nid = cipher_type;
29e71b7053SJung-uk Kim         cipher->block_size = block_size;
30e71b7053SJung-uk Kim         cipher->key_len = key_len;
31*b077aed3SPierre Pronchery         cipher->origin = EVP_ORIG_METH;
32e71b7053SJung-uk Kim     }
33e71b7053SJung-uk Kim     return cipher;
34e71b7053SJung-uk Kim }
35e71b7053SJung-uk Kim 
EVP_CIPHER_meth_dup(const EVP_CIPHER * cipher)36e71b7053SJung-uk Kim EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher)
37e71b7053SJung-uk Kim {
38*b077aed3SPierre Pronchery     EVP_CIPHER *to = NULL;
39e71b7053SJung-uk Kim 
40*b077aed3SPierre Pronchery     /*
41*b077aed3SPierre Pronchery      * Non-legacy EVP_CIPHERs can't be duplicated like this.
42*b077aed3SPierre Pronchery      * Use EVP_CIPHER_up_ref() instead.
43*b077aed3SPierre Pronchery      */
44*b077aed3SPierre Pronchery     if (cipher->prov != NULL)
45*b077aed3SPierre Pronchery         return NULL;
46*b077aed3SPierre Pronchery 
47*b077aed3SPierre Pronchery     if ((to = EVP_CIPHER_meth_new(cipher->nid, cipher->block_size,
48*b077aed3SPierre Pronchery                                   cipher->key_len)) != NULL) {
49*b077aed3SPierre Pronchery         CRYPTO_RWLOCK *lock = to->lock;
50*b077aed3SPierre Pronchery 
51e71b7053SJung-uk Kim         memcpy(to, cipher, sizeof(*to));
52*b077aed3SPierre Pronchery         to->lock = lock;
53*b077aed3SPierre Pronchery         to->origin = EVP_ORIG_METH;
54*b077aed3SPierre Pronchery     }
55e71b7053SJung-uk Kim     return to;
56e71b7053SJung-uk Kim }
57e71b7053SJung-uk Kim 
EVP_CIPHER_meth_free(EVP_CIPHER * cipher)58e71b7053SJung-uk Kim void EVP_CIPHER_meth_free(EVP_CIPHER *cipher)
59e71b7053SJung-uk Kim {
60*b077aed3SPierre Pronchery     if (cipher == NULL || cipher->origin != EVP_ORIG_METH)
61*b077aed3SPierre Pronchery        return;
62*b077aed3SPierre Pronchery 
63*b077aed3SPierre Pronchery     evp_cipher_free_int(cipher);
64e71b7053SJung-uk Kim }
65e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_iv_length(EVP_CIPHER * cipher,int iv_len)66e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len)
67e71b7053SJung-uk Kim {
68*b077aed3SPierre Pronchery     if (cipher->iv_len != 0)
69*b077aed3SPierre Pronchery         return 0;
70*b077aed3SPierre Pronchery 
71e71b7053SJung-uk Kim     cipher->iv_len = iv_len;
72e71b7053SJung-uk Kim     return 1;
73e71b7053SJung-uk Kim }
74e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_flags(EVP_CIPHER * cipher,unsigned long flags)75e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags)
76e71b7053SJung-uk Kim {
77*b077aed3SPierre Pronchery     if (cipher->flags != 0)
78*b077aed3SPierre Pronchery         return 0;
79*b077aed3SPierre Pronchery 
80e71b7053SJung-uk Kim     cipher->flags = flags;
81e71b7053SJung-uk Kim     return 1;
82e71b7053SJung-uk Kim }
83e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER * cipher,int ctx_size)84e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size)
85e71b7053SJung-uk Kim {
86*b077aed3SPierre Pronchery     if (cipher->ctx_size != 0)
87*b077aed3SPierre Pronchery         return 0;
88*b077aed3SPierre Pronchery 
89e71b7053SJung-uk Kim     cipher->ctx_size = ctx_size;
90e71b7053SJung-uk Kim     return 1;
91e71b7053SJung-uk Kim }
92e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_init(EVP_CIPHER * cipher,int (* init)(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc))93e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher,
94e71b7053SJung-uk Kim                              int (*init) (EVP_CIPHER_CTX *ctx,
95e71b7053SJung-uk Kim                                           const unsigned char *key,
96e71b7053SJung-uk Kim                                           const unsigned char *iv,
97e71b7053SJung-uk Kim                                           int enc))
98e71b7053SJung-uk Kim {
99*b077aed3SPierre Pronchery     if (cipher->init != NULL)
100*b077aed3SPierre Pronchery         return 0;
101*b077aed3SPierre Pronchery 
102e71b7053SJung-uk Kim     cipher->init = init;
103e71b7053SJung-uk Kim     return 1;
104e71b7053SJung-uk Kim }
105e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER * cipher,int (* do_cipher)(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl))106e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
107e71b7053SJung-uk Kim                                   int (*do_cipher) (EVP_CIPHER_CTX *ctx,
108e71b7053SJung-uk Kim                                                     unsigned char *out,
109e71b7053SJung-uk Kim                                                     const unsigned char *in,
110e71b7053SJung-uk Kim                                                     size_t inl))
111e71b7053SJung-uk Kim {
112*b077aed3SPierre Pronchery     if (cipher->do_cipher != NULL)
113*b077aed3SPierre Pronchery         return 0;
114*b077aed3SPierre Pronchery 
115e71b7053SJung-uk Kim     cipher->do_cipher = do_cipher;
116e71b7053SJung-uk Kim     return 1;
117e71b7053SJung-uk Kim }
118e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_cleanup(EVP_CIPHER * cipher,int (* cleanup)(EVP_CIPHER_CTX *))119e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher,
120e71b7053SJung-uk Kim                                 int (*cleanup) (EVP_CIPHER_CTX *))
121e71b7053SJung-uk Kim {
122*b077aed3SPierre Pronchery     if (cipher->cleanup != NULL)
123*b077aed3SPierre Pronchery         return 0;
124*b077aed3SPierre Pronchery 
125e71b7053SJung-uk Kim     cipher->cleanup = cleanup;
126e71b7053SJung-uk Kim     return 1;
127e71b7053SJung-uk Kim }
128e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER * cipher,int (* set_asn1_parameters)(EVP_CIPHER_CTX *,ASN1_TYPE *))129e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher,
130e71b7053SJung-uk Kim                                         int (*set_asn1_parameters) (EVP_CIPHER_CTX *,
131e71b7053SJung-uk Kim                                                                     ASN1_TYPE *))
132e71b7053SJung-uk Kim {
133*b077aed3SPierre Pronchery     if (cipher->set_asn1_parameters != NULL)
134*b077aed3SPierre Pronchery         return 0;
135*b077aed3SPierre Pronchery 
136e71b7053SJung-uk Kim     cipher->set_asn1_parameters = set_asn1_parameters;
137e71b7053SJung-uk Kim     return 1;
138e71b7053SJung-uk Kim }
139e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER * cipher,int (* get_asn1_parameters)(EVP_CIPHER_CTX *,ASN1_TYPE *))140e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher,
141e71b7053SJung-uk Kim                                         int (*get_asn1_parameters) (EVP_CIPHER_CTX *,
142e71b7053SJung-uk Kim                                                                     ASN1_TYPE *))
143e71b7053SJung-uk Kim {
144*b077aed3SPierre Pronchery     if (cipher->get_asn1_parameters != NULL)
145*b077aed3SPierre Pronchery         return 0;
146*b077aed3SPierre Pronchery 
147e71b7053SJung-uk Kim     cipher->get_asn1_parameters = get_asn1_parameters;
148e71b7053SJung-uk Kim     return 1;
149e71b7053SJung-uk Kim }
150e71b7053SJung-uk Kim 
EVP_CIPHER_meth_set_ctrl(EVP_CIPHER * cipher,int (* ctrl)(EVP_CIPHER_CTX *,int type,int arg,void * ptr))151e71b7053SJung-uk Kim int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher,
152e71b7053SJung-uk Kim                              int (*ctrl) (EVP_CIPHER_CTX *, int type,
153e71b7053SJung-uk Kim                                           int arg, void *ptr))
154e71b7053SJung-uk Kim {
155*b077aed3SPierre Pronchery     if (cipher->ctrl != NULL)
156*b077aed3SPierre Pronchery         return 0;
157*b077aed3SPierre Pronchery 
158e71b7053SJung-uk Kim     cipher->ctrl = ctrl;
159e71b7053SJung-uk Kim     return 1;
160e71b7053SJung-uk Kim }
161e71b7053SJung-uk Kim 
162e71b7053SJung-uk Kim 
EVP_CIPHER_meth_get_init(const EVP_CIPHER * cipher)163e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_init(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx,
164e71b7053SJung-uk Kim                                                           const unsigned char *key,
165e71b7053SJung-uk Kim                                                           const unsigned char *iv,
166e71b7053SJung-uk Kim                                                           int enc)
167e71b7053SJung-uk Kim {
168e71b7053SJung-uk Kim     return cipher->init;
169e71b7053SJung-uk Kim }
EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER * cipher)170e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_do_cipher(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *ctx,
171e71b7053SJung-uk Kim                                                                unsigned char *out,
172e71b7053SJung-uk Kim                                                                const unsigned char *in,
173e71b7053SJung-uk Kim                                                                size_t inl)
174e71b7053SJung-uk Kim {
175e71b7053SJung-uk Kim     return cipher->do_cipher;
176e71b7053SJung-uk Kim }
177e71b7053SJung-uk Kim 
EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER * cipher)178e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_cleanup(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *)
179e71b7053SJung-uk Kim {
180e71b7053SJung-uk Kim     return cipher->cleanup;
181e71b7053SJung-uk Kim }
182e71b7053SJung-uk Kim 
EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER * cipher)183e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_set_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *,
184e71b7053SJung-uk Kim                                                                      ASN1_TYPE *)
185e71b7053SJung-uk Kim {
186e71b7053SJung-uk Kim     return cipher->set_asn1_parameters;
187e71b7053SJung-uk Kim }
188e71b7053SJung-uk Kim 
EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER * cipher)189e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_get_asn1_params(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *,
190e71b7053SJung-uk Kim                                                                ASN1_TYPE *)
191e71b7053SJung-uk Kim {
192e71b7053SJung-uk Kim     return cipher->get_asn1_parameters;
193e71b7053SJung-uk Kim }
194e71b7053SJung-uk Kim 
EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER * cipher)195e71b7053SJung-uk Kim int (*EVP_CIPHER_meth_get_ctrl(const EVP_CIPHER *cipher))(EVP_CIPHER_CTX *,
196e71b7053SJung-uk Kim                                                           int type, int arg,
197e71b7053SJung-uk Kim                                                           void *ptr)
198e71b7053SJung-uk Kim {
199e71b7053SJung-uk Kim     return cipher->ctrl;
200e71b7053SJung-uk Kim }
201e71b7053SJung-uk Kim 
202