mirror of
https://github.com/torvalds/linux.git
synced 2025-12-01 07:26:02 +07:00
sign-file,extract-cert: use pkcs11 provider for OPENSSL MAJOR >= 3
ENGINE API has been deprecated since OpenSSL version 3.0 [1]. Distros have started dropping support from headers and in future it will likely disappear also from library. It has been superseded by the PROVIDER API, so use it instead for OPENSSL MAJOR >= 3. [1] https://github.com/openssl/openssl/blob/master/README-ENGINES.md [jarkko: fixed up alignment issues reported by checkpatch.pl --strict] Signed-off-by: Jan Stancek <jstancek@redhat.com> Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> Tested-by: R Nageswara Sastry <rnsastry@linux.ibm.com> Reviewed-by: Neal Gompa <neal@gompa.dev> Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
This commit is contained in:
committed by
Jarkko Sakkinen
parent
467d60eddf
commit
558bdc45df
@@ -27,17 +27,18 @@
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/engine.h>
|
||||
|
||||
#if OPENSSL_VERSION_MAJOR >= 3
|
||||
# define USE_PKCS11_PROVIDER
|
||||
# include <openssl/provider.h>
|
||||
# include <openssl/store.h>
|
||||
#else
|
||||
# if !defined(OPENSSL_NO_ENGINE) && !defined(OPENSSL_NO_DEPRECATED_3_0)
|
||||
# define USE_PKCS11_ENGINE
|
||||
# include <openssl/engine.h>
|
||||
# endif
|
||||
#endif
|
||||
#include "ssl-common.h"
|
||||
|
||||
/*
|
||||
* OpenSSL 3.0 deprecates the OpenSSL's ENGINE API.
|
||||
*
|
||||
* Remove this if/when that API is no longer used
|
||||
*/
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
|
||||
/*
|
||||
* Use CMS if we have openssl-1.0.0 or newer available - otherwise we have to
|
||||
* assume that it's not available and its header file is missing and that we
|
||||
@@ -106,28 +107,64 @@ static int pem_pw_cb(char *buf, int len, int w, void *v)
|
||||
return pwlen;
|
||||
}
|
||||
|
||||
static EVP_PKEY *read_private_key_pkcs11(const char *private_key_name)
|
||||
{
|
||||
EVP_PKEY *private_key = NULL;
|
||||
#ifdef USE_PKCS11_PROVIDER
|
||||
OSSL_STORE_CTX *store;
|
||||
|
||||
if (!OSSL_PROVIDER_try_load(NULL, "pkcs11", true))
|
||||
ERR(1, "OSSL_PROVIDER_try_load(pkcs11)");
|
||||
if (!OSSL_PROVIDER_try_load(NULL, "default", true))
|
||||
ERR(1, "OSSL_PROVIDER_try_load(default)");
|
||||
|
||||
store = OSSL_STORE_open(private_key_name, NULL, NULL, NULL, NULL);
|
||||
ERR(!store, "OSSL_STORE_open");
|
||||
|
||||
while (!OSSL_STORE_eof(store)) {
|
||||
OSSL_STORE_INFO *info = OSSL_STORE_load(store);
|
||||
|
||||
if (!info) {
|
||||
drain_openssl_errors(__LINE__, 0);
|
||||
continue;
|
||||
}
|
||||
if (OSSL_STORE_INFO_get_type(info) == OSSL_STORE_INFO_PKEY) {
|
||||
private_key = OSSL_STORE_INFO_get1_PKEY(info);
|
||||
ERR(!private_key, "OSSL_STORE_INFO_get1_PKEY");
|
||||
}
|
||||
OSSL_STORE_INFO_free(info);
|
||||
if (private_key)
|
||||
break;
|
||||
}
|
||||
OSSL_STORE_close(store);
|
||||
#elif defined(USE_PKCS11_ENGINE)
|
||||
ENGINE *e;
|
||||
|
||||
ENGINE_load_builtin_engines();
|
||||
drain_openssl_errors(__LINE__, 1);
|
||||
e = ENGINE_by_id("pkcs11");
|
||||
ERR(!e, "Load PKCS#11 ENGINE");
|
||||
if (ENGINE_init(e))
|
||||
drain_openssl_errors(__LINE__, 1);
|
||||
else
|
||||
ERR(1, "ENGINE_init");
|
||||
if (key_pass)
|
||||
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0), "Set PKCS#11 PIN");
|
||||
private_key = ENGINE_load_private_key(e, private_key_name, NULL, NULL);
|
||||
ERR(!private_key, "%s", private_key_name);
|
||||
#else
|
||||
fprintf(stderr, "no pkcs11 engine/provider available\n");
|
||||
exit(1);
|
||||
#endif
|
||||
return private_key;
|
||||
}
|
||||
|
||||
static EVP_PKEY *read_private_key(const char *private_key_name)
|
||||
{
|
||||
EVP_PKEY *private_key;
|
||||
|
||||
if (!strncmp(private_key_name, "pkcs11:", 7)) {
|
||||
ENGINE *e;
|
||||
|
||||
ENGINE_load_builtin_engines();
|
||||
drain_openssl_errors(__LINE__, 1);
|
||||
e = ENGINE_by_id("pkcs11");
|
||||
ERR(!e, "Load PKCS#11 ENGINE");
|
||||
if (ENGINE_init(e))
|
||||
drain_openssl_errors(__LINE__, 1);
|
||||
else
|
||||
ERR(1, "ENGINE_init");
|
||||
if (key_pass)
|
||||
ERR(!ENGINE_ctrl_cmd_string(e, "PIN", key_pass, 0),
|
||||
"Set PKCS#11 PIN");
|
||||
private_key = ENGINE_load_private_key(e, private_key_name,
|
||||
NULL, NULL);
|
||||
ERR(!private_key, "%s", private_key_name);
|
||||
return read_private_key_pkcs11(private_key_name);
|
||||
} else {
|
||||
EVP_PKEY *private_key;
|
||||
BIO *b;
|
||||
|
||||
b = BIO_new_file(private_key_name, "rb");
|
||||
@@ -136,9 +173,9 @@ static EVP_PKEY *read_private_key(const char *private_key_name)
|
||||
NULL);
|
||||
ERR(!private_key, "%s", private_key_name);
|
||||
BIO_free(b);
|
||||
}
|
||||
|
||||
return private_key;
|
||||
return private_key;
|
||||
}
|
||||
}
|
||||
|
||||
static X509 *read_x509(const char *x509_name)
|
||||
|
||||
Reference in New Issue
Block a user