X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fopenssl%2Fcipher.c;h=08b81de702e3521959d6aea3cbf56a4275aa5429;hb=bcac314fe2d758e85335d499dbb4300bfa8a599e;hp=974fbeb2e9966e1d189fa6c7737aa63aa1e1a025;hpb=2b0aeec02d64bb4724da9ff1dbc19b7d35d7c904;p=tinc diff --git a/src/openssl/cipher.c b/src/openssl/cipher.c index 974fbeb2..08b81de7 100644 --- a/src/openssl/cipher.c +++ b/src/openssl/cipher.c @@ -25,45 +25,38 @@ #include "../cipher.h" #include "../logger.h" -#include "../xalloc.h" -struct cipher { - EVP_CIPHER_CTX *ctx; - const EVP_CIPHER *cipher; -}; - -static cipher_t *cipher_open(const EVP_CIPHER *evp_cipher) { - cipher_t *cipher = xzalloc(sizeof(*cipher)); +static void cipher_open(cipher_t *cipher, const EVP_CIPHER *evp_cipher) { cipher->cipher = evp_cipher; cipher->ctx = EVP_CIPHER_CTX_new(); if(!cipher->ctx) { abort(); } - - return cipher; } -cipher_t *cipher_open_by_name(const char *name) { +bool cipher_open_by_name(cipher_t *cipher, const char *name) { const EVP_CIPHER *evp_cipher = EVP_get_cipherbyname(name); if(!evp_cipher) { logger(DEBUG_ALWAYS, LOG_ERR, "Unknown cipher name '%s'!", name); - return NULL; + return false; } - return cipher_open(evp_cipher); + cipher_open(cipher, evp_cipher); + return true; } -cipher_t *cipher_open_by_nid(int nid) { +bool cipher_open_by_nid(cipher_t *cipher, int nid) { const EVP_CIPHER *evp_cipher = EVP_get_cipherbynid(nid); if(!evp_cipher) { logger(DEBUG_ALWAYS, LOG_ERR, "Unknown cipher nid %d!", nid); - return NULL; + return false; } - return cipher_open(evp_cipher); + cipher_open(cipher, evp_cipher); + return true; } void cipher_close(cipher_t *cipher) { @@ -71,8 +64,11 @@ void cipher_close(cipher_t *cipher) { return; } - EVP_CIPHER_CTX_free(cipher->ctx); - free(cipher); + if(cipher->ctx) { + EVP_CIPHER_CTX_free(cipher->ctx); + } + + memset(cipher, 0, sizeof(*cipher)); } size_t cipher_keylength(const cipher_t *cipher) { @@ -149,7 +145,7 @@ bool cipher_encrypt(cipher_t *cipher, const void *indata, size_t inlen, void *ou int len, pad; if(EVP_EncryptInit_ex(cipher->ctx, NULL, NULL, NULL, NULL) - && EVP_EncryptUpdate(cipher->ctx, (unsigned char *)outdata, &len, indata, inlen) + && EVP_EncryptUpdate(cipher->ctx, (unsigned char *)outdata, &len, indata, (int)inlen) && EVP_EncryptFinal_ex(cipher->ctx, (unsigned char *)outdata + len, &pad)) { if(outlen) { *outlen = len + pad; @@ -160,7 +156,7 @@ bool cipher_encrypt(cipher_t *cipher, const void *indata, size_t inlen, void *ou } else { int len; - if(EVP_EncryptUpdate(cipher->ctx, outdata, &len, indata, inlen)) { + if(EVP_EncryptUpdate(cipher->ctx, outdata, &len, indata, (int)inlen)) { if(outlen) { *outlen = len; } @@ -178,7 +174,7 @@ bool cipher_decrypt(cipher_t *cipher, const void *indata, size_t inlen, void *ou int len, pad; if(EVP_DecryptInit_ex(cipher->ctx, NULL, NULL, NULL, NULL) - && EVP_DecryptUpdate(cipher->ctx, (unsigned char *)outdata, &len, indata, inlen) + && EVP_DecryptUpdate(cipher->ctx, (unsigned char *)outdata, &len, indata, (int)inlen) && EVP_DecryptFinal_ex(cipher->ctx, (unsigned char *)outdata + len, &pad)) { if(outlen) { *outlen = len + pad; @@ -189,7 +185,7 @@ bool cipher_decrypt(cipher_t *cipher, const void *indata, size_t inlen, void *ou } else { int len; - if(EVP_DecryptUpdate(cipher->ctx, outdata, &len, indata, inlen)) { + if(EVP_DecryptUpdate(cipher->ctx, outdata, &len, indata, (int)inlen)) { if(outlen) { *outlen = len; }