+ if (!sn || strcmp(sn, "dsa") == 0) {
+ dh_priv dp;
+ kp = key_fetchinit(dh_privfetch, 0, &dp);
+ if ((err = key_fetch(kp, k)) != 0) {
+ syslog(LOG_ERR, "error loading key: %s", key_strerror(err));
+ goto fail_2;
+ }
+ if ((g.g = group_prime(&dp.dp)) == 0) {
+ syslog(LOG_ERR, "bad prime group in key");
+ goto fail_3;
+ }
+ g.p = G_CREATE(g.g);
+ if (G_FROMINT(g.g, g.p, dp.y)) {
+ syslog(LOG_ERR, "bad public key");
+ goto fail_4;
+ }
+ g.u = mp_copy(dp.x);
+ } else if (strcmp(sn, "ecdsa") == 0) {
+ ec_priv ep;
+ ec_info ei;
+ kp = key_fetchinit(ec_privfetch, 0, &ep);
+ if ((err = key_fetch(kp, k)) != 0) {
+ syslog(LOG_ERR, "error loading key: %s", key_strerror(err));
+ goto fail_2;
+ }
+ if ((errmsg = ec_getinfo(&ei, ep.cstr)) != 0) {
+ syslog(LOG_ERR, "bad curve in key: %s", errmsg);
+ goto fail_3;
+ }
+ g.g = group_ec(&ei);
+ g.p = G_CREATE(g.g);
+ if (G_FROMEC(g.g, g.p, &ep.p)) {
+ syslog(LOG_ERR, "bad public point");
+ goto fail_4;
+ }
+ g.u = mp_copy(ep.x);
+ } else {
+ syslog(LOG_ERR, "key uses unknown signature scheme `%s'", sn);
+ goto fail_1;
+ }
+ key_fetchdone(kp);
+ daemon__keyfile = kf;
+ key_close(&f);
+ if (daemon__key.g) {
+ mp_drop(daemon__key.u);
+ G_DESTROY(daemon__key.g, daemon__key.p);
+ G_DESTROYGROUP(daemon__key.g);
+ }
+ daemon__key = g;
+ T( trace(TRACE_DAEMON, "daemon: key read ok"); )
+ return;
+
+fail_4:
+ G_DESTROY(g.g, g.p);
+fail_3:
+ G_DESTROYGROUP(g.g);
+fail_2: