コード例 #1
0
ファイル: alg.c プロジェクト: simo5/jose
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;
}
コード例 #2
0
ファイル: exc.c プロジェクト: latchset/jose
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;
}
コード例 #3
0
ファイル: thp.c プロジェクト: simo5/jose
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;
}