1 a065ee49 2026-03-05 rsadowski /* $OpenBSD: ca.c,v 1.50 2026/03/05 07:27:01 rsadowski Exp $ */
4 c525adb9 2014-04-18 reyk * Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
6 c525adb9 2014-04-18 reyk * Permission to use, copy, modify, and distribute this software for any
7 c525adb9 2014-04-18 reyk * purpose with or without fee is hereby granted, provided that the above
8 c525adb9 2014-04-18 reyk * copyright notice and this permission notice appear in all copies.
10 c525adb9 2014-04-18 reyk * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 c525adb9 2014-04-18 reyk * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 c525adb9 2014-04-18 reyk * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 c525adb9 2014-04-18 reyk * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 c525adb9 2014-04-18 reyk * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 c525adb9 2014-04-18 reyk * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 c525adb9 2014-04-18 reyk * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 d93c36af 2015-01-22 reyk #include <sys/types.h>
20 c525adb9 2014-04-18 reyk #include <sys/queue.h>
21 c525adb9 2014-04-18 reyk #include <sys/uio.h>
23 c525adb9 2014-04-18 reyk #include <unistd.h>
24 c525adb9 2014-04-18 reyk #include <string.h>
25 c525adb9 2014-04-18 reyk #include <stdlib.h>
26 5ba5de82 2016-09-01 claudio #include <poll.h>
27 d93c36af 2015-01-22 reyk #include <imsg.h>
29 d93c36af 2015-01-22 reyk #include <openssl/bio.h>
30 54ce1b06 2023-03-26 tb #include <openssl/err.h>
31 c525adb9 2014-04-18 reyk #include <openssl/evp.h>
32 54ce1b06 2023-03-26 tb #include <openssl/pem.h>
33 c525adb9 2014-04-18 reyk #include <openssl/rsa.h>
34 802f4c96 2026-03-05 tb #include <openssl/x509.h>
36 c525adb9 2014-04-18 reyk #include "relayd.h"
37 6b5c4000 2026-03-02 rsadowski #include "log.h"
39 c525adb9 2014-04-18 reyk void ca_init(struct privsep *, struct privsep_proc *p, void *);
40 c525adb9 2014-04-18 reyk void ca_launch(void);
42 c525adb9 2014-04-18 reyk int ca_dispatch_parent(int, struct privsep_proc *, struct imsg *);
43 c525adb9 2014-04-18 reyk int ca_dispatch_relay(int, struct privsep_proc *, struct imsg *);
45 c525adb9 2014-04-18 reyk int rsae_priv_enc(int, const u_char *, u_char *, RSA *, int);
46 c525adb9 2014-04-18 reyk int rsae_priv_dec(int, const u_char *, u_char *, RSA *, int);
48 c525adb9 2014-04-18 reyk static struct relayd *env = NULL;
50 c525adb9 2014-04-18 reyk static struct privsep_proc procs[] = {
51 c525adb9 2014-04-18 reyk { "parent", PROC_PARENT, ca_dispatch_parent },
52 c525adb9 2014-04-18 reyk { "relay", PROC_RELAY, ca_dispatch_relay },
56 c525adb9 2014-04-18 reyk ca(struct privsep *ps, struct privsep_proc *p)
58 c525adb9 2014-04-18 reyk env = ps->ps_env;
60 94404df8 2016-09-02 reyk proc_run(ps, p, procs, nitems(procs), ca_init, NULL);
64 c525adb9 2014-04-18 reyk ca_init(struct privsep *ps, struct privsep_proc *p, void *arg)
66 41ddf20a 2016-09-03 reyk if (pledge("stdio recvfd", NULL) == -1)
67 31e39099 2015-10-10 benno fatal("pledge");
69 c525adb9 2014-04-18 reyk if (config_init(ps->ps_env) == -1)
70 c525adb9 2014-04-18 reyk fatal("failed to initialize configuration");
72 c525adb9 2014-04-18 reyk env->sc_id = getpid() & 0xffff;
76 bd00d3d8 2017-07-28 bluhm hash_x509(X509 *cert, char *hash, size_t hashlen)
78 f4a6eef3 2017-05-27 claudio static const char hex[] = "0123456789abcdef";
79 bd00d3d8 2017-07-28 bluhm size_t off;
80 bd00d3d8 2017-07-28 bluhm char digest[EVP_MAX_MD_SIZE];
83 9eb5625c 2017-08-09 claudio if (X509_pubkey_digest(cert, EVP_sha256(), digest, &dlen) != 1)
84 9eb5625c 2017-08-09 claudio fatalx("%s: X509_pubkey_digest failed", __func__);
86 f4a6eef3 2017-05-27 claudio if (hashlen < 2 * dlen + sizeof("SHA256:"))
87 9c3adc95 2023-06-11 op fatalx("%s: hash buffer too small", __func__);
89 f4a6eef3 2017-05-27 claudio off = strlcpy(hash, "SHA256:", hashlen);
91 f4a6eef3 2017-05-27 claudio for (i = 0; i < dlen; i++) {
92 bd00d3d8 2017-07-28 bluhm hash[off++] = hex[(digest[i] >> 4) & 0x0f];
93 bd00d3d8 2017-07-28 bluhm hash[off++] = hex[digest[i] & 0x0f];
95 f4a6eef3 2017-05-27 claudio hash[off] = 0;
99 c525adb9 2014-04-18 reyk ca_launch(void)
101 fe4913ec 2019-05-31 reyk char hash[TLS_CERT_HASH_SIZE];
103 fe4913ec 2019-05-31 reyk BIO *in = NULL;
104 fe4913ec 2019-05-31 reyk EVP_PKEY *pkey = NULL;
105 fe4913ec 2019-05-31 reyk struct relay *rlay;
106 fe4913ec 2019-05-31 reyk struct relay_cert *cert;
107 fe4913ec 2019-05-31 reyk X509 *x509 = NULL;
110 fe4913ec 2019-05-31 reyk TAILQ_FOREACH(cert, env->sc_certs, cert_entry) {
111 fe4913ec 2019-05-31 reyk if (cert->cert_fd == -1 || cert->cert_key_fd == -1)
114 fe4913ec 2019-05-31 reyk if ((buf = relay_load_fd(cert->cert_fd, &len)) == NULL)
115 fe4913ec 2019-05-31 reyk fatal("ca_launch: cert relay_load_fd");
117 fe4913ec 2019-05-31 reyk if ((in = BIO_new_mem_buf(buf, len)) == NULL)
118 fe4913ec 2019-05-31 reyk fatalx("ca_launch: cert BIO_new_mem_buf");
120 fe4913ec 2019-05-31 reyk if ((x509 = PEM_read_bio_X509(in, NULL,
121 fe4913ec 2019-05-31 reyk NULL, NULL)) == NULL)
122 fe4913ec 2019-05-31 reyk fatalx("ca_launch: cert PEM_read_bio_X509");
124 fe4913ec 2019-05-31 reyk hash_x509(x509, hash, sizeof(hash));
126 fe4913ec 2019-05-31 reyk BIO_free(in);
127 fe4913ec 2019-05-31 reyk X509_free(x509);
128 fe4913ec 2019-05-31 reyk purge_key(&buf, len);
130 fe4913ec 2019-05-31 reyk if ((buf = relay_load_fd(cert->cert_key_fd, &len)) == NULL)
131 fe4913ec 2019-05-31 reyk fatal("ca_launch: key relay_load_fd");
133 fe4913ec 2019-05-31 reyk if ((in = BIO_new_mem_buf(buf, len)) == NULL)
134 fe4913ec 2019-05-31 reyk fatalx("%s: key", __func__);
136 fe4913ec 2019-05-31 reyk if ((pkey = PEM_read_bio_PrivateKey(in,
137 fe4913ec 2019-05-31 reyk NULL, NULL, NULL)) == NULL)
138 fe4913ec 2019-05-31 reyk fatalx("%s: PEM", __func__);
140 fe4913ec 2019-05-31 reyk cert->cert_pkey = pkey;
142 fe4913ec 2019-05-31 reyk if (pkey_add(env, pkey, hash) == NULL)
143 fe4913ec 2019-05-31 reyk fatalx("tls pkey");
145 fe4913ec 2019-05-31 reyk BIO_free(in);
146 fe4913ec 2019-05-31 reyk purge_key(&buf, len);
149 c525adb9 2014-04-18 reyk TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
150 096ff28b 2014-12-12 reyk if ((rlay->rl_conf.flags & (F_TLS|F_TLSCLIENT)) == 0)
153 fe4913ec 2019-05-31 reyk if (rlay->rl_tls_cacert_fd != -1 &&
154 fe4913ec 2019-05-31 reyk rlay->rl_conf.tls_cakey_len) {
155 ce78c3f2 2017-11-27 claudio if ((buf = relay_load_fd(rlay->rl_tls_cacert_fd,
156 ce78c3f2 2017-11-27 claudio &len)) == NULL)
157 710a1570 2017-11-28 claudio fatal("ca_launch: cacert relay_load_fd");
159 ce78c3f2 2017-11-27 claudio if ((in = BIO_new_mem_buf(buf, len)) == NULL)
160 25035eb9 2017-11-27 bluhm fatalx("ca_launch: cacert BIO_new_mem_buf");
162 fe4913ec 2019-05-31 reyk if ((x509 = PEM_read_bio_X509(in, NULL,
163 f4a6eef3 2017-05-27 claudio NULL, NULL)) == NULL)
164 25035eb9 2017-11-27 bluhm fatalx("ca_launch: cacert PEM_read_bio_X509");
166 fe4913ec 2019-05-31 reyk hash_x509(x509, hash, sizeof(hash));
168 f4a6eef3 2017-05-27 claudio BIO_free(in);
169 fe4913ec 2019-05-31 reyk X509_free(x509);
170 ce78c3f2 2017-11-27 claudio purge_key(&buf, len);
172 096ff28b 2014-12-12 reyk if ((in = BIO_new_mem_buf(rlay->rl_tls_cakey,
173 096ff28b 2014-12-12 reyk rlay->rl_conf.tls_cakey_len)) == NULL)
174 09e53fee 2017-05-28 benno fatalx("%s: key", __func__);
176 fae05986 2014-04-22 reyk if ((pkey = PEM_read_bio_PrivateKey(in,
177 fae05986 2014-04-22 reyk NULL, NULL, NULL)) == NULL)
178 09e53fee 2017-05-28 benno fatalx("%s: PEM", __func__);
179 fae05986 2014-04-22 reyk BIO_free(in);
181 096ff28b 2014-12-12 reyk rlay->rl_tls_capkey = pkey;
183 f4a6eef3 2017-05-27 claudio if (pkey_add(env, pkey, hash) == NULL)
184 fae05986 2014-04-22 reyk fatalx("ca pkey");
186 096ff28b 2014-12-12 reyk purge_key(&rlay->rl_tls_cakey,
187 096ff28b 2014-12-12 reyk rlay->rl_conf.tls_cakey_len);
189 ce78c3f2 2017-11-27 claudio close(rlay->rl_tls_ca_fd);
194 c525adb9 2014-04-18 reyk ca_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
196 c525adb9 2014-04-18 reyk switch (imsg->hdr.type) {
197 c525adb9 2014-04-18 reyk case IMSG_CFG_RELAY:
198 c525adb9 2014-04-18 reyk config_getrelay(env, imsg);
200 ce78c3f2 2017-11-27 claudio case IMSG_CFG_RELAY_FD:
201 ce78c3f2 2017-11-27 claudio config_getrelayfd(env, imsg);
203 c525adb9 2014-04-18 reyk case IMSG_CFG_DONE:
204 c525adb9 2014-04-18 reyk config_getcfg(env, imsg);
206 c525adb9 2014-04-18 reyk case IMSG_CTL_START:
207 c525adb9 2014-04-18 reyk ca_launch();
209 c525adb9 2014-04-18 reyk case IMSG_CTL_RESET:
210 c525adb9 2014-04-18 reyk config_getreset(env, imsg);
220 c525adb9 2014-04-18 reyk ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
222 c525adb9 2014-04-18 reyk struct ctl_keyop cko;
223 c525adb9 2014-04-18 reyk EVP_PKEY *pkey;
225 c525adb9 2014-04-18 reyk u_char *from = NULL, *to = NULL;
226 c525adb9 2014-04-18 reyk struct iovec iov[2];
229 c525adb9 2014-04-18 reyk switch (imsg->hdr.type) {
230 c525adb9 2014-04-18 reyk case IMSG_CA_PRIVENC:
231 c525adb9 2014-04-18 reyk case IMSG_CA_PRIVDEC:
232 c525adb9 2014-04-18 reyk IMSG_SIZE_CHECK(imsg, (&cko));
233 c525adb9 2014-04-18 reyk bcopy(imsg->data, &cko, sizeof(cko));
234 58fc320c 2016-09-02 reyk if (cko.cko_proc > env->sc_conf.prefork_relay)
235 09e53fee 2017-05-28 benno fatalx("%s: invalid relay proc", __func__);
236 c525adb9 2014-04-18 reyk if (IMSG_DATA_SIZE(imsg) != (sizeof(cko) + cko.cko_flen))
237 09e53fee 2017-05-28 benno fatalx("%s: invalid key operation", __func__);
239 a065ee49 2026-03-05 rsadowski if ((pkey = pkey_find(env, cko.cko_hash)) == NULL) {
240 a065ee49 2026-03-05 rsadowski log_warnx("%s: invalid relay hash '%s'",
241 bd00d3d8 2017-07-28 bluhm __func__, cko.cko_hash);
242 a065ee49 2026-03-05 rsadowski /* Signal failure to the waiting relay worker. */
243 a065ee49 2026-03-05 rsadowski cko.cko_tlen = -1;
244 a065ee49 2026-03-05 rsadowski iov[c].iov_base = &cko;
245 a065ee49 2026-03-05 rsadowski iov[c++].iov_len = sizeof(cko);
246 a065ee49 2026-03-05 rsadowski if (proc_composev_imsg(env->sc_ps, PROC_RELAY,
247 a065ee49 2026-03-05 rsadowski cko.cko_proc, imsg->hdr.type, -1, -1, iov,
248 a065ee49 2026-03-05 rsadowski c) == -1)
249 a065ee49 2026-03-05 rsadowski log_warn("%s: proc_composev_imsg", __func__);
250 a065ee49 2026-03-05 rsadowski break;
253 bd00d3d8 2017-07-28 bluhm if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
254 bd00d3d8 2017-07-28 bluhm fatalx("%s: invalid relay key", __func__);
256 f4a6eef3 2017-05-27 claudio DPRINTF("%s:%d: key hash %s proc %d",
257 f4a6eef3 2017-05-27 claudio __func__, __LINE__, cko.cko_hash, cko.cko_proc);
259 c525adb9 2014-04-18 reyk from = (u_char *)imsg->data + sizeof(cko);
260 c525adb9 2014-04-18 reyk if ((to = calloc(1, cko.cko_tlen)) == NULL)
261 09e53fee 2017-05-28 benno fatalx("%s: calloc", __func__);
263 c525adb9 2014-04-18 reyk switch (imsg->hdr.type) {
264 c525adb9 2014-04-18 reyk case IMSG_CA_PRIVENC:
265 c525adb9 2014-04-18 reyk cko.cko_tlen = RSA_private_encrypt(cko.cko_flen,
266 c525adb9 2014-04-18 reyk from, to, rsa, cko.cko_padding);
268 c525adb9 2014-04-18 reyk case IMSG_CA_PRIVDEC:
269 c525adb9 2014-04-18 reyk cko.cko_tlen = RSA_private_decrypt(cko.cko_flen,
270 c525adb9 2014-04-18 reyk from, to, rsa, cko.cko_padding);
274 ee99886a 2018-01-01 claudio if (cko.cko_tlen == -1) {
275 ee99886a 2018-01-01 claudio char buf[256];
276 ee99886a 2018-01-01 claudio log_warnx("%s: %s", __func__,
277 ee99886a 2018-01-01 claudio ERR_error_string(ERR_get_error(), buf));
280 c525adb9 2014-04-18 reyk iov[c].iov_base = &cko;
281 c525adb9 2014-04-18 reyk iov[c++].iov_len = sizeof(cko);
282 ee99886a 2018-01-01 claudio if (cko.cko_tlen > 0) {
283 c525adb9 2014-04-18 reyk iov[c].iov_base = to;
284 c525adb9 2014-04-18 reyk iov[c++].iov_len = cko.cko_tlen;
287 7dd9a7dd 2018-01-24 claudio if (proc_composev_imsg(env->sc_ps, PROC_RELAY, cko.cko_proc,
288 7dd9a7dd 2018-01-24 claudio imsg->hdr.type, -1, -1, iov, c) == -1)
289 7dd9a7dd 2018-01-24 claudio log_warn("%s: proc_composev_imsg", __func__);
292 c525adb9 2014-04-18 reyk RSA_free(rsa);
302 c525adb9 2014-04-18 reyk * RSA privsep engine (called from unprivileged processes)
305 5b1d01ab 2023-07-16 tb static const RSA_METHOD *rsa_default;
306 4b4041f5 2022-01-11 tb static RSA_METHOD *rsae_method;
309 0bdb5f55 2014-04-18 reyk rsae_send_imsg(int flen, const u_char *from, u_char *to, RSA *rsa,
310 0bdb5f55 2014-04-18 reyk int padding, u_int cmd)
312 b14526d5 2016-09-02 reyk struct privsep *ps = env->sc_ps;
313 5ba5de82 2016-09-01 claudio struct pollfd pfd[1];
314 c525adb9 2014-04-18 reyk struct ctl_keyop cko;
315 c525adb9 2014-04-18 reyk int ret = 0;
316 f4a6eef3 2017-05-27 claudio char *hash;
317 c525adb9 2014-04-18 reyk struct iovec iov[2];
318 c525adb9 2014-04-18 reyk struct imsgbuf *ibuf;
319 c525adb9 2014-04-18 reyk struct imsgev *iev;
320 c525adb9 2014-04-18 reyk struct imsg imsg;
321 c525adb9 2014-04-18 reyk int n, done = 0, cnt = 0;
322 c525adb9 2014-04-18 reyk u_char *toptr;
323 e7fdc47f 2021-03-23 claudio static u_int seq = 0;
325 f4a6eef3 2017-05-27 claudio if ((hash = RSA_get_ex_data(rsa, 0)) == NULL)
328 b14526d5 2016-09-02 reyk iev = proc_iev(ps, PROC_CA, ps->ps_instance);
329 c525adb9 2014-04-18 reyk ibuf = &iev->ibuf;
332 c525adb9 2014-04-18 reyk * XXX this could be nicer...
335 f4a6eef3 2017-05-27 claudio (void)strlcpy(cko.cko_hash, hash, sizeof(cko.cko_hash));
336 b14526d5 2016-09-02 reyk cko.cko_proc = ps->ps_instance;
337 c525adb9 2014-04-18 reyk cko.cko_flen = flen;
338 c525adb9 2014-04-18 reyk cko.cko_tlen = RSA_size(rsa);
339 c525adb9 2014-04-18 reyk cko.cko_padding = padding;
340 e7fdc47f 2021-03-23 claudio cko.cko_cookie = seq++;
342 c525adb9 2014-04-18 reyk iov[cnt].iov_base = &cko;
343 c525adb9 2014-04-18 reyk iov[cnt++].iov_len = sizeof(cko);
344 af11e588 2016-09-28 reyk iov[cnt].iov_base = (void *)(uintptr_t)from;
345 c525adb9 2014-04-18 reyk iov[cnt++].iov_len = flen;
348 c525adb9 2014-04-18 reyk * Send a synchronous imsg because we cannot defer the RSA
349 802f4c96 2026-03-05 tb * operation in OpenSSL.
351 7d3002f3 2026-02-24 rsadowski if (imsg_composev(ibuf, cmd, 0, 0, -1, iov, cnt) == -1) {
352 7dd9a7dd 2018-01-24 claudio log_warn("%s: imsg_composev", __func__);
353 7d3002f3 2026-02-24 rsadowski return -1;
355 7d3002f3 2026-02-24 rsadowski if (imsgbuf_flush(ibuf) == -1) {
356 585eb325 2024-11-21 claudio log_warn("%s: imsgbuf_flush", __func__);
357 7d3002f3 2026-02-24 rsadowski return -1;
360 5ba5de82 2016-09-01 claudio pfd[0].fd = ibuf->fd;
361 5ba5de82 2016-09-01 claudio pfd[0].events = POLLIN;
362 c525adb9 2014-04-18 reyk while (!done) {
363 5ba5de82 2016-09-01 claudio switch (poll(pfd, 1, RELAY_TLS_PRIV_TIMEOUT)) {
364 5ba5de82 2016-09-01 claudio case -1:
365 c89abf36 2022-01-20 benno if (errno != EINTR)
366 c89abf36 2022-01-20 benno fatal("%s: poll", __func__);
369 e7fdc47f 2021-03-23 claudio log_warnx("%s: priv%s poll timeout, keyop #%x",
370 e7fdc47f 2021-03-23 claudio __func__,
371 e7fdc47f 2021-03-23 claudio cmd == IMSG_CA_PRIVENC ? "enc" : "dec",
372 e7fdc47f 2021-03-23 claudio cko.cko_cookie);
374 5ba5de82 2016-09-01 claudio default:
377 a523d270 2024-11-21 claudio if ((n = imsgbuf_read(ibuf)) == -1)
378 585eb325 2024-11-21 claudio fatalx("imsgbuf_read");
379 c525adb9 2014-04-18 reyk if (n == 0)
380 c525adb9 2014-04-18 reyk fatalx("pipe closed");
382 c525adb9 2014-04-18 reyk while (!done) {
383 c525adb9 2014-04-18 reyk if ((n = imsg_get(ibuf, &imsg)) == -1)
384 c525adb9 2014-04-18 reyk fatalx("imsg_get error");
385 c525adb9 2014-04-18 reyk if (n == 0)
388 c525adb9 2014-04-18 reyk IMSG_SIZE_CHECK(&imsg, (&cko));
389 c525adb9 2014-04-18 reyk memcpy(&cko, imsg.data, sizeof(cko));
392 e7fdc47f 2021-03-23 claudio * Due to earlier timed out requests, there may be
393 e7fdc47f 2021-03-23 claudio * responses that need to be skipped.
395 e7fdc47f 2021-03-23 claudio if (cko.cko_cookie != seq - 1) {
396 e7fdc47f 2021-03-23 claudio log_warnx(
397 e7fdc47f 2021-03-23 claudio "%s: priv%s obsolete keyop #%x", __func__,
398 e7fdc47f 2021-03-23 claudio cmd == IMSG_CA_PRIVENC ? "enc" : "dec",
399 e7fdc47f 2021-03-23 claudio cko.cko_cookie);
400 3ec811e2 2026-02-24 rsadowski imsg_free(&imsg);
401 e7fdc47f 2021-03-23 claudio continue;
404 e7fdc47f 2021-03-23 claudio if (imsg.hdr.type != cmd)
405 e7fdc47f 2021-03-23 claudio fatalx("invalid response");
407 c525adb9 2014-04-18 reyk ret = cko.cko_tlen;
408 a065ee49 2026-03-05 rsadowski if (ret == -1) {
409 a065ee49 2026-03-05 rsadowski log_warnx("%s: priv%s failed for key %s",
410 a065ee49 2026-03-05 rsadowski __func__, cmd == IMSG_CA_PRIVENC ?
411 a065ee49 2026-03-05 rsadowski "enc" : "dec", cko.cko_hash);
412 a065ee49 2026-03-05 rsadowski } else if (ret > 0) {
413 ee99886a 2018-01-01 claudio if (IMSG_DATA_SIZE(&imsg) !=
414 ee99886a 2018-01-01 claudio (sizeof(cko) + ret))
415 ee99886a 2018-01-01 claudio fatalx("data size");
416 c525adb9 2014-04-18 reyk toptr = (u_char *)imsg.data + sizeof(cko);
417 c525adb9 2014-04-18 reyk memcpy(to, toptr, ret);
421 c525adb9 2014-04-18 reyk imsg_free(&imsg);
424 c525adb9 2014-04-18 reyk imsg_event_add(iev);
430 0bdb5f55 2014-04-18 reyk rsae_priv_enc(int flen, const u_char *from, u_char *to, RSA *rsa, int padding)
432 c525adb9 2014-04-18 reyk DPRINTF("%s:%d", __func__, __LINE__);
433 4b4041f5 2022-01-11 tb return rsae_send_imsg(flen, from, to, rsa, padding, IMSG_CA_PRIVENC);
437 0bdb5f55 2014-04-18 reyk rsae_priv_dec(int flen, const u_char *from, u_char *to, RSA *rsa, int padding)
439 c525adb9 2014-04-18 reyk DPRINTF("%s:%d", __func__, __LINE__);
440 4b4041f5 2022-01-11 tb return rsae_send_imsg(flen, from, to, rsa, padding, IMSG_CA_PRIVDEC);
444 c525adb9 2014-04-18 reyk ca_engine_init(struct relayd *x_env)
446 5b1d01ab 2023-07-16 tb const char *errstr;
448 c525adb9 2014-04-18 reyk if (env == NULL)
449 c525adb9 2014-04-18 reyk env = x_env;
451 2f479274 2015-05-02 claudio if (rsa_default != NULL)
454 5b1d01ab 2023-07-16 tb if ((rsa_default = RSA_get_default_method()) == NULL) {
455 5b1d01ab 2023-07-16 tb errstr = "RSA_get_default_method";
459 5b1d01ab 2023-07-16 tb if ((rsae_method = RSA_meth_dup(rsa_default)) == NULL) {
460 5b1d01ab 2023-07-16 tb errstr = "RSA_meth_dup";
464 4b4041f5 2022-01-11 tb RSA_meth_set_priv_enc(rsae_method, rsae_priv_enc);
465 4b4041f5 2022-01-11 tb RSA_meth_set_priv_dec(rsae_method, rsae_priv_dec);
467 4b4041f5 2022-01-11 tb RSA_meth_set_flags(rsae_method,
468 4b4041f5 2022-01-11 tb RSA_meth_get_flags(rsa_default) | RSA_METHOD_FLAG_NO_CHECK);
469 4b4041f5 2022-01-11 tb RSA_meth_set0_app_data(rsae_method,
470 4b4041f5 2022-01-11 tb RSA_meth_get0_app_data(rsa_default));
472 5b1d01ab 2023-07-16 tb RSA_set_default_method(rsae_method);
477 4b4041f5 2022-01-11 tb RSA_meth_free(rsae_method);
478 f4a6eef3 2017-05-27 claudio fatalx("%s: %s", __func__, errstr);