Support subgroups of binary fields.
[u/mdw/catacomb] / cc-sig.c
index b7ce0b7..027fa52 100644 (file)
--- 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,
 }
 
 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);
 {
   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);
   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;
 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);
 }
   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
 };
 
   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 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;
 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);
 }
 
   return (&ds->s);
 }
 
@@ -417,6 +439,11 @@ static const sigops dsa_vrf = {
   dsa_vrfinit, dsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy
 };
 
   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 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;
 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_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
 };
 
   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 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;
 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_sethash(ds, hc);
   return (&ds->s);
 }
@@ -510,6 +559,11 @@ static const sigops kcdsa_vrf = {
   kcdsa_vrfinit, kcdsa_vrfdoit, dsa_sigcheck, dsa_sigdestroy
 };
 
   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
 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 },
   { "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 },
   { "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 }
 };
   { "eckcdsa", &eckcdsa_sig,   &eckcdsa_vrf,   &has160 },
   { 0,         0,              0 }
 };