server/keymgmt.c: Detect if a private keys records a wrong public key.
[tripe] / server / keymgmt.c
index 9e4bc5b..3a20be0 100644 (file)
@@ -203,6 +203,8 @@ static int kh_loadpriv(key_file *kf, key *k, key_data *d,
 {
   int rc;
   const char *err;
+  dhge *K;
+  int ok;
 
   if ((rc = dh->ldpriv(kf, k, d, kd, t, e)) != 0)
     goto fail_0;
@@ -211,6 +213,13 @@ static int kh_loadpriv(key_file *kf, key *k, key_data *d,
     a_format(e, "bad-group", "%s", err, A_END);
     goto fail_1;
   }
+  K = kd->grp->ops->mul(kd->grp, kd->k, 0);
+  ok = kd->grp->ops->eq(kd->grp, kd->K, K);
+  kd->grp->ops->freege(kd->grp, K);
+  if (!ok) {
+    a_format(e, "incorrect-public-key", A_END);
+    goto fail_1;
+  }
   return (0);
 
 fail_1: