diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib/libcrypto/evp/evp_test.c | 143 |
1 files changed, 80 insertions, 63 deletions
diff --git a/src/lib/libcrypto/evp/evp_test.c b/src/lib/libcrypto/evp/evp_test.c index decd0713d6..90294ef686 100644 --- a/src/lib/libcrypto/evp/evp_test.c +++ b/src/lib/libcrypto/evp/evp_test.c | |||
@@ -118,18 +118,20 @@ static char *sstrsep(char **string, const char *delim) | |||
118 | } | 118 | } |
119 | 119 | ||
120 | static unsigned char *ustrsep(char **p,const char *sep) | 120 | static unsigned char *ustrsep(char **p,const char *sep) |
121 | { return (unsigned char *)sstrsep((char **)p,sep); } | 121 | { return (unsigned char *)sstrsep(p,sep); } |
122 | 122 | ||
123 | static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn, | 123 | static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn, |
124 | const unsigned char *iv,int in, | 124 | const unsigned char *iv,int in, |
125 | const unsigned char *plaintext,int pn, | 125 | const unsigned char *plaintext,int pn, |
126 | const unsigned char *ciphertext,int cn) | 126 | const unsigned char *ciphertext,int cn, |
127 | int encdec) | ||
127 | { | 128 | { |
128 | EVP_CIPHER_CTX ctx; | 129 | EVP_CIPHER_CTX ctx; |
129 | unsigned char out[4096]; | 130 | unsigned char out[4096]; |
130 | int outl,outl2; | 131 | int outl,outl2; |
131 | 132 | ||
132 | printf("Testing cipher %s\n",EVP_CIPHER_name(c)); | 133 | printf("Testing cipher %s%s\n",EVP_CIPHER_name(c), |
134 | (encdec == 1 ? "(encrypt)" : (encdec == 0 ? "(decrypt)" : "(encrypt/decrypt)"))); | ||
133 | hexdump(stdout,"Key",key,kn); | 135 | hexdump(stdout,"Key",key,kn); |
134 | if(in) | 136 | if(in) |
135 | hexdump(stdout,"IV",iv,in); | 137 | hexdump(stdout,"IV",iv,in); |
@@ -143,70 +145,76 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn, | |||
143 | exit(5); | 145 | exit(5); |
144 | } | 146 | } |
145 | EVP_CIPHER_CTX_init(&ctx); | 147 | EVP_CIPHER_CTX_init(&ctx); |
146 | if(!EVP_EncryptInit_ex(&ctx,c,NULL,key,iv)) | 148 | if (encdec != 0) |
147 | { | 149 | { |
148 | fprintf(stderr,"EncryptInit failed\n"); | 150 | if(!EVP_EncryptInit_ex(&ctx,c,NULL,key,iv)) |
149 | exit(10); | 151 | { |
150 | } | 152 | fprintf(stderr,"EncryptInit failed\n"); |
151 | EVP_CIPHER_CTX_set_padding(&ctx,0); | 153 | exit(10); |
154 | } | ||
155 | EVP_CIPHER_CTX_set_padding(&ctx,0); | ||
152 | 156 | ||
153 | if(!EVP_EncryptUpdate(&ctx,out,&outl,plaintext,pn)) | 157 | if(!EVP_EncryptUpdate(&ctx,out,&outl,plaintext,pn)) |
154 | { | 158 | { |
155 | fprintf(stderr,"Encrypt failed\n"); | 159 | fprintf(stderr,"Encrypt failed\n"); |
156 | exit(6); | 160 | exit(6); |
157 | } | 161 | } |
158 | if(!EVP_EncryptFinal_ex(&ctx,out+outl,&outl2)) | 162 | if(!EVP_EncryptFinal_ex(&ctx,out+outl,&outl2)) |
159 | { | 163 | { |
160 | fprintf(stderr,"EncryptFinal failed\n"); | 164 | fprintf(stderr,"EncryptFinal failed\n"); |
161 | exit(7); | 165 | exit(7); |
162 | } | 166 | } |
163 | 167 | ||
164 | if(outl+outl2 != cn) | 168 | if(outl+outl2 != cn) |
165 | { | 169 | { |
166 | fprintf(stderr,"Ciphertext length mismatch got %d expected %d\n", | 170 | fprintf(stderr,"Ciphertext length mismatch got %d expected %d\n", |
167 | outl+outl2,cn); | 171 | outl+outl2,cn); |
168 | exit(8); | 172 | exit(8); |
169 | } | 173 | } |
170 | 174 | ||
171 | if(memcmp(out,ciphertext,cn)) | 175 | if(memcmp(out,ciphertext,cn)) |
172 | { | 176 | { |
173 | fprintf(stderr,"Ciphertext mismatch\n"); | 177 | fprintf(stderr,"Ciphertext mismatch\n"); |
174 | hexdump(stderr,"Got",out,cn); | 178 | hexdump(stderr,"Got",out,cn); |
175 | hexdump(stderr,"Expected",ciphertext,cn); | 179 | hexdump(stderr,"Expected",ciphertext,cn); |
176 | exit(9); | 180 | exit(9); |
181 | } | ||
177 | } | 182 | } |
178 | 183 | ||
179 | if(!EVP_DecryptInit_ex(&ctx,c,NULL,key,iv)) | 184 | if (encdec <= 0) |
180 | { | 185 | { |
181 | fprintf(stderr,"DecryptInit failed\n"); | 186 | if(!EVP_DecryptInit_ex(&ctx,c,NULL,key,iv)) |
182 | exit(11); | 187 | { |
183 | } | 188 | fprintf(stderr,"DecryptInit failed\n"); |
184 | EVP_CIPHER_CTX_set_padding(&ctx,0); | 189 | exit(11); |
190 | } | ||
191 | EVP_CIPHER_CTX_set_padding(&ctx,0); | ||
185 | 192 | ||
186 | if(!EVP_DecryptUpdate(&ctx,out,&outl,ciphertext,pn)) | 193 | if(!EVP_DecryptUpdate(&ctx,out,&outl,ciphertext,cn)) |
187 | { | 194 | { |
188 | fprintf(stderr,"Decrypt failed\n"); | 195 | fprintf(stderr,"Decrypt failed\n"); |
189 | exit(6); | 196 | exit(6); |
190 | } | 197 | } |
191 | if(!EVP_DecryptFinal_ex(&ctx,out+outl,&outl2)) | 198 | if(!EVP_DecryptFinal_ex(&ctx,out+outl,&outl2)) |
192 | { | 199 | { |
193 | fprintf(stderr,"DecryptFinal failed\n"); | 200 | fprintf(stderr,"DecryptFinal failed\n"); |
194 | exit(7); | 201 | exit(7); |
195 | } | 202 | } |
196 | 203 | ||
197 | if(outl+outl2 != cn) | 204 | if(outl+outl2 != cn) |
198 | { | 205 | { |
199 | fprintf(stderr,"Plaintext length mismatch got %d expected %d\n", | 206 | fprintf(stderr,"Plaintext length mismatch got %d expected %d\n", |
200 | outl+outl2,cn); | 207 | outl+outl2,cn); |
201 | exit(8); | 208 | exit(8); |
202 | } | 209 | } |
203 | 210 | ||
204 | if(memcmp(out,plaintext,cn)) | 211 | if(memcmp(out,plaintext,cn)) |
205 | { | 212 | { |
206 | fprintf(stderr,"Plaintext mismatch\n"); | 213 | fprintf(stderr,"Plaintext mismatch\n"); |
207 | hexdump(stderr,"Got",out,cn); | 214 | hexdump(stderr,"Got",out,cn); |
208 | hexdump(stderr,"Expected",plaintext,cn); | 215 | hexdump(stderr,"Expected",plaintext,cn); |
209 | exit(9); | 216 | exit(9); |
217 | } | ||
210 | } | 218 | } |
211 | 219 | ||
212 | EVP_CIPHER_CTX_cleanup(&ctx); | 220 | EVP_CIPHER_CTX_cleanup(&ctx); |
@@ -217,7 +225,8 @@ static void test1(const EVP_CIPHER *c,const unsigned char *key,int kn, | |||
217 | static int test_cipher(const char *cipher,const unsigned char *key,int kn, | 225 | static int test_cipher(const char *cipher,const unsigned char *key,int kn, |
218 | const unsigned char *iv,int in, | 226 | const unsigned char *iv,int in, |
219 | const unsigned char *plaintext,int pn, | 227 | const unsigned char *plaintext,int pn, |
220 | const unsigned char *ciphertext,int cn) | 228 | const unsigned char *ciphertext,int cn, |
229 | int encdec) | ||
221 | { | 230 | { |
222 | const EVP_CIPHER *c; | 231 | const EVP_CIPHER *c; |
223 | 232 | ||
@@ -225,7 +234,7 @@ static int test_cipher(const char *cipher,const unsigned char *key,int kn, | |||
225 | if(!c) | 234 | if(!c) |
226 | return 0; | 235 | return 0; |
227 | 236 | ||
228 | test1(c,key,kn,iv,in,plaintext,pn,ciphertext,cn); | 237 | test1(c,key,kn,iv,in,plaintext,pn,ciphertext,cn,encdec); |
229 | 238 | ||
230 | return 1; | 239 | return 1; |
231 | } | 240 | } |
@@ -332,6 +341,7 @@ int main(int argc,char **argv) | |||
332 | char *p; | 341 | char *p; |
333 | char *cipher; | 342 | char *cipher; |
334 | unsigned char *iv,*key,*plaintext,*ciphertext; | 343 | unsigned char *iv,*key,*plaintext,*ciphertext; |
344 | int encdec; | ||
335 | int kn,in,pn,cn; | 345 | int kn,in,pn,cn; |
336 | 346 | ||
337 | if(!fgets((char *)line,sizeof line,f)) | 347 | if(!fgets((char *)line,sizeof line,f)) |
@@ -343,14 +353,21 @@ int main(int argc,char **argv) | |||
343 | key=ustrsep(&p,":"); | 353 | key=ustrsep(&p,":"); |
344 | iv=ustrsep(&p,":"); | 354 | iv=ustrsep(&p,":"); |
345 | plaintext=ustrsep(&p,":"); | 355 | plaintext=ustrsep(&p,":"); |
346 | ciphertext=ustrsep(&p,"\n"); | 356 | ciphertext=ustrsep(&p,":"); |
357 | if (p[-1] == '\n') { | ||
358 | p[-1] = '\0'; | ||
359 | encdec = -1; | ||
360 | } else { | ||
361 | encdec = atoi(sstrsep(&p,"\n")); | ||
362 | } | ||
363 | |||
347 | 364 | ||
348 | kn=convert(key); | 365 | kn=convert(key); |
349 | in=convert(iv); | 366 | in=convert(iv); |
350 | pn=convert(plaintext); | 367 | pn=convert(plaintext); |
351 | cn=convert(ciphertext); | 368 | cn=convert(ciphertext); |
352 | 369 | ||
353 | if(!test_cipher(cipher,key,kn,iv,in,plaintext,pn,ciphertext,cn) | 370 | if(!test_cipher(cipher,key,kn,iv,in,plaintext,pn,ciphertext,cn,encdec) |
354 | && !test_digest(cipher,plaintext,pn,ciphertext,cn)) | 371 | && !test_digest(cipher,plaintext,pn,ciphertext,cn)) |
355 | { | 372 | { |
356 | fprintf(stderr,"Can't find %s\n",cipher); | 373 | fprintf(stderr,"Can't find %s\n",cipher); |