OLD | NEW |
1 /* crypto/evp/e_des3.c */ | 1 /* crypto/evp/e_des3.c */ |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | 2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) |
3 * All rights reserved. | 3 * All rights reserved. |
4 * | 4 * |
5 * This package is an SSL implementation written | 5 * This package is an SSL implementation written |
6 * by Eric Young (eay@cryptsoft.com). | 6 * by Eric Young (eay@cryptsoft.com). |
7 * The implementation was written so as to conform with Netscapes SSL. | 7 * The implementation was written so as to conform with Netscapes SSL. |
8 * | 8 * |
9 * This library is free for commercial and non-commercial use as long as | 9 * This library is free for commercial and non-commercial use as long as |
10 * the following conditions are aheared to. The following conditions | 10 * the following conditions are aheared to. The following conditions |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
78 DES_key_schedule ks1;/* key schedule */ | 78 DES_key_schedule ks1;/* key schedule */ |
79 DES_key_schedule ks2;/* key schedule (for ede) */ | 79 DES_key_schedule ks2;/* key schedule (for ede) */ |
80 DES_key_schedule ks3;/* key schedule (for ede3) */ | 80 DES_key_schedule ks3;/* key schedule (for ede3) */ |
81 } DES_EDE_KEY; | 81 } DES_EDE_KEY; |
82 | 82 |
83 #define data(ctx) ((DES_EDE_KEY *)(ctx)->cipher_data) | 83 #define data(ctx) ((DES_EDE_KEY *)(ctx)->cipher_data) |
84 | 84 |
85 /* Because of various casts and different args can't use IMPLEMENT_BLOCK_CIPHER
*/ | 85 /* Because of various casts and different args can't use IMPLEMENT_BLOCK_CIPHER
*/ |
86 | 86 |
87 static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 87 static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
88 » » » const unsigned char *in, unsigned int inl) | 88 » » » const unsigned char *in, size_t inl) |
89 { | 89 { |
90 BLOCK_CIPHER_ecb_loop() | 90 BLOCK_CIPHER_ecb_loop() |
91 DES_ecb3_encrypt((const_DES_cblock *)(in + i), | 91 DES_ecb3_encrypt((const_DES_cblock *)(in + i), |
92 (DES_cblock *)(out + i), | 92 (DES_cblock *)(out + i), |
93 &data(ctx)->ks1, &data(ctx)->ks2, | 93 &data(ctx)->ks1, &data(ctx)->ks2, |
94 &data(ctx)->ks3, | 94 &data(ctx)->ks3, |
95 ctx->encrypt); | 95 ctx->encrypt); |
96 return 1; | 96 return 1; |
97 } | 97 } |
98 | 98 |
99 static int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 99 static int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
100 » » » const unsigned char *in, unsigned int inl) | 100 » » » const unsigned char *in, size_t inl) |
101 { | 101 { |
102 » DES_ede3_ofb64_encrypt(in, out, (long)inl, | 102 » if (inl>=EVP_MAXCHUNK) |
| 103 » » { |
| 104 » » DES_ede3_ofb64_encrypt(in, out, (long)EVP_MAXCHUNK, |
103 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3
, | 105 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3
, |
104 (DES_cblock *)ctx->iv, &ctx->num); | 106 (DES_cblock *)ctx->iv, &ctx->num); |
| 107 inl-=EVP_MAXCHUNK; |
| 108 in +=EVP_MAXCHUNK; |
| 109 out+=EVP_MAXCHUNK; |
| 110 } |
| 111 if (inl) |
| 112 DES_ede3_ofb64_encrypt(in, out, (long)inl, |
| 113 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks
3, |
| 114 (DES_cblock *)ctx->iv, &ctx->num); |
| 115 |
105 return 1; | 116 return 1; |
106 } | 117 } |
107 | 118 |
108 static int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 119 static int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
109 » » » const unsigned char *in, unsigned int inl) | 120 » » » const unsigned char *in, size_t inl) |
110 { | 121 { |
111 #ifdef KSSL_DEBUG | 122 #ifdef KSSL_DEBUG |
112 { | 123 { |
113 int i; | 124 int i; |
114 » printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", (unsigned long)ctx, c
tx->buf_len); | 125 char *cp; |
| 126 » printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", ctx, ctx->buf_len); |
115 printf("\t iv= "); | 127 printf("\t iv= "); |
116 for(i=0;i<8;i++) | 128 for(i=0;i<8;i++) |
117 printf("%02X",ctx->iv[i]); | 129 printf("%02X",ctx->iv[i]); |
118 printf("\n"); | 130 printf("\n"); |
119 } | 131 } |
120 #endif /* KSSL_DEBUG */ | 132 #endif /* KSSL_DEBUG */ |
121 » DES_ede3_cbc_encrypt(in, out, (long)inl, | 133 » if (inl>=EVP_MAXCHUNK) |
| 134 » » { |
| 135 » » DES_ede3_cbc_encrypt(in, out, (long)EVP_MAXCHUNK, |
122 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, | 136 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, |
123 (DES_cblock *)ctx->iv, ctx->encrypt); | 137 (DES_cblock *)ctx->iv, ctx->encrypt); |
| 138 inl-=EVP_MAXCHUNK; |
| 139 in +=EVP_MAXCHUNK; |
| 140 out+=EVP_MAXCHUNK; |
| 141 } |
| 142 if (inl) |
| 143 DES_ede3_cbc_encrypt(in, out, (long)inl, |
| 144 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, |
| 145 (DES_cblock *)ctx->iv, ctx->encrypt); |
124 return 1; | 146 return 1; |
125 } | 147 } |
126 | 148 |
127 static int des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 149 static int des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
128 » » » const unsigned char *in, unsigned int inl) | 150 » » » const unsigned char *in, size_t inl) |
129 { | 151 { |
130 » DES_ede3_cfb64_encrypt(in, out, (long)inl, | 152 » if (inl>=EVP_MAXCHUNK) |
| 153 » » { |
| 154 » » DES_ede3_cfb64_encrypt(in, out, (long)EVP_MAXCHUNK, |
131 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3
, | 155 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3
, |
132 (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); | 156 (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); |
| 157 inl-=EVP_MAXCHUNK; |
| 158 in +=EVP_MAXCHUNK; |
| 159 out+=EVP_MAXCHUNK; |
| 160 } |
| 161 if (inl) |
| 162 DES_ede3_cfb64_encrypt(in, out, (long)inl, |
| 163 &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3
, |
| 164 (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt); |
133 return 1; | 165 return 1; |
134 } | 166 } |
135 | 167 |
136 /* Although we have a CFB-r implementation for 3-DES, it doesn't pack the right | 168 /* Although we have a CFB-r implementation for 3-DES, it doesn't pack the right |
137 way, so wrap it here */ | 169 way, so wrap it here */ |
138 static int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 170 static int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
139 » » » » const unsigned char *in, unsigned int inl) | 171 » » » » const unsigned char *in, size_t inl) |
140 { | 172 { |
141 unsigned int n; | 173 size_t n; |
142 unsigned char c[1],d[1]; | 174 unsigned char c[1],d[1]; |
143 | 175 |
144 for(n=0 ; n < inl ; ++n) | 176 for(n=0 ; n < inl ; ++n) |
145 { | 177 { |
146 c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; | 178 c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0; |
147 DES_ede3_cfb_encrypt(c,d,1,1, | 179 DES_ede3_cfb_encrypt(c,d,1,1, |
148 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, | 180 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, |
149 (DES_cblock *)ctx->iv,ctx->encrypt); | 181 (DES_cblock *)ctx->iv,ctx->encrypt); |
150 » out[n/8]=(out[n/8]&~(0x80 >> (n%8)))|((d[0]&0x80) >> (n%8)); | 182 » out[n/8]=(out[n/8]&~(0x80 >> (unsigned int)(n%8))) | |
| 183 » » ((d[0]&0x80) >> (unsigned int)(n%8)); |
151 } | 184 } |
152 | 185 |
153 return 1; | 186 return 1; |
154 } | 187 } |
155 | 188 |
156 static int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, | 189 static int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, |
157 » » » » const unsigned char *in, unsigned int inl) | 190 » » » » const unsigned char *in, size_t inl) |
158 { | 191 { |
159 DES_ede3_cfb_encrypt(in,out,8,inl, | 192 while (inl>=EVP_MAXCHUNK) |
| 193 » { |
| 194 » DES_ede3_cfb_encrypt(in,out,8,(long)EVP_MAXCHUNK, |
160 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, | 195 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, |
161 (DES_cblock *)ctx->iv,ctx->encrypt); | 196 (DES_cblock *)ctx->iv,ctx->encrypt); |
| 197 inl-=EVP_MAXCHUNK; |
| 198 in +=EVP_MAXCHUNK; |
| 199 out+=EVP_MAXCHUNK; |
| 200 } |
| 201 if (inl) |
| 202 DES_ede3_cfb_encrypt(in,out,8,(long)inl, |
| 203 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3, |
| 204 (DES_cblock *)ctx->iv,ctx->encrypt); |
162 return 1; | 205 return 1; |
163 } | 206 } |
164 | 207 |
165 BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, | 208 BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, |
166 » » EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, | 209 » » » EVP_CIPH_RAND_KEY, des_ede_init_key, NULL, |
167 » » » des_ede_init_key, | 210 » » » EVP_CIPHER_set_asn1_iv, |
168 » » » NULL, NULL, NULL, | 211 » » » EVP_CIPHER_get_asn1_iv, |
169 des3_ctrl) | 212 des3_ctrl) |
170 | 213 |
171 #define des_ede3_cfb64_cipher des_ede_cfb64_cipher | 214 #define des_ede3_cfb64_cipher des_ede_cfb64_cipher |
172 #define des_ede3_ofb_cipher des_ede_ofb_cipher | 215 #define des_ede3_ofb_cipher des_ede_ofb_cipher |
173 #define des_ede3_cbc_cipher des_ede_cbc_cipher | 216 #define des_ede3_cbc_cipher des_ede_cbc_cipher |
174 #define des_ede3_ecb_cipher des_ede_ecb_cipher | 217 #define des_ede3_ecb_cipher des_ede_ecb_cipher |
175 | 218 |
176 BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, | 219 BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, |
177 » » EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, | 220 » » » EVP_CIPH_RAND_KEY, des_ede3_init_key, NULL, |
178 » » » des_ede3_init_key, | 221 » » » EVP_CIPHER_set_asn1_iv, |
179 » » » NULL, NULL, NULL, | 222 » » » EVP_CIPHER_get_asn1_iv, |
180 des3_ctrl) | 223 des3_ctrl) |
181 | 224 |
182 BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, | 225 BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, |
183 » » EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, | 226 » » EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, |
184 » » des_ede3_init_key, | 227 » » EVP_CIPHER_set_asn1_iv, |
185 » » NULL, NULL, NULL, | 228 » » EVP_CIPHER_get_asn1_iv, |
186 des3_ctrl) | 229 des3_ctrl) |
187 | 230 |
188 BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, | 231 BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, |
189 » » EVP_CIPH_RAND_KEY|EVP_CIPH_FLAG_FIPS|EVP_CIPH_FLAG_DEFAULT_ASN1, | 232 » » EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL, |
190 » » des_ede3_init_key, | 233 » » EVP_CIPHER_set_asn1_iv, |
191 » » NULL, NULL, NULL, | 234 » » EVP_CIPHER_get_asn1_iv, |
192 des3_ctrl) | 235 des3_ctrl) |
193 | 236 |
194 static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 237 static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
195 const unsigned char *iv, int enc) | 238 const unsigned char *iv, int enc) |
196 { | 239 { |
197 DES_cblock *deskey = (DES_cblock *)key; | 240 DES_cblock *deskey = (DES_cblock *)key; |
198 #ifdef EVP_CHECK_DES_KEY | 241 #ifdef EVP_CHECK_DES_KEY |
199 if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) | 242 if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) |
200 !! DES_set_key_checked(&deskey[1],&data(ctx)->ks2)) | 243 !! DES_set_key_checked(&deskey[1],&data(ctx)->ks2)) |
201 return 0; | 244 return 0; |
202 #else | 245 #else |
203 DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1); | 246 DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1); |
204 DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2); | 247 DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2); |
205 #endif | 248 #endif |
206 memcpy(&data(ctx)->ks3,&data(ctx)->ks1, | 249 memcpy(&data(ctx)->ks3,&data(ctx)->ks1, |
207 sizeof(data(ctx)->ks1)); | 250 sizeof(data(ctx)->ks1)); |
208 return 1; | 251 return 1; |
209 } | 252 } |
210 | 253 |
211 static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, | 254 static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, |
212 const unsigned char *iv, int enc) | 255 const unsigned char *iv, int enc) |
213 { | 256 { |
214 DES_cblock *deskey = (DES_cblock *)key; | 257 DES_cblock *deskey = (DES_cblock *)key; |
215 #ifdef KSSL_DEBUG | 258 #ifdef KSSL_DEBUG |
216 { | 259 { |
217 int i; | 260 int i; |
218 printf("des_ede3_init_key(ctx=%lx)\n", (unsigned long)ctx); | 261 printf("des_ede3_init_key(ctx=%lx)\n", ctx); |
219 printf("\tKEY= "); | 262 printf("\tKEY= "); |
220 for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n"); | 263 for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n"); |
221 printf("\t IV= "); | 264 printf("\t IV= "); |
222 for(i=0;i<8;i++) printf("%02X",iv[i]); printf("\n"); | 265 for(i=0;i<8;i++) printf("%02X",iv[i]); printf("\n"); |
223 } | 266 } |
224 #endif /* KSSL_DEBUG */ | 267 #endif /* KSSL_DEBUG */ |
225 | 268 |
226 #ifdef EVP_CHECK_DES_KEY | 269 #ifdef EVP_CHECK_DES_KEY |
227 if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) | 270 if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1) |
228 || DES_set_key_checked(&deskey[1],&data(ctx)->ks2) | 271 || DES_set_key_checked(&deskey[1],&data(ctx)->ks2) |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 const EVP_CIPHER *EVP_des_ede(void) | 304 const EVP_CIPHER *EVP_des_ede(void) |
262 { | 305 { |
263 return &des_ede_ecb; | 306 return &des_ede_ecb; |
264 } | 307 } |
265 | 308 |
266 const EVP_CIPHER *EVP_des_ede3(void) | 309 const EVP_CIPHER *EVP_des_ede3(void) |
267 { | 310 { |
268 return &des_ede3_ecb; | 311 return &des_ede3_ecb; |
269 } | 312 } |
270 #endif | 313 #endif |
OLD | NEW |