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