OpenSSL
1.0.1c
Main Page
Classes
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
crypto
evp
p5_crpt.c
Go to the documentation of this file.
1
/* p5_crpt.c */
2
/* Written by Dr Stephen N Henson (
[email protected]
) for the OpenSSL
3
* project 1999.
4
*/
5
/* ====================================================================
6
* Copyright (c) 1999 The OpenSSL Project. All rights reserved.
7
*
8
* Redistribution and use in source and binary forms, with or without
9
* modification, are permitted provided that the following conditions
10
* are met:
11
*
12
* 1. Redistributions of source code must retain the above copyright
13
* notice, this list of conditions and the following disclaimer.
14
*
15
* 2. Redistributions in binary form must reproduce the above copyright
16
* notice, this list of conditions and the following disclaimer in
17
* the documentation and/or other materials provided with the
18
* distribution.
19
*
20
* 3. All advertising materials mentioning features or use of this
21
* software must display the following acknowledgment:
22
* "This product includes software developed by the OpenSSL Project
23
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24
*
25
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26
* endorse or promote products derived from this software without
27
* prior written permission. For written permission, please contact
28
*
[email protected]
.
29
*
30
* 5. Products derived from this software may not be called "OpenSSL"
31
* nor may "OpenSSL" appear in their names without prior written
32
* permission of the OpenSSL Project.
33
*
34
* 6. Redistributions of any form whatsoever must retain the following
35
* acknowledgment:
36
* "This product includes software developed by the OpenSSL Project
37
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38
*
39
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50
* OF THE POSSIBILITY OF SUCH DAMAGE.
51
* ====================================================================
52
*
53
* This product includes cryptographic software written by Eric Young
54
* (
[email protected]
). This product includes software written by Tim
55
* Hudson (
[email protected]
).
56
*
57
*/
58
59
#include <stdio.h>
60
#include <stdlib.h>
61
#include "
cryptlib.h
"
62
#include <
openssl/x509.h
>
63
#include <
openssl/evp.h
>
64
65
/* Doesn't do anything now: Builtin PBE algorithms in static table.
66
*/
67
68
void
PKCS5_PBE_add
(
void
)
69
{
70
}
71
72
int
PKCS5_PBE_keyivgen
(
EVP_CIPHER_CTX
*cctx,
const
char
*
pass
,
int
passlen
,
73
ASN1_TYPE
*param,
const
EVP_CIPHER
*cipher,
const
EVP_MD
*md,
74
int
en_de)
75
{
76
EVP_MD_CTX
ctx;
77
unsigned
char
md_tmp[
EVP_MAX_MD_SIZE
];
78
unsigned
char
key
[
EVP_MAX_KEY_LENGTH
], iv[
EVP_MAX_IV_LENGTH
];
79
int
i;
80
PBEPARAM
*pbe;
81
int
saltlen, iter;
82
unsigned
char
*salt;
83
const
unsigned
char
*pbuf;
84
int
mdsize;
85
int
rv = 0;
86
EVP_MD_CTX_init
(&ctx);
87
88
/* Extract useful info from parameter */
89
if
(param == NULL || param->
type
!=
V_ASN1_SEQUENCE
||
90
param->
value
.
sequence
== NULL) {
91
EVPerr
(
EVP_F_PKCS5_PBE_KEYIVGEN
,
EVP_R_DECODE_ERROR
);
92
return
0;
93
}
94
95
pbuf = param->
value
.
sequence
->
data
;
96
if
(!(pbe = d2i_PBEPARAM(NULL, &pbuf, param->
value
.
sequence
->
length
))) {
97
EVPerr
(
EVP_F_PKCS5_PBE_KEYIVGEN
,
EVP_R_DECODE_ERROR
);
98
return
0;
99
}
100
101
if
(!pbe->
iter
) iter = 1;
102
else
iter =
ASN1_INTEGER_get
(pbe->
iter
);
103
salt = pbe->
salt
->
data
;
104
saltlen = pbe->
salt
->
length
;
105
106
if
(!pass) passlen = 0;
107
else
if
(passlen == -1) passlen = strlen(pass);
108
109
if
(!
EVP_DigestInit_ex
(&ctx, md, NULL))
110
goto
err;
111
if
(!
EVP_DigestUpdate
(&ctx, pass, passlen))
112
goto
err;
113
if
(!
EVP_DigestUpdate
(&ctx, salt, saltlen))
114
goto
err;
115
PBEPARAM_free(pbe);
116
if
(!
EVP_DigestFinal_ex
(&ctx, md_tmp, NULL))
117
goto
err;
118
mdsize =
EVP_MD_size
(md);
119
if
(mdsize < 0)
120
return
0;
121
for
(i = 1; i < iter; i++) {
122
if
(!
EVP_DigestInit_ex
(&ctx, md, NULL))
123
goto
err;
124
if
(!
EVP_DigestUpdate
(&ctx, md_tmp, mdsize))
125
goto
err;
126
if
(!
EVP_DigestFinal_ex
(&ctx, md_tmp, NULL))
127
goto
err;
128
}
129
OPENSSL_assert
(
EVP_CIPHER_key_length
(cipher) <= (
int
)
sizeof
(md_tmp));
130
memcpy(key, md_tmp,
EVP_CIPHER_key_length
(cipher));
131
OPENSSL_assert
(
EVP_CIPHER_iv_length
(cipher) <= 16);
132
memcpy(iv, md_tmp + (16 -
EVP_CIPHER_iv_length
(cipher)),
133
EVP_CIPHER_iv_length
(cipher));
134
if
(!
EVP_CipherInit_ex
(cctx, cipher, NULL, key, iv, en_de))
135
goto
err;
136
OPENSSL_cleanse
(md_tmp,
EVP_MAX_MD_SIZE
);
137
OPENSSL_cleanse
(key,
EVP_MAX_KEY_LENGTH
);
138
OPENSSL_cleanse
(iv,
EVP_MAX_IV_LENGTH
);
139
rv = 1;
140
err:
141
EVP_MD_CTX_cleanup
(&ctx);
142
return
rv;
143
}
Generated on Thu Jan 10 2013 09:53:37 for OpenSSL by
1.8.2