X-Git-Url: https://git.distorted.org.uk/u/mdw/catacomb/blobdiff_plain/986527ae4af14be68551d0b49a1145bb3e89f259..3688eb757240b2332f67ec827be8caf6f6abe924:/cc-sig.c?ds=sidebyside diff --git a/cc-sig.c b/cc-sig.c index b7ce0b7..027fa52 100644 --- a/cc-sig.c +++ b/cc-sig.c @@ -288,14 +288,16 @@ static void dsa_initcommon(dsa_sigctx *ds, const gchash *hc, } static dsa_sigctx *dsa_doinit(key *k, const gprime_param *gp, - mp *y, const gchash *hc) + mp *y, const gchash *hc, + group *(*makegroup)(const gprime_param *), + const char *what) { dsa_sigctx *ds = CREATE(dsa_sigctx); dstr t = DSTR_INIT; key_fulltag(k, &t); - if ((ds->g.g = group_prime(gp)) == 0) - die(EXIT_FAILURE, "bad prime group in key `%s'", t.buf); + if ((ds->g.g = makegroup(gp)) == 0) + die(EXIT_FAILURE, "bad %s group in key `%s'", what, t.buf); ds->g.p = G_CREATE(ds->g.g); if (G_FROMINT(ds->g.g, ds->g.p, y)) die(EXIT_FAILURE, "bad public key in key `%s'", t.buf); @@ -327,7 +329,15 @@ static dsa_sigctx *ecdsa_doinit(key *k, const char *cstr, static sig *dsa_siginit(key *k, void *kd, const gchash *hc) { dh_priv *dp = kd; - dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc); + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_prime, "prime"); + ds->g.u = MP_COPY(dp->x); + return (&ds->s); +} + +static sig *bindsa_siginit(key *k, void *kd, const gchash *hc) +{ + dh_priv *dp = kd; + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_binary, "binary"); ds->g.u = MP_COPY(dp->x); return (&ds->s); } @@ -379,6 +389,11 @@ static const sigops dsa_sig = { dsa_siginit, dsa_sigdoit, dsa_sigcheck, dsa_sigdestroy }; +static const sigops bindsa_sig = { + dh_privfetch, sizeof(dh_priv), + bindsa_siginit, dsa_sigdoit, dsa_sigcheck, dsa_sigdestroy +}; + static const sigops ecdsa_sig = { ec_privfetch, sizeof(ec_priv), ecdsa_siginit, dsa_sigdoit, dsa_sigcheck, dsa_sigdestroy @@ -387,7 +402,14 @@ static const sigops ecdsa_sig = { static sig *dsa_vrfinit(key *k, void *kd, const gchash *hc) { dh_pub *dp = kd; - dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc); + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_prime, "prime"); + return (&ds->s); +} + +static sig *bindsa_vrfinit(key *k, void *kd, const gchash *hc) +{ + dh_pub *dp = kd; + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_binary, "binary"); return (&ds->s); } @@ -417,6 +439,11 @@ static const sigops dsa_vrf = { dsa_vrfinit, dsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy }; +static const sigops bindsa_vrf = { + dh_pubfetch, sizeof(dh_pub), + bindsa_vrfinit, dsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy +}; + static const sigops ecdsa_vrf = { ec_pubfetch, sizeof(ec_pub), ecdsa_vrfinit, dsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy @@ -433,7 +460,16 @@ static void kcdsa_sethash(dsa_sigctx *ds, const gchash *hc) static sig *kcdsa_siginit(key *k, void *kd, const gchash *hc) { dh_priv *dp = kd; - dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc); + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_prime, "prime"); + kcdsa_privkey(ds, dp->x); + kcdsa_sethash(ds, hc); + return (&ds->s); +} + +static sig *binkcdsa_siginit(key *k, void *kd, const gchash *hc) +{ + dh_priv *dp = kd; + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_binary, "binary"); kcdsa_privkey(ds, dp->x); kcdsa_sethash(ds, hc); return (&ds->s); @@ -468,6 +504,11 @@ static const sigops kcdsa_sig = { kcdsa_siginit, kcdsa_sigdoit, dsa_sigcheck, dsa_sigdestroy }; +static const sigops binkcdsa_sig = { + dh_privfetch, sizeof(dh_priv), + binkcdsa_siginit, kcdsa_sigdoit, dsa_sigcheck, dsa_sigdestroy +}; + static const sigops eckcdsa_sig = { ec_privfetch, sizeof(ec_priv), eckcdsa_siginit, kcdsa_sigdoit, dsa_sigcheck, dsa_sigdestroy @@ -476,7 +517,15 @@ static const sigops eckcdsa_sig = { static sig *kcdsa_vrfinit(key *k, void *kd, const gchash *hc) { dh_pub *dp = kd; - dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc); + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_prime, "prime"); + kcdsa_sethash(ds, hc); + return (&ds->s); +} + +static sig *binkcdsa_vrfinit(key *k, void *kd, const gchash *hc) +{ + dh_pub *dp = kd; + dsa_sigctx *ds = dsa_doinit(k, &dp->dp, dp->y, hc, group_binary, "binary"); kcdsa_sethash(ds, hc); return (&ds->s); } @@ -510,6 +559,11 @@ static const sigops kcdsa_vrf = { kcdsa_vrfinit, kcdsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy }; +static const sigops binkcdsa_vrf = { + dh_pubfetch, sizeof(dh_pub), + binkcdsa_vrfinit, kcdsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy +}; + static const sigops eckcdsa_vrf = { ec_pubfetch, sizeof(ec_pub), eckcdsa_vrfinit, kcdsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy @@ -521,8 +575,10 @@ const struct sigtab sigtab[] = { { "rsapkcs1", &rsap1_sig, &rsap1_vrf, &sha }, { "rsapss", &rsapss_sig, &rsapss_vrf, &sha }, { "dsa", &dsa_sig, &dsa_vrf, &sha }, + { "bindsa", &bindsa_sig, &bindsa_vrf, &sha }, { "ecdsa", &ecdsa_sig, &ecdsa_vrf, &sha }, { "kcdsa", &kcdsa_sig, &kcdsa_vrf, &has160 }, + { "binkcdsa", &binkcdsa_sig, &binkcdsa_vrf, &has160 }, { "eckcdsa", &eckcdsa_sig, &eckcdsa_vrf, &has160 }, { 0, 0, 0 } };