libidav/crypto.c

changeset 470
6bf798ad3aec
parent 462
efda9aa1bbad
child 478
baa63fef5c5c
equal deleted inserted replaced
469:6ab1f4ad2835 470:6bf798ad3aec
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 }

mercurial