]> git.ipfire.org Git - thirdparty/systemd.git/blame_incremental - src/shared/openssl-util.h
Merge pull request #30491 from fbuihuu/vconsole-handle-kd-grahpics-mode
[thirdparty/systemd.git] / src / shared / openssl-util.h
... / ...
CommitLineData
1/* SPDX-License-Identifier: LGPL-2.1-or-later */
2#pragma once
3
4#include "iovec-util.h"
5#include "macro.h"
6#include "sha256.h"
7
8#define X509_FINGERPRINT_SIZE SHA256_DIGEST_SIZE
9
10#if HAVE_OPENSSL
11# include <openssl/bio.h>
12# include <openssl/bn.h>
13# include <openssl/crypto.h>
14# include <openssl/err.h>
15# include <openssl/evp.h>
16# include <openssl/opensslv.h>
17# include <openssl/pkcs7.h>
18# include <openssl/ssl.h>
19# include <openssl/x509v3.h>
20# ifndef OPENSSL_VERSION_MAJOR
21/* OPENSSL_VERSION_MAJOR macro was added in OpenSSL 3. Thus, if it doesn't exist, we must be before OpenSSL 3. */
22# define OPENSSL_VERSION_MAJOR 1
23# endif
24# if OPENSSL_VERSION_MAJOR >= 3
25# include <openssl/core_names.h>
26# include <openssl/kdf.h>
27# include <openssl/param_build.h>
28# endif
29
30DEFINE_TRIVIAL_CLEANUP_FUNC_FULL_MACRO(void*, OPENSSL_free, NULL);
31DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509_NAME*, X509_NAME_free, NULL);
32DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY_CTX*, EVP_PKEY_CTX_free, NULL);
33DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_CIPHER_CTX*, EVP_CIPHER_CTX_free, NULL);
34DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_POINT*, EC_POINT_free, NULL);
35DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_GROUP*, EC_GROUP_free, NULL);
36DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIGNUM*, BN_free, NULL);
37DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BN_CTX*, BN_CTX_free, NULL);
38DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(ECDSA_SIG*, ECDSA_SIG_free, NULL);
39DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(PKCS7*, PKCS7_free, NULL);
40DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(SSL*, SSL_free, NULL);
41DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(BIO*, BIO_free, NULL);
42DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_MD_CTX*, EVP_MD_CTX_free, NULL);
43#if OPENSSL_VERSION_MAJOR >= 3
44DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_CIPHER*, EVP_CIPHER_free, NULL);
45DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_KDF*, EVP_KDF_free, NULL);
46DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_KDF_CTX*, EVP_KDF_CTX_free, NULL);
47DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_MAC*, EVP_MAC_free, NULL);
48DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_MAC_CTX*, EVP_MAC_CTX_free, NULL);
49DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_MD*, EVP_MD_free, NULL);
50DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(OSSL_PARAM*, OSSL_PARAM_free, NULL);
51DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(OSSL_PARAM_BLD*, OSSL_PARAM_BLD_free, NULL);
52#else
53DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EC_KEY*, EC_KEY_free, NULL);
54DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(HMAC_CTX*, HMAC_CTX_free, NULL);
55DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(RSA*, RSA_free, NULL);
56#endif
57
58static inline void sk_X509_free_allp(STACK_OF(X509) **sk) {
59 if (!sk || !*sk)
60 return;
61
62 sk_X509_pop_free(*sk, X509_free);
63}
64
65int openssl_pkey_from_pem(const void *pem, size_t pem_size, EVP_PKEY **ret);
66
67int openssl_digest_size(const char *digest_alg, size_t *ret_digest_size);
68
69int openssl_digest_many(const char *digest_alg, const struct iovec data[], size_t n_data, void **ret_digest, size_t *ret_digest_size);
70
71static inline int openssl_digest(const char *digest_alg, const void *buf, size_t len, void **ret_digest, size_t *ret_digest_size) {
72 return openssl_digest_many(digest_alg, &IOVEC_MAKE((void*) buf, len), 1, ret_digest, ret_digest_size);
73}
74
75int openssl_hmac_many(const char *digest_alg, const void *key, size_t key_size, const struct iovec data[], size_t n_data, void **ret_digest, size_t *ret_digest_size);
76
77static inline int openssl_hmac(const char *digest_alg, const void *key, size_t key_size, const void *buf, size_t len, void **ret_digest, size_t *ret_digest_size) {
78 return openssl_hmac_many(digest_alg, key, key_size, &IOVEC_MAKE((void*) buf, len), 1, ret_digest, ret_digest_size);
79}
80
81int openssl_cipher_many(const char *alg, size_t bits, const char *mode, const void *key, size_t key_size, const void *iv, size_t iv_size, const struct iovec data[], size_t n_data, void **ret, size_t *ret_size);
82
83static inline int openssl_cipher(const char *alg, size_t bits, const char *mode, const void *key, size_t key_size, const void *iv, size_t iv_size, const void *buf, size_t len, void **ret, size_t *ret_size) {
84 return openssl_cipher_many(alg, bits, mode, key, key_size, iv, iv_size, &IOVEC_MAKE((void*) buf, len), 1, ret, ret_size);
85}
86
87int kdf_ss_derive(const char *digest, const void *key, size_t key_size, const void *salt, size_t salt_size, const void *info, size_t info_size, size_t derive_size, void **ret);
88
89int kdf_kb_hmac_derive(const char *mode, const char *digest, const void *key, size_t key_size, const void *salt, size_t salt_size, const void *info, size_t info_size, const void *seed, size_t seed_size, size_t derive_size, void **ret);
90
91int 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);
92
93int rsa_oaep_encrypt_bytes(const EVP_PKEY *pkey, const char *digest_alg, const char *label, const void *decrypted_key, size_t decrypted_key_size, void **ret_encrypt_key, size_t *ret_encrypt_key_size);
94
95int rsa_pkey_to_suitable_key_size(EVP_PKEY *pkey, size_t *ret_suitable_key_size);
96
97int rsa_pkey_new(size_t bits, EVP_PKEY **ret);
98
99int rsa_pkey_from_n_e(const void *n, size_t n_size, const void *e, size_t e_size, EVP_PKEY **ret);
100
101int rsa_pkey_to_n_e(const EVP_PKEY *pkey, void **ret_n, size_t *ret_n_size, void **ret_e, size_t *ret_e_size);
102
103int ecc_pkey_from_curve_x_y(int curve_id, const void *x, size_t x_size, const void *y, size_t y_size, EVP_PKEY **ret);
104
105int ecc_pkey_to_curve_x_y(const EVP_PKEY *pkey, int *ret_curve_id, void **ret_x, size_t *ret_x_size, void **ret_y, size_t *ret_y_size);
106
107int ecc_pkey_new(int curve_id, EVP_PKEY **ret);
108
109int ecc_ecdh(const EVP_PKEY *private_pkey, const EVP_PKEY *peer_pkey, void **ret_shared_secret, size_t *ret_shared_secret_size);
110
111int pubkey_fingerprint(EVP_PKEY *pk, const EVP_MD *md, void **ret, size_t *ret_size);
112
113int digest_and_sign(const EVP_MD *md, EVP_PKEY *privkey, const void *data, size_t size, void **ret, size_t *ret_size);
114
115#else
116
117typedef struct X509 X509;
118typedef struct EVP_PKEY EVP_PKEY;
119
120static inline void *X509_free(X509 *p) {
121 assert(p == NULL);
122 return NULL;
123}
124
125static inline void *EVP_PKEY_free(EVP_PKEY *p) {
126 assert(p == NULL);
127 return NULL;
128}
129
130#endif
131
132DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(X509*, X509_free, NULL);
133DEFINE_TRIVIAL_CLEANUP_FUNC_FULL(EVP_PKEY*, EVP_PKEY_free, NULL);
134
135int x509_fingerprint(X509 *cert, uint8_t buffer[static X509_FINGERPRINT_SIZE]);
136
137#if PREFER_OPENSSL
138/* The openssl definition */
139typedef const EVP_MD* hash_md_t;
140typedef const EVP_MD* hash_algorithm_t;
141typedef int elliptic_curve_t;
142typedef EVP_MD_CTX* hash_context_t;
143# define OPENSSL_OR_GCRYPT(a, b) (a)
144
145#elif HAVE_GCRYPT
146
147# include <gcrypt.h>
148
149/* The gcrypt definition */
150typedef int hash_md_t;
151typedef const char* hash_algorithm_t;
152typedef const char* elliptic_curve_t;
153typedef gcry_md_hd_t hash_context_t;
154# define OPENSSL_OR_GCRYPT(a, b) (b)
155#endif
156
157#if PREFER_OPENSSL
158int string_hashsum(const char *s, size_t len, const char *md_algorithm, char **ret);
159
160static inline int string_hashsum_sha224(const char *s, size_t len, char **ret) {
161 return string_hashsum(s, len, "SHA224", ret);
162}
163
164static inline int string_hashsum_sha256(const char *s, size_t len, char **ret) {
165 return string_hashsum(s, len, "SHA256", ret);
166}
167#endif