2 86693a33 2023-06-11 op * Copyright (c) 2023 Omar Polo <op@omarpolo.com>
3 86693a33 2023-06-11 op * Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
4 86693a33 2023-06-11 op * Copyright (c) 2012 Gilles Chehade <gilles@poolp.org>
6 86693a33 2023-06-11 op * Permission to use, copy, modify, and distribute this software for any
7 86693a33 2023-06-11 op * purpose with or without fee is hereby granted, provided that the above
8 86693a33 2023-06-11 op * copyright notice and this permission notice appear in all copies.
10 86693a33 2023-06-11 op * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 86693a33 2023-06-11 op * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 86693a33 2023-06-11 op * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 86693a33 2023-06-11 op * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 86693a33 2023-06-11 op * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 86693a33 2023-06-11 op * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 86693a33 2023-06-11 op * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 86693a33 2023-06-11 op #include "gmid.h"
21 86693a33 2023-06-11 op #include <string.h>
23 86693a33 2023-06-11 op #include <openssl/err.h>
24 86693a33 2023-06-11 op #include <openssl/pem.h>
25 86693a33 2023-06-11 op #include <openssl/engine.h>
27 86693a33 2023-06-11 op #include "log.h"
28 86693a33 2023-06-11 op #include "proc.h"
30 86693a33 2023-06-11 op #ifndef nitems
31 86693a33 2023-06-11 op #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
34 86693a33 2023-06-11 op static void crypto_init(struct privsep *, struct privsep_proc *, void *);
35 86693a33 2023-06-11 op static int crypto_dispatch_parent(int, struct privsep_proc *, struct imsg *);
36 86693a33 2023-06-11 op static int crypto_dispatch_server(int, struct privsep_proc *, struct imsg *);
38 86693a33 2023-06-11 op static struct privsep_proc procs[] = {
39 86693a33 2023-06-11 op { "parent", PROC_PARENT, crypto_dispatch_parent },
40 86693a33 2023-06-11 op { "server", PROC_SERVER, crypto_dispatch_server },
43 86693a33 2023-06-11 op struct imsg_crypto_req {
45 86693a33 2023-06-11 op char hash[TLS_CERT_HASH_SIZE];
49 86693a33 2023-06-11 op /* followed by flen bytes of `from'. */
52 86693a33 2023-06-11 op struct imsg_crypto_res {
56 86693a33 2023-06-11 op /* followed by len bytes of reply */
59 86693a33 2023-06-11 op static uint64_t reqid;
60 86693a33 2023-06-11 op static struct conf *conf;
63 86693a33 2023-06-11 op crypto(struct privsep *ps, struct privsep_proc *p)
65 86693a33 2023-06-11 op proc_run(ps, p, procs, nitems(procs), crypto_init, NULL);
69 86693a33 2023-06-11 op crypto_init(struct privsep *ps, struct privsep_proc *p, void *arg)
72 86693a33 2023-06-11 op static volatile int attached;
73 86693a33 2023-06-11 op while (!attached) sleep(1);
76 86693a33 2023-06-11 op conf = ps->ps_env;
78 86693a33 2023-06-11 op sandbox_crypto_process();
82 86693a33 2023-06-11 op crypto_dispatch_parent(int fd, struct privsep_proc *p, struct imsg *imsg)
84 86693a33 2023-06-11 op switch (imsg->hdr.type) {
85 86693a33 2023-06-11 op case IMSG_RECONF_START:
86 86693a33 2023-06-11 op case IMSG_RECONF_CERT:
87 86693a33 2023-06-11 op case IMSG_RECONF_KEY:
88 86693a33 2023-06-11 op case IMSG_RECONF_END:
89 86693a33 2023-06-11 op if (config_recv(conf, imsg) == -1)
99 86693a33 2023-06-11 op static EVP_PKEY *
100 86693a33 2023-06-11 op get_pkey(const char *hash)
102 86693a33 2023-06-11 op struct pki *pki;
104 86693a33 2023-06-11 op TAILQ_FOREACH(pki, &conf->pkis, pkis) {
105 86693a33 2023-06-11 op if (!strcmp(pki->hash, hash))
106 86693a33 2023-06-11 op return pki->pkey;
113 86693a33 2023-06-11 op crypto_dispatch_server(int fd, struct privsep_proc *p, struct imsg *imsg)
115 86693a33 2023-06-11 op struct privsep *ps = p->p_ps;
116 51340784 2023-06-23 op RSA *rsa = NULL;
117 51340784 2023-06-23 op EC_KEY *ecdsa = NULL;
118 86693a33 2023-06-11 op EVP_PKEY *pkey;
119 86693a33 2023-06-11 op struct imsg_crypto_req req;
120 86693a33 2023-06-11 op struct imsg_crypto_res res;
121 86693a33 2023-06-11 op struct iovec iov[2];
122 86693a33 2023-06-11 op const void *from;
123 10cc8193 2023-06-13 op unsigned char *data, *to;
124 86693a33 2023-06-11 op size_t datalen;
126 b8d68fc8 2023-06-11 op unsigned int len;
128 10cc8193 2023-06-13 op data = imsg->data;
129 86693a33 2023-06-11 op datalen = IMSG_DATA_SIZE(imsg);
131 86693a33 2023-06-11 op switch (imsg->hdr.type) {
132 86693a33 2023-06-11 op case IMSG_CRYPTO_RSA_PRIVENC:
133 86693a33 2023-06-11 op case IMSG_CRYPTO_RSA_PRIVDEC:
134 86693a33 2023-06-11 op if (datalen < sizeof(req))
135 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d", imsg->hdr.type);
136 10cc8193 2023-06-13 op memcpy(&req, data, sizeof(req));
137 86693a33 2023-06-11 op if (datalen != sizeof(req) + req.flen)
138 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d", imsg->hdr.type);
139 10cc8193 2023-06-13 op from = data + sizeof(req);
141 86693a33 2023-06-11 op if ((pkey = get_pkey(req.hash)) == NULL ||
142 86693a33 2023-06-11 op (rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
143 86693a33 2023-06-11 op fatalx("invalid pkey hash");
145 86693a33 2023-06-11 op if ((to = calloc(1, req.tlen)) == NULL)
146 86693a33 2023-06-11 op fatal("calloc");
148 b90faa16 2023-06-13 op if (imsg->hdr.type == IMSG_CRYPTO_RSA_PRIVENC)
149 86693a33 2023-06-11 op ret = RSA_private_encrypt(req.flen, from,
150 86693a33 2023-06-11 op to, rsa, req.padding);
152 86693a33 2023-06-11 op ret = RSA_private_decrypt(req.flen, from,
153 86693a33 2023-06-11 op to, rsa, req.padding);
155 86693a33 2023-06-11 op memset(&res, 0, sizeof(res));
156 86693a33 2023-06-11 op res.id = req.id;
157 86693a33 2023-06-11 op res.ret = ret;
159 86693a33 2023-06-11 op memset(&iov, 0, sizeof(iov));
161 86693a33 2023-06-11 op iov[n].iov_base = &res;
162 86693a33 2023-06-11 op iov[n].iov_len = sizeof(res);
165 86693a33 2023-06-11 op if (ret > 0) {
166 86693a33 2023-06-11 op res.len = ret;
167 86693a33 2023-06-11 op iov[n].iov_base = to;
168 86693a33 2023-06-11 op iov[n].iov_len = ret;
172 86693a33 2023-06-11 op log_debug("replying to server #%d", imsg->hdr.pid);
173 86693a33 2023-06-11 op if (proc_composev_imsg(ps, PROC_SERVER, imsg->hdr.pid - 1,
174 86693a33 2023-06-11 op imsg->hdr.type, 0, -1, iov, n) == -1)
175 86693a33 2023-06-11 op fatal("proc_composev_imsg");
177 86693a33 2023-06-11 op if (proc_flush_imsg(ps, PROC_SERVER, imsg->hdr.pid - 1) == -1)
178 86693a33 2023-06-11 op fatal("proc_flush_imsg");
181 86693a33 2023-06-11 op RSA_free(rsa);
184 86693a33 2023-06-11 op case IMSG_CRYPTO_ECDSA_SIGN:
185 86693a33 2023-06-11 op if (datalen < sizeof(req))
186 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d", imsg->hdr.type);
187 10cc8193 2023-06-13 op memcpy(&req, data, sizeof(req));
188 86693a33 2023-06-11 op if (datalen != sizeof(req) + req.flen)
189 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d", imsg->hdr.type);
190 10cc8193 2023-06-13 op from = data + sizeof(req);
192 86693a33 2023-06-11 op if ((pkey = get_pkey(req.hash)) == NULL ||
193 86693a33 2023-06-11 op (ecdsa = EVP_PKEY_get1_EC_KEY(pkey)) == NULL)
194 86693a33 2023-06-11 op fatalx("invalid pkey hash");
196 86693a33 2023-06-11 op len = ECDSA_size(ecdsa);
197 86693a33 2023-06-11 op if ((to = calloc(1, len)) == NULL)
198 86693a33 2023-06-11 op fatal("calloc");
199 86693a33 2023-06-11 op ret = ECDSA_sign(0, from, req.flen, to, &len, ecdsa);
201 86693a33 2023-06-11 op memset(&res, 0, sizeof(res));
202 86693a33 2023-06-11 op res.id = req.id;
203 86693a33 2023-06-11 op res.ret = ret;
205 86693a33 2023-06-11 op memset(&iov, 0, sizeof(iov));
207 86693a33 2023-06-11 op iov[0].iov_base = &res;
208 86693a33 2023-06-11 op iov[1].iov_len = sizeof(res);
211 86693a33 2023-06-11 op if (ret > 0) {
212 86693a33 2023-06-11 op res.len = len;
213 86693a33 2023-06-11 op iov[n].iov_base = to;
214 86693a33 2023-06-11 op iov[n].iov_len = len;
218 86693a33 2023-06-11 op log_debug("replying to server #%d", imsg->hdr.pid);
219 86693a33 2023-06-11 op if (proc_composev_imsg(ps, PROC_SERVER, imsg->hdr.pid - 1,
220 86693a33 2023-06-11 op imsg->hdr.type, 0, -1, iov, n) == -1)
221 86693a33 2023-06-11 op fatal("proc_composev_imsg");
223 86693a33 2023-06-11 op if (proc_flush_imsg(ps, PROC_SERVER, imsg->hdr.pid - 1) == -1)
224 86693a33 2023-06-11 op fatal("proc_flush_imsg");
227 86693a33 2023-06-11 op EC_KEY_free(ecdsa);
239 86693a33 2023-06-11 op * RSA privsep engine (called from unprivileged processes)
242 86693a33 2023-06-11 op static const RSA_METHOD *rsa_default;
243 86693a33 2023-06-11 op static RSA_METHOD *rsae_method;
246 86693a33 2023-06-11 op rsae_send_imsg(int flen, const unsigned char *from, unsigned char *to,
247 86693a33 2023-06-11 op RSA *rsa, int padding, unsigned int cmd)
249 86693a33 2023-06-11 op struct imsg_crypto_req req;
250 86693a33 2023-06-11 op struct iovec iov[2];
251 86693a33 2023-06-11 op struct imsg_crypto_res res;
252 86693a33 2023-06-11 op struct imsgev *iev;
253 86693a33 2023-06-11 op struct privsep_proc *p;
254 86693a33 2023-06-11 op struct privsep *ps = conf->ps;
255 86693a33 2023-06-11 op struct imsgbuf *ibuf;
256 86693a33 2023-06-11 op struct imsg imsg;
258 86693a33 2023-06-11 op int n, done = 0;
259 86693a33 2023-06-11 op const void *toptr;
261 10cc8193 2023-06-13 op unsigned char *data;
262 86693a33 2023-06-11 op size_t datalen;
264 86693a33 2023-06-11 op if ((hash = RSA_get_ex_data(rsa, 0)) == NULL)
268 86693a33 2023-06-11 op * Send a synchronous imsg because we cannot defer the RSA
269 86693a33 2023-06-11 op * operation in OpenSSL's engine layer.
271 86693a33 2023-06-11 op memset(&req, 0, sizeof(req));
272 86693a33 2023-06-11 op req.id = ++reqid;
273 86693a33 2023-06-11 op if (strlcpy(req.hash, hash, sizeof(req.hash)) >= sizeof(req.hash))
274 86693a33 2023-06-11 op fatalx("%s: hash too long (%zu)", __func__, strlen(hash));
275 86693a33 2023-06-11 op req.flen = flen;
276 86693a33 2023-06-11 op req.tlen = RSA_size(rsa);
277 86693a33 2023-06-11 op req.padding = padding;
279 86693a33 2023-06-11 op memset(&iov, 0, sizeof(iov));
280 86693a33 2023-06-11 op iov[0].iov_base = &req;
281 86693a33 2023-06-11 op iov[0].iov_len = sizeof(req);
282 86693a33 2023-06-11 op iov[1].iov_base = (void *)from;
283 86693a33 2023-06-11 op iov[1].iov_len = flen;
285 86693a33 2023-06-11 op if (proc_composev(ps, PROC_CRYPTO, cmd, iov, 2) == -1)
286 86693a33 2023-06-11 op fatal("proc_composev");
288 86693a33 2023-06-11 op if (proc_flush_imsg(ps, PROC_CRYPTO, -1) == -1)
289 86693a33 2023-06-11 op fatal("proc_flush_imsg");
291 86693a33 2023-06-11 op iev = ps->ps_ievs[PROC_CRYPTO];
292 86693a33 2023-06-11 op p = iev->proc;
293 86693a33 2023-06-11 op ibuf = &iev->ibuf;
295 86693a33 2023-06-11 op while (!done) {
296 86693a33 2023-06-11 op if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
297 86693a33 2023-06-11 op fatalx("imsg_read");
299 86693a33 2023-06-11 op fatalx("pipe closed");
301 86693a33 2023-06-11 op while (!done) {
302 86693a33 2023-06-11 op if ((n = imsg_get(ibuf, &imsg)) == -1)
303 86693a33 2023-06-11 op fatalx("imsg_get error");
307 86693a33 2023-06-11 op #if DEBUG > 1
309 86693a33 2023-06-11 op "%s: %s %d got imsg %d peerid %d from %s %d",
310 86693a33 2023-06-11 op __func__, title, 1, imsg.hdr.type,
311 86693a33 2023-06-11 op imsg.hdr.peerid, "crypto", imsg.hdr.pid);
314 86693a33 2023-06-11 op if ((p->p_cb)(ibuf->fd, p, &imsg) == 0) {
315 86693a33 2023-06-11 op /* Message was handled by the callback */
316 86693a33 2023-06-11 op imsg_free(&imsg);
320 86693a33 2023-06-11 op switch (imsg.hdr.type) {
321 86693a33 2023-06-11 op case IMSG_CRYPTO_RSA_PRIVENC:
322 86693a33 2023-06-11 op case IMSG_CRYPTO_RSA_PRIVDEC:
325 86693a33 2023-06-11 op fatalx("%s: %s %d got invalid imsg %d"
326 86693a33 2023-06-11 op " peerid %d from %s %d",
327 86693a33 2023-06-11 op __func__, "server", ps->ps_instance + 1,
328 86693a33 2023-06-11 op imsg.hdr.type, imsg.hdr.peerid,
329 86693a33 2023-06-11 op "crypto", imsg.hdr.pid);
332 10cc8193 2023-06-13 op data = imsg.data;
333 86693a33 2023-06-11 op datalen = IMSG_DATA_SIZE(&imsg);
334 86693a33 2023-06-11 op if (datalen < sizeof(res))
335 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d",
336 86693a33 2023-06-11 op imsg.hdr.type);
337 10cc8193 2023-06-13 op memcpy(&res, data, sizeof(res));
338 86693a33 2023-06-11 op if (datalen != sizeof(res) + res.ret)
339 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d",
340 86693a33 2023-06-11 op imsg.hdr.type);
341 86693a33 2023-06-11 op ret = res.ret;
342 10cc8193 2023-06-13 op toptr = data + sizeof(res);
344 86693a33 2023-06-11 op if (res.id != reqid)
345 d1739e3f 2023-06-11 op fatalx("invalid id; got %llu, want %llu",
346 d1739e3f 2023-06-11 op (unsigned long long)res.id,
347 d1739e3f 2023-06-11 op (unsigned long long)reqid);
348 86693a33 2023-06-11 op if (res.ret > 0)
349 86693a33 2023-06-11 op memcpy(to, toptr, res.len);
353 86693a33 2023-06-11 op imsg_free(&imsg);
356 86693a33 2023-06-11 op imsg_event_add(iev);
358 86693a33 2023-06-11 op return (ret);
362 86693a33 2023-06-11 op rsae_priv_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,
365 86693a33 2023-06-11 op log_debug("debug: %s", __func__);
366 86693a33 2023-06-11 op if (RSA_get_ex_data(rsa, 0) != NULL)
367 86693a33 2023-06-11 op return (rsae_send_imsg(flen, from, to, rsa, padding,
368 86693a33 2023-06-11 op IMSG_CRYPTO_RSA_PRIVENC));
369 86693a33 2023-06-11 op return (RSA_meth_get_priv_enc(rsa_default)(flen, from, to, rsa, padding));
373 86693a33 2023-06-11 op rsae_priv_dec(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,
376 86693a33 2023-06-11 op log_debug("debug: %s", __func__);
377 86693a33 2023-06-11 op if (RSA_get_ex_data(rsa, 0) != NULL)
378 86693a33 2023-06-11 op return (rsae_send_imsg(flen, from, to, rsa, padding,
379 86693a33 2023-06-11 op IMSG_CRYPTO_RSA_PRIVDEC));
381 86693a33 2023-06-11 op return (RSA_meth_get_priv_dec(rsa_default)(flen, from, to, rsa, padding));
386 86693a33 2023-06-11 op * ECDSA privsep engine (called from unprivileged processes)
389 86693a33 2023-06-11 op static const EC_KEY_METHOD *ecdsa_default;
390 86693a33 2023-06-11 op static EC_KEY_METHOD *ecdsae_method;
392 86693a33 2023-06-11 op static ECDSA_SIG *
393 86693a33 2023-06-11 op ecdsae_send_enc_imsg(const unsigned char *dgst, int dgst_len,
394 86693a33 2023-06-11 op const BIGNUM *inv, const BIGNUM *rp, EC_KEY *eckey)
396 86693a33 2023-06-11 op ECDSA_SIG *sig = NULL;
397 86693a33 2023-06-11 op struct imsg_crypto_req req;
398 86693a33 2023-06-11 op struct iovec iov[2];
399 86693a33 2023-06-11 op struct imsg_crypto_res res;
400 86693a33 2023-06-11 op struct imsgev *iev;
401 86693a33 2023-06-11 op struct privsep_proc *p;
402 86693a33 2023-06-11 op struct privsep *ps = conf->ps;
403 86693a33 2023-06-11 op struct imsgbuf *ibuf;
404 86693a33 2023-06-11 op struct imsg imsg;
405 86693a33 2023-06-11 op int n, done = 0;
406 86693a33 2023-06-11 op const void *toptr;
408 10cc8193 2023-06-13 op unsigned char *data;
409 86693a33 2023-06-11 op size_t datalen;
411 86693a33 2023-06-11 op if ((hash = EC_KEY_get_ex_data(eckey, 0)) == NULL)
415 86693a33 2023-06-11 op * Send a synchronous imsg because we cannot defer the RSA
416 86693a33 2023-06-11 op * operation in OpenSSL's engine layer.
418 86693a33 2023-06-11 op memset(&req, 0, sizeof(req));
419 86693a33 2023-06-11 op req.id = reqid++;
420 86693a33 2023-06-11 op if (strlcpy(req.hash, hash, sizeof(req.hash)) >= sizeof(req.hash))
421 86693a33 2023-06-11 op fatalx("%s: hash too long (%zu)", __func__, strlen(hash));
422 86693a33 2023-06-11 op req.flen = dgst_len;
424 86693a33 2023-06-11 op memset(&iov, 0, sizeof(iov));
425 86693a33 2023-06-11 op iov[0].iov_base = &req;
426 86693a33 2023-06-11 op iov[0].iov_len = sizeof(req);
427 86693a33 2023-06-11 op iov[1].iov_base = (void *)dgst;
428 86693a33 2023-06-11 op iov[1].iov_len = dgst_len;
430 86693a33 2023-06-11 op if (proc_composev(ps, PROC_CRYPTO, IMSG_CRYPTO_ECDSA_SIGN, iov, 2) == -1)
431 86693a33 2023-06-11 op fatal("proc_composev");
433 86693a33 2023-06-11 op if (proc_flush_imsg(ps, PROC_CRYPTO, -1) == -1)
434 86693a33 2023-06-11 op fatal("proc_flush_imsg");
436 86693a33 2023-06-11 op iev = ps->ps_ievs[PROC_CRYPTO];
437 86693a33 2023-06-11 op p = iev->proc;
438 86693a33 2023-06-11 op ibuf = &iev->ibuf;
440 86693a33 2023-06-11 op while (!done) {
441 86693a33 2023-06-11 op if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
442 86693a33 2023-06-11 op fatalx("imsg_read");
444 86693a33 2023-06-11 op fatalx("pipe closed");
446 86693a33 2023-06-11 op while (!done) {
447 86693a33 2023-06-11 op if ((n = imsg_get(ibuf, &imsg)) == -1)
448 86693a33 2023-06-11 op fatalx("imsg_get error");
452 86693a33 2023-06-11 op #if DEBUG > 1
454 86693a33 2023-06-11 op "%s: %s %d got imsg %d peerid %d from %s %d",
455 86693a33 2023-06-11 op __func__, title, 1, imsg.hdr.type,
456 86693a33 2023-06-11 op imsg.hdr.peerid, "crypto", imsg.hdr.pid);
459 86693a33 2023-06-11 op if (crypto_dispatch_server(ibuf->fd, p, &imsg) == 0) {
460 86693a33 2023-06-11 op /* Message was handled by the callback */
461 86693a33 2023-06-11 op imsg_free(&imsg);
465 86693a33 2023-06-11 op if (imsg.hdr.type != IMSG_CRYPTO_ECDSA_SIGN)
466 86693a33 2023-06-11 op fatalx("%s: %s %d got invalid imsg %d"
467 86693a33 2023-06-11 op " peerid %d from %s %d",
468 86693a33 2023-06-11 op __func__, "server", ps->ps_instance + 1,
469 86693a33 2023-06-11 op imsg.hdr.type, imsg.hdr.peerid,
470 86693a33 2023-06-11 op "crypto", imsg.hdr.pid);
472 10cc8193 2023-06-13 op data = imsg.data;
473 86693a33 2023-06-11 op datalen = IMSG_DATA_SIZE(&imsg);
474 86693a33 2023-06-11 op if (datalen < sizeof(res))
475 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d",
476 86693a33 2023-06-11 op imsg.hdr.type);
477 10cc8193 2023-06-13 op memcpy(&res, data, sizeof(res));
478 86693a33 2023-06-11 op if (datalen != sizeof(res) + res.ret)
479 86693a33 2023-06-11 op fatalx("size mismatch for imsg %d",
480 86693a33 2023-06-11 op imsg.hdr.type);
481 10cc8193 2023-06-13 op toptr = data + sizeof(res);
483 86693a33 2023-06-11 op if (res.id != reqid)
484 86693a33 2023-06-11 op fatalx("invalid response id");
485 86693a33 2023-06-11 op if (res.ret > 0) {
486 86693a33 2023-06-11 op d2i_ECDSA_SIG(&sig,
487 86693a33 2023-06-11 op (const unsigned char **)&toptr, res.len);
492 86693a33 2023-06-11 op imsg_free(&imsg);
495 86693a33 2023-06-11 op imsg_event_add(iev);
497 86693a33 2023-06-11 op return (sig);
500 86693a33 2023-06-11 op static ECDSA_SIG *
501 86693a33 2023-06-11 op ecdsae_do_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv,
502 86693a33 2023-06-11 op const BIGNUM *rp, EC_KEY *eckey)
504 86693a33 2023-06-11 op ECDSA_SIG *(*psign_sig)(const unsigned char *, int, const BIGNUM *,
505 86693a33 2023-06-11 op const BIGNUM *, EC_KEY *);
507 86693a33 2023-06-11 op log_debug("debug: %s", __func__);
508 86693a33 2023-06-11 op if (EC_KEY_get_ex_data(eckey, 0) != NULL)
509 86693a33 2023-06-11 op return (ecdsae_send_enc_imsg(dgst, dgst_len, inv, rp, eckey));
510 86693a33 2023-06-11 op EC_KEY_METHOD_get_sign(ecdsa_default, NULL, NULL, &psign_sig);
511 86693a33 2023-06-11 op return (psign_sig(dgst, dgst_len, inv, rp, eckey));
516 86693a33 2023-06-11 op * Initialize the two engines.
520 86693a33 2023-06-11 op rsa_engine_init(void)
523 86693a33 2023-06-11 op const char *errstr, *name;
525 86693a33 2023-06-11 op if ((e = ENGINE_get_default_RSA()) == NULL) {
526 86693a33 2023-06-11 op if ((e = ENGINE_new()) == NULL) {
527 86693a33 2023-06-11 op errstr = "ENGINE_new";
530 21617eda 2023-07-22 op if (!ENGINE_set_name(e, "RSA privsep engine")) {
531 86693a33 2023-06-11 op errstr = "ENGINE_set_name";
534 86693a33 2023-06-11 op if ((rsa_default = RSA_get_default_method()) == NULL) {
535 86693a33 2023-06-11 op errstr = "RSA_get_default_method";
538 86693a33 2023-06-11 op } else if ((rsa_default = ENGINE_get_RSA(e)) == NULL) {
539 86693a33 2023-06-11 op errstr = "ENGINE_get_RSA";
543 21617eda 2023-07-22 op if ((rsae_method = RSA_meth_dup(rsa_default)) == NULL) {
544 21617eda 2023-07-22 op errstr = "RSA_meth_dup";
548 86693a33 2023-06-11 op if ((name = ENGINE_get_name(e)) == NULL)
549 86693a33 2023-06-11 op name = "unknown RSA engine";
551 86693a33 2023-06-11 op log_debug("debug: %s: using %s", __func__, name);
553 21617eda 2023-07-22 op RSA_meth_set_priv_enc(rsae_method, rsae_priv_enc);
554 21617eda 2023-07-22 op RSA_meth_set_priv_dec(rsae_method, rsae_priv_dec);
556 86693a33 2023-06-11 op RSA_meth_set_flags(rsae_method,
557 86693a33 2023-06-11 op RSA_meth_get_flags(rsa_default) | RSA_METHOD_FLAG_NO_CHECK);
558 86693a33 2023-06-11 op RSA_meth_set0_app_data(rsae_method,
559 86693a33 2023-06-11 op RSA_meth_get0_app_data(rsa_default));
561 86693a33 2023-06-11 op if (!ENGINE_set_RSA(e, rsae_method)) {
562 86693a33 2023-06-11 op errstr = "ENGINE_set_RSA";
565 86693a33 2023-06-11 op if (!ENGINE_set_default_RSA(e)) {
566 86693a33 2023-06-11 op errstr = "ENGINE_set_default_RSA";
573 86693a33 2023-06-11 op ssl_error(errstr);
574 86693a33 2023-06-11 op fatalx("%s", errstr);
578 86693a33 2023-06-11 op ecdsa_engine_init(void)
581 86693a33 2023-06-11 op const char *errstr, *name;
582 21617eda 2023-07-22 op int (*sign)(int, const unsigned char *, int, unsigned char *,
583 21617eda 2023-07-22 op unsigned int *, const BIGNUM *, const BIGNUM *, EC_KEY *);
584 21617eda 2023-07-22 op int (*sign_setup)(EC_KEY *, BN_CTX *, BIGNUM **, BIGNUM **);
586 86693a33 2023-06-11 op if ((e = ENGINE_get_default_EC()) == NULL) {
587 86693a33 2023-06-11 op if ((e = ENGINE_new()) == NULL) {
588 86693a33 2023-06-11 op errstr = "ENGINE_new";
591 86693a33 2023-06-11 op if (!ENGINE_set_name(e, "ECDSA privsep engine")) {
592 86693a33 2023-06-11 op errstr = "ENGINE_set_name";
595 86693a33 2023-06-11 op if ((ecdsa_default = EC_KEY_get_default_method()) == NULL) {
596 86693a33 2023-06-11 op errstr = "EC_KEY_get_default_method";
599 86693a33 2023-06-11 op } else if ((ecdsa_default = ENGINE_get_EC(e)) == NULL) {
600 86693a33 2023-06-11 op errstr = "ENGINE_get_EC";
604 86693a33 2023-06-11 op if ((name = ENGINE_get_name(e)) == NULL)
605 86693a33 2023-06-11 op name = "unknown ECDSA engine";
607 86693a33 2023-06-11 op log_debug("debug: %s: using %s", __func__, name);
609 21617eda 2023-07-22 op if ((ecdsae_method = EC_KEY_METHOD_new(ecdsa_default)) == NULL) {
610 21617eda 2023-07-22 op errstr = "EC_KEY_METHOD_new";
614 21617eda 2023-07-22 op EC_KEY_METHOD_get_sign(ecdsa_default, &sign, &sign_setup, NULL);
615 21617eda 2023-07-22 op EC_KEY_METHOD_set_sign(ecdsae_method, sign, sign_setup,
616 21617eda 2023-07-22 op ecdsae_do_sign);
618 86693a33 2023-06-11 op if (!ENGINE_set_EC(e, ecdsae_method)) {
619 86693a33 2023-06-11 op errstr = "ENGINE_set_EC";
622 86693a33 2023-06-11 op if (!ENGINE_set_default_EC(e)) {
623 86693a33 2023-06-11 op errstr = "ENGINE_set_default_EC";
630 86693a33 2023-06-11 op ssl_error(errstr);
631 86693a33 2023-06-11 op fatalx("%s", errstr);
635 86693a33 2023-06-11 op crypto_engine_init(struct conf *c)
639 86693a33 2023-06-11 op rsa_engine_init();
640 86693a33 2023-06-11 op ecdsa_engine_init();