summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbcook <>2016-09-03 14:54:25 +0000
committerbcook <>2016-09-03 14:54:25 +0000
commit40f86ac072d3c93d1158f96a747042c4e32ca6a2 (patch)
tree7db452907fc08cb3776749169b2f238fa070ae20
parente5cd7ad2410b187a41e6ac216c000a85d90f9dcd (diff)
downloadopenbsd-40f86ac072d3c93d1158f96a747042c4e32ca6a2.tar.gz
openbsd-40f86ac072d3c93d1158f96a747042c4e32ca6a2.tar.bz2
openbsd-40f86ac072d3c93d1158f96a747042c4e32ca6a2.zip
deprecate EVP_EncryptFinal(), EVP_DecryptFinal() and EVP_CipherFinal()
This switches EVP_CipherFinal() to work as EVP_EncryptFinal() and EVP_DecryptFinal() do, always clearing the cipher context on completion. Indicate that, since it is not possible to tell whether this function will clear the context (the API has changed over time in OpenSSL), it is better to use the _ex() variants and explicitly clear instead. ok beck@
-rw-r--r--src/lib/libcrypto/doc/EVP_EncryptInit.pod12
-rw-r--r--src/lib/libcrypto/evp/evp_enc.c18
2 files changed, 23 insertions, 7 deletions
diff --git a/src/lib/libcrypto/doc/EVP_EncryptInit.pod b/src/lib/libcrypto/doc/EVP_EncryptInit.pod
index 02d02ba5f5..e72c101c94 100644
--- a/src/lib/libcrypto/doc/EVP_EncryptInit.pod
+++ b/src/lib/libcrypto/doc/EVP_EncryptInit.pod
@@ -23,7 +23,7 @@ EVP_des_ede3_cfb, EVP_desx_cbc, EVP_rc4, EVP_rc4_40, EVP_idea_cbc,
23EVP_idea_ecb, EVP_idea_cfb, EVP_idea_ofb, EVP_idea_cbc, EVP_rc2_cbc, 23EVP_idea_ecb, EVP_idea_cfb, EVP_idea_ofb, EVP_idea_cbc, EVP_rc2_cbc,
24EVP_rc2_ecb, EVP_rc2_cfb, EVP_rc2_ofb, EVP_rc2_40_cbc, EVP_rc2_64_cbc, 24EVP_rc2_ecb, EVP_rc2_cfb, EVP_rc2_ofb, EVP_rc2_40_cbc, EVP_rc2_64_cbc,
25EVP_bf_cbc, EVP_bf_ecb, EVP_bf_cfb, EVP_bf_ofb, EVP_cast5_cbc, 25EVP_bf_cbc, EVP_bf_ecb, EVP_bf_cfb, EVP_bf_ofb, EVP_cast5_cbc,
26EVP_cast5_ecb, EVP_cast5_cfb, EVP_cast5_ofb, 26EVP_cast5_ecb, EVP_cast5_cfb, EVP_cast5_ofb,
27EVP_aes_128_gcm, EVP_aes_192_gcm, EVP_aes_256_gcm, EVP_aes_128_ccm, 27EVP_aes_128_gcm, EVP_aes_192_gcm, EVP_aes_256_gcm, EVP_aes_128_ccm,
28EVP_aes_192_ccm, EVP_aes_256_ccm, EVP_rc5_32_12_16_cbc, 28EVP_aes_192_ccm, EVP_aes_256_ccm, EVP_rc5_32_12_16_cbc,
29EVP_rc5_32_12_16_cfb, EVP_rc5_32_12_16_ecb, EVP_rc5_32_12_16_ofb 29EVP_rc5_32_12_16_cfb, EVP_rc5_32_12_16_ecb, EVP_rc5_32_12_16_ofb
@@ -168,9 +168,13 @@ initialized and they always use the default cipher implementation.
168 168
169EVP_EncryptFinal(), EVP_DecryptFinal() and EVP_CipherFinal() are 169EVP_EncryptFinal(), EVP_DecryptFinal() and EVP_CipherFinal() are
170identical to EVP_EncryptFinal_ex(), EVP_DecryptFinal_ex() and 170identical to EVP_EncryptFinal_ex(), EVP_DecryptFinal_ex() and
171EVP_CipherFinal_ex(). In previous releases they also used to clean up 171EVP_CipherFinal_ex(). In previous releases of OpenSSL they also used to clean
172the B<ctx>, but this is no longer done and EVP_CIPHER_CTX_clean() 172up the B<ctx>, but this is no longer done and EVP_CIPHER_CTX_clean()
173must be called to free any context resources. 173must be called to free any context resources. As of LibreSSL 2.4,
174EVP_EncryptFinal() and EVP_DecryptFinal() will always clean up, and
175EVP_CipherFinal() also cleans up as of LibreSSL 2.5. The use of
176EVP_EncryptFinal(), EVP_DecryptFinal() and EVP_CipherFinal() is not
177recommended.
174 178
175EVP_get_cipherbyname(), EVP_get_cipherbynid() and EVP_get_cipherbyobj() 179EVP_get_cipherbyname(), EVP_get_cipherbynid() and EVP_get_cipherbyobj()
176return an EVP_CIPHER structure when passed a cipher name, a NID or an 180return an EVP_CIPHER structure when passed a cipher name, a NID or an
diff --git a/src/lib/libcrypto/evp/evp_enc.c b/src/lib/libcrypto/evp/evp_enc.c
index f8d2cb78d4..c89f69c9a2 100644
--- a/src/lib/libcrypto/evp/evp_enc.c
+++ b/src/lib/libcrypto/evp/evp_enc.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: evp_enc.c,v 1.31 2016/05/30 13:42:54 beck Exp $ */ 1/* $OpenBSD: evp_enc.c,v 1.32 2016/09/03 14:54:25 bcook Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -260,13 +260,19 @@ EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
260 return EVP_DecryptFinal_ex(ctx, out, outl); 260 return EVP_DecryptFinal_ex(ctx, out, outl);
261} 261}
262 262
263__warn_references(EVP_CipherFinal,
264 "warning: EVP_CipherFinal is often misused, please use EVP_CipherFinal_ex and EVP_CIPHER_CTX_cleanup");
265
263int 266int
264EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 267EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
265{ 268{
269 int ret;
266 if (ctx->encrypt) 270 if (ctx->encrypt)
267 return EVP_EncryptFinal_ex(ctx, out, outl); 271 ret = EVP_EncryptFinal_ex(ctx, out, outl);
268 else 272 else
269 return EVP_DecryptFinal_ex(ctx, out, outl); 273 ret = EVP_DecryptFinal_ex(ctx, out, outl);
274 (void) EVP_CIPHER_CTX_cleanup(ctx);
275 return ret;
270} 276}
271 277
272int 278int
@@ -365,6 +371,9 @@ EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
365 return 1; 371 return 1;
366} 372}
367 373
374__warn_references(EVP_EncryptFinal,
375 "warning: EVP_EncryptFinal is often misused, please use EVP_EncryptFinal_ex and EVP_CIPHER_CTX_cleanup");
376
368int 377int
369EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 378EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
370{ 379{
@@ -479,6 +488,9 @@ EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
479 return 1; 488 return 1;
480} 489}
481 490
491__warn_references(EVP_DecryptFinal,
492 "warning: EVP_DecryptFinal is often misused, please use EVP_DecryptFinal_ex and EVP_CIPHER_CTX_cleanup");
493
482int 494int
483EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl) 495EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
484{ 496{