summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/evp/e_des3.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/evp/e_des3.c')
-rw-r--r--src/lib/libcrypto/evp/e_des3.c95
1 files changed, 69 insertions, 26 deletions
diff --git a/src/lib/libcrypto/evp/e_des3.c b/src/lib/libcrypto/evp/e_des3.c
index f910af19b1..3232cfe024 100644
--- a/src/lib/libcrypto/evp/e_des3.c
+++ b/src/lib/libcrypto/evp/e_des3.c
@@ -85,7 +85,7 @@ typedef struct
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
87static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 87static 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),
@@ -97,48 +97,80 @@ static int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
97} 97}
98 98
99static int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 99static 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)->ks3,
114 (DES_cblock *)ctx->iv, &ctx->num);
115
105 return 1; 116 return 1;
106} 117}
107 118
108static int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 119static 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, ctx->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
127static int des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 149static 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 */
138static int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 170static 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)
@@ -147,25 +179,36 @@ static int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
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
156static int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, 189static 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
165BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64, 208BLOCK_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
@@ -174,21 +217,21 @@ BLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64,
174#define des_ede3_ecb_cipher des_ede_ecb_cipher 217#define des_ede3_ecb_cipher des_ede_ecb_cipher
175 218
176BLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64, 219BLOCK_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
182BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1, 225BLOCK_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
188BLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8, 231BLOCK_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
194static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 237static int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
@@ -215,7 +258,7 @@ static int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *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= ");