On Thu, Jul 13, 2023 at 05:44:03AM +0200, Theo Buehler wrote: > This is analogous to the change that op committed to smtpd a few days > ago. Instead of using ENGINE to make RSA use privsep via imsg, create > an RSA method that has custom priv_enc/priv_dec methods, replace the > default RSA method. Ditch numerous wrappers that extract the default > methods on the fly only to add a log call. > > This removes a lot of boilerplate and shows more clearly where the > actual magic happens. Regress exercises this code and passes.
Nice, that is a lot of boilerplate. ok tobhe@ > > Index: ca.c > =================================================================== > RCS file: /cvs/src/usr.sbin/relayd/ca.c,v > retrieving revision 1.42 > diff -u -p -r1.42 ca.c > --- ca.c 11 Jun 2023 10:30:26 -0000 1.42 > +++ ca.c 11 Jul 2023 18:21:47 -0000 > @@ -41,20 +41,8 @@ void ca_launch(void); > int ca_dispatch_parent(int, struct privsep_proc *, struct imsg *); > int ca_dispatch_relay(int, struct privsep_proc *, struct imsg *); > > -int rsae_pub_enc(int, const u_char *, u_char *, RSA *, int); > -int rsae_pub_dec(int,const u_char *, u_char *, RSA *, int); > int rsae_priv_enc(int, const u_char *, u_char *, RSA *, int); > int rsae_priv_dec(int, const u_char *, u_char *, RSA *, int); > -int rsae_mod_exp(BIGNUM *, const BIGNUM *, RSA *, BN_CTX *); > -int rsae_bn_mod_exp(BIGNUM *, const BIGNUM *, const BIGNUM *, > - const BIGNUM *, BN_CTX *, BN_MONT_CTX *); > -int rsae_init(RSA *); > -int rsae_finish(RSA *); > -int rsae_sign(int, const u_char *, u_int, u_char *, u_int *, > - const RSA *); > -int rsae_verify(int dtype, const u_char *m, u_int, const u_char *, > - u_int, const RSA *); > -int rsae_keygen(RSA *, int, BIGNUM *, BN_GENCB *); > > static struct relayd *env = NULL; > > @@ -301,7 +289,7 @@ ca_dispatch_relay(int fd, struct privsep > * RSA privsep engine (called from unprivileged processes) > */ > > -const RSA_METHOD *rsa_default = NULL; > +static const RSA_METHOD *rsa_default; > static RSA_METHOD *rsae_method; > > static int > @@ -417,20 +405,6 @@ rsae_send_imsg(int flen, const u_char *f > } > > int > -rsae_pub_enc(int flen,const u_char *from, u_char *to, RSA *rsa,int padding) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_pub_enc(rsa_default)(flen, from, to, rsa, padding); > -} > - > -int > -rsae_pub_dec(int flen,const u_char *from, u_char *to, RSA *rsa,int padding) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_pub_dec(rsa_default)(flen, from, to, rsa, padding); > -} > - > -int > rsae_priv_enc(int flen, const u_char *from, u_char *to, RSA *rsa, int > padding) > { > DPRINTF("%s:%d", __func__, __LINE__); > @@ -444,69 +418,10 @@ rsae_priv_dec(int flen, const u_char *fr > return rsae_send_imsg(flen, from, to, rsa, padding, IMSG_CA_PRIVDEC); > } > > -int > -rsae_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_mod_exp(rsa_default)(r0, I, rsa, ctx); > -} > - > -int > -rsae_bn_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, > - const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_bn_mod_exp(rsa_default)(r, a, p, m, ctx, m_ctx); > -} > - > -int > -rsae_init(RSA *rsa) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - if (RSA_meth_get_init(rsa_default) == NULL) > - return 1; > - return RSA_meth_get_init(rsa_default)(rsa); > -} > - > -int > -rsae_finish(RSA *rsa) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - if (RSA_meth_get_finish(rsa_default) == NULL) > - return 1; > - return RSA_meth_get_finish(rsa_default)(rsa); > -} > - > -int > -rsae_sign(int type, const u_char *m, u_int m_length, u_char *sigret, > - u_int *siglen, const RSA *rsa) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_sign(rsa_default)(type, m, m_length, > - sigret, siglen, rsa); > -} > - > -int > -rsae_verify(int dtype, const u_char *m, u_int m_length, const u_char *sigbuf, > - u_int siglen, const RSA *rsa) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_verify(rsa_default)(dtype, m, m_length, > - sigbuf, siglen, rsa); > -} > - > -int > -rsae_keygen(RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb) > -{ > - DPRINTF("%s:%d", __func__, __LINE__); > - return RSA_meth_get_keygen(rsa_default)(rsa, bits, e, cb); > -} > - > void > ca_engine_init(struct relayd *x_env) > { > - ENGINE *e = NULL; > - const char *errstr, *name; > + const char *errstr; > > if (env == NULL) > env = x_env; > @@ -514,68 +429,25 @@ ca_engine_init(struct relayd *x_env) > if (rsa_default != NULL) > return; > > - if ((rsae_method = RSA_meth_new("RSA privsep engine", 0)) == NULL) { > - errstr = "RSA_meth_new"; > + if ((rsa_default = RSA_get_default_method()) == NULL) { > + errstr = "RSA_get_default_method"; > goto fail; > } > > - RSA_meth_set_pub_enc(rsae_method, rsae_pub_enc); > - RSA_meth_set_pub_dec(rsae_method, rsae_pub_dec); > - RSA_meth_set_priv_enc(rsae_method, rsae_priv_enc); > - RSA_meth_set_priv_dec(rsae_method, rsae_priv_dec); > - RSA_meth_set_mod_exp(rsae_method, rsae_mod_exp); > - RSA_meth_set_bn_mod_exp(rsae_method, rsae_bn_mod_exp); > - RSA_meth_set_init(rsae_method, rsae_init); > - RSA_meth_set_finish(rsae_method, rsae_finish); > - RSA_meth_set_sign(rsae_method, rsae_sign); > - RSA_meth_set_verify(rsae_method, rsae_verify); > - RSA_meth_set_keygen(rsae_method, rsae_keygen); > - > - if ((e = ENGINE_get_default_RSA()) == NULL) { > - if ((e = ENGINE_new()) == NULL) { > - errstr = "ENGINE_new"; > - goto fail; > - } > - if (!ENGINE_set_name(e, RSA_meth_get0_name(rsae_method))) { > - errstr = "ENGINE_set_name"; > - goto fail; > - } > - if ((rsa_default = RSA_get_default_method()) == NULL) { > - errstr = "RSA_get_default_method"; > - goto fail; > - } > - } else if ((rsa_default = ENGINE_get_RSA(e)) == NULL) { > - errstr = "ENGINE_get_RSA"; > + if ((rsae_method = RSA_meth_dup(rsa_default)) == NULL) { > + errstr = "RSA_meth_dup"; > goto fail; > } > > - if ((name = ENGINE_get_name(e)) == NULL) > - name = "unknown RSA engine"; > - > - log_debug("%s: using %s", __func__, name); > - > - if (RSA_meth_get_flags(rsa_default) & RSA_FLAG_SIGN_VER) > - fatalx("unsupported RSA engine"); > + RSA_meth_set_priv_enc(rsae_method, rsae_priv_enc); > + RSA_meth_set_priv_dec(rsae_method, rsae_priv_dec); > > - if (RSA_meth_get_mod_exp(rsa_default) == NULL) > - RSA_meth_set_mod_exp(rsae_method, NULL); > - if (RSA_meth_get_bn_mod_exp(rsa_default) == NULL) > - RSA_meth_set_bn_mod_exp(rsae_method, NULL); > - if (RSA_meth_get_keygen(rsa_default) == NULL) > - RSA_meth_set_keygen(rsae_method, NULL); > RSA_meth_set_flags(rsae_method, > RSA_meth_get_flags(rsa_default) | RSA_METHOD_FLAG_NO_CHECK); > RSA_meth_set0_app_data(rsae_method, > RSA_meth_get0_app_data(rsa_default)); > > - if (!ENGINE_set_RSA(e, rsae_method)) { > - errstr = "ENGINE_set_RSA"; > - goto fail; > - } > - if (!ENGINE_set_default_RSA(e)) { > - errstr = "ENGINE_set_default_RSA"; > - goto fail; > - } > + RSA_set_default_method(rsae_method); > > return; > >