diff options
Diffstat (limited to 'src/lib/libcrypto/evp/e_des.c')
-rw-r--r-- | src/lib/libcrypto/evp/e_des.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/src/lib/libcrypto/evp/e_des.c b/src/lib/libcrypto/evp/e_des.c index 46e2899825..856323648c 100644 --- a/src/lib/libcrypto/evp/e_des.c +++ b/src/lib/libcrypto/evp/e_des.c | |||
@@ -63,9 +63,11 @@ | |||
63 | #include <openssl/objects.h> | 63 | #include <openssl/objects.h> |
64 | #include "evp_locl.h" | 64 | #include "evp_locl.h" |
65 | #include <openssl/des.h> | 65 | #include <openssl/des.h> |
66 | #include <openssl/rand.h> | ||
66 | 67 | ||
67 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 68 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
68 | const unsigned char *iv, int enc); | 69 | const unsigned char *iv, int enc); |
70 | static int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); | ||
69 | 71 | ||
70 | /* Because of various casts and different names can't use IMPLEMENT_BLOCK_CIPHER */ | 72 | /* Because of various casts and different names can't use IMPLEMENT_BLOCK_CIPHER */ |
71 | 73 | ||
@@ -127,28 +129,48 @@ static int des_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | |||
127 | } | 129 | } |
128 | 130 | ||
129 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, | 131 | BLOCK_CIPHER_defs(des, DES_key_schedule, NID_des, 8, 8, 8, 64, |
130 | EVP_CIPH_FLAG_FIPS, des_init_key, NULL, | 132 | EVP_CIPH_RAND_KEY, des_init_key, NULL, |
131 | EVP_CIPHER_set_asn1_iv, | 133 | EVP_CIPHER_set_asn1_iv, |
132 | EVP_CIPHER_get_asn1_iv, | 134 | EVP_CIPHER_get_asn1_iv, |
133 | NULL) | 135 | des_ctrl) |
134 | 136 | ||
135 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, | 137 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,1, |
136 | EVP_CIPH_FLAG_FIPS,des_init_key,NULL, | 138 | EVP_CIPH_RAND_KEY, des_init_key,NULL, |
137 | EVP_CIPHER_set_asn1_iv, | 139 | EVP_CIPHER_set_asn1_iv, |
138 | EVP_CIPHER_get_asn1_iv,NULL) | 140 | EVP_CIPHER_get_asn1_iv,des_ctrl) |
139 | 141 | ||
140 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, | 142 | BLOCK_CIPHER_def_cfb(des,DES_key_schedule,NID_des,8,8,8, |
141 | EVP_CIPH_FLAG_FIPS,des_init_key,NULL, | 143 | EVP_CIPH_RAND_KEY,des_init_key,NULL, |
142 | EVP_CIPHER_set_asn1_iv, | 144 | EVP_CIPHER_set_asn1_iv, |
143 | EVP_CIPHER_get_asn1_iv,NULL) | 145 | EVP_CIPHER_get_asn1_iv,des_ctrl) |
144 | 146 | ||
145 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 147 | static int des_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
146 | const unsigned char *iv, int enc) | 148 | const unsigned char *iv, int enc) |
147 | { | 149 | { |
148 | DES_cblock *deskey = (DES_cblock *)key; | 150 | DES_cblock *deskey = (DES_cblock *)key; |
149 | 151 | #ifdef EVP_CHECK_DES_KEY | |
152 | if(DES_set_key_checked(deskey,ctx->cipher_data) != 0) | ||
153 | return 0; | ||
154 | #else | ||
150 | DES_set_key_unchecked(deskey,ctx->cipher_data); | 155 | DES_set_key_unchecked(deskey,ctx->cipher_data); |
156 | #endif | ||
151 | return 1; | 157 | return 1; |
152 | } | 158 | } |
153 | 159 | ||
160 | static int des_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) | ||
161 | { | ||
162 | |||
163 | switch(type) | ||
164 | { | ||
165 | case EVP_CTRL_RAND_KEY: | ||
166 | if (RAND_bytes(ptr, 8) <= 0) | ||
167 | return 0; | ||
168 | DES_set_odd_parity((DES_cblock *)ptr); | ||
169 | return 1; | ||
170 | |||
171 | default: | ||
172 | return -1; | ||
173 | } | ||
174 | } | ||
175 | |||
154 | #endif | 176 | #endif |