54 #define EVP_CIPHER_CTX_new() create_evp_cipher_ctx() |
54 #define EVP_CIPHER_CTX_new() create_evp_cipher_ctx() |
55 #define EVP_CIPHER_CTX_free(ctx) free_evp_cipher_ctx(ctx) |
55 #define EVP_CIPHER_CTX_free(ctx) free_evp_cipher_ctx(ctx) |
56 |
56 |
57 #endif |
57 #endif |
58 |
58 |
|
59 int dav_rand_bytes(unsigned char *buf, size_t len) { |
|
60 return !RAND_bytes(buf, len); |
|
61 } |
|
62 |
59 AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { |
63 AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { |
60 AESDecrypter *dec = calloc(1, sizeof(AESDecrypter)); |
64 AESDecrypter *dec = calloc(1, sizeof(AESDecrypter)); |
61 SHA256_Init(&dec->sha256); |
65 SHA256_Init(&dec->sha256); |
62 dec->stream = stream; |
66 dec->stream = stream; |
63 dec->write = write_func; |
67 dec->write = write_func; |
110 } |
114 } |
111 } |
115 } |
112 |
116 |
113 int outlen = len + 16; |
117 int outlen = len + 16; |
114 unsigned char *out = malloc(outlen); |
118 unsigned char *out = malloc(outlen); |
115 EVP_DecryptUpdate(dec->ctx, out, &len, buf, len); |
119 EVP_DecryptUpdate(dec->ctx, out, &outlen, buf, len); |
116 ssize_t wlen = dec->write(out, 1, len, dec->stream); |
120 ssize_t wlen = dec->write(out, 1, outlen, dec->stream); |
117 SHA256_Update(&dec->sha256, out, wlen); |
121 SHA256_Update(&dec->sha256, out, wlen); |
118 free(out); |
122 free(out); |
119 return (s*n) / s; |
123 return (s*n) / s; |
120 } |
124 } |
121 |
125 |
342 unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
346 unsigned char hash[DAV_SHA256_DIGEST_LENGTH]; |
343 SHA256((const unsigned char*)data, len, hash); |
347 SHA256((const unsigned char*)data, len, hash); |
344 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
348 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
345 } |
349 } |
346 |
350 |
|
351 DavKey* dav_pw2key(const char *password, const char *salt, int saltlen, int pwfunc, int enc) { |
|
352 if(!password) { |
|
353 return NULL; |
|
354 } |
|
355 size_t len = strlen(password); |
|
356 if(len == 0) { |
|
357 return NULL; |
|
358 } |
|
359 |
|
360 // setup key data and length |
|
361 unsigned char keydata[32]; |
|
362 int keylen = 32; |
|
363 switch(enc) { |
|
364 case DAV_KEY_AES128: keylen = 16; break; |
|
365 case DAV_KEY_AES256: keylen = 32; break; |
|
366 default: return NULL; |
|
367 } |
|
368 |
|
369 // generate key |
|
370 switch(pwfunc) { |
|
371 case DAV_PWFUNC_PBKDF2_SHA256: { |
|
372 PKCS5_PBKDF2_HMAC( |
|
373 password, |
|
374 len, |
|
375 salt, |
|
376 saltlen, |
|
377 DAV_CRYPTO_ITERATION_COUNT, |
|
378 EVP_sha256(), |
|
379 keylen, |
|
380 keydata); |
|
381 break; |
|
382 } |
|
383 case DAV_PWFUNC_PBKDF2_SHA512: { |
|
384 PKCS5_PBKDF2_HMAC( |
|
385 password, |
|
386 len, |
|
387 salt, |
|
388 saltlen, |
|
389 DAV_CRYPTO_ITERATION_COUNT, |
|
390 EVP_sha512(), |
|
391 keylen, |
|
392 keydata); |
|
393 break; |
|
394 } |
|
395 default: return NULL; |
|
396 } |
|
397 |
|
398 // create DavKey with generated data |
|
399 DavKey *key = malloc(sizeof(DavKey)); |
|
400 key->data = malloc(keylen); |
|
401 key->length = keylen; |
|
402 key->name = NULL; |
|
403 key->type = enc; |
|
404 memcpy(key->data, keydata, keylen); |
|
405 return key; |
|
406 } |
|
407 |
347 #endif |
408 #endif |
348 |
409 |
349 |
410 |
350 /* -------------------- Apple Crypto Functions -------------------- */ |
411 /* -------------------- Apple Crypto Functions -------------------- */ |
351 #ifdef __APPLE__ |
412 #ifdef __APPLE__ |
695 CC_SHA256((const unsigned char*)data, len, hash); |
756 CC_SHA256((const unsigned char*)data, len, hash); |
696 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
757 return util_hexstr(hash, DAV_SHA256_DIGEST_LENGTH); |
697 } |
758 } |
698 |
759 |
699 #endif |
760 #endif |
|
761 |
|
762 UcxBuffer* aes_encrypt_buffer(UcxBuffer *in, DavKey *key) { |
|
763 UcxBuffer *encbuf = ucx_buffer_new( |
|
764 NULL, |
|
765 in->size+16, |
|
766 UCX_BUFFER_AUTOEXTEND); |
|
767 |
|
768 AESEncrypter *enc = aes_encrypter_new( |
|
769 key, |
|
770 in, |
|
771 (dav_read_func)ucx_buffer_read); |
|
772 if(!enc) { |
|
773 ucx_buffer_free(encbuf); |
|
774 return NULL; |
|
775 } |
|
776 |
|
777 char buf[1024]; |
|
778 size_t r; |
|
779 while((r = aes_read(buf, 1, 1024, enc)) > 0) { |
|
780 ucx_buffer_write(buf, 1, r, encbuf); |
|
781 } |
|
782 aes_encrypter_close(enc); |
|
783 |
|
784 encbuf->pos = 0; |
|
785 return encbuf; |
|
786 } |
|
787 |
|
788 UcxBuffer* aes_decrypt_buffer(UcxBuffer *in, DavKey *key) { |
|
789 UcxBuffer *decbuf = ucx_buffer_new( |
|
790 NULL, |
|
791 in->size, |
|
792 UCX_BUFFER_AUTOEXTEND); |
|
793 AESDecrypter *dec = aes_decrypter_new( |
|
794 key, |
|
795 decbuf, |
|
796 (dav_write_func)ucx_buffer_write); |
|
797 |
|
798 aes_write(in->space, 1, in->size, dec); |
|
799 aes_decrypter_shutdown(dec); |
|
800 aes_decrypter_close(dec); |
|
801 decbuf->pos = 0; |
|
802 return decbuf; |
|
803 } |