- return;
- kp = key_fetchinit(dsa_privfetch, kps, &daemon__key);
- if ((k = key_bytype(&f, "become-dsa")) == 0)
- err = KERR_NOTFOUND;
- else
- err = key_fetch(kp, k);
- if (err)
- syslog(LOG_ERR, "couldn't load key: %s", key_strerror(err));
- else {
- mp_copy(daemon__key.dp.p);
- mp_copy(daemon__key.dp.q);
- mp_copy(daemon__key.dp.g);
- mp_copy(daemon__key.x);
- mp_copy(daemon__key.y);
+ goto fail_0;
+ if ((k = key_bytype(&f, "become")) == 0) {
+ syslog(LOG_ERR, "no key of type `become' found");
+ goto fail_1;
+ }
+ if ((hn = key_getattr(&f, k, "hash")) == 0)
+ hn = "sha";
+ sn = key_getattr(&f, k, "sig");
+ g.r = &rand_global;
+ if ((g.h = ghash_byname(hn)) == 0) {
+ syslog(LOG_ERR, "key uses unknown hash algorithm `%s'", hn);
+ goto fail_1;
+ }
+ 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;