summaryrefslogtreecommitdiff
path: root/usr.sbin/smtpd
diff options
context:
space:
mode:
authorGilles Chehade <gilles@cvs.openbsd.org>2019-05-24 18:01:53 +0000
committerGilles Chehade <gilles@cvs.openbsd.org>2019-05-24 18:01:53 +0000
commit8af5963cfa85cda0d709b183eac0e7cf4c7d7cfe (patch)
treef58831e8ae54a36970ca81c95c12feef1a00d125 /usr.sbin/smtpd
parented0acc7f603cc3c9884321e78c647de706fa11f8 (diff)
switch from having automatic EVP_CIPHER_CTX variables to allocating them
with EVP_CIPHER_CTX_new() and releasing them with EVP_CIPHER_CTX_free(). ok sunil@ and millert@
Diffstat (limited to 'usr.sbin/smtpd')
-rw-r--r--usr.sbin/smtpd/crypto.c69
1 files changed, 40 insertions, 29 deletions
diff --git a/usr.sbin/smtpd/crypto.c b/usr.sbin/smtpd/crypto.c
index 1cc1af7c7a6..39576f71a80 100644
--- a/usr.sbin/smtpd/crypto.c
+++ b/usr.sbin/smtpd/crypto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: crypto.c,v 1.6 2016/09/03 14:42:08 gilles Exp $ */
+/* $OpenBSD: crypto.c,v 1.7 2019/05/24 18:01:52 gilles Exp $ */
/*
* Copyright (c) 2013 Gilles Chehade <gilles@openbsd.org>
@@ -62,7 +62,7 @@ crypto_setup(const char *key, size_t len)
int
crypto_encrypt_file(FILE * in, FILE * out)
{
- EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX *ctx;
uint8_t ibuf[CRYPTO_BUFFER_SIZE];
uint8_t obuf[CRYPTO_BUFFER_SIZE];
uint8_t iv[IV_SIZE];
@@ -89,12 +89,15 @@ crypto_encrypt_file(FILE * in, FILE * out)
if ((w = fwrite(iv, 1, sizeof iv, out)) != sizeof iv)
return 0;
- EVP_CIPHER_CTX_init(&ctx);
- EVP_EncryptInit_ex(&ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
+ ctx = EVP_CIPHER_CTX_new();
+ if (ctx == NULL)
+ return 0;
+
+ EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
/* encrypt until end of file */
while ((r = fread(ibuf, 1, CRYPTO_BUFFER_SIZE, in)) != 0) {
- if (!EVP_EncryptUpdate(&ctx, obuf, &len, ibuf, r))
+ if (!EVP_EncryptUpdate(ctx, obuf, &len, ibuf, r))
goto end;
if (len && (w = fwrite(obuf, len, 1, out)) != 1)
goto end;
@@ -103,13 +106,13 @@ crypto_encrypt_file(FILE * in, FILE * out)
goto end;
/* finalize and write last chunk if any */
- if (!EVP_EncryptFinal_ex(&ctx, obuf, &len))
+ if (!EVP_EncryptFinal_ex(ctx, obuf, &len))
goto end;
if (len && (w = fwrite(obuf, len, 1, out)) != 1)
goto end;
/* get and append tag */
- EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, sizeof tag, tag);
+ EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, sizeof tag, tag);
if ((w = fwrite(tag, sizeof tag, 1, out)) != 1)
goto end;
@@ -117,14 +120,14 @@ crypto_encrypt_file(FILE * in, FILE * out)
ret = 1;
end:
- EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
return ret;
}
int
crypto_decrypt_file(FILE * in, FILE * out)
{
- EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX *ctx;
uint8_t ibuf[CRYPTO_BUFFER_SIZE];
uint8_t obuf[CRYPTO_BUFFER_SIZE];
uint8_t iv[IV_SIZE];
@@ -168,12 +171,14 @@ crypto_decrypt_file(FILE * in, FILE * out)
sz -= sizeof iv;
sz -= sizeof tag;
+ ctx = EVP_CIPHER_CTX_new();
+ if (ctx == NULL)
+ return 0;
- EVP_CIPHER_CTX_init(&ctx);
- EVP_DecryptInit_ex(&ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
+ EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
/* set expected tag */
- EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, sizeof tag, tag);
+ EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, sizeof tag, tag);
/* decrypt until end of ciphertext */
while (sz) {
@@ -183,7 +188,7 @@ crypto_decrypt_file(FILE * in, FILE * out)
r = fread(ibuf, 1, sz, in);
if (!r)
break;
- if (!EVP_DecryptUpdate(&ctx, obuf, &len, ibuf, r))
+ if (!EVP_DecryptUpdate(ctx, obuf, &len, ibuf, r))
goto end;
if (len && (w = fwrite(obuf, len, 1, out)) != 1)
goto end;
@@ -193,7 +198,7 @@ crypto_decrypt_file(FILE * in, FILE * out)
goto end;
/* finalize, write last chunk if any and perform authentication check */
- if (!EVP_DecryptFinal_ex(&ctx, obuf, &len))
+ if (!EVP_DecryptFinal_ex(ctx, obuf, &len))
goto end;
if (len && (w = fwrite(obuf, len, 1, out)) != 1)
goto end;
@@ -202,14 +207,14 @@ crypto_decrypt_file(FILE * in, FILE * out)
ret = 1;
end:
- EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
return ret;
}
size_t
crypto_encrypt_buffer(const char *in, size_t inlen, char *out, size_t outlen)
{
- EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX *ctx;
uint8_t iv[IV_SIZE];
uint8_t tag[GCM_TAG_SIZE];
uint8_t version = API_VERSION;
@@ -237,33 +242,36 @@ crypto_encrypt_buffer(const char *in, size_t inlen, char *out, size_t outlen)
memcpy(out + len, iv, sizeof iv);
len += sizeof iv;
- EVP_CIPHER_CTX_init(&ctx);
- EVP_EncryptInit_ex(&ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
+ ctx = EVP_CIPHER_CTX_new();
+ if (ctx == NULL)
+ return 0;
+
+ EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
/* encrypt buffer */
- if (!EVP_EncryptUpdate(&ctx, out + len, &olen, in, inlen))
+ if (!EVP_EncryptUpdate(ctx, out + len, &olen, in, inlen))
goto end;
len += olen;
/* finalize and write last chunk if any */
- if (!EVP_EncryptFinal_ex(&ctx, out + len, &olen))
+ if (!EVP_EncryptFinal_ex(ctx, out + len, &olen))
goto end;
len += olen;
/* get and append tag */
- EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_GET_TAG, sizeof tag, tag);
+ EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, sizeof tag, tag);
memcpy(out + len, tag, sizeof tag);
ret = len + sizeof tag;
end:
- EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
return ret;
}
size_t
crypto_decrypt_buffer(const char *in, size_t inlen, char *out, size_t outlen)
{
- EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX *ctx;
uint8_t iv[IV_SIZE];
uint8_t tag[GCM_TAG_SIZE];
int olen;
@@ -290,24 +298,27 @@ crypto_decrypt_buffer(const char *in, size_t inlen, char *out, size_t outlen)
inlen -= sizeof iv;
in += sizeof iv;
- EVP_CIPHER_CTX_init(&ctx);
- EVP_DecryptInit_ex(&ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
+ ctx = EVP_CIPHER_CTX_new();
+ if (ctx == NULL)
+ return 0;
+
+ EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, cp.key, iv);
/* set expected tag */
- EVP_CIPHER_CTX_ctrl(&ctx, EVP_CTRL_GCM_SET_TAG, sizeof tag, tag);
+ EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, sizeof tag, tag);
/* decrypt buffer */
- if (!EVP_DecryptUpdate(&ctx, out, &olen, in, inlen))
+ if (!EVP_DecryptUpdate(ctx, out, &olen, in, inlen))
goto end;
len += olen;
/* finalize, write last chunk if any and perform authentication check */
- if (!EVP_DecryptFinal_ex(&ctx, out + len, &olen))
+ if (!EVP_DecryptFinal_ex(ctx, out + len, &olen))
goto end;
ret = len + olen;
end:
- EVP_CIPHER_CTX_cleanup(&ctx);
+ EVP_CIPHER_CTX_free(ctx);
return ret;
}