From: Mark Wooding Date: Fri, 29 May 2015 17:49:35 +0000 (+0100) Subject: progs/key.c: Use the mLib generic codec interface instead of base64_*. X-Git-Tag: 2.2.0~3 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/catacomb/commitdiff_plain/2b4be81b52f345c12c36d2e4da0ef52e958e74dd progs/key.c: Use the mLib generic codec interface instead of base64_*. This means we can actually detect errors in the seed provided to `key add -s'. --- diff --git a/progs/key.c b/progs/key.c index 83d27e5e..4530d00e 100644 --- a/progs/key.c +++ b/progs/key.c @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -474,7 +475,7 @@ static void alg_dsaparam(keyopts *k) octet *p; size_t sz; dstr d = DSTR_INIT; - base64_ctx c; + codec *c; key_data *kd; dsa_seed ds; @@ -511,11 +512,9 @@ static void alg_dsaparam(keyopts *k) /* --- Store the seed for future verification --- */ - base64_init(&c); - c.maxline = 0; - c.indent = ""; - base64_encode(&c, ds.p, ds.sz, &d); - base64_encode(&c, 0, 0, &d); + c = base64_class.encoder(0, "", 0); + c->ops->code(c, ds.p, ds.sz, &d); c->ops->code(c, 0, 0, &d); + c->ops->destroy(c); DPUTZ(&d); key_putattr(k->kf, k->k, "seed", d.buf); DRESET(&d); @@ -1099,19 +1098,22 @@ static int cmd_add(int argc, char *argv[]) } break; case 's': { - base64_ctx b; + codec *c; + int rc; dstr d = DSTR_INIT; if (seed) die(EXIT_FAILURE, "seed already set"); - base64_init(&b); - base64_decode(&b, optarg, strlen(optarg), &d); - base64_decode(&b, 0, 0, &d); + c = base64_class.decoder(CDCF_IGNEQPAD); + if ((rc = c->ops->code(c, optarg, strlen(optarg), &d)) != 0 || + (rc = c->ops->code(c, 0, 0, &d)) != 0) + die(EXIT_FAILURE, "invalid seed base64: %s", codec_strerror(rc)); + c->ops->destroy(c); k.r = sa->gen(d.buf, d.len); seed = optarg; dstr_destroy(&d); } break; case 'n': { - base64_ctx b; + codec *c; dstr d = DSTR_INIT; char *p; unsigned n = strtoul(optarg, &p, 0); @@ -1121,9 +1123,9 @@ static int cmd_add(int argc, char *argv[]) n /= 8; p = xmalloc(n); rand_get(RAND_GLOBAL, p, n); - base64_init(&b); - base64_encode(&b, p, n, &d); - base64_encode(&b, 0, 0, &d); + c = base64_class.encoder(0, "", 0); + c->ops->code(c, p, n, &d); c->ops->code(c, 0, 0, &d); + c->ops->destroy(c); seed = d.buf; k.r = sa->gen(p, n); } break;