}
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);
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);
}
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
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);
}
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
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);
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
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);
}
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
{ "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 }
};