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