]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/shared/openssl-util.h
openssl-util: Allow declaring openssl struct pointers without openssl
[thirdparty/systemd.git] / src / shared / openssl-util.h
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
3f637019
LP
2#pragma once
3
f2d5df8a
LP
4#include "macro.h"
5
b012a1f4 6#if HAVE_OPENSSL
c2fa92e7 7# include <openssl/bio.h>
57633d23
ZJS
8# include <openssl/bn.h>
9# include <openssl/err.h>
4ef65db3 10# include <openssl/evp.h>
d9b5841d 11# include <openssl/opensslv.h>
c2fa92e7
LP
12# include <openssl/pkcs7.h>
13# include <openssl/ssl.h>
14# include <openssl/x509v3.h>
d9b5841d
LP
15# ifndef OPENSSL_VERSION_MAJOR
16/* OPENSSL_VERSION_MAJOR macro was added in OpenSSL 3. Thus, if it doesn't exist, we must be before OpenSSL 3. */
17# define OPENSSL_VERSION_MAJOR 1
18# endif
19# if OPENSSL_VERSION_MAJOR >= 3
20# include <openssl/core_names.h>
21# endif
3f637019 22
fd421c4a
ZJS
23DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509_NAME*, X509_NAME_free, NULL);
24DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY_CTX*, EVP_PKEY_CTX_free, NULL);
25DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_CIPHER_CTX*, EVP_CIPHER_CTX_free, NULL);
57633d23
ZJS
26DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_POINT*, EC_POINT_free, NULL);
27DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_GROUP*, EC_GROUP_free, NULL);
28DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIGNUM*, BN_free, NULL);
29DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BN_CTX*, BN_CTX_free, NULL);
30DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ECDSA_SIG*, ECDSA_SIG_free, NULL);
c2fa92e7
LP
31DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(PKCS7*, PKCS7_free, NULL);
32DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(SSL*, SSL_free, NULL);
33DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIO*, BIO_free, NULL);
18f568b8 34DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_MD_CTX*, EVP_MD_CTX_free, NULL);
c2fa92e7
LP
35
36static inline void sk_X509_free_allp(STACK_OF(X509) **sk) {
37 if (!sk || !*sk)
38 return;
39
40 sk_X509_pop_free(*sk, X509_free);
41}
b012a1f4 42
fc169a6f
KK
43int openssl_hash(const EVP_MD *alg, const void *msg, size_t msg_len, uint8_t *ret_hash, size_t *ret_hash_len);
44
f2d5df8a
LP
45int 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);
46
d041e4fc 47int rsa_pkey_to_suitable_key_size(EVP_PKEY *pkey, size_t *ret_suitable_key_size);
e8ccb5c7
LP
48
49int pubkey_fingerprint(EVP_PKEY *pk, const EVP_MD *md, void **ret, size_t *ret_size);
50
bc958a19
DDM
51#else
52
53typedef struct X509 X509;
54typedef struct EVP_PKEY EVP_PKEY;
55
56static inline void *X509_free(X509 *p) {
57 assert(p == NULL);
58 return NULL;
59}
60
61static inline void *EVP_PKEY_free(EVP_PKEY *p) {
62 assert(p == NULL);
63 return NULL;
64}
65
57633d23
ZJS
66#endif
67
bc958a19
DDM
68DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509*, X509_free, NULL);
69DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY*, EVP_PKEY_free, NULL);
70
57633d23
ZJS
71#if PREFER_OPENSSL
72/* The openssl definition */
73typedef const EVP_MD* hash_md_t;
74typedef const EVP_MD* hash_algorithm_t;
75typedef int elliptic_curve_t;
76typedef EVP_MD_CTX* hash_context_t;
77# define OPENSSL_OR_GCRYPT(a, b) (a)
78
79#elif HAVE_GCRYPT
80
81# include <gcrypt.h>
d041e4fc 82
57633d23
ZJS
83/* The gcrypt definition */
84typedef int hash_md_t;
85typedef const char* hash_algorithm_t;
86typedef const char* elliptic_curve_t;
87typedef gcry_md_hd_t hash_context_t;
88# define OPENSSL_OR_GCRYPT(a, b) (b)
b012a1f4 89#endif
7e8facb3
ZJS
90
91#if PREFER_OPENSSL
92int string_hashsum(const char *s, size_t len, hash_algorithm_t md_algorithm, char **ret);
93
94static inline int string_hashsum_sha224(const char *s, size_t len, char **ret) {
95 return string_hashsum(s, len, EVP_sha224(), ret);
96}
97
98static inline int string_hashsum_sha256(const char *s, size_t len, char **ret) {
99 return string_hashsum(s, len, EVP_sha256(), ret);
100}
101#endif