--- 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; +} +