dav/crypto.c

changeset 39
3e55bed345f9
parent 11
5db6178d8b58
--- a/dav/crypto.c	Tue Sep 03 12:08:35 2013 +0200
+++ b/dav/crypto.c	Sat Sep 07 14:08:43 2013 +0200
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <openssl/rand.h>
 
+#include <libidav/utils.h>
 #include "crypto.h"
 
 AESDecrypter* aes_decrypter_new(Key *key, void *stream, dav_write_func write_func) {
@@ -192,3 +193,76 @@
     EVP_CIPHER_CTX_cleanup(&enc->ctx);
     free(enc);
 }
+
+
+char* aes_encrypt(char *in, Key *key) {
+    char *iv = malloc(16);
+    if(!RAND_bytes(iv, 16)) {
+        free(iv);
+        return NULL;
+    }
+    
+    EVP_CIPHER_CTX ctx;
+    EVP_CIPHER_CTX_init(&ctx);
+    if(key->type == KEY_AES128) {
+        EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key->data, iv);
+    } else if(key->type == KEY_AES256) {
+        EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, key->data, iv);
+    } else {
+        return NULL;
+    }
+    
+    int len = strlen(in);
+    int buflen = len + 64;
+    char *buf = calloc(1, buflen);
+    memcpy(buf, iv, 16);
+    
+    int l = buflen - 16;
+    EVP_EncryptUpdate(&ctx, buf + 16, &l, in, len);
+    
+    int f = 0;
+    EVP_EncryptFinal_ex(&ctx, buf + 16 + l, &f);
+    char *out = util_base64encode(buf, 16 + l + f);
+    free(buf);
+    return out;
+}
+
+char* aes_decrypt(char *in, Key *key) {
+    int len;
+    char *buf = util_base64decode_len(in, &len);
+    
+    EVP_CIPHER_CTX ctx;
+    EVP_CIPHER_CTX_init(&ctx);
+    if(key->type == KEY_AES128) {
+        EVP_DecryptInit_ex(
+                &ctx,
+                EVP_aes_128_cbc(),
+                NULL,
+                key->data,
+                buf);
+    } else if(key->type == KEY_AES256) {
+        EVP_DecryptInit_ex(
+                &ctx,
+                EVP_aes_256_cbc(),
+                NULL,
+                key->data,
+                buf);
+    } else {
+        return NULL;
+    }
+    
+    char *out = malloc(len + 1);
+    int outlen = len;
+    char *in_buf = buf + 16;
+    int inlen = len - 16;
+    int f = 0;
+    
+    
+    
+    EVP_DecryptUpdate(&ctx, out, &outlen, in_buf, inlen);
+    EVP_DecryptFinal_ex(&ctx, out + outlen, &f);
+    out[outlen + f] = '\0';
+    free(buf);
+    return out;
+}
+

mercurial