| 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 } |