test/crypto.c

branch
dav-2
changeset 879
255a5ef46400
parent 816
839fefbdedc7
child 886
da79af4baec8
equal deleted inserted replaced
878:68ea3a0fe66f 879:255a5ef46400
190 keys128[i].type = DAV_KEY_AES128; 190 keys128[i].type = DAV_KEY_AES128;
191 keys128[i].data = data[i]; 191 keys128[i].data = data[i];
192 } 192 }
193 } 193 }
194 194
195 UCX_TEST(test_util_decrypt_str_k) { 195 CX_TEST(test_util_decrypt_str_k) {
196 create_keys(); 196 create_keys();
197 197
198 DavContext *ctx = dav_context_new(); 198 DavContext *ctx = dav_context_new();
199 DavSession *sn = dav_session_new(ctx, "http://localhost/"); 199 DavSession *sn = dav_session_new(ctx, "http://localhost/");
200 200
201 UCX_TEST_BEGIN; 201 CX_TEST_DO {
202 202 for(int k=0;k<2;k++) {
203 for(int k=0;k<2;k++) { 203 for(int i=0;i<20;i++) {
204 for(int i=0;i<20;i++) { 204 char *c1;
205 char *c1; 205 char *c2;
206 char *c2; 206 if(k == 0) {
207 if(k == 0) { 207 c1 = cryptkey0aes128strings[i];
208 c1 = cryptkey0aes128strings[i]; 208 c2 = cryptkey0aes256strings[i];
209 c2 = cryptkey0aes256strings[i]; 209 } else {
210 } else { 210 c1 = cryptkey1aes128strings[i];
211 c1 = cryptkey1aes128strings[i]; 211 c2 = cryptkey1aes256strings[i];
212 c2 = cryptkey1aes256strings[i]; 212 }
213
214 char *s128 = util_decrypt_str_k(sn, c1, &keys128[k]);
215 char *s256 = util_decrypt_str_k(sn, c2, &keys256[k]);
216
217 CX_TEST_ASSERT(!strcmp(s128, strings[i]));
218 CX_TEST_ASSERT(!strcmp(s256, strings[i]));
213 } 219 }
214
215 char *s128 = util_decrypt_str_k(sn, c1, &keys128[k]);
216 char *s256 = util_decrypt_str_k(sn, c2, &keys256[k]);
217
218 UCX_TEST_ASSERT(!strcmp(s128, strings[i]), "s128 wrong");
219 UCX_TEST_ASSERT(!strcmp(s256, strings[i]), "s256 wrong");
220 } 220 }
221 } 221 }
222 222
223 UCX_TEST_END;
224
225 dav_context_destroy(ctx); 223 dav_context_destroy(ctx);
226 } 224 }
227 225
228 UCX_TEST(test_util_encrypt_str_k) { 226 CX_TEST(test_util_encrypt_str_k) {
229 DavContext *ctx = dav_context_new(); 227 DavContext *ctx = dav_context_new();
230 DavSession *sn = dav_session_new(ctx, "http://localhost/"); 228 DavSession *sn = dav_session_new(ctx, "http://localhost/");
231 229
232 UCX_TEST_BEGIN; 230 CX_TEST_DO {
233 231 for(int k=0;k<16;k++) {
234 for(int k=0;k<16;k++) { 232 for(int i=0;i<20;i++) {
235 for(int i=0;i<20;i++) { 233 char *aes128 = util_encrypt_str_k(sn, strings[i], &keys128[k]);
236 char *aes128 = util_encrypt_str_k(sn, strings[i], &keys128[k]); 234 char *aes256 = util_encrypt_str_k(sn, strings[i], &keys256[k]);
237 char *aes256 = util_encrypt_str_k(sn, strings[i], &keys256[k]); 235
238 236 char *dec1 = util_decrypt_str_k(sn, aes128, &keys128[k]);
239 char *dec1 = util_decrypt_str_k(sn, aes128, &keys128[k]); 237 char *dec2 = util_decrypt_str_k(sn, aes256, &keys256[k]);
240 char *dec2 = util_decrypt_str_k(sn, aes256, &keys256[k]); 238
241 239 CX_TEST_ASSERT(!strcmp(dec1, strings[i]));
242 UCX_TEST_ASSERT(!strcmp(dec1, strings[i]), "aes128 encrypt failed"); 240 CX_TEST_ASSERT(!strcmp(dec2, strings[i]));
243 UCX_TEST_ASSERT(!strcmp(dec2, strings[i]), "aes256 encrypt failed"); 241 }
244 } 242 }
245 } 243 }
246 244 }
247 UCX_TEST_END; 245
248 } 246 CX_TEST(test_crypto_buffer) {
249 247 CX_TEST_DO {
250 UCX_TEST(test_crypto_buffer) { 248 for(int i=0;i<32;i++) {
251 UCX_TEST_BEGIN; 249 DavKey *key = i < 16 ? &keys256[i] : &keys128[i%16];
252 250
253 for(int i=0;i<32;i++) { 251 for(int j=0;j<20;j++) {
254 DavKey *key = i < 16 ? &keys256[i] : &keys128[i%16]; 252 CxBuffer *content = cxBufferCreate(NULL, 256, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
255 253 cxBufferPutString(content, strings[j]);
256 for(int j=0;j<20;j++) { 254 content->pos = 0;
257 CxBuffer *content = cxBufferCreate(NULL, 256, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); 255
258 cxBufferPutString(content, strings[j]); 256 CxBuffer *enc = aes_encrypt_buffer(content, key);
259 content->pos = 0; 257 CX_TEST_ASSERT(enc->size >= content->size + 16);
260 258
261 CxBuffer *enc = aes_encrypt_buffer(content, key); 259 char *base64 = util_base64encode(enc->space, enc->size);
262 UCX_TEST_ASSERT(enc->size >= content->size + 16, "aes_encrypt_buffer failed"); 260 size_t plainlen = 0;
263 261 char *plain = aes_decrypt(base64, &plainlen, key);
264 char *base64 = util_base64encode(enc->space, enc->size); 262
265 size_t plainlen = 0; 263 CX_TEST_ASSERT(plain);
266 char *plain = aes_decrypt(base64, &plainlen, key); 264 CX_TEST_ASSERT(plainlen == content->size);
267 265 CX_TEST_ASSERT(!memcmp(plain, content->space, plainlen));
268 UCX_TEST_ASSERT(plain, "aes_decrypt failed"); 266
269 UCX_TEST_ASSERT(plainlen == content->size, "aes_decrypt: wrong length"); 267 CxBuffer *dec = aes_decrypt_buffer(enc, key);
270 UCX_TEST_ASSERT(!memcmp(plain, content->space, plainlen), "aes_decrypt: wrong content"); 268 CX_TEST_ASSERT(dec->size == content->size);
271 269
272 CxBuffer *dec = aes_decrypt_buffer(enc, key); 270 CX_TEST_ASSERT(!memcmp(content->space, dec->space, dec->size));
273 UCX_TEST_ASSERT(dec->size == content->size, "aes_decrypt_buffer failed"); 271
274 272 cxBufferFree(content);
275 UCX_TEST_ASSERT(!memcmp(content->space, dec->space, dec->size), "decrypted buffer has wrong content"); 273 cxBufferFree(enc);
276 274 cxBufferFree(dec);
277 cxBufferFree(content); 275 free(base64);
278 cxBufferFree(enc); 276 free(plain);
279 cxBufferFree(dec); 277 }
280 free(base64);
281 free(plain);
282 } 278 }
283 } 279 }
284 280 }
285 UCX_TEST_END; 281
286 } 282 CX_TEST(test_crypto_stream) {
287
288 UCX_TEST(test_crypto_stream) {
289 CxBuffer *data = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); 283 CxBuffer *data = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
290 CxBuffer *cbuf = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); 284 CxBuffer *cbuf = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
291 CxBuffer *pbuf = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND); 285 CxBuffer *pbuf = cxBufferCreate(NULL, 1024, cxDefaultAllocator, CX_BUFFER_FREE_CONTENTS|CX_BUFFER_AUTO_EXTEND);
292 286
293 UCX_TEST_BEGIN; 287 CX_TEST_DO {
294 288 for(int i=0;i<32;i++) {
295 for(int i=0;i<32;i++) { 289 DavKey *key = i < 16 ? &keys256[i] : &keys128[i%16];
296 DavKey *key = i < 16 ? &keys256[i] : &keys128[i%16]; 290 for(int j=0;j<20;j++) {
297 for(int j=0;j<20;j++) { 291 data->pos = 0;
298 data->pos = 0; 292 data->size = 0;
299 data->size = 0; 293 size_t slen = strlen(strings[j]);
300 size_t slen = strlen(strings[j]); 294 cxBufferWrite(strings[j], 1, slen, data);
301 cxBufferWrite(strings[j], 1, slen, data); 295 cxBufferSeek(data, 0, SEEK_SET);
302 cxBufferSeek(data, 0, SEEK_SET); 296
303 297 cbuf->pos = 0;
304 cbuf->pos = 0; 298 cbuf->size = 0;
305 cbuf->size = 0; 299 pbuf->pos = 0;
306 pbuf->pos = 0; 300 pbuf->size = 0;
307 pbuf->size = 0; 301
308 302 AESEncrypter *enc = aes_encrypter_new(key, data, (dav_read_func)cxBufferRead, NULL);
309 AESEncrypter *enc = aes_encrypter_new(key, data, (dav_read_func)cxBufferRead, NULL); 303 char buf[1024];
310 char buf[1024]; 304 size_t r = 0;
311 size_t r = 0; 305 while((r = aes_read(buf, 1, 1024, enc)) != 0) {
312 while((r = aes_read(buf, 1, 1024, enc)) != 0) { 306 cxBufferWrite(buf, 1, r, cbuf);
313 cxBufferWrite(buf, 1, r, cbuf); 307 }
308 aes_encrypter_close(enc);
309
310 AESDecrypter *dec = aes_decrypter_new(key, pbuf, (dav_write_func)cxBufferWrite);
311 aes_write(cbuf->space, 1, cbuf->pos, dec);
312 aes_decrypter_shutdown(dec);
313 aes_decrypter_close(dec);
314
315 CX_TEST_ASSERT(slen == pbuf->pos);
316 CX_TEST_ASSERT(!memcmp(strings[j], pbuf->space, slen));
317
318 data->pos = 0;
319 CxBuffer *enc2 = aes_encrypt_buffer(data, key);
320 CxBuffer *dec2 = aes_decrypt_buffer(enc2, key);
321
322 CX_TEST_ASSERT(dec2->size == data->size);
323 CX_TEST_ASSERT(!memcmp(strings[j], dec2->space, dec2->size));
314 } 324 }
315 aes_encrypter_close(enc);
316
317 AESDecrypter *dec = aes_decrypter_new(key, pbuf, (dav_write_func)cxBufferWrite);
318 aes_write(cbuf->space, 1, cbuf->pos, dec);
319 aes_decrypter_shutdown(dec);
320 aes_decrypter_close(dec);
321
322 UCX_TEST_ASSERT(slen == pbuf->pos, "wrong length after enc-dec");
323 UCX_TEST_ASSERT(!memcmp(strings[j], pbuf->space, slen), "wrong content after enc-dec");
324
325 data->pos = 0;
326 CxBuffer *enc2 = aes_encrypt_buffer(data, key);
327 CxBuffer *dec2 = aes_decrypt_buffer(enc2, key);
328
329 UCX_TEST_ASSERT(dec2->size == data->size, "dec2 has wrong size");
330 UCX_TEST_ASSERT(!memcmp(strings[j], dec2->space, dec2->size), "dec2 has wrong content");
331 } 325 }
332 } 326 }
333
334 UCX_TEST_END;
335 } 327 }
336 328
337 static char *pws[] = { 329 static char *pws[] = {
338 "1234", 330 "1234",
339 "abdefgh", 331 "abdefgh",
416 { 252, 208, 199, 95, 179, 33, 229, 155, 159, 226, 234, 213, 21, 83, 30, 206 }, 408 { 252, 208, 199, 95, 179, 33, 229, 155, 159, 226, 234, 213, 21, 83, 30, 206 },
417 { 252, 208, 199, 95, 179, 33, 229, 155, 159, 226, 234, 213, 21, 83, 30, 206, 174, 151, 174, 207, 58, 169, 148, 244, 37, 88, 44, 46, 72, 172, 15, 214 } 409 { 252, 208, 199, 95, 179, 33, 229, 155, 159, 226, 234, 213, 21, 83, 30, 206, 174, 151, 174, 207, 58, 169, 148, 244, 37, 88, 44, 46, 72, 172, 15, 214 }
418 }; 410 };
419 411
420 412
421 UCX_TEST(test_dav_pw2key) { 413 CX_TEST(test_dav_pw2key) {
422 414
423 415 CX_TEST_DO {
424 UCX_TEST_BEGIN; 416
425 417 for(int p=0;p<4;p++) {
426 for(int p=0;p<4;p++) { 418 for(int s=0;s<4;s++) {
427 for(int s=0;s<4;s++) { 419 DavKey *keys[4];
428 DavKey *keys[4]; 420 keys[0] = dav_pw2key(
429 keys[0] = dav_pw2key( 421 pws[p],
430 pws[p], 422 salt[s],
431 salt[s], 423 saltlen[s],
432 saltlen[s], 424 DAV_PWFUNC_PBKDF2_SHA256,
433 DAV_PWFUNC_PBKDF2_SHA256, 425 DAV_KEY_AES128);
434 DAV_KEY_AES128); 426 keys[1] = dav_pw2key(
435 keys[1] = dav_pw2key( 427 pws[p],
436 pws[p], 428 salt[s],
437 salt[s], 429 saltlen[s],
438 saltlen[s], 430 DAV_PWFUNC_PBKDF2_SHA256,
439 DAV_PWFUNC_PBKDF2_SHA256, 431 DAV_KEY_AES256);
440 DAV_KEY_AES256); 432 keys[2] = dav_pw2key(
441 keys[2] = dav_pw2key( 433 pws[p],
442 pws[p], 434 salt[s],
443 salt[s], 435 saltlen[s],
444 saltlen[s], 436 DAV_PWFUNC_PBKDF2_SHA512,
445 DAV_PWFUNC_PBKDF2_SHA512, 437 DAV_KEY_AES128);
446 DAV_KEY_AES128); 438 keys[3] = dav_pw2key(
447 keys[3] = dav_pw2key( 439 pws[p],
448 pws[p], 440 salt[s],
449 salt[s], 441 saltlen[s],
450 saltlen[s], 442 DAV_PWFUNC_PBKDF2_SHA512,
451 DAV_PWFUNC_PBKDF2_SHA512, 443 DAV_KEY_AES256);
452 DAV_KEY_AES256); 444
453 445 for(int i=0;i<4;i++) {
454 for(int i=0;i<4;i++) { 446 DavKey *key = keys[i];
455 DavKey *key = keys[i]; 447
456 448 int index = 16*p + 4*s + i;
457 int index = 16*p + 4*s + i; 449 int keylen = index % 2 == 0 ? 16 : 32;
458 int keylen = index % 2 == 0 ? 16 : 32; 450
459 451 CX_TEST_ASSERT(key);
460 UCX_TEST_ASSERT(key, "no key"); 452 CX_TEST_ASSERT(keylen == key->length);
461 UCX_TEST_ASSERT(keylen == key->length, "wrong key length"); 453 CX_TEST_ASSERT(!memcmp(key->data, pwgenkeys[index], keylen));
462 UCX_TEST_ASSERT(!memcmp(key->data, pwgenkeys[index], keylen), "wrong key data"); 454 }
463 } 455 }
464 } 456 }
465 } 457
466 458 }
467 UCX_TEST_END; 459 }
468 }

mercurial