From: Dan Streetman Date: Wed, 19 Jul 2023 02:48:34 +0000 (-0400) Subject: openssl: add openssl_pkey_from_pem() X-Git-Tag: v255-rc1~815^2~8 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=4af788c70c985b6b87435a90594e2a301929fb5b;p=thirdparty%2Fsystemd.git openssl: add openssl_pkey_from_pem() Add function to create EVP_PKEY from PEM buffer. --- diff --git a/src/shared/openssl-util.c b/src/shared/openssl-util.c index c7fcbd9ea48..9021d910770 100644 --- a/src/shared/openssl-util.c +++ b/src/shared/openssl-util.c @@ -1,10 +1,29 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ +#include "fd-util.h" #include "openssl-util.h" #include "alloc-util.h" #include "hexdecoct.h" #if HAVE_OPENSSL +int openssl_pkey_from_pem(const void *pem, size_t pem_size, EVP_PKEY **ret) { + assert(pem); + assert(ret); + + _cleanup_fclose_ FILE *f = NULL; + f = fmemopen((void*) pem, pem_size, "r"); + if (!f) + return log_oom_debug(); + + _cleanup_(EVP_PKEY_freep) EVP_PKEY *pkey = PEM_read_PUBKEY(f, NULL, NULL, NULL); + if (!pkey) + return log_debug_errno(SYNTHETIC_ERRNO(EIO), "Failed to parse PEM."); + + *ret = TAKE_PTR(pkey); + + return 0; +} + int openssl_hash(const EVP_MD *alg, const void *msg, size_t msg_len, diff --git a/src/shared/openssl-util.h b/src/shared/openssl-util.h index 4fa0a959665..231bcc2bf81 100644 --- a/src/shared/openssl-util.h +++ b/src/shared/openssl-util.h @@ -43,6 +43,8 @@ static inline void sk_X509_free_allp(STACK_OF(X509) **sk) { sk_X509_pop_free(*sk, X509_free); } +int openssl_pkey_from_pem(const void *pem, size_t pem_size, EVP_PKEY **ret); + int openssl_hash(const EVP_MD *alg, const void *msg, size_t msg_len, uint8_t *ret_hash, size_t *ret_hash_len); int rsa_encrypt_bytes(EVP_PKEY *pkey, const void *decrypted_key, size_t decrypted_key_size, void **ret_encrypt_key, size_t *ret_encrypt_key_size);