RFC5753 compliance.
[openssl.git] / crypto / evp / evp_lib.c
1 /* crypto/evp/evp_lib.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include <stdio.h>
60 #include "internal/cryptlib.h"
61 #include <openssl/evp.h>
62 #include <openssl/objects.h>
63
64 int EVP_CIPHER_param_to_asn1(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
65 {
66     int ret;
67
68     if (c->cipher->set_asn1_parameters != NULL)
69         ret = c->cipher->set_asn1_parameters(c, type);
70     else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
71         switch (EVP_CIPHER_CTX_mode(c)) {
72         case EVP_CIPH_WRAP_MODE:
73             if (EVP_CIPHER_CTX_nid(c) == NID_id_smime_alg_CMS3DESwrap)
74                 ASN1_TYPE_set(type, V_ASN1_NULL, NULL);
75             ret = 1;
76             break;
77
78         case EVP_CIPH_GCM_MODE:
79         case EVP_CIPH_CCM_MODE:
80         case EVP_CIPH_XTS_MODE:
81         case EVP_CIPH_OCB_MODE:
82             ret = -1;
83             break;
84
85         default:
86             ret = EVP_CIPHER_set_asn1_iv(c, type);
87         }
88     } else
89         ret = -1;
90     return (ret);
91 }
92
93 int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
94 {
95     int ret;
96
97     if (c->cipher->get_asn1_parameters != NULL)
98         ret = c->cipher->get_asn1_parameters(c, type);
99     else if (c->cipher->flags & EVP_CIPH_FLAG_DEFAULT_ASN1) {
100         switch (EVP_CIPHER_CTX_mode(c)) {
101
102         case EVP_CIPH_WRAP_MODE:
103             ret = 1;
104             break;
105
106         case EVP_CIPH_GCM_MODE:
107         case EVP_CIPH_CCM_MODE:
108         case EVP_CIPH_XTS_MODE:
109         case EVP_CIPH_OCB_MODE:
110             ret = -1;
111             break;
112
113         default:
114             ret = EVP_CIPHER_get_asn1_iv(c, type);
115             break;
116         }
117     } else
118         ret = -1;
119     return (ret);
120 }
121
122 int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
123 {
124     int i = 0;
125     unsigned int l;
126
127     if (type != NULL) {
128         l = EVP_CIPHER_CTX_iv_length(c);
129         OPENSSL_assert(l <= sizeof(c->iv));
130         i = ASN1_TYPE_get_octetstring(type, c->oiv, l);
131         if (i != (int)l)
132             return (-1);
133         else if (i > 0)
134             memcpy(c->iv, c->oiv, l);
135     }
136     return (i);
137 }
138
139 int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
140 {
141     int i = 0;
142     unsigned int j;
143
144     if (type != NULL) {
145         j = EVP_CIPHER_CTX_iv_length(c);
146         OPENSSL_assert(j <= sizeof(c->iv));
147         i = ASN1_TYPE_set_octetstring(type, c->oiv, j);
148     }
149     return (i);
150 }
151
152 /* Convert the various cipher NIDs and dummies to a proper OID NID */
153 int EVP_CIPHER_type(const EVP_CIPHER *ctx)
154 {
155     int nid;
156     ASN1_OBJECT *otmp;
157     nid = EVP_CIPHER_nid(ctx);
158
159     switch (nid) {
160
161     case NID_rc2_cbc:
162     case NID_rc2_64_cbc:
163     case NID_rc2_40_cbc:
164
165         return NID_rc2_cbc;
166
167     case NID_rc4:
168     case NID_rc4_40:
169
170         return NID_rc4;
171
172     case NID_aes_128_cfb128:
173     case NID_aes_128_cfb8:
174     case NID_aes_128_cfb1:
175
176         return NID_aes_128_cfb128;
177
178     case NID_aes_192_cfb128:
179     case NID_aes_192_cfb8:
180     case NID_aes_192_cfb1:
181
182         return NID_aes_192_cfb128;
183
184     case NID_aes_256_cfb128:
185     case NID_aes_256_cfb8:
186     case NID_aes_256_cfb1:
187
188         return NID_aes_256_cfb128;
189
190     case NID_des_cfb64:
191     case NID_des_cfb8:
192     case NID_des_cfb1:
193
194         return NID_des_cfb64;
195
196     case NID_des_ede3_cfb64:
197     case NID_des_ede3_cfb8:
198     case NID_des_ede3_cfb1:
199
200         return NID_des_cfb64;
201
202     default:
203         /* Check it has an OID and it is valid */
204         otmp = OBJ_nid2obj(nid);
205         if (OBJ_get0_data(otmp) == NULL)
206             nid = NID_undef;
207         ASN1_OBJECT_free(otmp);
208         return nid;
209     }
210 }
211
212 int EVP_CIPHER_block_size(const EVP_CIPHER *e)
213 {
214     return e->block_size;
215 }
216
217 int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
218 {
219     return ctx->cipher->block_size;
220 }
221
222 int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
223                const unsigned char *in, unsigned int inl)
224 {
225     return ctx->cipher->do_cipher(ctx, out, in, inl);
226 }
227
228 const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
229 {
230     return ctx->cipher;
231 }
232
233 unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher)
234 {
235     return cipher->flags;
236 }
237
238 unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
239 {
240     return ctx->cipher->flags;
241 }
242
243 void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
244 {
245     return ctx->app_data;
246 }
247
248 void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
249 {
250     ctx->app_data = data;
251 }
252
253 int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
254 {
255     return cipher->iv_len;
256 }
257
258 int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
259 {
260     return ctx->cipher->iv_len;
261 }
262
263 int EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
264 {
265     return cipher->key_len;
266 }
267
268 int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
269 {
270     return ctx->key_len;
271 }
272
273 int EVP_CIPHER_nid(const EVP_CIPHER *cipher)
274 {
275     return cipher->nid;
276 }
277
278 int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
279 {
280     return ctx->cipher->nid;
281 }
282
283 int EVP_MD_block_size(const EVP_MD *md)
284 {
285     return md->block_size;
286 }
287
288 int EVP_MD_type(const EVP_MD *md)
289 {
290     return md->type;
291 }
292
293 int EVP_MD_pkey_type(const EVP_MD *md)
294 {
295     return md->pkey_type;
296 }
297
298 int EVP_MD_size(const EVP_MD *md)
299 {
300     if (!md) {
301         EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
302         return -1;
303     }
304     return md->md_size;
305 }
306
307 unsigned long EVP_MD_flags(const EVP_MD *md)
308 {
309     return md->flags;
310 }
311
312 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
313 {
314     if (!ctx)
315         return NULL;
316     return ctx->digest;
317 }
318
319 void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
320 {
321     ctx->flags |= flags;
322 }
323
324 void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
325 {
326     ctx->flags &= ~flags;
327 }
328
329 int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
330 {
331     return (ctx->flags & flags);
332 }
333
334 void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
335 {
336     ctx->flags |= flags;
337 }
338
339 void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
340 {
341     ctx->flags &= ~flags;
342 }
343
344 int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
345 {
346     return (ctx->flags & flags);
347 }