aboutsummaryrefslogtreecommitdiff
path: root/crypto/evp/cmeth_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/evp/cmeth_lib.c')
-rw-r--r--crypto/evp/cmeth_lib.c64
1 files changed, 57 insertions, 7 deletions
diff --git a/crypto/evp/cmeth_lib.c b/crypto/evp/cmeth_lib.c
index 272e48249e42..a806ec5f9e22 100644
--- a/crypto/evp/cmeth_lib.c
+++ b/crypto/evp/cmeth_lib.c
@@ -1,59 +1,91 @@
/*
- * Copyright 2015-2016 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2015-2021 The OpenSSL Project Authors. All Rights Reserved.
*
- * Licensed under the OpenSSL license (the "License"). You may not use
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
* in the file LICENSE in the source distribution or at
* https://www.openssl.org/source/license.html
*/
+/*
+ * EVP _meth_ APIs are deprecated for public use, but still ok for
+ * internal use.
+ */
+#include "internal/deprecated.h"
+
#include <string.h>
#include <openssl/evp.h>
#include "crypto/evp.h"
+#include "internal/provider.h"
#include "evp_local.h"
EVP_CIPHER *EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len)
{
- EVP_CIPHER *cipher = OPENSSL_zalloc(sizeof(EVP_CIPHER));
+ EVP_CIPHER *cipher = evp_cipher_new();
if (cipher != NULL) {
cipher->nid = cipher_type;
cipher->block_size = block_size;
cipher->key_len = key_len;
+ cipher->origin = EVP_ORIG_METH;
}
return cipher;
}
EVP_CIPHER *EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher)
{
- EVP_CIPHER *to = EVP_CIPHER_meth_new(cipher->nid, cipher->block_size,
- cipher->key_len);
+ EVP_CIPHER *to = NULL;
+
+ /*
+ * Non-legacy EVP_CIPHERs can't be duplicated like this.
+ * Use EVP_CIPHER_up_ref() instead.
+ */
+ if (cipher->prov != NULL)
+ return NULL;
+
+ if ((to = EVP_CIPHER_meth_new(cipher->nid, cipher->block_size,
+ cipher->key_len)) != NULL) {
+ CRYPTO_RWLOCK *lock = to->lock;
- if (to != NULL)
memcpy(to, cipher, sizeof(*to));
+ to->lock = lock;
+ to->origin = EVP_ORIG_METH;
+ }
return to;
}
void EVP_CIPHER_meth_free(EVP_CIPHER *cipher)
{
- OPENSSL_free(cipher);
+ if (cipher == NULL || cipher->origin != EVP_ORIG_METH)
+ return;
+
+ evp_cipher_free_int(cipher);
}
int EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len)
{
+ if (cipher->iv_len != 0)
+ return 0;
+
cipher->iv_len = iv_len;
return 1;
}
int EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags)
{
+ if (cipher->flags != 0)
+ return 0;
+
cipher->flags = flags;
return 1;
}
int EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size)
{
+ if (cipher->ctx_size != 0)
+ return 0;
+
cipher->ctx_size = ctx_size;
return 1;
}
@@ -64,6 +96,9 @@ int EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher,
const unsigned char *iv,
int enc))
{
+ if (cipher->init != NULL)
+ return 0;
+
cipher->init = init;
return 1;
}
@@ -74,6 +109,9 @@ int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
const unsigned char *in,
size_t inl))
{
+ if (cipher->do_cipher != NULL)
+ return 0;
+
cipher->do_cipher = do_cipher;
return 1;
}
@@ -81,6 +119,9 @@ int EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
int EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher,
int (*cleanup) (EVP_CIPHER_CTX *))
{
+ if (cipher->cleanup != NULL)
+ return 0;
+
cipher->cleanup = cleanup;
return 1;
}
@@ -89,6 +130,9 @@ int EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher,
int (*set_asn1_parameters) (EVP_CIPHER_CTX *,
ASN1_TYPE *))
{
+ if (cipher->set_asn1_parameters != NULL)
+ return 0;
+
cipher->set_asn1_parameters = set_asn1_parameters;
return 1;
}
@@ -97,6 +141,9 @@ int EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher,
int (*get_asn1_parameters) (EVP_CIPHER_CTX *,
ASN1_TYPE *))
{
+ if (cipher->get_asn1_parameters != NULL)
+ return 0;
+
cipher->get_asn1_parameters = get_asn1_parameters;
return 1;
}
@@ -105,6 +152,9 @@ int EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher,
int (*ctrl) (EVP_CIPHER_CTX *, int type,
int arg, void *ptr))
{
+ if (cipher->ctrl != NULL)
+ return 0;
+
cipher->ctrl = ctrl;
return 1;
}