libidav/crypto.c

changeset 150
37fb12574acd
parent 75
56962faf2b42
child 155
b85248a8aee2
--- 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
+}

mercurial