Latest update.
This commit is contained in:
@@ -7,6 +7,13 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* IDEA low level APIs are deprecated for public use, but still ok for internal
|
||||
* use where we're using them to implement the higher level EVP interface, as is
|
||||
* the case here.
|
||||
*/
|
||||
#include "internal/deprecated.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include "internal/cryptlib.h"
|
||||
|
||||
|
||||
@@ -8,8 +8,8 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* RC4 low level APIs are deprecated for public use, but still ok for internal
|
||||
* use.
|
||||
* MD5 and RC4 low level APIs are deprecated for public use, but still ok for
|
||||
* internal use.
|
||||
*/
|
||||
#include "internal/deprecated.h"
|
||||
|
||||
|
||||
@@ -142,6 +142,7 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
|
||||
|
||||
if (tmpcipher->prov == NULL) {
|
||||
switch(tmpcipher->nid) {
|
||||
case NID_undef:
|
||||
case NID_aes_256_ecb:
|
||||
case NID_aes_192_ecb:
|
||||
case NID_aes_128_ecb:
|
||||
@@ -326,7 +327,10 @@ int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
|
||||
return 0;
|
||||
#else
|
||||
EVP_CIPHER *provciph =
|
||||
EVP_CIPHER_fetch(NULL, OBJ_nid2sn(cipher->nid), "");
|
||||
EVP_CIPHER_fetch(NULL,
|
||||
cipher->nid == NID_undef ? "NULL"
|
||||
: OBJ_nid2sn(cipher->nid),
|
||||
"");
|
||||
|
||||
if (provciph == NULL) {
|
||||
EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
|
||||
|
||||
@@ -281,3 +281,6 @@ void evp_names_do_all(OSSL_PROVIDER *prov, int number,
|
||||
void (*fn)(const char *name, void *data),
|
||||
void *data);
|
||||
int evp_cipher_cache_constants(EVP_CIPHER *cipher);
|
||||
void *evp_pkey_make_provided(EVP_PKEY *pk, OPENSSL_CTX *libctx,
|
||||
EVP_KEYMGMT **keymgmt, const char *propquery,
|
||||
int domainparams);
|
||||
+30
-32
@@ -164,6 +164,8 @@ int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx)
|
||||
int ret;
|
||||
void *provkey = NULL;
|
||||
EVP_KEYEXCH *exchange = NULL;
|
||||
EVP_KEYMGMT *tmp_keymgmt = NULL;
|
||||
const char *supported_exch = NULL;
|
||||
|
||||
if (ctx == NULL) {
|
||||
EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
||||
@@ -176,33 +178,36 @@ int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx)
|
||||
if (ctx->engine != NULL || ctx->keytype == NULL)
|
||||
goto legacy;
|
||||
|
||||
if (ctx->keymgmt == NULL)
|
||||
ctx->keymgmt =
|
||||
EVP_KEYMGMT_fetch(ctx->libctx, ctx->keytype, ctx->propquery);
|
||||
if (ctx->keymgmt != NULL) {
|
||||
const char *supported_exch = NULL;
|
||||
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_exch =
|
||||
ctx->keymgmt->query_operation_name(OSSL_OP_KEYEXCH);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported exch, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_exch == NULL)
|
||||
supported_exch = ctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if exchange is already there.
|
||||
*/
|
||||
exchange =
|
||||
EVP_KEYEXCH_fetch(ctx->libctx, supported_exch, ctx->propquery);
|
||||
/* Ensure that the key is provided. If not, go legacy */
|
||||
tmp_keymgmt = ctx->keymgmt;
|
||||
provkey = evp_pkey_make_provided(ctx->pkey, ctx->libctx,
|
||||
&tmp_keymgmt, ctx->propquery, 0);
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) {
|
||||
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
|
||||
goto err;
|
||||
}
|
||||
EVP_KEYMGMT_free(ctx->keymgmt);
|
||||
ctx->keymgmt = tmp_keymgmt;
|
||||
|
||||
if (ctx->keymgmt == NULL
|
||||
|| exchange == NULL
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_exch = ctx->keymgmt->query_operation_name(OSSL_OP_KEYEXCH);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported exch, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_exch == NULL)
|
||||
supported_exch = ctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if exchange is already there.
|
||||
*/
|
||||
exchange = EVP_KEYEXCH_fetch(ctx->libctx, supported_exch, ctx->propquery);
|
||||
|
||||
if (exchange == NULL
|
||||
|| (EVP_KEYMGMT_provider(ctx->keymgmt)
|
||||
!= EVP_KEYEXCH_provider(exchange))) {
|
||||
/*
|
||||
@@ -217,13 +222,6 @@ int EVP_PKEY_derive_init(EVP_PKEY_CTX *ctx)
|
||||
|
||||
|
||||
ctx->op.kex.exchange = exchange;
|
||||
|
||||
if (ctx->pkey != NULL) {
|
||||
provkey = evp_keymgmt_export_to_provider(ctx->pkey, ctx->keymgmt, 0);
|
||||
/* If export failed, legacy may be able to pick it up */
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
}
|
||||
ctx->op.kex.exchprovctx = exchange->newctx(ossl_provider_ctx(exchange->prov));
|
||||
if (ctx->op.kex.exchprovctx == NULL) {
|
||||
/* The provider key can stay in the cache */
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* MD5 low level APIs are deprecated for public use, but still ok for
|
||||
* internal use.
|
||||
*/
|
||||
#include "internal/deprecated.h"
|
||||
|
||||
#include <openssl/md5.h>
|
||||
#include "crypto/evp.h"
|
||||
#include "legacy_meth.h"
|
||||
|
||||
@@ -7,6 +7,13 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* MD5 and SHA-1 low level APIs are deprecated for public use, but still ok for
|
||||
* internal use. The prov/md5_sha1.h include requires this, but this must
|
||||
* be the first include loaded.
|
||||
*/
|
||||
#include "internal/deprecated.h"
|
||||
|
||||
#include "crypto/evp.h"
|
||||
#include "prov/md5_sha1.h" /* diverse MD5_SHA1 macros */
|
||||
#include "legacy_meth.h"
|
||||
|
||||
@@ -7,6 +7,12 @@
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* All SHA low level APIs are deprecated for public use, but still ok for
|
||||
* internal use.
|
||||
*/
|
||||
#include "internal/deprecated.h"
|
||||
|
||||
#include <openssl/sha.h> /* diverse SHA macros */
|
||||
#include "internal/sha3.h" /* KECCAK1600_WIDTH */
|
||||
#include "crypto/evp.h"
|
||||
|
||||
+32
-33
@@ -31,6 +31,8 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
|
||||
{
|
||||
EVP_PKEY_CTX *locpctx = NULL;
|
||||
EVP_SIGNATURE *signature = NULL;
|
||||
EVP_KEYMGMT *tmp_keymgmt = NULL;
|
||||
const char *supported_sig = NULL;
|
||||
void *provkey = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -71,33 +73,38 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
|
||||
}
|
||||
}
|
||||
|
||||
if (locpctx->keymgmt == NULL)
|
||||
locpctx->keymgmt = EVP_KEYMGMT_fetch(locpctx->libctx, locpctx->keytype,
|
||||
locpctx->propquery);
|
||||
if (locpctx->keymgmt != NULL) {
|
||||
const char *supported_sig = NULL;
|
||||
|
||||
if (locpctx->keymgmt->query_operation_name != NULL)
|
||||
supported_sig =
|
||||
locpctx->keymgmt->query_operation_name(OSSL_OP_SIGNATURE);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported sig, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_sig == NULL)
|
||||
supported_sig = locpctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if signature is already there.
|
||||
*/
|
||||
signature = EVP_SIGNATURE_fetch(locpctx->libctx, supported_sig,
|
||||
locpctx->propquery);
|
||||
/* Ensure that the key is provided. If not, go legacy */
|
||||
tmp_keymgmt = locpctx->keymgmt;
|
||||
provkey = evp_pkey_make_provided(locpctx->pkey, locpctx->libctx,
|
||||
&tmp_keymgmt, locpctx->propquery, 0);
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) {
|
||||
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
|
||||
goto err;
|
||||
}
|
||||
EVP_KEYMGMT_free(locpctx->keymgmt);
|
||||
locpctx->keymgmt = tmp_keymgmt;
|
||||
|
||||
if (locpctx->keymgmt == NULL
|
||||
|| signature == NULL
|
||||
if (locpctx->keymgmt->query_operation_name != NULL)
|
||||
supported_sig =
|
||||
locpctx->keymgmt->query_operation_name(OSSL_OP_SIGNATURE);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported sig, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_sig == NULL)
|
||||
supported_sig = locpctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if signature is already there.
|
||||
*/
|
||||
signature = EVP_SIGNATURE_fetch(locpctx->libctx, supported_sig,
|
||||
locpctx->propquery);
|
||||
|
||||
if (signature == NULL
|
||||
|| (EVP_KEYMGMT_provider(locpctx->keymgmt)
|
||||
!= EVP_SIGNATURE_provider(signature))) {
|
||||
/*
|
||||
@@ -113,16 +120,8 @@ static int do_sigver_init(EVP_MD_CTX *ctx, EVP_PKEY_CTX **pctx,
|
||||
/* No more legacy from here down to legacy: */
|
||||
|
||||
locpctx->op.sig.signature = signature;
|
||||
|
||||
provkey =
|
||||
evp_keymgmt_export_to_provider(locpctx->pkey, locpctx->keymgmt, 0);
|
||||
/* If export failed, legacy may be able to pick it up */
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
|
||||
locpctx->operation = ver ? EVP_PKEY_OP_VERIFYCTX
|
||||
: EVP_PKEY_OP_SIGNCTX;
|
||||
|
||||
locpctx->op.sig.sigprovctx
|
||||
= signature->newctx(ossl_provider_ctx(signature->prov));
|
||||
if (locpctx->op.sig.sigprovctx == NULL) {
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "crypto/asn1.h"
|
||||
#include "crypto/evp.h"
|
||||
#include "internal/provider.h"
|
||||
#include "evp_local.h"
|
||||
|
||||
static void evp_pkey_free_it(EVP_PKEY *key);
|
||||
|
||||
@@ -827,3 +828,47 @@ int EVP_PKEY_size(const EVP_PKEY *pkey)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *evp_pkey_make_provided(EVP_PKEY *pk, OPENSSL_CTX *libctx,
|
||||
EVP_KEYMGMT **keymgmt, const char *propquery,
|
||||
int domainparams)
|
||||
{
|
||||
EVP_KEYMGMT *allocated_keymgmt = NULL;
|
||||
EVP_KEYMGMT *tmp_keymgmt = NULL;
|
||||
void *provdata = NULL;
|
||||
|
||||
if (pk == NULL)
|
||||
return NULL;
|
||||
|
||||
if (keymgmt != NULL) {
|
||||
tmp_keymgmt = *keymgmt;
|
||||
*keymgmt = NULL;
|
||||
}
|
||||
|
||||
if (tmp_keymgmt == NULL) {
|
||||
EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new_from_pkey(libctx, pk);
|
||||
|
||||
if (ctx != NULL && ctx->keytype != NULL)
|
||||
tmp_keymgmt = allocated_keymgmt =
|
||||
EVP_KEYMGMT_fetch(ctx->libctx, ctx->keytype, propquery);
|
||||
EVP_PKEY_CTX_free(ctx);
|
||||
}
|
||||
|
||||
if (tmp_keymgmt != NULL)
|
||||
provdata =
|
||||
evp_keymgmt_export_to_provider(pk, tmp_keymgmt, domainparams);
|
||||
|
||||
/*
|
||||
* If nothing was exported, |tmp_keymgmt| might point at a freed
|
||||
* EVP_KEYMGMT, so we clear it to be safe. It shouldn't be useful for
|
||||
* the caller either way in that case.
|
||||
*/
|
||||
if (provdata == NULL)
|
||||
tmp_keymgmt = NULL;
|
||||
|
||||
if (keymgmt != NULL)
|
||||
*keymgmt = tmp_keymgmt;
|
||||
|
||||
EVP_KEYMGMT_free(allocated_keymgmt);
|
||||
return provdata;
|
||||
}
|
||||
+27
-30
@@ -21,6 +21,8 @@ static int evp_pkey_asym_cipher_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
int ret = 0;
|
||||
void *provkey = NULL;
|
||||
EVP_ASYM_CIPHER *cipher = NULL;
|
||||
EVP_KEYMGMT *tmp_keymgmt = NULL;
|
||||
const char *supported_ciph = NULL;
|
||||
|
||||
if (ctx == NULL) {
|
||||
EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
||||
@@ -33,33 +35,35 @@ static int evp_pkey_asym_cipher_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
if (ctx->keytype == NULL || ctx->engine != NULL)
|
||||
goto legacy;
|
||||
|
||||
if (ctx->keymgmt == NULL)
|
||||
ctx->keymgmt =
|
||||
EVP_KEYMGMT_fetch(ctx->libctx, ctx->keytype, ctx->propquery);
|
||||
if (ctx->keymgmt != NULL) {
|
||||
const char *supported_ciph = NULL;
|
||||
/* Ensure that the key is provided. If not, go legacy */
|
||||
tmp_keymgmt = ctx->keymgmt;
|
||||
provkey = evp_pkey_make_provided(ctx->pkey, ctx->libctx,
|
||||
&tmp_keymgmt, ctx->propquery, 0);
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
EVP_KEYMGMT_up_ref(tmp_keymgmt);
|
||||
EVP_KEYMGMT_free(ctx->keymgmt);
|
||||
ctx->keymgmt = tmp_keymgmt;
|
||||
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_ciph =
|
||||
ctx->keymgmt->query_operation_name(OSSL_OP_ASYM_CIPHER);
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_ciph =
|
||||
ctx->keymgmt->query_operation_name(OSSL_OP_ASYM_CIPHER);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported ciph, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_ciph == NULL)
|
||||
supported_ciph = ctx->keytype;
|
||||
/*
|
||||
* If we didn't get a supported ciph, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_ciph == NULL)
|
||||
supported_ciph = ctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if cipher is already there.
|
||||
*/
|
||||
cipher =
|
||||
EVP_ASYM_CIPHER_fetch(ctx->libctx, supported_ciph, ctx->propquery);
|
||||
}
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if cipher is already there.
|
||||
*/
|
||||
cipher =
|
||||
EVP_ASYM_CIPHER_fetch(ctx->libctx, supported_ciph, ctx->propquery);
|
||||
|
||||
if (ctx->keymgmt == NULL
|
||||
|| cipher == NULL
|
||||
if (cipher == NULL
|
||||
|| (EVP_KEYMGMT_provider(ctx->keymgmt)
|
||||
!= EVP_ASYM_CIPHER_provider(cipher))) {
|
||||
/*
|
||||
@@ -73,13 +77,6 @@ static int evp_pkey_asym_cipher_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
}
|
||||
|
||||
ctx->op.ciph.cipher = cipher;
|
||||
|
||||
if (ctx->pkey != NULL) {
|
||||
provkey = evp_keymgmt_export_to_provider(ctx->pkey, ctx->keymgmt, 0);
|
||||
/* If export failed, legacy may be able to pick it up */
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
}
|
||||
ctx->op.ciph.ciphprovctx = cipher->newctx(ossl_provider_ctx(cipher->prov));
|
||||
if (ctx->op.ciph.ciphprovctx == NULL) {
|
||||
/* The provider key can stay in the cache */
|
||||
|
||||
+31
-33
@@ -322,6 +322,8 @@ static int evp_pkey_signature_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
int ret = 0;
|
||||
void *provkey = NULL;
|
||||
EVP_SIGNATURE *signature = NULL;
|
||||
EVP_KEYMGMT *tmp_keymgmt = NULL;
|
||||
const char *supported_sig = NULL;
|
||||
|
||||
if (ctx == NULL) {
|
||||
EVPerr(0, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
||||
@@ -334,33 +336,37 @@ static int evp_pkey_signature_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
if (ctx->keytype == NULL)
|
||||
goto legacy;
|
||||
|
||||
if (ctx->keymgmt == NULL)
|
||||
ctx->keymgmt =
|
||||
EVP_KEYMGMT_fetch(ctx->libctx, ctx->keytype, ctx->propquery);
|
||||
if (ctx->keymgmt != NULL) {
|
||||
const char *supported_sig = NULL;
|
||||
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_sig =
|
||||
ctx->keymgmt->query_operation_name(OSSL_OP_SIGNATURE);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported sig, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_sig == NULL)
|
||||
supported_sig = ctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if signature is already there.
|
||||
*/
|
||||
signature =
|
||||
EVP_SIGNATURE_fetch(ctx->libctx, supported_sig, ctx->propquery);
|
||||
/* Ensure that the key is provided. If not, go legacy */
|
||||
tmp_keymgmt = ctx->keymgmt;
|
||||
provkey = evp_pkey_make_provided(ctx->pkey, ctx->libctx,
|
||||
&tmp_keymgmt, ctx->propquery, 0);
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
if (!EVP_KEYMGMT_up_ref(tmp_keymgmt)) {
|
||||
ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
|
||||
goto err;
|
||||
}
|
||||
EVP_KEYMGMT_free(ctx->keymgmt);
|
||||
ctx->keymgmt = tmp_keymgmt;
|
||||
|
||||
if (ctx->keymgmt == NULL
|
||||
|| signature == NULL
|
||||
if (ctx->keymgmt->query_operation_name != NULL)
|
||||
supported_sig = ctx->keymgmt->query_operation_name(OSSL_OP_SIGNATURE);
|
||||
|
||||
/*
|
||||
* If we didn't get a supported sig, assume there is one with the
|
||||
* same name as the key type.
|
||||
*/
|
||||
if (supported_sig == NULL)
|
||||
supported_sig = ctx->keytype;
|
||||
|
||||
/*
|
||||
* Because we cleared out old ops, we shouldn't need to worry about
|
||||
* checking if signature is already there.
|
||||
*/
|
||||
signature =
|
||||
EVP_SIGNATURE_fetch(ctx->libctx, supported_sig, ctx->propquery);
|
||||
|
||||
if (signature == NULL
|
||||
|| (EVP_KEYMGMT_provider(ctx->keymgmt)
|
||||
!= EVP_SIGNATURE_provider(signature))) {
|
||||
/*
|
||||
@@ -374,14 +380,6 @@ static int evp_pkey_signature_init(EVP_PKEY_CTX *ctx, int operation)
|
||||
}
|
||||
|
||||
ctx->op.sig.signature = signature;
|
||||
|
||||
if (ctx->pkey != NULL) {
|
||||
provkey =
|
||||
evp_keymgmt_export_to_provider(ctx->pkey, ctx->keymgmt, 0);
|
||||
/* If export failed, legacy may be able to pick it up */
|
||||
if (provkey == NULL)
|
||||
goto legacy;
|
||||
}
|
||||
ctx->op.sig.sigprovctx = signature->newctx(ossl_provider_ctx(signature->prov));
|
||||
if (ctx->op.sig.sigprovctx == NULL) {
|
||||
/* The provider key can stay in the cache */
|
||||
|
||||
Reference in New Issue
Block a user