FIPS mode EVP changes:
[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 "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                 ret=EVP_CIPHER_set_asn1_iv(c, type);
72         else
73                 ret=-1;
74         return(ret);
75         }
76
77 int EVP_CIPHER_asn1_to_param(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
78         {
79         int ret;
80
81         if (c->cipher->get_asn1_parameters != NULL)
82                 ret=c->cipher->get_asn1_parameters(c,type);
83         else
84                 ret=-1;
85         return(ret);
86         }
87
88 int EVP_CIPHER_get_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
89         {
90         int i=0;
91         unsigned int l;
92
93         if (type != NULL) 
94                 {
95                 l=EVP_CIPHER_CTX_iv_length(c);
96                 OPENSSL_assert(l <= sizeof(c->iv));
97                 i=ASN1_TYPE_get_octetstring(type,c->oiv,l);
98                 if (i != (int)l)
99                         return(-1);
100                 else if (i > 0)
101                         memcpy(c->iv,c->oiv,l);
102                 }
103         return(i);
104         }
105
106 int EVP_CIPHER_set_asn1_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type)
107         {
108         int i=0;
109         unsigned int j;
110
111         if (type != NULL)
112                 {
113                 j=EVP_CIPHER_CTX_iv_length(c);
114                 OPENSSL_assert(j <= sizeof(c->iv));
115                 i=ASN1_TYPE_set_octetstring(type,c->oiv,j);
116                 }
117         return(i);
118         }
119
120 /* Convert the various cipher NIDs and dummies to a proper OID NID */
121 int EVP_CIPHER_type(const EVP_CIPHER *ctx)
122 {
123         int nid;
124         ASN1_OBJECT *otmp;
125         nid = EVP_CIPHER_nid(ctx);
126
127         switch(nid) {
128
129                 case NID_rc2_cbc:
130                 case NID_rc2_64_cbc:
131                 case NID_rc2_40_cbc:
132
133                 return NID_rc2_cbc;
134
135                 case NID_rc4:
136                 case NID_rc4_40:
137
138                 return NID_rc4;
139
140                 case NID_aes_128_cfb128:
141                 case NID_aes_128_cfb8:
142                 case NID_aes_128_cfb1:
143
144                 return NID_aes_128_cfb128;
145
146                 case NID_aes_192_cfb128:
147                 case NID_aes_192_cfb8:
148                 case NID_aes_192_cfb1:
149
150                 return NID_aes_192_cfb128;
151
152                 case NID_aes_256_cfb128:
153                 case NID_aes_256_cfb8:
154                 case NID_aes_256_cfb1:
155
156                 return NID_aes_256_cfb128;
157
158                 case NID_des_cfb64:
159                 case NID_des_cfb8:
160                 case NID_des_cfb1:
161
162                 return NID_des_cfb64;
163
164                 case NID_des_ede3_cfb64:
165                 case NID_des_ede3_cfb8:
166                 case NID_des_ede3_cfb1:
167
168                 return NID_des_cfb64;
169
170                 default:
171                 /* Check it has an OID and it is valid */
172                 otmp = OBJ_nid2obj(nid);
173                 if(!otmp || !otmp->data) nid = NID_undef;
174                 ASN1_OBJECT_free(otmp);
175                 return nid;
176         }
177 }
178
179 int EVP_CIPHER_block_size(const EVP_CIPHER *e)
180         {
181         return e->block_size;
182         }
183
184 int EVP_CIPHER_CTX_block_size(const EVP_CIPHER_CTX *ctx)
185         {
186         return ctx->cipher->block_size;
187         }
188
189 int EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl)
190         {
191         return ctx->cipher->do_cipher(ctx,out,in,inl);
192         }
193
194 const EVP_CIPHER *EVP_CIPHER_CTX_cipher(const EVP_CIPHER_CTX *ctx)
195         {
196         return ctx->cipher;
197         }
198
199 unsigned long EVP_CIPHER_flags(const EVP_CIPHER *cipher)
200         {
201         return cipher->flags;
202         }
203
204 unsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
205         {
206         return ctx->cipher->flags;
207         }
208
209 void *EVP_CIPHER_CTX_get_app_data(const EVP_CIPHER_CTX *ctx)
210         {
211         return ctx->app_data;
212         }
213
214 void EVP_CIPHER_CTX_set_app_data(EVP_CIPHER_CTX *ctx, void *data)
215         {
216         ctx->app_data = data;
217         }
218
219 int EVP_CIPHER_iv_length(const EVP_CIPHER *cipher)
220         {
221         return cipher->iv_len;
222         }
223
224 int EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
225         {
226         return ctx->cipher->iv_len;
227         }
228
229 int EVP_CIPHER_key_length(const EVP_CIPHER *cipher)
230         {
231         return cipher->key_len;
232         }
233
234 int EVP_CIPHER_CTX_key_length(const EVP_CIPHER_CTX *ctx)
235         {
236         return ctx->key_len;
237         }
238
239 int EVP_CIPHER_nid(const EVP_CIPHER *cipher)
240         {
241         return cipher->nid;
242         }
243
244 int EVP_CIPHER_CTX_nid(const EVP_CIPHER_CTX *ctx)
245         {
246         return ctx->cipher->nid;
247         }
248
249 int EVP_MD_block_size(const EVP_MD *md) 
250         {
251         return md->block_size;
252         }
253
254 int EVP_MD_type(const EVP_MD *md)
255         {
256         return md->type;
257         }
258
259 int EVP_MD_pkey_type(const EVP_MD *md)
260         {
261         return md->pkey_type;
262         }
263
264 int EVP_MD_size(const EVP_MD *md)
265         {
266         if (!md)
267                 {
268                 EVPerr(EVP_F_EVP_MD_SIZE, EVP_R_MESSAGE_DIGEST_IS_NULL);
269                 return -1;
270                 }
271         return md->md_size;
272         }
273
274 unsigned long EVP_MD_flags(const EVP_MD *md)
275         {
276         return md->flags;
277         }
278
279 const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx)
280         {
281         if (!ctx)
282                 return NULL;
283         return ctx->digest;
284         }
285
286 void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags)
287         {
288         ctx->flags |= flags;
289         }
290
291 void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags)
292         {
293         ctx->flags &= ~flags;
294         }
295
296 int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags)
297         {
298         return (ctx->flags & flags);
299         }
300
301 void EVP_CIPHER_CTX_set_flags(EVP_CIPHER_CTX *ctx, int flags)
302         {
303         ctx->flags |= flags;
304         }
305
306 void EVP_CIPHER_CTX_clear_flags(EVP_CIPHER_CTX *ctx, int flags)
307         {
308         ctx->flags &= ~flags;
309         }
310
311 int EVP_CIPHER_CTX_test_flags(const EVP_CIPHER_CTX *ctx, int flags)
312         {
313         return (ctx->flags & flags);
314         }