static int jcmd_alg(int argc, char *argv[]) { jcmd_opt_auto_t opt = {}; size_t len = 0; if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix, NULL)) return EXIT_FAILURE; for (const jose_hook_alg_t *a = jose_hook_alg_list(); a; a = a->next) { if (filter(&opt, a->kind)) len++; } const char *names[len]; for (const jose_hook_alg_t *a = jose_hook_alg_list(); a; a = a->next) { if (filter(&opt, a->kind)) names[--len] = a->name; } qsort(names, sizeof(names) / sizeof(*names), sizeof(*names), cmp); for (size_t i = 0; i < sizeof(names) / sizeof(*names); i++) fprintf(stdout, "%s\n", names[i]); return EXIT_SUCCESS; }
static int jcmd_jwk_exc(int argc, char *argv[]) { jcmd_opt_auto_t opt = {}; json_auto_t *key = NULL; json_t *tmpl = NULL; if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix)) return EXIT_FAILURE; if (json_array_size(opt.keys) > 1 && json_array_remove(opt.keys, 0) < 0) return EXIT_FAILURE; if (json_array_size(opt.lcl) != 1) { fprintf(stderr, "Local JWK must be specified exactly once!\n"); return EXIT_FAILURE; } if (json_array_size(opt.rem) != 1) { fprintf(stderr, "Remote JWK must be specified exactly once!\n"); return EXIT_FAILURE; } key = jose_jwk_exc(NULL, json_array_get(opt.lcl, 0), json_array_get(opt.rem, 0)); if (!key) { fprintf(stderr, "Error performing exchange!\n"); return EXIT_FAILURE; } tmpl = json_array_get(opt.keys, json_array_size(opt.keys) - 1); if (json_object_update(tmpl, key) < 0) return EXIT_FAILURE; if (json_dumpf(tmpl, opt.output, JSON_COMPACT | JSON_SORT_KEYS) < 0) { fprintf(stderr, "Error writing JWK!\n"); return EXIT_FAILURE; } if (isatty(fileno(opt.output))) fprintf(opt.output, "\n"); return EXIT_SUCCESS; }
static int jcmd_jwk_thp(int argc, char *argv[]) { jcmd_opt_auto_t opt = {}; size_t elen = 0; size_t dlen = 0; if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix, suffix)) return EXIT_FAILURE; if (json_array_size(opt.keys) == 0) { fprintf(stderr, "Must specify JWK(Set)!\n"); return EXIT_FAILURE; } dlen = jose_jwk_thp_buf(NULL, NULL, opt.hash, NULL, 0); if (dlen == SIZE_MAX) { fprintf(stderr, "Error determining hash size!\n"); return EXIT_FAILURE; } elen = jose_b64_enc_buf(NULL, dlen, NULL, 0); if (elen == SIZE_MAX) return EXIT_FAILURE; for (size_t i = 0; i < json_array_size(opt.keys); i++) { const json_t *jwk = json_array_get(opt.keys, i); uint8_t dec[dlen]; char enc[elen]; if (!jose_jwk_thp_buf(NULL, jwk, opt.hash, dec, sizeof(dec))) { fprintf(stderr, "Error making thumbprint!\n"); return EXIT_FAILURE; } if (jose_b64_enc_buf(dec, dlen, enc, sizeof(enc)) != elen) return EXIT_FAILURE; fwrite(enc, 1, elen, opt.output); fprintf(opt.output, "\n"); } return EXIT_SUCCESS; }