diff -r 509e9e1cbdcc -r 37fb12574acd libidav/crypto.c --- a/libidav/crypto.c Sat Oct 03 20:10:54 2015 +0200 +++ b/libidav/crypto.c Sun Oct 04 15:57:40 2015 +0200 @@ -36,6 +36,7 @@ AESDecrypter* aes_decrypter_new(DavKey *key, void *stream, dav_write_func write_func) { AESDecrypter *dec = malloc(sizeof(AESDecrypter)); + SHA256_Init(&dec->sha256); dec->stream = stream; dec->write = write_func; dec->key = key; @@ -89,7 +90,8 @@ int outlen = len + 16; unsigned char *out = malloc(outlen); EVP_DecryptUpdate(&dec->ctx, out, &len, buf, len); - dec->write(out, 1, len, dec->stream); + ssize_t wlen = dec->write(out, 1, len, dec->stream); + SHA256_Update(&dec->sha256, out, wlen); free(out); return (s*n) / s; } @@ -113,13 +115,13 @@ } AESEncrypter *enc = malloc(sizeof(AESEncrypter)); + SHA256_Init(&enc->sha256); enc->stream = stream; enc->read = read_func; enc->tmp = NULL; enc->tmplen = 0; enc->tmpoff = 0; enc->end = 0; - //enc->iv = iv; enc->iv = iv; enc->ivlen = 16; @@ -158,6 +160,8 @@ void *in = malloc(len); size_t in_len = enc->read(in, 1, len, enc->stream); + SHA256_Update(&enc->sha256, in, in_len); + unsigned char *out = NULL; int outlen = 0; size_t ivl = enc->ivlen; @@ -173,12 +177,14 @@ out = malloc(16); EVP_EncryptFinal_ex(&enc->ctx, out, &outlen); enc->end = 1; + free(in); } enc->tmp = (char*)out; enc->tmplen = outlen + ivl; enc->tmpoff = 0; if(enc->iv) { + free(enc->iv); enc->iv = NULL; enc->ivlen = 0; } @@ -190,12 +196,15 @@ if(enc->tmp) { free(enc->tmp); } + if(enc->iv) { + free(enc->iv); + } EVP_CIPHER_CTX_cleanup(&enc->ctx); free(enc); } -char* aes_encrypt(char *in, DavKey *key) { +char* aes_encrypt(char *in, size_t len, DavKey *key) { unsigned char iv[16]; if(!RAND_bytes(iv, 16)) { return NULL; @@ -218,10 +227,11 @@ (unsigned char*)key->data, iv); } else { + EVP_CIPHER_CTX_cleanup(&ctx); return NULL; } - int len = strlen(in); + //int len = strlen(in); int buflen = len + 64; unsigned char *buf = calloc(1, buflen); memcpy(buf, iv, 16); @@ -233,10 +243,12 @@ EVP_EncryptFinal_ex(&ctx, buf + 16 + l, &f); char *out = util_base64encode((char*)buf, 16 + l + f); free(buf); + EVP_CIPHER_CTX_cleanup(&ctx); + return out; } -char* aes_decrypt(char *in, DavKey *key) { +char* aes_decrypt(char *in, size_t *length, DavKey *key) { int len; unsigned char *buf = (unsigned char*)util_base64decode_len(in, &len); @@ -257,6 +269,7 @@ key->data, buf); } else { + EVP_CIPHER_CTX_cleanup(&ctx); return NULL; } @@ -270,5 +283,17 @@ EVP_DecryptFinal_ex(&ctx, out + outlen, &f); out[outlen + f] = '\0'; free(buf); + EVP_CIPHER_CTX_cleanup(&ctx); + + *length = outlen + f; return (char*)out; } + + +void dav_get_hash(SHA256_CTX *sha256, char *buf) { +#ifdef __sun + SHA256Final(buf, sha256); +#else + SHA256_Final(buf, sha256); +#endif +}