test/crypto.c

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

mercurial