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