Merge pull request #21170 from keszybz/delibgcryptify
Allow systemd-resolved and systemd-importd to use libgcrypt or libopenssl
This commit is contained in:
@@ -2,8 +2,46 @@
|
||||
|
||||
#include "openssl-util.h"
|
||||
#include "alloc-util.h"
|
||||
#include "hexdecoct.h"
|
||||
|
||||
#if HAVE_OPENSSL
|
||||
int openssl_hash(const EVP_MD *alg,
|
||||
const void *msg,
|
||||
size_t msg_len,
|
||||
uint8_t *ret_hash,
|
||||
size_t *ret_hash_len) {
|
||||
|
||||
_cleanup_(EVP_MD_CTX_freep) EVP_MD_CTX *ctx = NULL;
|
||||
unsigned len;
|
||||
int r;
|
||||
|
||||
ctx = EVP_MD_CTX_new();
|
||||
if (!ctx)
|
||||
/* This function just calls OPENSSL_zalloc, so failure
|
||||
* here is almost certainly a failed allocation. */
|
||||
return -ENOMEM;
|
||||
|
||||
/* The documentation claims EVP_DigestInit behaves just like
|
||||
* EVP_DigestInit_ex if passed NULL, except it also calls
|
||||
* EVP_MD_CTX_reset, which deinitializes the context. */
|
||||
r = EVP_DigestInit_ex(ctx, alg, NULL);
|
||||
if (r == 0)
|
||||
return -EIO;
|
||||
|
||||
r = EVP_DigestUpdate(ctx, msg, msg_len);
|
||||
if (r == 0)
|
||||
return -EIO;
|
||||
|
||||
r = EVP_DigestFinal_ex(ctx, ret_hash, &len);
|
||||
if (r == 0)
|
||||
return -EIO;
|
||||
|
||||
if (ret_hash_len)
|
||||
*ret_hash_len = len;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rsa_encrypt_bytes(
|
||||
EVP_PKEY *pkey,
|
||||
const void *decrypted_key,
|
||||
@@ -70,4 +108,33 @@ int rsa_pkey_to_suitable_key_size(
|
||||
*ret_suitable_key_size = suitable_key_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
# if PREFER_OPENSSL
|
||||
int string_hashsum(
|
||||
const char *s,
|
||||
size_t len,
|
||||
const EVP_MD *md_algorithm,
|
||||
char **ret) {
|
||||
|
||||
uint8_t hash[EVP_MAX_MD_SIZE];
|
||||
size_t hash_size;
|
||||
char *enc;
|
||||
int r;
|
||||
|
||||
hash_size = EVP_MD_size(md_algorithm);
|
||||
assert(hash_size > 0);
|
||||
|
||||
r = openssl_hash(md_algorithm, s, len, hash, NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
enc = hexmem(hash, hash_size);
|
||||
if (!enc)
|
||||
return -ENOMEM;
|
||||
|
||||
*ret = enc;
|
||||
return 0;
|
||||
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
|
||||
#if HAVE_OPENSSL
|
||||
# include <openssl/bio.h>
|
||||
# include <openssl/bn.h>
|
||||
# include <openssl/err.h>
|
||||
# include <openssl/evp.h>
|
||||
# include <openssl/pkcs7.h>
|
||||
# include <openssl/ssl.h>
|
||||
@@ -13,7 +15,15 @@
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509*, X509_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509_NAME*, X509_NAME_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY_CTX*, EVP_PKEY_CTX_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY*, EVP_PKEY_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_CIPHER_CTX*, EVP_CIPHER_CTX_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(RSA*, RSA_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_KEY*, EC_KEY_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_POINT*, EC_POINT_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_GROUP*, EC_GROUP_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIGNUM*, BN_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BN_CTX*, BN_CTX_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ECDSA_SIG*, ECDSA_SIG_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(PKCS7*, PKCS7_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(SSL*, SSL_free, NULL);
|
||||
DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIO*, BIO_free, NULL);
|
||||
@@ -26,8 +36,41 @@ static inline void sk_X509_free_allp(STACK_OF(X509) **sk) {
|
||||
sk_X509_pop_free(*sk, X509_free);
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
int rsa_pkey_to_suitable_key_size(EVP_PKEY *pkey, size_t *ret_suitable_key_size);
|
||||
#endif
|
||||
|
||||
#if PREFER_OPENSSL
|
||||
/* The openssl definition */
|
||||
typedef const EVP_MD* hash_md_t;
|
||||
typedef const EVP_MD* hash_algorithm_t;
|
||||
typedef int elliptic_curve_t;
|
||||
typedef EVP_MD_CTX* hash_context_t;
|
||||
# define OPENSSL_OR_GCRYPT(a, b) (a)
|
||||
|
||||
#elif HAVE_GCRYPT
|
||||
|
||||
# include <gcrypt.h>
|
||||
|
||||
/* The gcrypt definition */
|
||||
typedef int hash_md_t;
|
||||
typedef const char* hash_algorithm_t;
|
||||
typedef const char* elliptic_curve_t;
|
||||
typedef gcry_md_hd_t hash_context_t;
|
||||
# define OPENSSL_OR_GCRYPT(a, b) (b)
|
||||
#endif
|
||||
|
||||
#if PREFER_OPENSSL
|
||||
int string_hashsum(const char *s, size_t len, hash_algorithm_t md_algorithm, char **ret);
|
||||
|
||||
static inline int string_hashsum_sha224(const char *s, size_t len, char **ret) {
|
||||
return string_hashsum(s, len, EVP_sha224(), ret);
|
||||
}
|
||||
|
||||
static inline int string_hashsum_sha256(const char *s, size_t len, char **ret) {
|
||||
return string_hashsum(s, len, EVP_sha256(), ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user