├── .github └── workflows │ ├── build.yml │ └── install-dependencies ├── .gitignore ├── .packit.yaml ├── COPYING ├── README.md ├── cmd ├── alg.c ├── b64 │ ├── b64.h │ ├── dec.c │ └── enc.c ├── fmt.c ├── jose.c ├── jose.h ├── jwe │ ├── dec.c │ ├── enc.c │ ├── fmt.c │ ├── jwe.h │ └── pwd.h ├── jwk │ ├── eql.c │ ├── exc.c │ ├── gen.c │ ├── jwk.h │ ├── pub.c │ ├── thp.c │ └── use.c ├── jws │ ├── fmt.c │ ├── jws.h │ ├── sig.c │ └── ver.c └── meson.build ├── doc ├── doxygen │ ├── Doxyfile │ ├── html │ │ ├── annotated.html │ │ ├── b64_8h_source.html │ │ ├── bc_s.png │ │ ├── bdwn.png │ │ ├── cfg_8h_source.html │ │ ├── classes.html │ │ ├── closed.png │ │ ├── dir_f2bd36b8a3f3d476e48bdb5015c9fdfb.html │ │ ├── doc.png │ │ ├── doxygen.css │ │ ├── doxygen.png │ │ ├── dynsections.js │ │ ├── folderclosed.png │ │ ├── folderopen.png │ │ ├── functions.html │ │ ├── functions_vars.html │ │ ├── group__jose__b64.html │ │ ├── group__jose__cfg.html │ │ ├── group__jose__io.html │ │ ├── group__jose__jwe.html │ │ ├── group__jose__jwk.html │ │ ├── group__jose__jws.html │ │ ├── index.html │ │ ├── io_8h_source.html │ │ ├── jose_8h_source.html │ │ ├── jquery.js │ │ ├── jwe_8h_source.html │ │ ├── jwk_8h_source.html │ │ ├── jws_8h_source.html │ │ ├── jwt_8h_source.html │ │ ├── menu.js │ │ ├── menudata.js │ │ ├── modules.html │ │ ├── nav_f.png │ │ ├── nav_g.png │ │ ├── nav_h.png │ │ ├── open.png │ │ ├── openssl_8h_source.html │ │ ├── search │ │ │ ├── all_0.html │ │ │ ├── all_0.js │ │ │ ├── all_1.html │ │ │ ├── all_1.js │ │ │ ├── all_2.html │ │ │ ├── all_2.js │ │ │ ├── all_3.html │ │ │ ├── all_3.js │ │ │ ├── all_4.html │ │ │ ├── all_4.js │ │ │ ├── all_5.html │ │ │ ├── all_5.js │ │ │ ├── classes_0.html │ │ │ ├── classes_0.js │ │ │ ├── close.png │ │ │ ├── functions_0.html │ │ │ ├── functions_0.js │ │ │ ├── groups_0.html │ │ │ ├── groups_0.js │ │ │ ├── groups_1.html │ │ │ ├── groups_1.js │ │ │ ├── groups_2.html │ │ │ ├── groups_2.js │ │ │ ├── groups_3.html │ │ │ ├── groups_3.js │ │ │ ├── mag_sel.png │ │ │ ├── nomatches.html │ │ │ ├── pages_0.html │ │ │ ├── pages_0.js │ │ │ ├── search.css │ │ │ ├── search.js │ │ │ ├── search_l.png │ │ │ ├── search_m.png │ │ │ ├── search_r.png │ │ │ ├── searchdata.js │ │ │ ├── typedefs_0.html │ │ │ ├── typedefs_0.js │ │ │ ├── variables_0.html │ │ │ ├── variables_0.js │ │ │ ├── variables_1.html │ │ │ └── variables_1.js │ │ ├── splitbar.png │ │ ├── structjose__io__t.html │ │ ├── sync_off.png │ │ ├── sync_on.png │ │ ├── tab_a.png │ │ ├── tab_b.png │ │ ├── tab_h.png │ │ ├── tab_s.png │ │ └── tabs.css │ └── man │ │ └── man3 │ │ ├── jose_b64.3 │ │ ├── jose_cfg.3 │ │ ├── jose_io.3 │ │ ├── jose_io_t.3 │ │ ├── jose_jwe.3 │ │ ├── jose_jwk.3 │ │ └── jose_jws.3 ├── man │ ├── jose-alg.1.adoc │ ├── jose-b64-dec.1.adoc │ ├── jose-b64-enc.1.adoc │ ├── jose-fmt.1.adoc │ ├── jose-jwe-dec.1.adoc │ ├── jose-jwe-enc.1.adoc │ ├── jose-jwe-fmt.1.adoc │ ├── jose-jwk-eql.1.adoc │ ├── jose-jwk-exc.1.adoc │ ├── jose-jwk-gen.1.adoc │ ├── jose-jwk-pub.1.adoc │ ├── jose-jwk-thp.1.adoc │ ├── jose-jwk-use.1.adoc │ ├── jose-jws-fmt.1.adoc │ ├── jose-jws-sig.1.adoc │ ├── jose-jws-ver.1.adoc │ ├── jose.1.adoc │ └── meson.build └── meson.build ├── include ├── jose │ ├── b64.h │ ├── cfg.h │ ├── io.h │ ├── jose.h.in │ ├── jwe.h │ ├── jwk.h │ ├── jws.h │ ├── meson.build │ └── openssl.h └── meson.build ├── jose.spec ├── lib ├── b64.c ├── cfg.c ├── hooks.c ├── hooks.h ├── hsh.c ├── hsh.h ├── io.c ├── jwe.c ├── jwk.c ├── jws.c ├── libjose.map ├── meson.build ├── misc.c ├── misc.h ├── openssl │ ├── aescbch.c │ ├── aesgcm.c │ ├── aesgcmkw.c │ ├── aeskw.c │ ├── compat.c │ ├── compat.h │ ├── dir.c │ ├── ec.c │ ├── ecdh.c │ ├── ecdhes.c │ ├── ecdsa.c │ ├── ecmr.c │ ├── hash.c │ ├── hmac.c │ ├── jwk.c │ ├── lock.c │ ├── misc.c │ ├── misc.h │ ├── oct.c │ ├── pbes2.c │ ├── rsa.c │ ├── rsaes.c │ └── rsassa.c └── zlib │ └── deflate.c ├── meson.build ├── meson_options.txt ├── slides.pdf └── tests ├── alg_comp.c ├── alg_encr.c ├── alg_hash.c ├── alg_sign.c ├── alg_wrap.c ├── api_b64.c ├── api_jwe.c ├── api_jws.c ├── cve-2023-50967 ├── cve-2023-50967.jwe └── cve-2023-50967.jwk ├── issue-75 ├── issue-75.c ├── meson.build └── rsa512.pem ├── jose-alg ├── jose-b64-dec ├── jose-b64-enc ├── jose-fmt ├── jose-jwe-dec ├── jose-jwe-enc ├── jose-jwe-fmt ├── jose-jwk-eql ├── jose-jwk-exc ├── jose-jwk-gen ├── jose-jwk-pub ├── jose-jwk-thp ├── jose-jwk-use ├── jose-jws-fmt ├── jose-jws-sig ├── jose-jws-ver ├── meson.build └── vectors ├── rfc7515_A.1.jwk ├── rfc7515_A.1.jwsc ├── rfc7515_A.2.jwk ├── rfc7515_A.2.jwsc ├── rfc7515_A.3.jwk ├── rfc7515_A.3.jwsc ├── rfc7515_A.4.jwk ├── rfc7515_A.4.jwsc ├── rfc7515_A.5.jwsc ├── rfc7515_A.6.1.jwk ├── rfc7515_A.6.2.jwk ├── rfc7515_A.6.jwkset ├── rfc7515_A.6.jwsg ├── rfc7515_A.7.jwk ├── rfc7515_A.7.jwsf ├── rfc7517_A.1.jwkset ├── rfc7517_A.2.jwkset ├── rfc7517_A.3.jwkset ├── rfc7517_B.jwk ├── rfc7520_3.1.jwk ├── rfc7520_3.2.jwk ├── rfc7520_3.3.jwk ├── rfc7520_3.4.jwk ├── rfc7520_3.5.jwk ├── rfc7520_3.6.jwk ├── rfc7520_4.1.jwk ├── rfc7520_4.1.jwsc ├── rfc7520_4.1.jwsf ├── rfc7520_4.1.jwsg ├── rfc7520_4.2.jwk ├── rfc7520_4.2.jwsc ├── rfc7520_4.2.jwsf ├── rfc7520_4.2.jwsg ├── rfc7520_4.3.jwk ├── rfc7520_4.3.jwsc ├── rfc7520_4.3.jwsf ├── rfc7520_4.3.jwsg ├── rfc7520_4.4.jwk ├── rfc7520_4.4.jwsc ├── rfc7520_4.4.jwsf ├── rfc7520_4.4.jwsg ├── rfc7520_4.5.jwk ├── rfc7520_4.5.jwsc ├── rfc7520_4.5.jwsf ├── rfc7520_4.5.jwsg ├── rfc7520_4.5.payl ├── rfc7520_4.6.jwk ├── rfc7520_4.6.jwsf ├── rfc7520_4.6.jwsg ├── rfc7520_4.7.jwk ├── rfc7520_4.7.jwsf ├── rfc7520_4.7.jwsg ├── rfc7520_4.8.1.jwk ├── rfc7520_4.8.2.jwk ├── rfc7520_4.8.3.jwk ├── rfc7520_4.8.jwkset ├── rfc7520_4.8.jwsg ├── rfc7520_5.1.jwec ├── rfc7520_5.1.jwef ├── rfc7520_5.1.jweg ├── rfc7520_5.1.jwk ├── rfc7520_5.1.pt ├── rfc7520_5.10.jwef ├── rfc7520_5.10.jweg ├── rfc7520_5.10.jwk ├── rfc7520_5.10.pt ├── rfc7520_5.11.jwef ├── rfc7520_5.11.jweg ├── rfc7520_5.11.jwk ├── rfc7520_5.11.pt ├── rfc7520_5.12.jwef ├── rfc7520_5.12.jweg ├── rfc7520_5.12.jwk ├── rfc7520_5.12.pt ├── rfc7520_5.13.1.jwk ├── rfc7520_5.13.2.jwk ├── rfc7520_5.13.3.jwk ├── rfc7520_5.13.jweg ├── rfc7520_5.13.pt ├── rfc7520_5.2.jwec ├── rfc7520_5.2.jwef ├── rfc7520_5.2.jweg ├── rfc7520_5.2.jwk ├── rfc7520_5.2.pt ├── rfc7520_5.3.jwec ├── rfc7520_5.3.jwef ├── rfc7520_5.3.jweg ├── rfc7520_5.3.jwk ├── rfc7520_5.3.pt ├── rfc7520_5.3.pwd ├── rfc7520_5.4.jwec ├── rfc7520_5.4.jwef ├── rfc7520_5.4.jweg ├── rfc7520_5.4.jwk ├── rfc7520_5.4.pt ├── rfc7520_5.5.jwec ├── rfc7520_5.5.jweg ├── rfc7520_5.5.jwk ├── rfc7520_5.5.pt ├── rfc7520_5.6.jwec ├── rfc7520_5.6.jweg ├── rfc7520_5.6.jwk ├── rfc7520_5.6.pt ├── rfc7520_5.7.jwec ├── rfc7520_5.7.jwef ├── rfc7520_5.7.jweg ├── rfc7520_5.7.jwk ├── rfc7520_5.7.pt ├── rfc7520_5.8.jwec ├── rfc7520_5.8.jwef ├── rfc7520_5.8.jweg ├── rfc7520_5.8.jwk ├── rfc7520_5.8.pt ├── rfc7520_5.9.jwec ├── rfc7520_5.9.jwef ├── rfc7520_5.9.jweg ├── rfc7520_5.9.jwk ├── rfc7520_5.9.pt ├── rfc7638_3.1.jwk ├── rfc7638_3.1.thp └── strip.sh /.github/workflows/install-dependencies: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | COMMON="meson curl git file bzip2 asciidoc jq ${CC}" 4 | 5 | case "${DISTRO}" in 6 | osx:*) 7 | brew update 8 | for pkg in pkg-config jansson openssl zlib meson; do 9 | brew ls --versions "${pkg}" || brew install "${pkg}" 10 | brew outdated "${pkg}" || brew upgrade "${pkg}" || true 11 | done 12 | ;; 13 | 14 | debian:*|ubuntu:*) 15 | export DEBIAN_FRONTEND=noninteractive 16 | apt clean 17 | apt update 18 | # We get some errors once in a while, so let's try a few times. 19 | for i in 1 2 3; do 20 | apt -y install build-essential pkg-config libssl-dev zlib1g-dev \ 21 | libjansson-dev ${COMMON} && break 22 | sleep 5 23 | done 24 | ;; 25 | 26 | *fedora:*) 27 | echo 'max_parallel_downloads=10' >> /etc/dnf/dnf.conf 28 | dnf -y clean all 29 | dnf -y --setopt=deltarpm=0 update 30 | dnf -y install ${COMMON} pkgconfig openssl-devel zlib-devel jansson-devel 31 | ;; 32 | 33 | centos:7) 34 | yum -y clean all 35 | yum -y --setopt=deltarpm=0 update 36 | yum install -y yum-utils epel-release centos-release-scl llvm-toolset-7 37 | yum -y install ${COMMON} 38 | yum-builddep -y jose 39 | ;; 40 | 41 | *centos:stream*) 42 | dnf -y clean all 43 | dnf -y --allowerasing --setopt=deltarpm=0 update 44 | dnf install -y yum-utils epel-release 45 | dnf config-manager -y --set-enabled crb \ 46 | || dnf config-manager -y --set-enabled powertools || : 47 | dnf -y --allowerasing install ${COMMON} 48 | dnf builddep -y jose 49 | ;; 50 | esac 51 | # vim: set ts=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.a 3 | *.o 4 | *.la 5 | *.lo 6 | *.log 7 | *.m4 8 | *.pc 9 | *.so 10 | *.swp 11 | *.swo 12 | *.trs 13 | *_t 14 | .* 15 | aclocal.m4 16 | ar-lib 17 | autom4te.cache 18 | build 19 | compile 20 | config.guess 21 | config.log 22 | config.status 23 | config.sub 24 | configure 25 | configure-stamp 26 | depcomp 27 | install-sh 28 | libtool 29 | ltmain.sh 30 | Makecache 31 | Makefile.in 32 | Makefile 33 | missing 34 | tags 35 | test-* 36 | vgcore.* 37 | 38 | cmd/jose 39 | jose/jose.h 40 | 41 | tests/alg_* 42 | tests/api_* 43 | !tests/alg_*.c 44 | !tests/api_*.c 45 | 46 | doc/doxygen/man/man3/* 47 | !doc/doxygen/man/man3/jose_*.3 48 | -------------------------------------------------------------------------------- /.packit.yaml: -------------------------------------------------------------------------------- 1 | downstream_package_name: jose 2 | jobs: 3 | - job: copr_build 4 | metadata: 5 | targets: 6 | - fedora-30-x86_64 7 | - fedora-31-x86_64 8 | - fedora-rawhide-x86_64 9 | trigger: pull_request 10 | specfile_path: jose.spec 11 | synced_files: 12 | - jose.spec 13 | - .packit.yaml 14 | upstream_package_name: jose 15 | -------------------------------------------------------------------------------- /cmd/b64/b64.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "../jose.h" 19 | 20 | #define jcmd_b64_opt_auto_t __JCMD_AUTO(jcmd_b64_opt) 21 | 22 | typedef struct { 23 | FILE *input; 24 | FILE *output; 25 | } jcmd_b64_opt_t; 26 | 27 | static inline void 28 | jcmd_b64_opt_cleanup(jcmd_b64_opt_t *opt) 29 | { 30 | jcmd_file_cleanup(&opt->input); 31 | jcmd_file_cleanup(&opt->output); 32 | } 33 | -------------------------------------------------------------------------------- /cmd/b64/dec.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "b64.h" 19 | #include 20 | #include 21 | #include 22 | 23 | #define SUMMARY "Decodes URL-safe Base64 data to binary" 24 | 25 | static const char *prefix = "jose b64 dec -i B64 [-O BIN]\n\n" SUMMARY; 26 | 27 | static const jcmd_doc_t doc_input[] = { 28 | { .arg = "FILE", .doc="Read Base64 (URL-safe) data from FILE" }, 29 | { .arg = "-", .doc="Read Base64 (URL-safe) data from standard input" }, 30 | {} 31 | }; 32 | 33 | static const jcmd_doc_t doc_output[] = { 34 | { .arg = "FILE", .doc="Write binary data to FILE" }, 35 | { .arg = "-", .doc="Write binary data to standard output" }, 36 | {} 37 | }; 38 | 39 | static const jcmd_cfg_t cfgs[] = { 40 | { 41 | .opt = { "base64", required_argument, .val = 'i' }, 42 | .off = offsetof(jcmd_b64_opt_t, input), 43 | .set = jcmd_opt_set_ifile, 44 | .doc = doc_input, 45 | }, 46 | { 47 | .opt = { "binary", required_argument, .val = 'O' }, 48 | .off = offsetof(jcmd_b64_opt_t, output), 49 | .set = jcmd_opt_set_ofile, 50 | .doc = doc_output, 51 | .def = "-", 52 | }, 53 | {} 54 | }; 55 | 56 | static int 57 | jcmd_b64_dec(int argc, char *argv[]) 58 | { 59 | jcmd_b64_opt_auto_t opt = {}; 60 | jose_io_auto_t *b64 = NULL; 61 | jose_io_auto_t *out = NULL; 62 | 63 | if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix)) 64 | return EXIT_FAILURE; 65 | 66 | if (!opt.input) { 67 | fprintf(stderr, "Input not specified!\n"); 68 | return EXIT_FAILURE; 69 | } 70 | 71 | out = jose_io_file(NULL, opt.output); 72 | if (!out) 73 | return EXIT_FAILURE; 74 | 75 | b64 = jose_b64_dec_io(out); 76 | if (!b64) 77 | return EXIT_FAILURE; 78 | 79 | for (int c = fgetc(opt.input); c != EOF; c = fgetc(opt.input)) { 80 | uint8_t b = c; 81 | 82 | if (isspace(c)) 83 | continue; 84 | 85 | if (!b64->feed(b64, &b, sizeof(b))) 86 | return EXIT_FAILURE; 87 | } 88 | 89 | if (!b64->done(b64)) 90 | return EXIT_FAILURE; 91 | 92 | return EXIT_SUCCESS; 93 | } 94 | 95 | JCMD_REGISTER(SUMMARY, jcmd_b64_dec, "b64", "dec") 96 | -------------------------------------------------------------------------------- /cmd/b64/enc.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "b64.h" 19 | #include 20 | #include 21 | 22 | #define SUMMARY "Encodes binary data to URL-safe Base64" 23 | 24 | static const char *prefix = "jose b64 enc -I BIN [-o B64]\n\n" SUMMARY; 25 | 26 | static const jcmd_doc_t doc_input[] = { 27 | { .arg = "FILE", .doc="Read binary data from FILE" }, 28 | { .arg = "-", .doc="Read binary data from standard input" }, 29 | {} 30 | }; 31 | 32 | static const jcmd_doc_t doc_output[] = { 33 | { .arg = "FILE", .doc="Write Base64 (URL-safe) to FILE" }, 34 | { .arg = "-", .doc="Write Base64 (URL-safe) to standard output" }, 35 | {} 36 | }; 37 | 38 | static const jcmd_cfg_t cfgs[] = { 39 | { 40 | .opt = { "binary", required_argument, .val = 'I' }, 41 | .off = offsetof(jcmd_b64_opt_t, input), 42 | .set = jcmd_opt_set_ifile, 43 | .doc = doc_input, 44 | }, 45 | { 46 | .opt = { "base64", required_argument, .val = 'o' }, 47 | .off = offsetof(jcmd_b64_opt_t, output), 48 | .set = jcmd_opt_set_ofile, 49 | .doc = doc_output, 50 | .def = "-", 51 | }, 52 | {} 53 | }; 54 | 55 | static int 56 | jcmd_b64_enc(int argc, char *argv[]) 57 | { 58 | jcmd_b64_opt_auto_t opt = {}; 59 | jose_io_auto_t *b64 = NULL; 60 | jose_io_auto_t *out = NULL; 61 | 62 | if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix)) 63 | return EXIT_FAILURE; 64 | 65 | if (!opt.input) { 66 | fprintf(stderr, "Input not specified!\n"); 67 | return EXIT_FAILURE; 68 | } 69 | 70 | out = jose_io_file(NULL, opt.output); 71 | if (!out) 72 | return EXIT_FAILURE; 73 | 74 | b64 = jose_b64_enc_io(out); 75 | if (!b64) 76 | return EXIT_FAILURE; 77 | 78 | for (int c = fgetc(opt.input); c != EOF; c = fgetc(opt.input)) { 79 | uint8_t b = c; 80 | 81 | if (!b64->feed(b64, &b, sizeof(b))) 82 | return EXIT_FAILURE; 83 | } 84 | 85 | if (!b64->done(b64)) 86 | return EXIT_FAILURE; 87 | 88 | if (isatty(fileno(opt.output))) 89 | fprintf(opt.output, "\n"); 90 | 91 | return EXIT_SUCCESS; 92 | } 93 | 94 | JCMD_REGISTER(SUMMARY, jcmd_b64_enc, "b64", "enc") 95 | -------------------------------------------------------------------------------- /cmd/jwe/jwe.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include "../jose.h" 21 | 22 | static const jcmd_field_t jcmd_jwe_fields[] = { 23 | { .name = "protected" }, 24 | { .name = "encrypted_key", .mult = "recipients" }, 25 | { .name = "iv" }, 26 | { .name = "ciphertext" }, 27 | { .name = "tag" }, 28 | {} 29 | }; 30 | 31 | static const jcmd_doc_t jcmd_jwe_doc_input[] = { 32 | { .arg = "JSON", .doc="Parse JWE from JSON" }, 33 | { .arg = "FILE", .doc="Read JWE from FILE" }, 34 | { .arg = "-", .doc="Read JWE from standard input" }, 35 | {} 36 | }; 37 | 38 | static const jcmd_doc_t jcmd_jwe_doc_detached[] = { 39 | { .arg = "FILE", .doc="Read decoded ciphertext from FILE" }, 40 | { .arg = "-", .doc="Read decoded ciphertext from standard input" }, 41 | {} 42 | }; 43 | 44 | static const jcmd_doc_t jcmd_jwe_doc_output[] = { 45 | { .arg = "FILE", .doc="Write JWE to FILE" }, 46 | { .arg = "-", .doc="Write JWE to stdout (default)" }, 47 | {} 48 | }; 49 | 50 | static const jcmd_doc_t jcmd_jwe_doc_detach[] = { 51 | { .arg = "FILE", .doc="Detach ciphertext and decode to FILE" }, 52 | { .arg = "-", .doc="Detach ciphertext and decode to standard output" }, 53 | {} 54 | }; 55 | 56 | static const jcmd_doc_t jcmd_jwe_doc_compact[] = { 57 | { .doc="Output JWE using compact serialization" }, 58 | {} 59 | }; 60 | -------------------------------------------------------------------------------- /cmd/jwe/pwd.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include 21 | #include 22 | 23 | #ifdef _WIN32 24 | static const char * 25 | jwe_getpass(const char *prompt) 26 | { 27 | static char pwd[4096]; 28 | 29 | fprintf(stdout, "%s", prompt); 30 | 31 | memset(pwd, 0, sizeof(pwd)); 32 | for (size_t i = 0; i < sizeof(pwd) - 1; i++) { 33 | int c = fgetc(stdin); 34 | if (c == EOF || !isprint(c) || isspace(c)) 35 | break; 36 | 37 | pwd[i] = c; 38 | } 39 | 40 | return pwd; 41 | } 42 | #else 43 | #include 44 | static const char * 45 | jwe_getpass(const char *prompt) 46 | { 47 | static char pwd[4096]; 48 | struct termios of, nf; 49 | FILE *tty = NULL; 50 | 51 | tty = fopen("/dev/tty", "r+"); 52 | if (!tty) 53 | return NULL; 54 | 55 | tcgetattr(fileno(tty), &of); 56 | nf = of; 57 | nf.c_lflag &= ~ECHO; 58 | nf.c_lflag |= ECHONL; 59 | 60 | if (tcsetattr(fileno(tty), TCSANOW, &nf) != 0) { 61 | fclose(tty); 62 | return NULL; 63 | } 64 | 65 | fprintf(tty, "%s", prompt); 66 | 67 | memset(pwd, 0, sizeof(pwd)); 68 | for (size_t i = 0; i < sizeof(pwd) - 1; i++) { 69 | int c = fgetc(tty); 70 | if (c == EOF || !isprint(c) || isspace(c)) 71 | break; 72 | 73 | pwd[i] = c; 74 | } 75 | 76 | tcsetattr(fileno(tty), TCSANOW, &of); 77 | fclose(tty); 78 | return pwd; 79 | } 80 | #endif 81 | -------------------------------------------------------------------------------- /cmd/jwk/eql.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "jwk.h" 19 | #include 20 | 21 | #define SUMMARY "Determines if two or more JWKs are equal" 22 | 23 | typedef struct { 24 | json_t *keys; 25 | } jcmd_opt_t; 26 | 27 | static const char *prefix = 28 | "jose jwk eql -i JWK -i JWK\n\n" SUMMARY; 29 | 30 | static const jcmd_cfg_t cfgs[] = { 31 | { 32 | .opt = { "input", required_argument, .val = 'i' }, 33 | .off = offsetof(jcmd_opt_t, keys), 34 | .set = jcmd_opt_set_jwks, 35 | .doc = jcmd_jwk_doc_input, 36 | }, 37 | {} 38 | }; 39 | 40 | static void 41 | jcmd_opt_cleanup(jcmd_opt_t *opt) 42 | { 43 | json_decrefp(&opt->keys); 44 | } 45 | 46 | static int 47 | jcmd_jwk_eql(int argc, char *argv[]) 48 | { 49 | jcmd_opt_auto_t opt = {}; 50 | 51 | if (!jcmd_opt_parse(argc, argv, cfgs, &opt, prefix)) 52 | return EXIT_FAILURE; 53 | 54 | if (json_array_size(opt.keys) < 2) { 55 | fprintf(stderr, "Must specify at least two JWKs!\n"); 56 | return EXIT_FAILURE; 57 | } 58 | 59 | for (size_t i = 1; i < json_array_size(opt.keys); i++) { 60 | const json_t *a = json_array_get(opt.keys, i - 1); 61 | const json_t *b = json_array_get(opt.keys, i); 62 | 63 | if (!jose_jwk_eql(NULL, a, b)) 64 | return EXIT_FAILURE; 65 | } 66 | 67 | return EXIT_SUCCESS; 68 | } 69 | 70 | JCMD_REGISTER(SUMMARY, jcmd_jwk_eql, "jwk", "eql") 71 | -------------------------------------------------------------------------------- /cmd/jwk/jwk.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include "../jose.h" 21 | 22 | static const jcmd_doc_t jcmd_jwk_doc_input[] = { 23 | { .arg = "JSON", .doc="Parse JWK(Set) from JSON" }, 24 | { .arg = "FILE", .doc="Read JWK(Set) from FILE" }, 25 | { .arg = "-", .doc="Read JWK(Set) standard input" }, 26 | {} 27 | }; 28 | 29 | static const jcmd_doc_t jcmd_jwk_doc_output[] = { 30 | { .arg = "FILE", .doc="Write JWK(Set) to FILE" }, 31 | { .arg = "-", .doc="Write JWK(Set) to standard input" }, 32 | {} 33 | }; 34 | 35 | static const jcmd_doc_t jcmd_jwk_doc_set[] = { 36 | { .doc="Always output a JWKSet" }, 37 | {} 38 | }; 39 | -------------------------------------------------------------------------------- /cmd/meson.build: -------------------------------------------------------------------------------- 1 | executable(meson.project_name(), 2 | 'jose.c', 'jose.h', 3 | 'b64/b64.h', 4 | 'b64/dec.c', 5 | 'b64/enc.c', 6 | 'jwk/jwk.h', 7 | 'jwk/eql.c', 8 | 'jwk/exc.c', 9 | 'jwk/gen.c', 10 | 'jwk/pub.c', 11 | 'jwk/thp.c', 12 | 'jwk/use.c', 13 | 'jws/jws.h', 14 | 'jws/fmt.c', 15 | 'jws/sig.c', 16 | 'jws/ver.c', 17 | 'jwe/jwe.h', 18 | 'jwe/pwd.h', 19 | 'jwe/fmt.c', 20 | 'jwe/dec.c', 21 | 'jwe/enc.c', 22 | 'alg.c', 23 | 'fmt.c', 24 | 25 | dependencies: libjose_dep, 26 | install: true 27 | ) 28 | -------------------------------------------------------------------------------- /doc/doxygen/html/bc_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/bc_s.png -------------------------------------------------------------------------------- /doc/doxygen/html/bdwn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/bdwn.png -------------------------------------------------------------------------------- /doc/doxygen/html/closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/closed.png -------------------------------------------------------------------------------- /doc/doxygen/html/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/doc.png -------------------------------------------------------------------------------- /doc/doxygen/html/doxygen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/doxygen.png -------------------------------------------------------------------------------- /doc/doxygen/html/folderclosed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/folderclosed.png -------------------------------------------------------------------------------- /doc/doxygen/html/folderopen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/folderopen.png -------------------------------------------------------------------------------- /doc/doxygen/html/functions_vars.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | José: Data Fields - Variables 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 |
20 | 21 | 22 | 23 | 27 | 28 | 29 |
24 |
José 25 |
26 |
30 |
31 | 32 | 33 | 36 | 37 | 38 | 44 | 45 |
46 | 47 |
51 |
52 | 53 | 54 |
55 | 58 |
59 | 60 |
61 |   69 |
70 | 71 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /doc/doxygen/html/menu.js: -------------------------------------------------------------------------------- 1 | function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { 2 | function makeTree(data,relPath) { 3 | var result=''; 4 | if ('children' in data) { 5 | result+=''; 12 | } 13 | return result; 14 | } 15 | 16 | $('#main-nav').append(makeTree(menudata,relPath)); 17 | $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); 18 | if (searchEnabled) { 19 | if (serverSide) { 20 | $('#main-menu').append('
  • '); 21 | } else { 22 | $('#main-menu').append('
  • '); 23 | } 24 | } 25 | $('#main-menu').smartmenus(); 26 | } 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/menudata.js: -------------------------------------------------------------------------------- 1 | var menudata={children:[ 2 | {text:"Main Page",url:"index.html"}, 3 | {text:"Modules",url:"modules.html"}, 4 | {text:"Data Structures",url:"annotated.html",children:[ 5 | {text:"Data Structures",url:"annotated.html"}, 6 | {text:"Data Structure Index",url:"classes.html"}, 7 | {text:"Data Fields",url:"functions.html",children:[ 8 | {text:"All",url:"functions.html"}, 9 | {text:"Variables",url:"functions_vars.html"}]}]}]} 10 | -------------------------------------------------------------------------------- /doc/doxygen/html/nav_f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/nav_f.png -------------------------------------------------------------------------------- /doc/doxygen/html/nav_g.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/nav_g.png -------------------------------------------------------------------------------- /doc/doxygen/html/nav_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/nav_h.png -------------------------------------------------------------------------------- /doc/doxygen/html/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/open.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['base64',['Base64',['../group__jose__b64.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['config',['Config',['../group__jose__cfg.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['done',['done',['../structjose__io__t.html#a76d1eac0d05d3604c16686b08bd80aa0',1,'jose_io_t']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['feed',['feed',['../structjose__io__t.html#afa8ec8ac8802fd2600466b9477730cfe',1,'jose_io_t']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_4.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_4.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['io',['IO',['../group__jose__io.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/all_5.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/classes_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/classes_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['jose_5fio_5ft',['jose_io_t',['../structjose__io__t.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/search/close.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/functions_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['base64',['Base64',['../group__jose__b64.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['config',['Config',['../group__jose__cfg.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_2.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['io',['IO',['../group__jose__io.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_3.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/groups_3.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['jwe',['JWE',['../group__jose__jwe.html',1,'']]], 4 | ['jwk',['JWK',['../group__jose__jwk.html',1,'']]], 5 | ['jws',['JWS',['../group__jose__jws.html',1,'']]] 6 | ]; 7 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/mag_sel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/search/mag_sel.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/nomatches.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    9 |
    No Matches
    10 |
    11 | 12 | 13 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/pages_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/pages_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['josé_20api_20documentation',['José API Documentation',['../index.html',1,'']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/search_l.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/search/search_l.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/search_m.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/search/search_m.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/search_r.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/search/search_r.png -------------------------------------------------------------------------------- /doc/doxygen/html/search/searchdata.js: -------------------------------------------------------------------------------- 1 | var indexSectionsWithContent = 2 | { 3 | 0: "bcdfij", 4 | 1: "j", 5 | 2: "j", 6 | 3: "df", 7 | 4: "j", 8 | 5: "bcij", 9 | 6: "j" 10 | }; 11 | 12 | var indexSectionNames = 13 | { 14 | 0: "all", 15 | 1: "classes", 16 | 2: "functions", 17 | 3: "variables", 18 | 4: "typedefs", 19 | 5: "groups", 20 | 6: "pages" 21 | }; 22 | 23 | var indexSectionLabels = 24 | { 25 | 0: "All", 26 | 1: "Data Structures", 27 | 2: "Functions", 28 | 3: "Variables", 29 | 4: "Typedefs", 30 | 5: "Modules", 31 | 6: "Pages" 32 | }; 33 | 34 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/typedefs_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/typedefs_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['jose_5fcfg_5fauto_5ft',['jose_cfg_auto_t',['../group__jose__cfg.html#gaf1dca939bc91e5f203f440307240b08f',1,'cfg.h']]], 4 | ['jose_5fio_5fauto_5ft',['jose_io_auto_t',['../group__jose__io.html#ga5470c8ebb2993293197844f2782616b5',1,'io.h']]] 5 | ]; 6 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/variables_0.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/variables_0.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['done',['done',['../structjose__io__t.html#a76d1eac0d05d3604c16686b08bd80aa0',1,'jose_io_t']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/variables_1.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
    11 |
    Loading...
    12 |
    13 | 16 |
    Searching...
    17 |
    No Matches
    18 | 24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /doc/doxygen/html/search/variables_1.js: -------------------------------------------------------------------------------- 1 | var searchData= 2 | [ 3 | ['feed',['feed',['../structjose__io__t.html#afa8ec8ac8802fd2600466b9477730cfe',1,'jose_io_t']]] 4 | ]; 5 | -------------------------------------------------------------------------------- /doc/doxygen/html/splitbar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/splitbar.png -------------------------------------------------------------------------------- /doc/doxygen/html/sync_off.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/sync_off.png -------------------------------------------------------------------------------- /doc/doxygen/html/sync_on.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/sync_on.png -------------------------------------------------------------------------------- /doc/doxygen/html/tab_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/tab_a.png -------------------------------------------------------------------------------- /doc/doxygen/html/tab_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/tab_b.png -------------------------------------------------------------------------------- /doc/doxygen/html/tab_h.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/tab_h.png -------------------------------------------------------------------------------- /doc/doxygen/html/tab_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/doc/doxygen/html/tab_s.png -------------------------------------------------------------------------------- /doc/doxygen/man/man3/jose_io_t.3: -------------------------------------------------------------------------------- 1 | .TH "jose_io_t" 3 "Tue May 30 2017" "José" \" -*- nroff -*- 2 | .ad l 3 | .nh 4 | .SH NAME 5 | jose_io_t \- The interface for chained IO\&. 6 | 7 | .SH SYNOPSIS 8 | .br 9 | .PP 10 | .SS "Data Fields" 11 | 12 | .in +1c 13 | .ti -1c 14 | .RI "bool(* \fBfeed\fP )(\fBjose_io_t\fP *io, const void *in, size_t len)" 15 | .br 16 | .RI "Pushes data into the IO chain\&. " 17 | .ti -1c 18 | .RI "bool(* \fBdone\fP )(\fBjose_io_t\fP *io)" 19 | .br 20 | .RI "Completes the IO chain\&. " 21 | .in -1c 22 | .SH "Detailed Description" 23 | .PP 24 | The interface for chained IO\&. 25 | 26 | 27 | .PP 28 | \fBSee also:\fP 29 | .RS 4 30 | \fBjose_io_malloc()\fP 31 | .PP 32 | \fBjose_io_buffer()\fP 33 | .PP 34 | \fBjose_io_file()\fP 35 | .PP 36 | \fBjose_io_multiplex()\fP 37 | .PP 38 | \fBjose_b64_enc_io()\fP 39 | .PP 40 | \fBjose_b64_dec_io()\fP 41 | .PP 42 | \fBjose_jws_sig_io()\fP 43 | .PP 44 | \fBjose_jws_ver_io()\fP 45 | .PP 46 | \fBjose_jwe_dec_io()\fP 47 | .PP 48 | \fBjose_jwe_dec_cek_io()\fP 49 | .PP 50 | \fBjose_jwe_enc_io()\fP 51 | .PP 52 | \fBjose_jwe_enc_cek_io()\fP 53 | .RE 54 | .PP 55 | 56 | .SH "Field Documentation" 57 | .PP 58 | .SS "bool(* jose_io_t::feed) (\fBjose_io_t\fP *io, const void *in, size_t len)" 59 | 60 | .PP 61 | Pushes data into the IO chain\&. 62 | .PP 63 | \fBParameters:\fP 64 | .RS 4 65 | \fIio\fP The \fBjose_io_t\fP entity you are using\&. 66 | .br 67 | \fIin\fP The input buffer\&. 68 | .br 69 | \fIlen\fP The length of the data in the input buffer\&. 70 | .RE 71 | .PP 72 | \fBReturns:\fP 73 | .RS 4 74 | Returns true if all data was consumed, otherwise false\&. 75 | .RE 76 | .PP 77 | 78 | .SS "bool(* jose_io_t::done) (\fBjose_io_t\fP *io)" 79 | 80 | .PP 81 | Completes the IO chain\&. Any data stored in internal buffers will be flushed\&. 82 | .PP 83 | \fBParameters:\fP 84 | .RS 4 85 | \fIio\fP The \fBjose_io_t\fP entity you are using\&. 86 | .RE 87 | .PP 88 | \fBReturns:\fP 89 | .RS 4 90 | Returns true if flushing was successful, otherwise false\&. 91 | .RE 92 | .PP 93 | 94 | 95 | .SH "Author" 96 | .PP 97 | Generated automatically by Doxygen for José from the source code\&. 98 | -------------------------------------------------------------------------------- /doc/man/jose-alg.1.adoc: -------------------------------------------------------------------------------- 1 | jose-alg(1) 2 | =========== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-alg - Lists all supported algorithms 8 | 9 | == SYNOPSIS 10 | 11 | *jose alg* [-k KIND] 12 | 13 | == OVERVIEW 14 | 15 | The *jose alg* command lists the algorithms supported by all *jose* commands. 16 | 17 | Since *jose* supports different kinds of algorithms (encryption, signing, 18 | hashing, etc.), you can limit the kinds of algorithms you would like to see 19 | using the *-k* option (which can be specified multiple times). For a list of 20 | the different kinds of algorithms, use the *-k ?* option. If the *-k* option is 21 | not used, all algorithms, regardless of their kind, will be listed. 22 | 23 | == OPTIONS 24 | 25 | * *-k* _KIND_, *--kind*=_KIND_ : 26 | Restrict algorithm list to a certain kind 27 | 28 | * *-k* ?, *--kind*=? : 29 | List valid algorithm kinds 30 | 31 | == EXAMPLES 32 | 33 | List all encryption algorithms: 34 | 35 | $ jose alg -k encr 36 | A128CBC-HS256 37 | A128GCM 38 | A192CBC-HS384 39 | A192GCM 40 | A256CBC-HS512 41 | A256GCM 42 | 43 | == AUTHOR 44 | 45 | Nathaniel McCallum 46 | -------------------------------------------------------------------------------- /doc/man/jose-b64-dec.1.adoc: -------------------------------------------------------------------------------- 1 | jose-b64-dec(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-b64-dec - Decodes URL-safe Base64 data to binary 8 | 9 | == SYNOPSIS 10 | 11 | *jose b64 dec* -i B64 [-O BIN] 12 | 13 | == OVERVIEW 14 | 15 | The *jose b64 dec* command decodes URL-safe Base64 data to binary format. 16 | 17 | == OPTIONS 18 | 19 | * *-i* _FILE_, *--base64*=_FILE_ : 20 | Read Base64 (URL-safe) data from FILE 21 | 22 | * *-i* -, *--base64*=- : 23 | Read Base64 (URL-safe) data from standard input 24 | 25 | * *-O* _FILE_, *--binary*=_FILE_ : 26 | Write binary data to FILE 27 | 28 | * *-O* -, *--binary*=- : 29 | Write binary data to standard output 30 | 31 | == EXAMPLES 32 | 33 | Decode a simple message: 34 | 35 | $ echo SGVsbG8sIFdvcmxkCg | jose b64 dec -i- 36 | Hello, World 37 | 38 | == AUTHOR 39 | 40 | Nathaniel McCallum 41 | 42 | == SEE ALSO 43 | 44 | link:jose-b64-enc.1.adoc[*jose-b64-enc*(1)] 45 | -------------------------------------------------------------------------------- /doc/man/jose-b64-enc.1.adoc: -------------------------------------------------------------------------------- 1 | jose-b64-enc(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-b64-enc - Encodes binary data to URL-safe Base64 8 | 9 | == SYNOPSIS 10 | 11 | *jose b64 enc* -I BIN [-o B64] 12 | 13 | == OVERVIEW 14 | 15 | The *jose b64 enc* command encodes binary data to URL-safe Base64 format. 16 | 17 | == OPTIONS 18 | 19 | * *-I* _FILE_, *--binary*=_FILE_ : 20 | Read binary data from FILE 21 | 22 | * *-I* -, *--binary*=- : 23 | Read binary data from standard input 24 | 25 | * *-o* _FILE_, *--base64*=_FILE_ : 26 | Write Base64 (URL-safe) to FILE 27 | 28 | * *-o* -, *--base64*=- : 29 | Write Base64 (URL-safe) to standard output 30 | 31 | == EXAMPLES 32 | 33 | Encode a simple message: 34 | 35 | $ echo "Hello, World" | jose b64 enc -I- 36 | SGVsbG8sIFdvcmxkCg 37 | 38 | == AUTHOR 39 | 40 | Nathaniel McCallum 41 | 42 | == SEE ALSO 43 | 44 | link:jose-b64-dec.1.adoc[*jose-b64-dec*(1)] 45 | -------------------------------------------------------------------------------- /doc/man/jose-jwe-dec.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwe-dec(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwe-dec - Decrypts a JWE using the supplied JWKs 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwe dec* -i JWE [-I CT] -k JWK [-p] [-O PT] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwe dec* command decrypts a JWE using one or more JWK (*-k*) or 16 | password (*-p*). Decryption succeeds if any key is able to perform decryption. 17 | 18 | If the JWE is a detached JWE, meaning that the ciphertext is stored in 19 | binary form external to the JWE itself, the ciphertext can be loaded using 20 | the *-I* parameter. 21 | 22 | Please note that, when specifying the *-O* option to output the plaintext, 23 | plaintext output begins before ciphertext validation. Therefore, 24 | you must check the return value of the command before using the data. 25 | 26 | == OPTIONS 27 | 28 | * *-i* _JSON_, *--input*=_JSON_ : 29 | Parse JWE from JSON 30 | 31 | * *-i* _FILE_, *--input*=_FILE_ : 32 | Read JWE from FILE 33 | 34 | * *-i* -, *--input*=- : 35 | Read JWE from standard input 36 | 37 | * *-I* _FILE_, *--detached*=_FILE_ : 38 | Read decoded ciphertext from FILE 39 | 40 | * *-I* -, *--detached*=- : 41 | Read decoded ciphertext from standard input 42 | 43 | * *-p*, *--password* : 44 | Prompt for a decryption password, if necessary 45 | 46 | * *-k* _FILE_, *--key*=_FILE_ : 47 | Read JWK(Set) from FILE 48 | 49 | * *-k* -, *--key=-* : 50 | Read JWK(Set) from standard input 51 | 52 | * *-O* _JSON_, *--detach*=_JSON_ : 53 | Parse JWE from JSON 54 | 55 | * *-O* _FILE_, *--detach*=_FILE_ : 56 | Read JWE from FILE 57 | 58 | * *-O* -, *--detach*=- : 59 | Read JWE from standard input 60 | 61 | == EXAMPLES 62 | 63 | Decrypt a JWE with a JWK: 64 | 65 | $ jose jwe dec -i msg.jwe -k rsa.key -O msg.txt 66 | 67 | Decrypt a JWE with a password: 68 | 69 | $ jose jwe dec -i msg.jwe -p -O msg.txt 70 | Please enter decryption password: 71 | 72 | Decrypt a JWE with either of two JWKs: 73 | 74 | $ jose jwe dec -i msg.jwe -k ec.jwk -k rsa.jwk -O msg.txt 75 | 76 | == AUTHOR 77 | 78 | Nathaniel McCallum 79 | 80 | == SEE ALSO 81 | 82 | link:jose-jwe-enc.1.adoc[*jose-jwe-enc*(1)], 83 | link:jose-jwe-fmt.1.adoc[*jose-jwe-fmt*(1)] 84 | -------------------------------------------------------------------------------- /doc/man/jose-jwe-fmt.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwe-fmt(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwe-fmt - Converts a JWE between serialization formats 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwe fmt* -i JWE [-I CT] [-o JWE] [-O CT] [-c] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwe fmt* command converts a JWE into alternative serialization 16 | formats. For example, it can: 17 | 18 | 1. Attach ciphertext to a detached JWE. 19 | 2. Detach ciphertext from a JWE. 20 | 3. Convert JWE Compact Serialization to JWE JSON Serialization. 21 | 4. Convert JWE JSON Serialization to JWE Compact Serialization. 22 | 23 | == OPTIONS 24 | 25 | * *-i* _JSON_, *--input*=_JSON_ : 26 | Parse JWE from JSON 27 | 28 | * *-i* _FILE_, *--input*=_FILE_ : 29 | Read JWE from FILE 30 | 31 | * *-i* -, *--input*=-: 32 | Read JWE from standard input 33 | 34 | * *-I* _FILE_, *--detached*=_FILE_ : 35 | Read decoded ciphertext from FILE 36 | 37 | * *-I* -, *--detached*=- : 38 | Read decoded ciphertext from standard input 39 | 40 | * *-o* _FILE_, *--output*=_FILE_ : 41 | Write JWE to FILE 42 | 43 | * *-o* -, *--output*=- : 44 | Write JWE to stdout (default) 45 | 46 | * *-O* _FILE_, *--detach*=_FILE_ : 47 | Detach ciphertext and decode to FILE 48 | 49 | * *-O* -, *--detach*=- : 50 | Detach ciphertext and decode to standard output 51 | 52 | * *-c*, *--compact* : 53 | Output JWE using compact serialization 54 | 55 | == EXAMPLES 56 | 57 | Attach ciphertext to a detached JWE and emit JWE Compact Serialization: 58 | 59 | $ jose jwe fmt -i msg.jwe -I msg.ct -o compact.jwe -c 60 | 61 | Detach ciphertext from a JWE: 62 | 63 | $ jose jwe fmt -i msg.jwe -o detached.jwe -O detached.ct 64 | 65 | == AUTHOR 66 | 67 | Nathaniel McCallum 68 | 69 | == SEE ALSO 70 | 71 | link:jose-jwe-dec.1.adoc[*jose-jwe-dec*(1)], 72 | link:jose-jwe-enc.1.adoc[*jose-jwe-enc*(1)] 73 | -------------------------------------------------------------------------------- /doc/man/jose-jwk-eql.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwk-eql(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwk-eql - Checks if two keys are equal 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwk eql* -i JWK -i JWK 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwk eql* command determines whether two keys are equal. It compares 16 | the same properties defined for use in a JWK thumbprint (RFC 7638). This means 17 | that optional metadata isn't considered for comparison. 18 | 19 | == OPTIONS 20 | 21 | * *-i* JSON, *--input*=JSON : 22 | Parse JWK(Set) from JSON 23 | 24 | * *-i* FILE, *--input*=FILE : 25 | Read JWK(Set) from FILE 26 | 27 | * *-i* -, *--input*=- : 28 | Read JWK(Set) standard input 29 | 30 | == EXAMPLES 31 | 32 | Generate a key and modify optional metadata then test equality: 33 | 34 | $ jose jwk gen -i '{"alg":"ES256"}' -o key.jwk 35 | $ jose fmt -j key.jwk -Od alg -o mod.jwk 36 | $ jose jwk eql -i key.jwk -i mod.jwk 37 | $ echo $? 38 | 0 39 | 40 | == AUTHOR 41 | 42 | Nathaniel McCallum 43 | 44 | == SEE ALSO 45 | 46 | link:jose-jwk-thp.1.adoc[*jose-jwk-thp*(1)] 47 | -------------------------------------------------------------------------------- /doc/man/jose-jwk-exc.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwk-exc(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwk-exc - Performs a key exchange using the two input keys 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwk exc* [-i JWK] -l JWK -r JWK [-o JWK] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwk exc* command performs a key exchange using the two input keys 16 | and provides the result of the exchange as output. The user can specify a JWK 17 | template as input and the specified properties will appear in the output JWK 18 | unmodified. 19 | 20 | A key exchange requires two keys: 21 | 22 | 1. The local key, which usually contains private key material. 23 | 2. The remote key, which usually contains public key material. 24 | 25 | The algorithm for the exchange is inferred from the inputs. 26 | 27 | The *ECDH* algorithm performs a standard elliptic curve multiplication such 28 | that the public value of \p rem is multiplied by the private value of \p. 29 | 30 | The *ECMR* algorithm has three modes of operation. Where the local key has a 31 | private key (the "d" property), it performs exactly like *ECDH*. If the local 32 | key does not have a private key and the remote key does have a private key, 33 | elliptic curve addition is performed on the two values. Otherwise, if neither 34 | the local key nor the remote key have a private key, the remote key is 35 | subtracted from the local key using elliptic curve subtraction. When using 36 | ECMR, be sure to validate the content of your inputs to avoid triggering the 37 | incorrect operation! 38 | 39 | == OPTIONS 40 | 41 | * *-i* _JSON_, *--input*=_JSON_ : 42 | Parse JWK template from JSON 43 | 44 | * *-i* _FILE_, *--input*=_FILE_ : 45 | Read JWK template from FILE 46 | 47 | * *-i* -, *--input*=- : 48 | Read JWK template from standard input 49 | 50 | * *-o* _FILE_, *--output*=_FILE_ : 51 | Write JWK(Set) to FILE 52 | 53 | * *-o* -, *--output*=- : 54 | Write JWK(Set) to standard input 55 | 56 | * *-l* _FILE_, *--local*=_FILE_ : 57 | Read local JWK from FILE 58 | 59 | * *-l* -, *--local*=- : 60 | Read local JWK from standard input 61 | 62 | * *-r* _FILE_, *--remote*=_FILE_ : 63 | Read remote JWK from FILE 64 | 65 | * *-r* -, *--remote*=- : 66 | Read remote JWK from standard input 67 | 68 | == EXAMPLES 69 | 70 | Perform a key exchange: 71 | 72 | $ jose jwk gen -i '{"alg":"ECDH"}' -o local.jwk 73 | $ jose jwk gen -i '{"alg":"ECDH"}' | jose jwk pub -i- -o remote.jwk 74 | $ jose jwk exc -l local.jwk -r remote.jwk -o exchanged.jwk 75 | 76 | == AUTHOR 77 | 78 | Nathaniel McCallum 79 | 80 | == SEE ALSO 81 | 82 | link:jose-alg.1.adoc[*jose-alg*(1)], 83 | link:jose-jwk-exc.1.adoc[*jose-jwk-exc*(1)], 84 | link:jose-jwk-gen.1.adoc[*jose-jwk-gen*(1)], 85 | link:jose-jwk-pub.1.adoc[*jose-jwk-pub*(1)] 86 | -------------------------------------------------------------------------------- /doc/man/jose-jwk-pub.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwk-pub(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwk-pub - Cleans private keys from a JWK 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwk pub* -i JWK [-o JWK] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwk pub* command removes all private key material from one or more 16 | JWK(Set) inputs. The output will contain only public key material. 17 | 18 | If the JWK contains the "key_ops" property, it will be automatically adjusted 19 | to include only operations relevant to public keys. 20 | 21 | == OPTIONS 22 | 23 | * *-i* _JSON_, *--input*=_JSON_ : 24 | Parse JWK(Set) from JSON 25 | 26 | * *-i* _FILE_, *--input*=_FILE_ : 27 | Read JWK(Set) from FILE 28 | 29 | * *-i* -, *--input*=- : 30 | Read JWK(Set) from standard input 31 | 32 | * *-o* _FILE_, *--output*=_FILE_ : 33 | Write JWK(Set) to FILE 34 | 35 | * *-o* -, *--output*=- : 36 | Write JWK(Set) to standard input 37 | 38 | * *-s*, *--set* : 39 | Always output a JWKSet 40 | 41 | == EXAMPLES 42 | 43 | Clean private key material from a JWK: 44 | 45 | $ jose jwk gen -i '{"alg":"ES256"}' -o prv.jwk 46 | $ cat prv.jwk 47 | {"alg":"ES256","crv":"P-256","key_ops":["sign","verify"],"kty":"EC", ...} 48 | $ jose jwk pub -i prv.jwk -o pub.jwk 49 | $ cat pub.jwk 50 | {"alg":"ES256","crv":"P-256","key_ops":["verify"],"kty":"EC", ...} 51 | 52 | == AUTHOR 53 | 54 | Nathaniel McCallum 55 | 56 | == SEE ALSO 57 | 58 | link:jose-alg.1.adoc[*jose-alg*(1)], 59 | link:jose-jwe-enc.1.adoc[*jose-jwe-enc*(1)], 60 | link:jose-jwk-exc.1.adoc[*jose-jwk-exc*(1)], 61 | link:jose-jwk-gen.1.adoc[*jose-jwk-gen*(1)], 62 | link:jose-jwk-thp.1.adoc[*jose-jwk-thp*(1)], 63 | link:jose-jwk-use.1.adoc[*jose-jwk-use*(1)], 64 | link:jose-jws-ver.1.adoc[*jose-jws-ver*(1)] 65 | -------------------------------------------------------------------------------- /doc/man/jose-jwk-thp.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwk-thp(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwk-thp - Calculates the JWK thumbprint 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwk thp* -i JWK [-H ALG] [-o THP] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwk thp* command calculates the thumbprint of one or more JWKs. 16 | 17 | == OPTIONS 18 | 19 | * *-i* _JSON_, *--input*=_JSON_ : 20 | Parse JWK(Set) from JSON 21 | 22 | * *-i* _FILE_, *--input*=_FILE_ : 23 | Read JWK(Set) from FILE 24 | 25 | * *-i* -, *--input*=- : 26 | Read JWK(Set) standard input 27 | 28 | * *-a* _ALG_, *--algorithm*=_ALG_ : 29 | Use the specified hash algorithm (case sensitive) 30 | 31 | * *-a* ?, *--algorithm*=? : 32 | List available hash algorithms 33 | 34 | * *-o* _FILE_, *--output*=_FILE_ : 35 | Write thumbprint(s) to FILE 36 | 37 | * *-o* -, *--output*=- : 38 | Write thumbprint(s) to standard input 39 | 40 | * *-f* _THP_, *--find*=_THP_ : 41 | Search input keys for JWK with the given thumbprint 42 | 43 | == EXAMPLES 44 | 45 | Calculate the S1 thumbprint of a newly generated key: 46 | 47 | $ jose jwk gen -i '{"alg":"ES256"}' -a S1 | jose jwk thp -i- 48 | BzmSH6W8a8LlbQ1mD0iBJdYj4x4 49 | 50 | Calculate the S256 thumbprints of a JWKSet containing two keys: 51 | 52 | $ jose jwk thp -i keys.jwkset -a S256 53 | 6HJwXEuRh8gAkTz4BodEvcEj_KXkgjc-7Qez3d4VNMs 54 | jo_j_O5gqYpKcZKHPp3miTszAeV60MXHvdb_kkjjTWE 55 | 56 | Find the input key with the given thumbprint: 57 | 58 | $ jose jwk thp -i keys.jwkset -f HYRNOxxOOHap0amTONoy1bHnS5M -o key.jwk 59 | 60 | == AUTHOR 61 | 62 | Nathaniel McCallum 63 | 64 | == SEE ALSO 65 | 66 | link:jose-alg.1.adoc[*jose-alg*(1)], 67 | link:jose-jwk-gen.1.adoc[*jose-jwk-gen*(1)], 68 | -------------------------------------------------------------------------------- /doc/man/jose-jwk-use.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jwk-use(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jwk-use - Validates a key for the specified use(s) 8 | 9 | == SYNOPSIS 10 | 11 | *jose jwk use* -i JWK [-a] [-r] -u OP 12 | 13 | == OVERVIEW 14 | 15 | The *jose jwk use* command validates one or more JWK(Set) inputs for a given 16 | set of usages. This will be validated against the "use" and "key_ops" 17 | properties of each JWK. 18 | 19 | By default, if a JWK has no restrictions an operation will be allowed. 20 | However, by specifying the *-r* option you can ensure that a JWK will not 21 | be allowed unless it explicitly permits the option. 22 | 23 | In normal operation, *jose jwk use* will fail if any of the JWKs do not 24 | validate. However, if the *-o* option is used *jose jwk use* will instead 25 | write a JWK(Set) containing all of the input keys that validate. If no JWKs 26 | validate, the command will fail. 27 | 28 | == OPTIONS 29 | 30 | * *-i* _JSON_, *--input*=_JSON_ : 31 | Parse JWK(Set) from JSON 32 | 33 | * *-i* _FILE_, *--input*=_FILE_ : 34 | Read JWK(Set) from FILE 35 | 36 | * *-i* -, *--input*=- : 37 | Read JWK(Set) standard input 38 | 39 | * *-u* sign, *--use*=sign : 40 | Validate the key for signing 41 | 42 | * *-u* verify, *--use*=verify : 43 | Validate the key for verifying 44 | 45 | * *-u* encrypt, *--use*=encrypt : 46 | Validate the key for encrypting 47 | 48 | * *-u* decrypt, *--use*=decrypt : 49 | Validate the key for decrypting 50 | 51 | * *-u* wrapKey, *--use*=wrapKey : 52 | Validate the key for wrapping 53 | 54 | * *-u* unwrapKey, *--use*=unwrapKey : 55 | Validate the key for unwrapping 56 | 57 | * *-u* deriveKey, *--use*=deriveKey : 58 | Validate the key for deriving keys 59 | 60 | * *-u* deriveBits, *--use*=deriveBits : 61 | Validate the key for deriving bits 62 | 63 | * *-a*, *--all* : 64 | Succeeds only if all operations are allowed 65 | 66 | * *-r*, *--required* : 67 | Operations must be explicitly allowed 68 | 69 | * *-o* _FILE_, *--output*=_FILE_ : 70 | Filter keys to FILE as JWK(Set) 71 | 72 | * *-o* -, *--output*=- : 73 | Filter keys to standard output as JWK(Set) 74 | 75 | * *-s*, *--set* : 76 | Always output a JWKSet 77 | 78 | == EXAMPLES 79 | 80 | Examples of both success and failure from a private and public key: 81 | 82 | $ jose jwk gen -i '{"alg":"ES256"}' -o prv.jwk 83 | $ jose jwk pub -i prv.jwk -o pub.jwk 84 | $ jose jwk use -i prv.jwk -u sign 85 | $ echo $? 86 | 0 87 | $ jose jwk use -i pub.jwk -u sign 88 | $ echo $? 89 | 1 90 | 91 | == AUTHOR 92 | 93 | Nathaniel McCallum 94 | 95 | == SEE ALSO 96 | 97 | link:jose-jwk-gen.1.adoc[*jose-jwk-gen*(1)] 98 | -------------------------------------------------------------------------------- /doc/man/jose-jws-fmt.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jws-fmt(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jws-fmt - Converts a JWS between serialization formats 8 | 9 | == SYNOPSIS 10 | 11 | *jose jws fmt* -i JWS [-I PAY] [-o JWS] [-O PAY] [-c] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jws fmt* command converts a JWS into alternative serialization 16 | formats. For example, it can: 17 | 18 | 1. Attach payload to a detached JWS. 19 | 2. Detach payload from a JWS. 20 | 3. Convert JWS Compact Serialization to JWS JSON Serialization. 21 | 4. Convert JWS JSON Serialization to JWS Compact Serialization. 22 | 23 | == OPTIONS 24 | 25 | * *-i* _JSON_, *--input*=_JSON_ : 26 | Parse JWS from JSON 27 | 28 | * *-i* _FILE_, *--input*=_FILE_ : 29 | Read JWS from FILE 30 | 31 | * *-i* -, *--input*=-: 32 | Read JWS from standard input 33 | 34 | * *-I* _FILE_, *--detached*=_FILE_ : 35 | Read decoded payload from FILE 36 | 37 | * *-I* -, *--detached*=- : 38 | Read decoded payload from standard input 39 | 40 | * *-o* _FILE_, *--output*=_FILE_ : 41 | Write JWS to FILE 42 | 43 | * *-o* -, *--output*=- : 44 | Write JWS to stdout (default) 45 | 46 | * *-O* _FILE_, *--detach*=_FILE_ : 47 | Detach payload and decode to FILE 48 | 49 | * *-O* -, *--detach*=- : 50 | Detach payload and decode to standard output 51 | 52 | * *-c*, *--compact* : 53 | Output JWS using compact serialization 54 | 55 | == EXAMPLES 56 | 57 | Attach payload to a detached JWS and emit JWS Compact Serialization: 58 | 59 | $ jose jws fmt -i msg.jws -I msg.txt -o compact.jws -c 60 | 61 | Detach payload from a JWS: 62 | 63 | $ jose jws fmt -i msg.jws -o detached.jws -O msg.txt 64 | 65 | == AUTHOR 66 | 67 | Nathaniel McCallum 68 | 69 | == SEE ALSO 70 | 71 | link:jose-jws-sig.1.adoc[*jose-jws-sig*(1)], 72 | link:jose-jws-ver.1.adoc[*jose-jws-ver*(1)] 73 | -------------------------------------------------------------------------------- /doc/man/jose-jws-ver.1.adoc: -------------------------------------------------------------------------------- 1 | jose-jws-ver(1) 2 | =============== 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose-jws-ver - Verifies a JWS using the supplied JWKs 8 | 9 | == SYNOPSIS 10 | 11 | *jose jws ver* -i JWS [-I PAY] -k JWK [-a] [-O PAY] 12 | 13 | == OVERVIEW 14 | 15 | The *jose jws ver* command verifies a signature over a payload using one or 16 | more JWKs. When specifying more than one JWK (*-k*), the program will succeed 17 | when any of the provided JWKs successfully verify a signature. Alternatively, 18 | if the *-a* option is given, the program will succeed only when all JWKs 19 | successfully verify a signature. 20 | 21 | If the JWS is a detached JWS, meaning that the payload is stored in binary 22 | form external to the JWS itself, the payload can be loaded using the *-I* 23 | parameter. 24 | 25 | Please note that, when specifying the *-O* option to output the payload, 26 | the payload is output whether or not the signature validates. Therefore, 27 | you must check the return value of the command before trusting the data. 28 | 29 | == OPTIONS 30 | 31 | * *-i* _JSON_, *--input*=_JSON_ : 32 | Parse JWS from JSON 33 | 34 | * *-i* _FILE_, *--input*=_FILE_ : 35 | Read JWS from FILE 36 | 37 | * *-i* -, *--input*=- : 38 | Read JWS from standard input 39 | 40 | * *-I* _FILE_, *--detached*=_FILE_ : 41 | Read decoded payload from FILE 42 | 43 | * *-I* -, *--detached*=- : 44 | Read decoded payload from standard input 45 | 46 | * *-k* _FILE_, *--key*=_FILE_ : 47 | Read JWK(Set) from FILE 48 | 49 | * *-k* -, *--key*=- : 50 | Read JWK(Set) from standard input 51 | 52 | * *-O* _FILE_, *--detach*=_FILE_ : 53 | Decode payload to FILE 54 | 55 | * *-O* -, *--detach*=- : 56 | Decode payload to standard output 57 | 58 | * *-a*, *--all* : 59 | Ensure the JWS validates with all keys 60 | 61 | == EXAMPLES 62 | 63 | Verify a regular JWS and output the payload: 64 | 65 | $ jose jws ver -i msg.jws -k key.jwk -O msg.txt 66 | 67 | Verify a detached JWS without outputting the payload: 68 | 69 | $ jose jws ver -i msg.jws -I msg.txt -k key.jwk 70 | 71 | Ensure that a JWS is signed with all specified keys: 72 | 73 | $ jose jws ver -i msg.jws -k ec.jwk -k rsa.jwk -a 74 | 75 | == AUTHOR 76 | 77 | Nathaniel McCallum 78 | 79 | == SEE ALSO 80 | 81 | link:jose-jws-fmt.1.adoc[*jose-jws-fmt*(1)], 82 | link:jose-jws-sig.1.adoc[*jose-jws-sig*(1)] 83 | -------------------------------------------------------------------------------- /doc/man/jose.1.adoc: -------------------------------------------------------------------------------- 1 | jose(1) 2 | ======= 3 | :doctype: manpage 4 | 5 | == NAME 6 | 7 | jose - Toolkit for performing JSON Object Signing and Encryption 8 | 9 | == SYNOPSIS 10 | 11 | *jose alg* [-k KIND] 12 | 13 | *jose b64 dec* -i B64 [-O BIN] 14 | 15 | *jose b64 enc* -I BIN [-o B64] 16 | 17 | *jose jwe dec* -i JWE [-I CT] -k JWK [-p] [-O PT] 18 | 19 | *jose jwe enc* [-i JWE] -I PT -k JWK [-p] [-r RCP] [-o JWE] [-O CT] [-c] 20 | 21 | *jose jwe fmt* -i JWE [-I CT] [-o JWE] [-O CT] [-c] 22 | 23 | *jose jwk exc* [-i JWK] -l JWK -r JWK [-o JWK] 24 | 25 | *jose jwk gen* -i JWK [-o JWK] 26 | 27 | *jose jwk pub* -i JWK [-o JWK] 28 | 29 | *jose jwk thp* -i JWK [-a ALG] [-o THP] 30 | 31 | *jose jwk use* -i JWK [-a] [-r] -u OP 32 | 33 | *jose jws fmt* -i JWS [-I PAY] [-o JWS] [-O PAY] [-c] 34 | 35 | *jose jws sig* [-i JWS] [-I PAY] [-s SIG] -k JWK [-o JWS] [-O PAY] [-c] 36 | 37 | *jose jws ver* -i JWS [-I PAY] -k JWK [-O PAY] [-a] 38 | 39 | == OVERVIEW 40 | 41 | José is a C-language implementation of the Javascript Object Signing and 42 | Encryption standards. Specifically, José aims towards implementing the 43 | following standards: 44 | 45 | * RFC 7515 - JSON Web Signature (JWS) 46 | * RFC 7516 - JSON Web Encryption (JWE) 47 | * RFC 7517 - JSON Web Key (JWK) 48 | * RFC 7518 - JSON Web Algorithms (JWA) 49 | * RFC 7519 - JSON Web Token (JWT) 50 | * RFC 7520 - Examples of Protecting Content Using JOSE 51 | * RFC 7638 - JSON Web Key (JWK) Thumbprint 52 | 53 | 54 | The José command line utility provides facilities for the following: 55 | 56 | * URL-safe Base64 Encoding & Decoding 57 | * Key Generation and Management 58 | * Encryption & Decryption 59 | * Signing & Verification 60 | 61 | == AUTHOR 62 | 63 | Nathaniel McCallum 64 | 65 | == SEE ALSO 66 | 67 | link:jose-alg.1.adoc[*jose-alg*(1)], 68 | link:jose-b64-dec.1.adoc[*jose-b64-dec*(1)], 69 | link:jose-b64-enc.1.adoc[*jose-b64-enc*(1)], 70 | link:jose-jwe-dec.1.adoc[*jose-jwe-dec*(1)], 71 | link:jose-jwe-enc.1.adoc[*jose-jwe-enc*(1)], 72 | link:jose-jwe-fmt.1.adoc[*jose-jwe-fmt*(1)], 73 | link:jose-jwk-exc.1.adoc[*jose-jwk-exc*(1)], 74 | link:jose-jwk-gen.1.adoc[*jose-jwk-gen*(1)], 75 | link:jose-jwk-pub.1.adoc[*jose-jwk-pub*(1)], 76 | link:jose-jwk-thp.1.adoc[*jose-jwk-thp*(1)], 77 | link:jose-jwk-use.1.adoc[*jose-jwk-use*(1)], 78 | link:jose-jws-fmt.1.adoc[*jose-jws-fmt*(1)], 79 | link:jose-jws-sig.1.adoc[*jose-jws-sig*(1)], 80 | link:jose-jws-ver.1.adoc[*jose-jws-ver*(1)] 81 | -------------------------------------------------------------------------------- /doc/man/meson.build: -------------------------------------------------------------------------------- 1 | mans += join_paths(meson.current_source_dir(), 'jose.1') 2 | mans += join_paths(meson.current_source_dir(), 'jose-alg.1') 3 | mans += join_paths(meson.current_source_dir(), 'jose-b64-dec.1') 4 | mans += join_paths(meson.current_source_dir(), 'jose-b64-enc.1') 5 | mans += join_paths(meson.current_source_dir(), 'jose-fmt.1') 6 | mans += join_paths(meson.current_source_dir(), 'jose-jwe-dec.1') 7 | mans += join_paths(meson.current_source_dir(), 'jose-jwe-enc.1') 8 | mans += join_paths(meson.current_source_dir(), 'jose-jwe-fmt.1') 9 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-eql.1') 10 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-exc.1') 11 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-gen.1') 12 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-pub.1') 13 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-thp.1') 14 | mans += join_paths(meson.current_source_dir(), 'jose-jwk-use.1') 15 | mans += join_paths(meson.current_source_dir(), 'jose-jws-fmt.1') 16 | mans += join_paths(meson.current_source_dir(), 'jose-jws-sig.1') 17 | mans += join_paths(meson.current_source_dir(), 'jose-jws-ver.1') 18 | -------------------------------------------------------------------------------- /doc/meson.build: -------------------------------------------------------------------------------- 1 | subdir('man') 2 | 3 | install_man( 4 | 'doxygen/man/man3/jose_b64.3', 5 | 'doxygen/man/man3/jose_jwk.3', 6 | 'doxygen/man/man3/jose_jws.3', 7 | 'doxygen/man/man3/jose_cfg.3', 8 | 'doxygen/man/man3/jose_jwe.3', 9 | 'doxygen/man/man3/jose_io_t.3', 10 | 'doxygen/man/man3/jose_io.3', 11 | ) 12 | -------------------------------------------------------------------------------- /include/jose/jose.h.in: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | /** 19 | * \mainpage José API Documentation 20 | * \author Nathaniel McCallum 21 | * \copyright Apache License, Version 2.0 22 | * 23 | * José is a C-language implementation of the Javascript Object Signing and 24 | * Encryption standards. Specifically, José aims towards implementing the 25 | * following standards: 26 | * 27 | * * RFC 7515 - JSON Web Signature (JWS) 28 | * * RFC 7516 - JSON Web Encryption (JWE) 29 | * * RFC 7517 - JSON Web Key (JWK) 30 | * * RFC 7518 - JSON Web Algorithms (JWA) 31 | * * RFC 7519 - JSON Web Token (JWT) 32 | * * RFC 7520 - Examples of Protecting Content Using JOSE 33 | * * RFC 7638 - JSON Web Key (JWK) Thumbprint 34 | */ 35 | 36 | #pragma once 37 | 38 | #include 39 | #include 40 | #include 41 | #include 42 | 43 | #define JOSE_VERSION @VERSION@ 44 | -------------------------------------------------------------------------------- /include/jose/meson.build: -------------------------------------------------------------------------------- 1 | cd = configuration_data() 2 | cd.set('VERSION', meson.project_version()) 3 | 4 | jose_h = configure_file( 5 | input: 'jose.h.in', 6 | output: 'jose.h', 7 | configuration: cd 8 | ) 9 | 10 | install_headers( 11 | jose_h, 12 | 'cfg.h', 13 | 'io.h', 14 | 'b64.h', 15 | 'jwk.h', 16 | 'jws.h', 17 | 'jwe.h', 18 | 'openssl.h', 19 | subdir: meson.project_name() 20 | ) 21 | -------------------------------------------------------------------------------- /include/jose/openssl.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include "cfg.h" 21 | #include 22 | #include 23 | #include 24 | 25 | json_t * 26 | jose_openssl_jwk_from_EVP_PKEY(jose_cfg_t *cfg, EVP_PKEY *key); 27 | 28 | json_t * 29 | jose_openssl_jwk_from_RSA(jose_cfg_t *cfg, const RSA *key); 30 | 31 | json_t * 32 | jose_openssl_jwk_from_EC_KEY(jose_cfg_t *cfg, const EC_KEY *key); 33 | 34 | json_t * 35 | jose_openssl_jwk_from_EC_POINT(jose_cfg_t *cfg, const EC_GROUP *grp, 36 | const EC_POINT *pub, const BIGNUM *prv); 37 | 38 | EVP_PKEY * 39 | jose_openssl_jwk_to_EVP_PKEY(jose_cfg_t *cfg, const json_t *jwk); 40 | 41 | RSA * 42 | jose_openssl_jwk_to_RSA(jose_cfg_t *cfg, const json_t *jwk); 43 | 44 | EC_KEY * 45 | jose_openssl_jwk_to_EC_KEY(jose_cfg_t *cfg, const json_t *jwk); 46 | -------------------------------------------------------------------------------- /include/meson.build: -------------------------------------------------------------------------------- 1 | incdir = include_directories('.') 2 | 3 | subdir('jose') 4 | -------------------------------------------------------------------------------- /jose.spec: -------------------------------------------------------------------------------- 1 | Name: jose 2 | Version: 10 3 | Release: 5%{?dist} 4 | Summary: Tools for JSON Object Signing and Encryption (JOSE) 5 | 6 | License: ASL 2.0 7 | URL: https://github.com/latchset/%{name} 8 | Source0: https://github.com/latchset/%{name}/releases/download/v%{version}/%{name}-%{version}.tar.bz2 9 | 10 | BuildRequires: gcc 11 | BuildRequires: pkgconfig 12 | BuildRequires: jansson-devel >= 2.10 13 | BuildRequires: openssl-devel 14 | BuildRequires: zlib-devel 15 | Requires: lib%{name}%{?_isa} = %{version}-%{release} 16 | 17 | %description 18 | José is a command line utility for performing various tasks on JSON 19 | Object Signing and Encryption (JOSE) objects. José provides a full 20 | crypto stack including key generation, signing and encryption. 21 | 22 | %package -n lib%{name} 23 | Summary: Library implementing JSON Object Signing and Encryption 24 | Conflicts: jansson < 2.10 25 | Provides: lib%{name}-openssl = %{version}-%{release} 26 | Obsoletes: lib%{name}-openssl < %{version}-%{release} 27 | Provides: lib%{name}-zlib = %{version}-%{release} 28 | Obsoletes: lib%{name}-zlib < %{version}-%{release} 29 | 30 | %description -n lib%{name} 31 | This package contains a C library for performing JOSE operations. 32 | 33 | %package -n lib%{name}-devel 34 | Summary: Development files for lib%{name} 35 | Requires: lib%{name}%{?_isa} = %{version}-%{release} 36 | Requires: pkgconfig 37 | Requires: jansson-devel 38 | Provides: lib%{name}-openssl-devel = %{version}-%{release} 39 | Obsoletes: lib%{name}-openssl-devel < %{version}-%{release} 40 | Provides: lib%{name}-zlib-devel = %{version}-%{release} 41 | Obsoletes: lib%{name}-zlib-devel < %{version}-%{release} 42 | 43 | %description -n lib%{name}-devel 44 | This package contains development files for lib%{name}. 45 | 46 | %prep 47 | %setup -q 48 | 49 | %build 50 | %if 0%{?rhel} 51 | %__sed -i 's|libcrypto >= 1\.0\.2|libcrypto >= 1\.0\.1|' configure 52 | %endif 53 | %configure --disable-openmp 54 | make %{?_smp_mflags} 55 | 56 | %install 57 | rm -rf %{buildroot} 58 | %make_install 59 | rm -rf %{buildroot}/%{_libdir}/lib%{name}.la 60 | 61 | %check 62 | make %{?_smp_mflags} check 63 | 64 | %ldconfig_scriptlets -n lib%{name} 65 | 66 | %files 67 | %{_bindir}/%{name} 68 | %{_mandir}/man1/jose*.1* 69 | 70 | %files -n lib%{name} 71 | %license COPYING 72 | %{_libdir}/lib%{name}.so.* 73 | 74 | %files -n lib%{name}-devel 75 | %dir %{_includedir}/%{name} 76 | %{_includedir}/%{name}/*.h 77 | %{_libdir}/lib%{name}.so 78 | %{_libdir}/pkgconfig/%{name}.pc 79 | %{_mandir}/man3/jose*.3* 80 | 81 | %changelog 82 | -------------------------------------------------------------------------------- /lib/hooks.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "hooks.h" 19 | #include 20 | 21 | static const jose_hook_jwk_t *jwks; 22 | static const jose_hook_alg_t *algs; 23 | 24 | void 25 | jose_hook_jwk_push(jose_hook_jwk_t *jwk) 26 | { 27 | jwk->next = jwks; 28 | jwks = jwk; 29 | } 30 | 31 | const jose_hook_jwk_t * 32 | jose_hook_jwk_list(void) 33 | { 34 | return jwks; 35 | } 36 | 37 | void 38 | jose_hook_alg_push(jose_hook_alg_t *alg) 39 | { 40 | alg->next = algs; 41 | algs = alg; 42 | } 43 | 44 | const jose_hook_alg_t * 45 | jose_hook_alg_list(void) 46 | { 47 | return algs; 48 | } 49 | 50 | const jose_hook_alg_t * 51 | jose_hook_alg_find(jose_hook_alg_kind_t kind, const char *name) 52 | { 53 | for (const jose_hook_alg_t *a = algs; a; a = a->next) { 54 | if (a->kind != kind) 55 | continue; 56 | 57 | if (!name || strcmp(a->name, name) == 0) 58 | return a; 59 | } 60 | 61 | return NULL; 62 | } 63 | 64 | const jose_hook_alg_t * 65 | jose_hook_alg_find_any(const char *name) 66 | { 67 | for (const jose_hook_alg_t *a = algs; a; a = a->next) { 68 | if (strcmp(a->name, name) == 0) { 69 | return a; 70 | } 71 | } 72 | return NULL; 73 | } 74 | -------------------------------------------------------------------------------- /lib/hsh.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #define _GNU_SOURCE 19 | #include "misc.h" 20 | #include "hsh.h" 21 | 22 | #include 23 | #include "hooks.h" 24 | 25 | json_t * 26 | hsh(jose_cfg_t *cfg, const char *alg, const void *data, size_t dlen) 27 | { 28 | jose_io_auto_t *_hsh = NULL; 29 | jose_io_auto_t *enc = NULL; 30 | jose_io_auto_t *buf = NULL; 31 | char b[1024] = {}; 32 | size_t l = sizeof(b); 33 | 34 | buf = jose_io_buffer(cfg, b, &l); 35 | enc = jose_b64_enc_io(buf); 36 | _hsh = hsh_io(cfg, alg, enc); 37 | if (!buf || !enc || !_hsh || !_hsh->feed(_hsh, data, dlen) || !_hsh->done(_hsh)) 38 | return NULL; 39 | 40 | return json_stringn(b, l); 41 | } 42 | 43 | jose_io_t * 44 | hsh_io(jose_cfg_t *cfg, const char *alg, jose_io_t *next) 45 | { 46 | const jose_hook_alg_t *a = NULL; 47 | 48 | a = jose_hook_alg_find(JOSE_HOOK_ALG_KIND_HASH, alg); 49 | if (!a) 50 | return NULL; 51 | 52 | return a->hash.hsh(a, cfg, next); 53 | } 54 | 55 | size_t 56 | hsh_buf(jose_cfg_t *cfg, const char *alg, 57 | const void *data, size_t dlen, void *hash, size_t hlen) 58 | { 59 | const jose_hook_alg_t *a = NULL; 60 | jose_io_auto_t *_hsh = NULL; 61 | jose_io_auto_t *buf = NULL; 62 | 63 | a = jose_hook_alg_find(JOSE_HOOK_ALG_KIND_HASH, alg); 64 | if (!a) 65 | return SIZE_MAX; 66 | 67 | if (!hash || hlen == 0) 68 | return a->hash.size; 69 | 70 | if (hlen < a->hash.size) 71 | return SIZE_MAX; 72 | 73 | buf = jose_io_buffer(cfg, hash, &hlen); 74 | _hsh = a->hash.hsh(a, cfg, buf); 75 | if (!buf || !_hsh || !_hsh->feed(_hsh, data, dlen) || !_hsh->done(_hsh)) 76 | return SIZE_MAX; 77 | 78 | return hlen; 79 | } 80 | -------------------------------------------------------------------------------- /lib/hsh.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | /** 19 | * \brief Cryptographic Hashing 20 | * \defgroup hsh Hash 21 | * @{ 22 | */ 23 | 24 | #pragma once 25 | 26 | #include 27 | #include 28 | #include 29 | #include 30 | 31 | /** 32 | * Hashes data with the specified algorithm. 33 | * 34 | * This function hashes the first \p dlen bytes of \p data using the \p alg 35 | * specified and returns the output as a URL-safe Base64 encoded JSON string. 36 | * 37 | * \param cfg The configuration context (optional). 38 | * \param alg The hashing algorithm. 39 | * \param data The input data buffer. 40 | * \param dlen The length of the data in the input buffer. 41 | * \return The hash as a URL-safe Base64 encoded JSON string. 42 | */ 43 | json_t * 44 | hsh(jose_cfg_t *cfg, const char *alg, const void *data, size_t dlen); 45 | 46 | /** 47 | * Hashes data with the specified algorithm using IO chaining. 48 | * 49 | * This function creates an IO chain filter that takes the data to be hashed 50 | * as input and outputs a hash of the input data. 51 | * 52 | * \param cfg The configuration context (optional). 53 | * \param alg The hashing algorithm. 54 | * \param next The size of the output hash buffer. 55 | * \return The number of bytes written to the hash buffer or SIZE_MAX on error. 56 | */ 57 | 58 | jose_io_t * 59 | hsh_io(jose_cfg_t *cfg, const char *alg, jose_io_t *next); 60 | 61 | 62 | /** 63 | * Hashes data with the specified algorithm into a buffer. 64 | * 65 | * This function hashes the first \p dlen bytes of \p data using the \p alg 66 | * specified and stores the output in \p hash (a buffer of size \p hlen). 67 | * 68 | * If \p hash is NULL, the required size of the output buffer is returned. 69 | * 70 | * \param cfg The configuration context (optional). 71 | * \param alg The hashing algorithm. 72 | * \param data The input data buffer. 73 | * \param dlen The length of the data in the input buffer. 74 | * \param hash The output hash buffer. 75 | * \param hlen The size of the output hash buffer. 76 | * \return The number of bytes written to the hash buffer or SIZE_MAX on error. 77 | */ 78 | size_t 79 | hsh_buf(jose_cfg_t *cfg, const char *alg, 80 | const void *data, size_t dlen, void *hash, size_t hlen); 81 | 82 | /** @} */ 83 | -------------------------------------------------------------------------------- /lib/libjose.map: -------------------------------------------------------------------------------- 1 | LIBJOSE_1.0 { 2 | global: 3 | jose_b64_dec; 4 | jose_b64_dec_buf; 5 | jose_b64_dec_io; 6 | jose_b64_dec_load; 7 | jose_b64_enc; 8 | jose_b64_enc_buf; 9 | jose_b64_enc_dump; 10 | jose_b64_enc_io; 11 | jose_cfg; 12 | jose_cfg_auto; 13 | jose_cfg_decref; 14 | jose_cfg_err; 15 | jose_cfg_get_err_misc; 16 | jose_cfg_incref; 17 | jose_cfg_set_err_func; 18 | jose_hook_alg_find; 19 | jose_hook_alg_find_any; 20 | jose_hook_alg_list; 21 | jose_hook_alg_push; 22 | jose_hook_jwk_list; 23 | jose_hook_jwk_push; 24 | jose_io_auto; 25 | jose_io_buffer; 26 | jose_io_decref; 27 | jose_io_file; 28 | jose_io_incref; 29 | jose_io_malloc; 30 | jose_io_malloc_steal; 31 | jose_io_multiplex; 32 | jose_jwe_dec; 33 | jose_jwe_dec_cek; 34 | jose_jwe_dec_cek_io; 35 | jose_jwe_dec_io; 36 | jose_jwe_dec_jwk; 37 | jose_jwe_enc; 38 | jose_jwe_enc_cek; 39 | jose_jwe_enc_cek_io; 40 | jose_jwe_enc_io; 41 | jose_jwe_enc_jwk; 42 | jose_jwe_hdr; 43 | jose_jwk_eql; 44 | jose_jwk_exc; 45 | jose_jwk_gen; 46 | jose_jwk_prm; 47 | jose_jwk_pub; 48 | jose_jwk_thp; 49 | jose_jwk_thp_buf; 50 | jose_jws_hdr; 51 | jose_jws_sig; 52 | jose_jws_sig_io; 53 | jose_jws_ver; 54 | jose_jws_ver_io; 55 | 56 | local: 57 | *; 58 | }; 59 | 60 | LIBJOSE_OPENSSL_1.0 { 61 | global: 62 | jose_openssl_jwk_from_EC_KEY; 63 | jose_openssl_jwk_from_EC_POINT; 64 | jose_openssl_jwk_from_EVP_PKEY; 65 | jose_openssl_jwk_from_RSA; 66 | jose_openssl_jwk_to_EC_KEY; 67 | jose_openssl_jwk_to_EVP_PKEY; 68 | jose_openssl_jwk_to_RSA; 69 | 70 | local: 71 | *; 72 | }; 73 | -------------------------------------------------------------------------------- /lib/meson.build: -------------------------------------------------------------------------------- 1 | flags = '-Wl,--version-script=' + meson.current_source_dir() + '/libjose.map' 2 | code = 'int main() { return 0; }' 3 | cc = meson.get_compiler('c') 4 | 5 | if host_machine.system() == 'freebsd' 6 | if not cc.links(code, args: flags + ',--undefined-version' , name: '-Wl,--version-script=...') 7 | flags = [ '-export-symbols-regex=^jose_.*' ] 8 | endif 9 | else 10 | if not cc.links(code, args: flags, name: '-Wl,--version-script=...') 11 | flags = [ '-export-symbols-regex=^jose_.*' ] 12 | endif 13 | endif 14 | 15 | libjose_lib = shared_library('jose', 16 | 'misc.c', 'misc.h', 17 | 'cfg.c', 18 | 'io.c', 19 | 'b64.c', 20 | 'hsh.c', 'hsh.h', 21 | 'hooks.c', 'hooks.h', 22 | 'jwk.c', 23 | 'jws.c', 24 | 'jwe.c', 25 | 'zlib/deflate.c', 26 | 'openssl/aescbch.c', 27 | 'openssl/aesgcm.c', 28 | 'openssl/aesgcmkw.c', 29 | 'openssl/aeskw.c', 30 | 'openssl/compat.c', 'openssl/compat.h', 31 | 'openssl/dir.c', 32 | 'openssl/ec.c', 33 | 'openssl/ecdh.c', 34 | 'openssl/ecdhes.c', 35 | 'openssl/ecmr.c', 36 | 'openssl/ecdsa.c', 37 | 'openssl/hash.c', 38 | 'openssl/hmac.c', 39 | 'openssl/jwk.c', 40 | 'openssl/lock.c', 41 | 'openssl/misc.c', 'openssl/misc.h', 42 | 'openssl/oct.c', 43 | 'openssl/pbes2.c', 44 | 'openssl/rsa.c', 45 | 'openssl/rsaes.c', 46 | 'openssl/rsassa.c', 47 | 48 | include_directories: incdir, 49 | dependencies: [zlib, jansson, libcrypto, threads], 50 | version: '0.0.0', 51 | link_args: flags, 52 | install: true 53 | ) 54 | 55 | libjose_dep = declare_dependency( 56 | include_directories: incdir, 57 | dependencies: jansson, 58 | link_with: libjose_lib 59 | ) 60 | -------------------------------------------------------------------------------- /lib/misc.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | #define containerof(ptr, type, member) \ 26 | ((type *)((char *) ptr - offsetof(type, member))) 27 | 28 | bool 29 | encode_protected(json_t *obj); 30 | 31 | void 32 | zero(void *mem, size_t len); 33 | 34 | bool 35 | handle_zip_enc(json_t *jwe, const void *in, size_t len, void **data, size_t *data_len); 36 | 37 | bool 38 | zip_in_protected_header(json_t *jwe); 39 | -------------------------------------------------------------------------------- /lib/openssl/compat.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | /* Don't warn about deprecated functions. */ 21 | #ifndef OPENSSL_API_COMPAT 22 | /* 0x10101000L == 1.1.1. */ 23 | #define OPENSSL_API_COMPAT 0x10101000L 24 | #endif 25 | 26 | #include 27 | #include 28 | #include 29 | #include 30 | #include 31 | #include 32 | 33 | #if OPENSSL_VERSION_NUMBER < 0x10100000L 34 | const unsigned char * 35 | EVP_PKEY_get0_hmac(EVP_PKEY *pkey, size_t *len); 36 | 37 | void 38 | RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d); 39 | 40 | void 41 | RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q); 42 | 43 | void 44 | RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, 45 | const BIGNUM **iqmp); 46 | 47 | RSA * 48 | EVP_PKEY_get0_RSA(EVP_PKEY *pkey); 49 | 50 | EC_KEY * 51 | EVP_PKEY_get0_EC_KEY(EVP_PKEY *pkey); 52 | 53 | int 54 | RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d); 55 | 56 | int 57 | RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q); 58 | 59 | int 60 | RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp); 61 | 62 | EVP_MD_CTX * 63 | EVP_MD_CTX_new(void); 64 | 65 | void 66 | EVP_MD_CTX_free(EVP_MD_CTX *ctx); 67 | 68 | void 69 | ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps); 70 | 71 | int 72 | ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s); 73 | 74 | HMAC_CTX * 75 | HMAC_CTX_new(void); 76 | 77 | const EVP_MD * 78 | HMAC_CTX_get_md(const HMAC_CTX *ctx); 79 | 80 | void 81 | HMAC_CTX_free(HMAC_CTX *ctx); 82 | #endif 83 | -------------------------------------------------------------------------------- /lib/openssl/ec.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "misc.h" 19 | #include "../hooks.h" 20 | #include 21 | 22 | #include 23 | 24 | declare_cleanup(EC_KEY) 25 | 26 | static bool 27 | jwk_make_handles(jose_cfg_t *cfg, const json_t *jwk) 28 | { 29 | const char *kty = NULL; 30 | 31 | if (json_unpack((json_t *) jwk, "{s:s}", "kty", &kty) == -1) 32 | return false; 33 | 34 | return strcmp(kty, "EC") == 0; 35 | } 36 | 37 | static bool 38 | jwk_make_execute(jose_cfg_t *cfg, json_t *jwk) 39 | { 40 | openssl_auto(EC_KEY) *key = NULL; 41 | const char *crv = "P-256"; 42 | json_auto_t *out = NULL; 43 | int nid = NID_undef; 44 | 45 | if (!jwk_make_handles(cfg, jwk)) 46 | return false; 47 | 48 | if (json_unpack(jwk, "{s?s}", "crv", &crv) < 0) 49 | return false; 50 | 51 | switch (str2enum(crv, "P-256", "P-384", "P-521", "secp256k1", NULL)) { 52 | case 0: nid = NID_X9_62_prime256v1; break; 53 | case 1: nid = NID_secp384r1; break; 54 | case 2: nid = NID_secp521r1; break; 55 | case 3: nid = NID_secp256k1; break; 56 | default: return false; 57 | } 58 | 59 | key = EC_KEY_new_by_curve_name(nid); 60 | if (!key) 61 | return false; 62 | 63 | if (EC_KEY_generate_key(key) <= 0) 64 | return false; 65 | 66 | out = jose_openssl_jwk_from_EC_KEY(cfg, key); 67 | if (!out) 68 | return false; 69 | 70 | return copy_val(out, jwk, "crv", "x", "y", "d", NULL); 71 | } 72 | 73 | static void __attribute__((constructor)) 74 | constructor(void) 75 | { 76 | static jose_hook_jwk_t jwk = { 77 | .kind = JOSE_HOOK_JWK_KIND_MAKE, 78 | .make.handles = jwk_make_handles, 79 | .make.execute = jwk_make_execute 80 | }; 81 | 82 | jose_hook_jwk_push(&jwk); 83 | } 84 | -------------------------------------------------------------------------------- /lib/openssl/lock.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include 19 | 20 | #if OPENSSL_VERSION_NUMBER < 0x10100000L 21 | 22 | #include 23 | 24 | static pthread_mutex_t *locks; 25 | 26 | static void 27 | locking_cb(int mode, int type, const char *file, int line) 28 | { 29 | if (mode & CRYPTO_LOCK) 30 | pthread_mutex_lock(&(locks[type])); 31 | else 32 | pthread_mutex_unlock(&(locks[type])); 33 | } 34 | 35 | static void 36 | thread_id_cb(CRYPTO_THREADID *tid) 37 | { 38 | CRYPTO_THREADID_set_numeric(tid, (unsigned long)pthread_self()); 39 | } 40 | 41 | static void __attribute__((constructor)) 42 | locking_setup(void) 43 | { 44 | int i; 45 | 46 | /* Check if somebody else has set a locking callback already. */ 47 | if (CRYPTO_get_locking_callback()) 48 | return; 49 | 50 | locks = OPENSSL_malloc(CRYPTO_num_locks() * sizeof(pthread_mutex_t)); 51 | if (!locks) 52 | return; 53 | 54 | for (i = 0; i < CRYPTO_num_locks(); i++) { 55 | if (pthread_mutex_init(&(locks[i]), NULL) != 0) { 56 | for (int n = 0; n < i; n++) 57 | pthread_mutex_destroy(&(locks[n])); 58 | OPENSSL_free(locks); 59 | locks = NULL; 60 | return; 61 | } 62 | } 63 | 64 | CRYPTO_set_locking_callback(locking_cb); 65 | CRYPTO_THREADID_set_callback(thread_id_cb); 66 | } 67 | 68 | #endif /* OpenSSL < 1.1.0 */ 69 | -------------------------------------------------------------------------------- /lib/openssl/misc.h: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #pragma once 19 | 20 | #include "compat.h" 21 | 22 | #include 23 | #include 24 | #include 25 | 26 | #define KEYMAX 1024 27 | 28 | #define containerof(ptr, type, member) \ 29 | ((type *)((char *) ptr - offsetof(type, member))) 30 | 31 | #define declare_cleanup_full(type, prfx) \ 32 | static inline void \ 33 | type ## _auto(type **p) { \ 34 | if (!p) return; \ 35 | prfx ## _free(*p); \ 36 | *p = NULL; \ 37 | } 38 | 39 | #define declare_cleanup(type) declare_cleanup_full(type, type) 40 | 41 | #define openssl_auto(type) type __attribute__((cleanup(type ## _auto))) 42 | 43 | declare_cleanup_full(BIGNUM, BN_clear) 44 | 45 | size_t 46 | str2enum(const char *str, ...); 47 | 48 | BIGNUM * 49 | bn_decode(const uint8_t buf[], size_t len); 50 | 51 | BIGNUM * 52 | bn_decode_json(const json_t *json); 53 | 54 | bool 55 | bn_encode(const BIGNUM *bn, uint8_t buf[], size_t len); 56 | 57 | json_t * 58 | bn_encode_json(const BIGNUM *bn, size_t len); 59 | 60 | bool 61 | add_entity(json_t *root, json_t *obj, const char *plural, ...); 62 | 63 | bool 64 | copy_val(const json_t *from, json_t *into, ...); 65 | -------------------------------------------------------------------------------- /lib/openssl/oct.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2016 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "misc.h" 19 | #include 20 | #include "../hooks.h" 21 | 22 | #include 23 | #include 24 | 25 | static bool 26 | jwk_make_handles(jose_cfg_t *cfg, const json_t *jwk) 27 | { 28 | const char *kty = NULL; 29 | 30 | if (json_unpack((json_t *) jwk, "{s:s}", "kty", &kty) < 0) 31 | return false; 32 | 33 | return strcmp(kty, "oct") == 0; 34 | } 35 | 36 | static bool 37 | jwk_make_execute(jose_cfg_t *cfg, json_t *jwk) 38 | { 39 | uint8_t key[KEYMAX] = {}; 40 | json_int_t len = 0; 41 | 42 | if (!jwk_make_handles(cfg, jwk)) 43 | return false; 44 | 45 | if (json_unpack(jwk, "{s:I}", "bytes", &len) < 0) 46 | return false; 47 | 48 | if (len <= 0 || len > KEYMAX) 49 | return false; 50 | 51 | if (RAND_bytes(key, len) <= 0) 52 | return false; 53 | 54 | if (json_object_del(jwk, "bytes") < 0) 55 | return false; 56 | 57 | if (json_object_set_new(jwk, "k", jose_b64_enc(key, len)) < 0) 58 | return false; 59 | 60 | OPENSSL_cleanse(key, len); 61 | return true; 62 | } 63 | 64 | static void __attribute__((constructor)) 65 | constructor(void) 66 | { 67 | static jose_hook_jwk_t jwk = { 68 | .kind = JOSE_HOOK_JWK_KIND_MAKE, 69 | .make.handles = jwk_make_handles, 70 | .make.execute = jwk_make_execute 71 | }; 72 | 73 | jose_hook_jwk_push(&jwk); 74 | } 75 | -------------------------------------------------------------------------------- /meson.build: -------------------------------------------------------------------------------- 1 | project('jose', 'c', license: 'APL2', 2 | version: '14', 3 | default_options: [ 4 | 'c_std=gnu99', 5 | 'prefix=/usr', 6 | 'warning_level=2', 7 | 'werror=true' 8 | ], 9 | meson_version: '>=0.47.0', 10 | ) 11 | 12 | licensedir = join_paths(get_option('prefix'), 'share', 'licenses', meson.project_name()) 13 | if host_machine.system() == 'freebsd' 14 | licensedir += '-'+meson.project_version() 15 | endif 16 | 17 | add_project_arguments( 18 | '-Wstrict-aliasing', 19 | '-Wchar-subscripts', 20 | '-Wformat-security', 21 | '-Wmissing-declarations', 22 | '-Wmissing-prototypes', 23 | '-Wnested-externs', 24 | '-Wpointer-arith', 25 | '-Wshadow', 26 | '-Wsign-compare', 27 | '-Wstrict-prototypes', 28 | '-Wtype-limits', 29 | '-Wunused-function', 30 | '-Wno-missing-field-initializers', 31 | '-Wno-unused-command-line-argument', 32 | '-Wno-unused-parameter', 33 | '-Wno-unknown-pragmas', 34 | language: 'c' 35 | ) 36 | 37 | zlib = dependency('zlib') 38 | threads = dependency('threads') 39 | jansson = dependency('jansson', version: '>=2.10') 40 | libcrypto = dependency('libcrypto', version: '>=1.0.2') 41 | a2x = find_program('a2x', required: get_option('docs')) 42 | jq = find_program('jq', required: false) 43 | 44 | mans = [] 45 | 46 | licenses = ['COPYING'] 47 | 48 | subdir('include') 49 | subdir('doc') 50 | subdir('lib') 51 | subdir('cmd') 52 | subdir('tests') 53 | 54 | install_data(licenses, install_dir: licensedir) 55 | 56 | pkg = import('pkgconfig') 57 | pkg.generate( 58 | description: 'Library for managing JOSE objects', 59 | version: meson.project_version(), 60 | filebase: meson.project_name(), 61 | name: 'José Library', 62 | libraries_private: [ zlib, libcrypto ], 63 | libraries: libjose_lib, 64 | requires: jansson, 65 | ) 66 | 67 | if a2x.found() 68 | foreach m : mans 69 | custom_target(m.split('/')[-1], input: m + '.adoc', output: m.split('/')[-1], 70 | command: [a2x, '-f', 'manpage', '-D', meson.current_build_dir(), '@INPUT@'], 71 | install_dir: join_paths(get_option('mandir'), 'man' + m.split('.')[-1]), 72 | install: true 73 | ) 74 | endforeach 75 | elif get_option('docs').auto() 76 | warning('Will not build man pages due to missing dependencies!') 77 | endif 78 | 79 | if not jq.found() 80 | message('jq not found (unrequired but recommended)') 81 | endif 82 | -------------------------------------------------------------------------------- /meson_options.txt: -------------------------------------------------------------------------------- 1 | option('docs', type: 'feature', description: 'Whether to build asciidoc manpages') 2 | -------------------------------------------------------------------------------- /slides.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/latchset/jose/3d2f6db5cdc8659f06f284cc69ab42d5a692c2da/slides.pdf -------------------------------------------------------------------------------- /tests/alg_encr.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "../lib/hooks.h" 19 | #include 20 | #include 21 | #include 22 | 23 | const char *const pts[] = { 24 | "", 25 | "abc", 26 | "aosidmfoasidhtaoirnigaoiurebxlicjnvalsiouerhnoaiusdnvaisudfrhpqowuiefnali", 27 | NULL 28 | }; 29 | 30 | static void 31 | test(const jose_hook_alg_t *a, const char *pt, json_t *cek, bool iter) 32 | { 33 | json_auto_t *jwe = json_object(); 34 | jose_io_auto_t *eb = NULL; 35 | jose_io_auto_t *db = NULL; 36 | jose_io_auto_t *e = NULL; 37 | jose_io_auto_t *d = NULL; 38 | void *ebuf = NULL; 39 | void *dbuf = NULL; 40 | size_t elen = 0; 41 | size_t dlen = 0; 42 | 43 | eb = jose_io_malloc(NULL, &ebuf, &elen); 44 | assert(eb); 45 | e = a->encr.enc(a, NULL, jwe, cek, eb); 46 | assert(e); 47 | 48 | if (iter) { 49 | for (size_t i = 0; pt[i]; i++) 50 | assert(e->feed(e, &pt[i], 1)); 51 | } else { 52 | assert(e->feed(e, pt, strlen(pt))); 53 | } 54 | 55 | assert(e->done(e)); 56 | 57 | 58 | assert(json_object_get(jwe, "tag")); 59 | 60 | 61 | db = jose_io_malloc(NULL, &dbuf, &dlen); 62 | assert(db); 63 | d = a->encr.dec(a, NULL, jwe, cek, db); 64 | assert(d); 65 | 66 | if (iter) { 67 | if (elen) { 68 | uint8_t *xxx = ebuf; 69 | for (size_t i = 0; i < elen; i++) { 70 | assert(d->feed(d, &xxx[i], 1)); 71 | } 72 | } 73 | } else { 74 | assert(d->feed(d, ebuf, elen)); 75 | } 76 | 77 | assert(d->done(d)); 78 | assert(dlen == strlen(pt)); 79 | assert(memcmp(pt, dbuf, dlen) == 0); 80 | } 81 | 82 | int 83 | main(int argc, char *argv[]) 84 | { 85 | for (const jose_hook_alg_t *a = jose_hook_alg_list(); a; a = a->next) { 86 | json_auto_t *cek = NULL; 87 | 88 | if (a->kind != JOSE_HOOK_ALG_KIND_ENCR) 89 | continue; 90 | 91 | fprintf(stderr, "alg: %s\n", a->name); 92 | 93 | assert((cek = json_pack("{s:s}", "alg", a->name))); 94 | assert(jose_jwk_gen(NULL, cek)); 95 | 96 | for (size_t i = 0; pts[i]; i++) { 97 | test(a, pts[i], cek, false); 98 | test(a, pts[i], cek, true); 99 | } 100 | } 101 | 102 | return EXIT_SUCCESS; 103 | } 104 | -------------------------------------------------------------------------------- /tests/alg_sign.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "../lib/hooks.h" 19 | #include 20 | #include 21 | #include 22 | 23 | const char *payloads[] = { 24 | "", 25 | "abc", 26 | "aosidmfoasidhtaoirnigaoiurebxlicjnvalsiouerhnoaiusdnvaisudfrhpqowuiefnali", 27 | NULL 28 | }; 29 | 30 | static void 31 | test(const jose_hook_alg_t *a, const char *pay, json_t *jwk, bool iter) 32 | { 33 | json_auto_t *jwe = json_object(); 34 | json_auto_t *rcp = json_object(); 35 | jose_io_auto_t *sio = NULL; 36 | jose_io_auto_t *vio = NULL; 37 | 38 | sio = a->sign.sig(a, NULL, jwe, rcp, jwk); 39 | assert(sio); 40 | if (iter) { 41 | assert(sio->feed(sio, pay, strlen(pay))); 42 | } else { 43 | for (size_t i = 0; pay[i]; i++) 44 | assert(sio->feed(sio, &pay[i], 1)); 45 | } 46 | assert(sio->done(sio)); 47 | 48 | assert(json_object_get(jwe, "signature")); 49 | 50 | vio = a->sign.ver(a, NULL, jwe, jwe, jwk); 51 | assert(vio); 52 | if (iter) { 53 | assert(vio->feed(vio, pay, strlen(pay))); 54 | } else { 55 | for (size_t i = 0; pay[i]; i++) 56 | assert(vio->feed(vio, &pay[i], 1)); 57 | } 58 | assert(vio->done(vio)); 59 | } 60 | 61 | int 62 | main(int argc, char *argv[]) 63 | { 64 | for (const jose_hook_alg_t *a = jose_hook_alg_list(); a; a = a->next) { 65 | json_auto_t *jwk = NULL; 66 | 67 | if (a->kind != JOSE_HOOK_ALG_KIND_SIGN) 68 | continue; 69 | 70 | fprintf(stderr, "alg: %s\n", a->name); 71 | 72 | assert((jwk = json_pack("{s:s}", "alg", a->name))); 73 | assert(jose_jwk_gen(NULL, jwk)); 74 | 75 | for (size_t i = 0; payloads[i]; i++) { 76 | test(a, payloads[i], jwk, false); 77 | test(a, payloads[i], jwk, true); 78 | } 79 | } 80 | 81 | return EXIT_SUCCESS; 82 | } 83 | -------------------------------------------------------------------------------- /tests/alg_wrap.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2017 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include "../lib/hooks.h" 19 | #include 20 | #include 21 | #include 22 | 23 | int 24 | main(int argc, char *argv[]) 25 | { 26 | for (const jose_hook_alg_t *a = jose_hook_alg_list(); a; a = a->next) { 27 | json_auto_t *jwk = json_pack("{s:s}", "alg", a->name); 28 | 29 | if (a->kind != JOSE_HOOK_ALG_KIND_WRAP) 30 | continue; 31 | 32 | fprintf(stderr, "alg: %s\n", a->name); 33 | 34 | if (strcmp(a->name, "dir") != 0) 35 | assert(jose_jwk_gen(NULL, jwk)); 36 | 37 | for (const jose_hook_alg_t *b = jose_hook_alg_list(); b; b = b->next) { 38 | json_auto_t *cek = json_pack("{s:s}", "alg", b->name); 39 | json_auto_t *tst = json_pack("{s:s}", "alg", b->name); 40 | json_auto_t *rcp = json_object(); 41 | json_auto_t *jwe = json_object(); 42 | 43 | if (b->kind != JOSE_HOOK_ALG_KIND_ENCR) 44 | continue; 45 | 46 | fprintf(stderr, "\tenc: %s\n", b->name); 47 | 48 | if (strcmp(a->name, "dir") == 0) { 49 | json_decref(jwk); 50 | assert((jwk = json_deep_copy(cek))); 51 | assert(jose_jwk_gen(NULL, jwk)); 52 | } 53 | 54 | assert(jose_jwk_gen(NULL, tst)); 55 | assert(json_object_del(tst, "k") == 0); 56 | 57 | assert(a->wrap.wrp(a, NULL, jwe, rcp, jwk, cek)); 58 | assert(a->wrap.unw(a, NULL, jwe, rcp, jwk, tst)); 59 | assert(json_equal(cek, tst)); 60 | } 61 | } 62 | 63 | return EXIT_SUCCESS; 64 | } 65 | -------------------------------------------------------------------------------- /tests/cve-2023-50967/cve-2023-50967.jwe: -------------------------------------------------------------------------------- 1 | {"ciphertext":"aaPb-JYGACs-loPwJkZewg","encrypted_key":"P1h8q8wLVxqYsZUuw6iEQTzgXVZHCsu8Eik-oqbE4AJGIDto3gb3SA","header":{"alg":"PBES2-HS256+A128KW","p2c":1000000000,"p2s":"qUQQWWkyyIqculSiC93mlg"},"iv":"Clg3JX9oNl_ck3sLSGrlgg","protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","tag":"i7vga9tJkwRswFd7HlyD_A"} 2 | -------------------------------------------------------------------------------- /tests/cve-2023-50967/cve-2023-50967.jwk: -------------------------------------------------------------------------------- 1 | {"alg":"PBES2-HS256+A128KW","k":"VHBLJ4-PmnqELoKbQoXuRA","key_ops":["wrapKey","unwrapKey"],"kty":"oct"} 2 | -------------------------------------------------------------------------------- /tests/issue-75/issue-75.c: -------------------------------------------------------------------------------- 1 | /* vim: set tabstop=8 shiftwidth=4 softtabstop=4 expandtab smarttab colorcolumn=80: */ 2 | /* 3 | * Copyright 2020 Red Hat, Inc. 4 | * 5 | * Licensed under the Apache License, Version 2.0 (the "License"); 6 | * you may not use this file except in compliance with the License. 7 | * You may obtain a copy of the License at 8 | * 9 | * http://www.apache.org/licenses/LICENSE-2.0 10 | * 11 | * Unless required by applicable law or agreed to in writing, software 12 | * distributed under the License is distributed on an "AS IS" BASIS, 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 | * See the License for the specific language governing permissions and 15 | * limitations under the License. 16 | */ 17 | 18 | #include 19 | #include 20 | #include 21 | #include 22 | 23 | #include 24 | #include 25 | 26 | /* 27 | * In this test we load a (RSA, 512-bit) PEM file asa n EVP_PKEY*, then 28 | * convert it to JWK with jose_openssl_jwk_from_EVP_PKEY(). 29 | * 30 | * Afterwards, we convert this JWK to EVP_PKEY* again, with 31 | * jose_openssl_jwk_to_EVP_PKEY(), and once more convert the 32 | * resulting EVP_PKEY* back to JWK with jose_openssl_jwk_from_EVP_PKEY(). 33 | * 34 | * We then compare the two JWKs, and they should be equal. 35 | */ 36 | 37 | int 38 | main(int argc, char *argv[]) 39 | { 40 | #if OPENSSL_VERSION_NUMBER < 0x10100000L 41 | SSL_library_init(); 42 | #else 43 | OPENSSL_init_ssl(0, NULL); 44 | #endif 45 | 46 | BIO* pfile = BIO_new_file("rsa512.pem", "r"); 47 | assert(pfile); 48 | 49 | EVP_PKEY* pkey = PEM_read_bio_PrivateKey(pfile, NULL, 0, NULL); 50 | assert(pkey); 51 | BIO_free(pfile); 52 | 53 | json_auto_t* jwk = jose_openssl_jwk_from_EVP_PKEY(NULL, pkey); 54 | assert(jwk); 55 | 56 | EVP_PKEY* from_jwk = jose_openssl_jwk_to_EVP_PKEY(NULL, jwk); 57 | assert(from_jwk); 58 | 59 | json_auto_t* converted_jwk = jose_openssl_jwk_from_EVP_PKEY(NULL, from_jwk); 60 | assert(converted_jwk); 61 | 62 | EVP_PKEY_free(pkey); 63 | EVP_PKEY_free(from_jwk); 64 | 65 | assert(json_equal(jwk, converted_jwk)); 66 | return EXIT_SUCCESS; 67 | } 68 | -------------------------------------------------------------------------------- /tests/issue-75/meson.build: -------------------------------------------------------------------------------- 1 | e = environment() 2 | 3 | openssl = dependency('openssl', version: '>= 1.1.0', required: false) 4 | if openssl.found() 5 | issue75 = executable('issue75', 'issue-75.c', 6 | dependencies: [libjose_dep, openssl]) 7 | test('issue75', issue75, workdir : meson.current_source_dir(), env: e, timeout: 30) 8 | endif 9 | -------------------------------------------------------------------------------- /tests/issue-75/rsa512.pem: -------------------------------------------------------------------------------- 1 | -----BEGIN RSA PRIVATE KEY----- 2 | MIIBOgIBAAJBAMm/50Zj7HgDGBzTy6tmgeBq4jVVpbWA86ZBFgQpwOmXsRToQpCA 3 | K56DNzDBMOt4SIA7pF2uf9VBF3EQ7rg8H88CAwEAAQJAYK/HdsSMnzdcZvRZt1r5 4 | A0Q2BLl3IPUbz6GBm50nBssB2lYZqxpOL0i5MO5wt7DgPzrbwjugjUvhkSwdy+Wo 5 | gQIhAO1KoRRDaUufWNkzLjx+1XbZFnZRw+xN4Nz2P0JrVRO9AiEA2afqKfzaaxGg 6 | tnZGINhYBx8Iym9cZ2BpXdh5ZGCydHsCIBIcYhLz2jOFY/if6WWAoLZDd21sbDG6 7 | 9/ClcsqU+pdZAiEA1zLDPkJnPidOrDjie4UL+/Z+PZC/XuKfKw9mbo2Aw9MCIB2E 8 | LzXkdu8W3g3ORa4jkV3na49Jiyg0VGeaAoauebo5 9 | -----END RSA PRIVATE KEY----- 10 | -------------------------------------------------------------------------------- /tests/jose-alg: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | jose alg | grep -q "^A128GCM$" 4 | 5 | jose alg -k sign | grep -q "^ES256$" 6 | jose alg -k wrap | grep -q "^A128GCMKW$" 7 | jose alg -k encr | grep -q "^A128GCM$" 8 | jose alg -k exch | grep -q "^ECDH$" 9 | 10 | ! jose alg -k sign | grep -q "^A128GCMKW$" 11 | ! jose alg -k wrap | grep -q "^A128GCM$" 12 | ! jose alg -k encr | grep -q "^ES256$" 13 | ! jose alg -k exch | grep -q "^HS256$" 14 | 15 | jose alg -k encr -k sign | grep -q "^A128GCM$" 16 | jose alg -k encr -k sign | grep -q "^ES256$" 17 | jose alg -k sign -k wrap | grep -q "^ES256$" 18 | jose alg -k sign -k wrap | grep -q "^A128GCMKW$" 19 | jose alg -k wrap -k exch | grep -q "^A128GCMKW$" 20 | jose alg -k wrap -k exch | grep -q "^ECDH$" 21 | jose alg -k exch -k encr | grep -q "^ECDH$" 22 | jose alg -k exch -k encr | grep -q "^A128GCM$" 23 | -------------------------------------------------------------------------------- /tests/jose-b64-dec: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | test "`printf "" | jose b64 dec -i-`" = "" 4 | test `printf "Zg" | jose b64 dec -i-` = "f" 5 | test `printf "Zm8" | jose b64 dec -i-` = "fo" 6 | test `printf "Zm9v" | jose b64 dec -i-` = "foo" 7 | test `printf "Zm9vYg" | jose b64 dec -i-` = "foob" 8 | test `printf "Zm9vYmE" | jose b64 dec -i-` = "fooba" 9 | test `printf "Zm9vYmFy" | jose b64 dec -i-` = "foobar" 10 | -------------------------------------------------------------------------------- /tests/jose-b64-enc: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | test "`printf "" | jose b64 enc -I-`" = "" 4 | test `printf "f" | jose b64 enc -I-` = "Zg" 5 | test `printf "fo" | jose b64 enc -I-` = "Zm8" 6 | test `printf "foo" | jose b64 enc -I-` = "Zm9v" 7 | test `printf "foob" | jose b64 enc -I-` = "Zm9vYg" 8 | test `printf "fooba" | jose b64 enc -I-` = "Zm9vYmE" 9 | test `printf "foobar" | jose b64 enc -I-` = "Zm9vYmFy" 10 | -------------------------------------------------------------------------------- /tests/jose-jwe-enc: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | WRAP=`jose alg -k wrap` 4 | ENCR=`jose alg -k encr` 5 | 6 | tmpdir=`mktemp -d 2>/dev/null || mktemp -d -t jose` 7 | 8 | onexit() { 9 | rm -rf $tmpdir 10 | } 11 | 12 | trap onexit EXIT 13 | 14 | jwk=$tmpdir/jwk 15 | jwe=$tmpdir/jwe 16 | 17 | jqopt() { 18 | if ! command -v jq >/dev/null 2>&1; then 19 | echo "$3" 20 | else 21 | jq -r "if $2 | type | . = \"string\" then $2 else error(\"\") end" < $1 22 | fi 23 | } 24 | 25 | jqbopt() { 26 | if ! command -v jq >/dev/null 2>&1; then 27 | echo "$4" 28 | else 29 | jq -r "if $2 | type | . = \"string\" then $2 else error(\"\") end" < $1 \ 30 | | jose b64 dec -i- \ 31 | | jq -r "if $3 | type | . = \"string\" then $3 else error(\"\") end" 32 | fi 33 | } 34 | 35 | for msg in "hi" "this is a longer message that is more than one block"; do 36 | for w in $WRAP; do 37 | [ $w = "dir" ] && continue 38 | 39 | jose jwk gen -i "{\"alg\":\"$w\"}" -o $jwk 40 | 41 | printf '%s' "$msg" | jose jwe enc -I- -k $jwk -o $jwe 42 | [ "`jqopt $jwe .header.alg $w`" = "$w" ] 43 | [ "`jose jwe dec -i $jwe -k $jwk -O-`" = "$msg" ] 44 | 45 | for e in $ENCR; do 46 | printf '%s' "$msg" | jose jwe enc \ 47 | -i "{\"protected\":{\"enc\":\"$e\"}}" -I- \ 48 | -k $jwk -o $jwe 49 | [ "`jqopt $jwe .header.alg $w`" = "$w" ] 50 | [ "`jqbopt $jwe .protected .enc $e`" = "$e" ] 51 | [ "`jose jwe dec -i $jwe -k $jwk -O-`" = "$msg" ] 52 | done 53 | done 54 | 55 | for e in $ENCR; do 56 | jose jwk gen -i "{\"alg\":\"$e\"}" -o $jwk 57 | 58 | printf '%s' "$msg" | jose jwe enc \ 59 | -i "{\"protected\":{\"alg\":\"dir\"}}" -I- \ 60 | -k $jwk -o $jwe 61 | [ "`jqbopt $jwe .protected .alg dir`" = "dir" ] 62 | [ "`jqbopt $jwe .protected .enc $e`" = "$e" ] 63 | [ "`jose jwe dec -i $jwe -k $jwk -O-`" = "$msg" ] 64 | 65 | printf '%s' "$msg" | jose jwe enc -I- -k $jwk -o $jwe 66 | [ "`jqopt $jwe .header.alg dir`" = "dir" ] 67 | [ "`jqbopt $jwe .protected .enc $e`" = "$e" ] 68 | [ "`jose jwe dec -i $jwe -k $jwk -O-`" = "$msg" ] 69 | done 70 | 71 | for tmpl in '{"kty":"oct","bytes":32}' '{"kty":"RSA","bits":2048}' '{"kty":"EC","crv":"P-256"}'; do 72 | jose jwk gen -i "$tmpl" -o $jwk 73 | 74 | printf '%s' "$msg" | jose jwe enc -I- -k $jwk -o $jwe 75 | [ "`jose jwe dec -i $jwe -k $jwk -O-`" = "$msg" ] 76 | done 77 | 78 | # "zip": "DEF" 79 | tmpl='{"kty":"oct","bytes":32}' 80 | for enc in A128CBC-HS256 A192CBC-HS384 A256CBC-HS512 A128GCM A192GCM A256GCM; do 81 | jose jwk gen -i "${tmpl}" -o "${jwk}" 82 | zip="$(printf '{"alg":"A128KW","enc":"%s","zip":"DEF"}' "${enc}")" 83 | printf '%s' "${msg}" | jose jwe enc -i "${zip}" -I- -k "${jwk}" -o "${jwe}" 84 | [ "$(jose jwe dec -i "${jwe}" -k "${jwk}" -O-)" = "${msg}" ] 85 | done 86 | done 87 | -------------------------------------------------------------------------------- /tests/jose-jwe-fmt: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | for f in $VECTORS/*.jwec; do 4 | cmpct=`cat $f` 5 | flat=`echo $f | sed 's|jwec|jwef|'` 6 | gen=`echo $f | sed 's|jwec|jweg|'` 7 | 8 | if [ -f $flat ]; then 9 | [ `jose jwe fmt -i $flat -c` = $cmpct ] 10 | [ `jose jwe fmt -i $flat | jose jwe fmt -i- -c` = $cmpct ] 11 | fi 12 | 13 | if [ -f $gen ]; then 14 | [ `jose jwe fmt -i $gen -c` = $cmpct ] 15 | [ `jose jwe fmt -i $gen | jose jwe fmt -i- -c` = $cmpct ] 16 | fi 17 | 18 | [ `jose jwe fmt -i $f -c` = $cmpct ] 19 | [ `jose jwe fmt -i $f | jose jwe fmt -i- -c` = $cmpct ] 20 | done 21 | -------------------------------------------------------------------------------- /tests/jose-jwk-eql: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | echo $PATH 4 | 5 | jwk=`jose jwk gen -i '{"alg":"ECDH-ES"}'` 6 | oth=`jose jwk gen -i '{"alg":"ECDH-ES"}'` 7 | pub=`echo "$jwk" | jose jwk pub -i-` 8 | mod=`echo "$jwk" | jose fmt -j- -Od alg -o-` 9 | 10 | ! jose jwk eql 11 | ! echo "$jwk" | jose jwk eql -i- 12 | echo "$jwk$pub" | jose jwk eql -i- -i- 13 | echo "$jwk$mod" | jose jwk eql -i- -i- 14 | ! echo "$jwk$oth" | jose jwk eql -i- -i- 15 | 16 | echo "$jwk$pub$mod" | jose jwk eql -i- -i- -i- 17 | ! echo "$jwk$pub$oth" | jose jwk eql -i- -i- -i- 18 | 19 | jwk=`jose jwk gen -i '{"alg":"A128KW"}'` 20 | oth=`jose jwk gen -i '{"alg":"A128KW"}'` 21 | pub=`echo "$jwk" | jose jwk pub -i-` 22 | mod=`echo "$jwk" | jose fmt -j- -Od alg -o-` 23 | 24 | ! jose jwk eql 25 | ! echo "$jwk" | jose jwk eql -i- 26 | ! echo "$jwk$pub" | jose jwk eql -i- -i- 27 | echo "$jwk$mod" | jose jwk eql -i- -i- 28 | ! echo "$jwk$oth" | jose jwk eql -i- -i- 29 | 30 | ! echo "$jwk$pub$mod" | jose jwk eql -i- -i- -i- 31 | ! echo "$jwk$pub$oth" | jose jwk eql -i- -i- -i- 32 | -------------------------------------------------------------------------------- /tests/jose-jwk-exc: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | tmpdir=`mktemp -d 2>/dev/null || mktemp -d -t jose` 4 | 5 | onexit() { 6 | rm -rf $tmpdir 7 | } 8 | 9 | trap onexit EXIT 10 | 11 | for T in '{"alg":"ECDH"}' '{"alg":"ECDH","crv":"P-256"}' '{"kty":"EC","crv":"P-256"}'; do 12 | jose jwk gen -i "$T" -o $tmpdir/exc_a.jwk 13 | jose jwk gen -i "$T" -o $tmpdir/exc_b.jwk 14 | 15 | jose jwk pub -i $tmpdir/exc_a.jwk -o $tmpdir/exc_a.pub.jwk 16 | jose jwk pub -i $tmpdir/exc_b.jwk -o $tmpdir/exc_b.pub.jwk 17 | 18 | a=`jose jwk exc -l $tmpdir/exc_a.jwk -r $tmpdir/exc_b.pub.jwk` 19 | b=`jose jwk exc -l $tmpdir/exc_b.jwk -r $tmpdir/exc_a.pub.jwk` 20 | c=`jose jwk exc -l $tmpdir/exc_a.jwk -r $tmpdir/exc_b.jwk` 21 | d=`jose jwk exc -l $tmpdir/exc_b.jwk -r $tmpdir/exc_a.jwk` 22 | test "$a" = "$b" 23 | test "$c" = "$d" 24 | test "$a" = "$c" 25 | 26 | ! jose jwk exc -l $tmpdir/exc_a.pub.jwk -r $tmpdir/exc_b.jwk 27 | ! jose jwk exc -l $tmpdir/exc_b.pub.jwk -r $tmpdir/exc_a.jwk 28 | ! jose jwk exc -l $tmpdir/exc_a.pub.jwk -r $tmpdir/exc_b.pub.jwk 29 | ! jose jwk exc -l $tmpdir/exc_b.pub.jwk -r $tmpdir/exc_a.pub.jwk 30 | done 31 | 32 | jose jwk gen -i '{"alg":"ECDH","crv":"P-384"}' -o $tmpdir/exc_c.jwk 33 | ! jose jwk exc -l $tmpdir/exc_c.jwk -r $tmpdir/exc_a.pub.jwk 34 | 35 | jose jwk gen -i '{"kty":"EC","crv":"P-384"}' -o $tmpdir/exc_c.jwk 36 | ! jose jwk exc -l $tmpdir/exc_c.jwk -r $tmpdir/exc_a.pub.jwk 37 | 38 | jose jwk gen -i '{ "alg": "ES256" }' -o $tmpdir/exc_c.jwk 39 | ! jose jwk exc -l $tmpdir/exc_c.jwk -r $tmpdir/exc_a.pub.jwk 40 | 41 | srv=`jose jwk gen -i '{"alg":"ECMR"}'` 42 | clt=`jose jwk gen -i '{"alg":"ECMR"}'` 43 | eph=`jose jwk gen -i '{"alg":"ECMR"}'` 44 | 45 | spb=`echo "$srv" | jose jwk pub -i-` 46 | cpb=`echo "$clt" | jose jwk pub -i-` 47 | 48 | key=`echo "$clt$spb" | jose jwk exc -l- -r-` 49 | sub=`echo "$eph$spb" | jose jwk exc -l- -r- -i '{"alg":"ECMR"}'` 50 | req=`echo "$cpb$eph" | jose jwk exc -l- -r- -i '{"alg":"ECMR"}'` 51 | rep=`echo "$srv$req" | jose jwk exc -l- -r- -i '{"alg":"ECMR"}'` 52 | rec=`echo "$rep$sub" | jose jwk exc -l- -r-` 53 | echo "$key$rec" | jose fmt -j- -Oj- -OE 54 | -------------------------------------------------------------------------------- /tests/jose-jwk-gen: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | ALGS=`jose alg -k sign -k wrap -k encr | grep -v '^dir$'` 4 | 5 | ## 6 | ### Generate a key for every supported algorithm 7 | ## 8 | 9 | for a in $ALGS; do 10 | jose jwk gen -i "{\"alg\": \"$a\"}" 11 | done 12 | 13 | ## 14 | ### Generate a key for each parameter 15 | ## 16 | 17 | jose jwk gen -i '{ "kty": "EC", "crv": "P-256" }' 18 | jose jwk gen -i '{ "kty": "EC", "crv": "P-384" }' 19 | jose jwk gen -i '{ "kty": "EC", "crv": "P-521" }' 20 | jose jwk gen -i '{ "kty": "EC", "crv": "secp256k1" }' 21 | 22 | jose jwk gen -i '{ "kty": "RSA", "bits": 3072 }' 23 | ! jose jwk gen -i '{ "kty": "RSA", "bits": 3072, "e": 257 }' 24 | ! jose jwk gen -i '{ "kty": "RSA", "bits": 3072, "e": 65536 }' 25 | ! jose jwk gen -i '{ "kty": "RSA", "bits": 3072, "e": 65537 }' 26 | ! jose jwk gen -i '{ "kty": "RSA", "bits": 3072, "e": "AQE" }' # 257. 27 | jose jwk gen -i '{ "kty": "RSA", "bits": 3072, "e": "AQAB"}' # 65537. 28 | 29 | jose jwk gen -i '{ "kty": "oct", "bytes": 32 }' 30 | 31 | ## 32 | ### Test the key types we can't generate 33 | ## 34 | 35 | ! jose jwk gen -i '{"alg": "dir"}' 36 | 37 | ## 38 | ### Test invalid keys 39 | ## 40 | 41 | ! jose jwk gen -i '{"not_valid": "RS256"}' 42 | 43 | ## 44 | ### Test the set output option 45 | ## 46 | 47 | jose jwk gen -s -i '{ "kty": "EC", "crv": "P-256" }' \ 48 | | jose fmt -j- -Og keys -A \ 49 | -l -j 1 -EUU \ 50 | -g 0 -O \ 51 | -g kty -q EC -EUU \ 52 | -g crv -q P-256 -EUU 53 | -------------------------------------------------------------------------------- /tests/jose-jwk-pub: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | ioct='{"kty":"oct","k":"","a":"foo","key_ops":["encrypt","decrypt"]}' 4 | irsa='{"kty":"RSA","p":"","d":"","q":"","dp":"","dq":"","qi":"","oth":"","a":"bar","key_ops":["encrypt","decrypt"]}' 5 | iec='{"kty":"EC","d":"","a":"baz","key_ops":["encrypt","decrypt"]}' 6 | ijwkset="{\"keys\":[$ioct,$irsa,$iec]}" 7 | ooct='{"a":"foo","key_ops":[],"kty":"oct"}' 8 | orsa='{"a":"bar","key_ops":["encrypt"],"kty":"RSA"}' 9 | oec='{"a":"baz","key_ops":["encrypt"],"kty":"EC"}' 10 | ojwkset="{\"keys\":[$ooct,$orsa,$oec]}" 11 | test "`echo $ioct | jose jwk pub -i-`" = "$ooct" 12 | test "`echo $irsa | jose jwk pub -i-`" = "$orsa" 13 | test "`echo $iec | jose jwk pub -i-`" = "$oec" 14 | test "`echo $ijwkset | jose jwk pub -i-`" = "$ojwkset" 15 | test "`echo $iec | jose jwk pub -i- -s`" = "{\"keys\":[$oec]}" 16 | -------------------------------------------------------------------------------- /tests/jose-jwk-thp: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | a=`jose jwk thp -i $VECTORS/rfc7638_3.1.jwk -a S256` 4 | b=`cat $VECTORS/rfc7638_3.1.thp` 5 | [ $a = $b ] 6 | 7 | jwk=`jose jwk thp -i $VECTORS/rfc7520_4.8.jwkset -a S1 -f HYRNOxxOOHap0amTONoy1bHnS5M` 8 | [ "`echo ${jwk} | jose jwk thp -i- -a S1`" = "HYRNOxxOOHap0amTONoy1bHnS5M" ] 9 | jose fmt -j "$jwk" -O \ 10 | -g kty -q EC -EUU \ 11 | -g crv -q P-521 -EUU \ 12 | -g kid -q bilbo.baggins@hobbiton.example -EUU 13 | 14 | ! jose jwk thp -i $VECTORS/rfc7520_4.8.jwkset -a S1 -f VHriznG7vJAFpXMXRmGgAkA5sEE 15 | 16 | # Check default thumbprint algorithm (SHA-256). 17 | RFC_7638_3_1="${VECTORS}/rfc7638_3.1" 18 | jwk="${RFC_7638_3_1}.jwk" 19 | thp256="${RFC_7638_3_1}.thp" 20 | [ "$(jose jwk thp -i ${jwk})" = "$(jose jwk thp -i ${jwk} -a S256)" ] 21 | [ "$(jose jwk thp -i ${jwk})" = "$(cat ${thp256})" ] 22 | 23 | # Github issue #170. 24 | KEY_ISSUE170='{ 25 | "use": "sig", 26 | "kty": "OKP", 27 | "kid": "IpNACexNZWO9hVeADtTT0Nvturu6OtMV3B4u1OVr1fU", 28 | "crv": "Ed25519", 29 | "alg": "EdDSA", 30 | "x": "etkJX1EBhliHzBaimUQb0h2JhJKQ3G0beRVR3ssiedY" 31 | }' 32 | # We expect a failure when calculating the thumbprint of KEY_ISSUE170. 33 | ! echo "${KEY_ISSUE170}" | jose jwk thp -i - 34 | -------------------------------------------------------------------------------- /tests/jose-jwk-use: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | echo '{}' | jose jwk use -i- -u encrypt 4 | ! echo '{}' | jose jwk use -i- -r -u encrypt 5 | 6 | ! echo '{"use": true}' | jose jwk use -i- -u encrypt 7 | ! echo '{"key_ops": []}' | jose jwk use -i- -u encrypt 8 | ! echo '{"key_ops": [true]}' | jose jwk use -i- -u encrypt 9 | 10 | echo '{"use": "enc"}' | jose jwk use -i- -u encrypt 11 | ! echo '{"use": "sig"}' | jose jwk use -i- -u encrypt 12 | 13 | tmp='{"key_ops": ["encrypt", "decrypt"]}' 14 | echo "$tmp" | jose jwk use -i- -u encrypt 15 | echo "$tmp" | jose jwk use -i- -u encrypt -u decrypt 16 | echo "$tmp" | jose jwk use -i- -a -u encrypt -u decrypt 17 | echo "$tmp" | jose jwk use -i- -u encrypt -u sign 18 | ! echo "$tmp" | jose jwk use -i- -u sign 19 | ! echo "$tmp" | jose jwk use -i- -a -u encrypt -u sign 20 | 21 | tmp='{"use": "sig", "key_ops": ["encrypt", "decrypt"]}' 22 | echo "$tmp" | jose jwk use -i- -u encrypt -u sign 23 | echo "$tmp" | jose jwk use -i- -a -u encrypt -u sign 24 | 25 | ! echo '{"use": "enc"}' | jose jwk use -i- -u deriveKey 26 | ! echo '{"use": "enc"}' | jose jwk use -i- -u deriveBits 27 | ! echo '{"use": "sig"}' | jose jwk use -i- -u deriveKey 28 | ! echo '{"use": "sig"}' | jose jwk use -i- -u deriveBits 29 | 30 | jwkset=`jose jwk gen -i '{"keys":[{"alg":"A128KW"},{"alg":"ES256"}]}'` 31 | 32 | [ "`echo "$jwkset" | jose jwk use -i- -u wrapKey -s -o-`" \ 33 | = "`jose fmt -j "$jwkset" -g keys -d 1 -Uo-`" ] 34 | [ "`echo "$jwkset" | jose jwk use -i- -u verify -s -o-`" \ 35 | = "`jose fmt -j "$jwkset" -g keys -d 0 -Uo-`" ] 36 | [ "`echo "$jwkset" | jose jwk use -i- -u wrapKey -o-`" \ 37 | = "`jose fmt -j "$jwkset" -g keys -g 0 -o-`" ] 38 | [ "`echo "$jwkset" | jose jwk use -i- -u verify -o-`" \ 39 | = "`jose fmt -j "$jwkset" -g keys -g 1 -o-`" ] 40 | echo "$jwkset" | jose jwk use -i- -u verify -o- 41 | -------------------------------------------------------------------------------- /tests/jose-jws-fmt: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | for f in $VECTORS/*.jwsc; do 4 | cmpct=`cat $f` 5 | flat=`echo $f | sed 's|jwsc|jwsf|'` 6 | gen=`echo $f | sed 's|jwsc|jwsg|'` 7 | 8 | if [ -f $flat ]; then 9 | [ `jose jws fmt -i $flat -c` = $cmpct ] 10 | [ `jose jws fmt -i $flat | jose jws fmt -i- -c` = $cmpct ] 11 | fi 12 | 13 | if [ -f $gen ]; then 14 | [ `jose jws fmt -i $gen -c` = $cmpct ] 15 | [ `jose jws fmt -i $gen | jose jws fmt -i- -c` = $cmpct ] 16 | fi 17 | 18 | [ `jose jws fmt -i $f -c` = $cmpct ] 19 | [ `jose jws fmt -i $f | jose jws fmt -i- -c` = $cmpct ] 20 | done 21 | -------------------------------------------------------------------------------- /tests/jose-jws-sig: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | ALGS=`jose alg -k sign` 4 | 5 | tmpdir=`mktemp -d 2>/dev/null || mktemp -d -t jose` 6 | 7 | onexit() { 8 | rm -rf $tmpdir 9 | } 10 | 11 | trap onexit EXIT 12 | 13 | msg=$tmpdir/msg.txt 14 | printf "hi" > $msg 15 | 16 | for a in $ALGS; do 17 | jwk=$tmpdir/$a.jwk 18 | jws=$tmpdir/$a.jws 19 | 20 | jose jwk gen -i "{\"alg\":\"$a\"}" -o $jwk 21 | jose jwk pub -i $jwk -o $jwk.pub 22 | 23 | old=$prv 24 | prv=$jwk 25 | done 26 | 27 | for a in $ALGS; do 28 | jwk=$tmpdir/$a.jwk 29 | jws=$tmpdir/$a.jws 30 | 31 | printf "hi" | jose jws sig -I- -k $jwk | jose jws ver -i- -k $jwk 32 | printf "hi" | jose jws sig -I- -k $jwk -c | jose jws ver -i- -k $jwk 33 | 34 | jose jws sig -o $jws -k $jwk -I $msg 35 | jose jws ver -i $jws -k $jwk 36 | rm -f $jws 37 | 38 | jose jws sig -o $jws -k $jwk -I $msg -c 39 | jose jws ver -i $jws -k $jwk 40 | rm -f $jws 41 | 42 | det=`jose jws sig -I $msg -k $jwk -o /dev/null -O-` 43 | [ "$det" = "hi" ] 44 | 45 | jws=`jose jws sig -I $msg -k $jwk -O /dev/null` 46 | ! jose jws ver -i "$jws" -k $jwk 47 | det=`jose jws ver -i "$jws" -k $jwk -I $msg -O-` 48 | [ "$det" = "hi" ] 49 | 50 | jws=`jose jws sig -I $msg -k $jwk` 51 | det=`jose jws ver -i "$jws" -k $jwk` 52 | [ "$det" = "" ] 53 | det=`jose jws ver -i "$jws" -k $jwk -O-` 54 | [ "$det" = "hi" ] 55 | 56 | jws=`jose jws sig -I $msg -k $jwk -c` 57 | det=`jose jws ver -i "$jws" -k $jwk` 58 | [ "$det" = "" ] 59 | det=`jose jws ver -i "$jws" -k $jwk -O-` 60 | [ "$det" = "hi" ] 61 | 62 | jws=`jose jws sig -k $jwk -I $msg -s "{\"protected\":{\"alg\":\"$a\"}}"` 63 | jose jws ver -i "$jws" -k $jwk 64 | 65 | jws=`jose jws sig -k $jwk -i "{\"payload\":\"aGkK\"}"` 66 | jose jws ver -i "$jws" -k $jwk 67 | 68 | for b in $ALGS; do 69 | [ $a = $b ] && continue 70 | 71 | ! jose jws sig -I $msg -k $jwk -s "{\"protected\":{\"alg\":\"$b\"}}" 72 | 73 | jws=`jose jws sig -I $msg -k $jwk` 74 | ! jose jws ver -i "$jws" -k $tmpdir/$b.jwk 75 | done 76 | 77 | jws=`jose jws sig -I $msg -k $jwk -k $prv` 78 | jose jws ver -i "$jws" -k $jwk 79 | jose jws ver -i "$jws" -k $prv 80 | ! jose jws ver -i "$jws" -k $old 81 | jose jws ver -i "$jws" -k $jwk -k $prv -a 82 | ! jose jws ver -i "$jws" -k $jwk -k $prv -k $old -a 83 | 84 | old=$prv 85 | prv=$jwk 86 | done 87 | 88 | for tmpl in '{"kty":"oct","bytes":32}' '{"kty":"RSA","bits":2048}' '{"kty":"EC","crv":"P-256"}'; do 89 | jose jwk gen -i "$tmpl" -o $tmpdir/jwk 90 | 91 | printf '%s' "$msg" | jose jws sig -I- -k $tmpdir/jwk -o $tmpdir/jws 92 | [ "`jose jws ver -i $tmpdir/jws -k $tmpdir/jwk -O-`" = "$msg" ] 93 | done 94 | -------------------------------------------------------------------------------- /tests/jose-jws-ver: -------------------------------------------------------------------------------- 1 | #!/bin/sh -ex 2 | 3 | prfx=$VECTORS/rfc7515_A 4 | 5 | jose jws ver -i $prfx.1.jwsc -k $prfx.1.jwk 6 | ! jose jws ver -i $prfx.1.jwsc -k $prfx.2.jwk 7 | ! jose jws ver -i $prfx.1.jwsc -k $prfx.3.jwk 8 | ! jose jws ver -i $prfx.1.jwsc -k $prfx.4.jwk 9 | 10 | ! jose jws ver -i $prfx.2.jwsc -k $prfx.1.jwk 11 | jose jws ver -i $prfx.2.jwsc -k $prfx.2.jwk 12 | ! jose jws ver -i $prfx.2.jwsc -k $prfx.3.jwk 13 | ! jose jws ver -i $prfx.2.jwsc -k $prfx.4.jwk 14 | 15 | ! jose jws ver -i $prfx.3.jwsc -k $prfx.1.jwk 16 | ! jose jws ver -i $prfx.3.jwsc -k $prfx.2.jwk 17 | jose jws ver -i $prfx.3.jwsc -k $prfx.3.jwk 18 | ! jose jws ver -i $prfx.3.jwsc -k $prfx.4.jwk 19 | 20 | ! jose jws ver -i $prfx.4.jwsc -k $prfx.1.jwk 21 | ! jose jws ver -i $prfx.4.jwsc -k $prfx.2.jwk 22 | ! jose jws ver -i $prfx.4.jwsc -k $prfx.3.jwk 23 | jose jws ver -i $prfx.4.jwsc -k $prfx.4.jwk 24 | 25 | # We don't support alg = none 26 | 27 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.jwkset 28 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.jwkset -a 29 | ! jose jws ver -i $prfx.6.jwsg -k $prfx.6.jwkset -k $prfx.1.jwk -a 30 | 31 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.1.jwk 32 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.2.jwk 33 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.1.jwk -k $prfx.6.2.jwk 34 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.1.jwk -k $prfx.6.2.jwk -a 35 | ! jose jws ver -i $prfx.6.jwsg -k $prfx.6.1.jwk -k $prfx.6.2.jwk -k $prfx.1.jwk -a 36 | 37 | jose jws ver -i $prfx.7.jwsf -k $prfx.7.jwk 38 | 39 | 40 | prfx=$VECTORS/rfc7520_4 41 | 42 | jose jws ver -i $prfx.1.jwsc -k $prfx.1.jwk 43 | jose jws ver -i $prfx.1.jwsf -k $prfx.1.jwk 44 | jose jws ver -i $prfx.1.jwsg -k $prfx.1.jwk 45 | 46 | jose jws ver -i $prfx.2.jwsc -k $prfx.2.jwk 47 | jose jws ver -i $prfx.2.jwsf -k $prfx.2.jwk 48 | jose jws ver -i $prfx.2.jwsg -k $prfx.2.jwk 49 | 50 | jose jws ver -i $prfx.3.jwsc -k $prfx.3.jwk 51 | jose jws ver -i $prfx.3.jwsf -k $prfx.3.jwk 52 | jose jws ver -i $prfx.3.jwsg -k $prfx.3.jwk 53 | 54 | jose jws ver -i $prfx.4.jwsc -k $prfx.4.jwk 55 | jose jws ver -i $prfx.4.jwsf -k $prfx.4.jwk 56 | jose jws ver -i $prfx.4.jwsg -k $prfx.4.jwk 57 | 58 | jose jws ver -i $prfx.5.jwsc -I $prfx.5.payl -k $prfx.5.jwk 59 | jose jws ver -i $prfx.5.jwsf -I $prfx.5.payl -k $prfx.5.jwk 60 | jose jws ver -i $prfx.5.jwsg -I $prfx.5.payl -k $prfx.5.jwk 61 | 62 | ! jose jws ver -i $prfx.6.jwsc -k $prfx.6.jwk 63 | jose jws ver -i $prfx.6.jwsf -k $prfx.6.jwk 64 | jose jws ver -i $prfx.6.jwsg -k $prfx.6.jwk 65 | 66 | ! jose jws ver -i $prfx.7.jwsc -k $prfx.7.jwk 67 | jose jws ver -i $prfx.7.jwsf -k $prfx.7.jwk 68 | jose jws ver -i $prfx.7.jwsg -k $prfx.7.jwk 69 | 70 | jose jws ver -i $prfx.8.jwsg -k $prfx.8.jwkset 71 | jose jws ver -i $prfx.8.jwsg -k $prfx.8.1.jwk 72 | jose jws ver -i $prfx.8.jwsg -k $prfx.8.2.jwk 73 | jose jws ver -i $prfx.8.jwsg -k $prfx.8.3.jwk 74 | -------------------------------------------------------------------------------- /tests/meson.build: -------------------------------------------------------------------------------- 1 | scripts = [ 2 | 'jose-alg', 3 | 'jose-fmt', 4 | 'jose-b64-enc', 5 | 'jose-b64-dec', 6 | 'jose-jwk-eql', 7 | 'jose-jwk-exc', 8 | 'jose-jwk-gen', 9 | 'jose-jwk-pub', 10 | 'jose-jwk-use', 11 | 'jose-jwk-thp', 12 | 'jose-jws-fmt', 13 | 'jose-jws-ver', 14 | 'jose-jws-sig', 15 | 'jose-jwe-fmt', 16 | 'jose-jwe-dec', 17 | 'jose-jwe-enc', 18 | ] 19 | 20 | progs = [ 21 | 'alg_hash', 22 | 'alg_sign', 23 | 'alg_encr', 24 | 'alg_wrap', 25 | 'alg_comp', 26 | 'api_b64', 27 | 'api_jws', 28 | 'api_jwe', 29 | ] 30 | 31 | e = environment() 32 | e.prepend('PATH', meson.current_build_dir() + '/../cmd', separator: ':') 33 | e.set('VECTORS', meson.current_source_dir() + '/vectors') 34 | e.set('CVE_2023_50967', meson.current_source_dir() + '/cve-2023-50967') 35 | 36 | 37 | foreach p: progs 38 | exe = executable(p, p + '.c', dependencies: libjose_dep) 39 | if p == 'api_b64' 40 | to = 1800 41 | else 42 | to = 180 43 | endif 44 | test(p, exe, timeout: to) 45 | endforeach 46 | 47 | foreach s: scripts 48 | exe = find_program('./' + s) 49 | test(s, exe, env: e, timeout: 900) 50 | endforeach 51 | 52 | subdir('issue-75') 53 | -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.1.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","k":"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow"} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.1.jwsc: -------------------------------------------------------------------------------- 1 | eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.2.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","n":"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ","e":"AQAB","d":"Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ","p":"4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc","q":"uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc","dp":"BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0","dq":"h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU","qi":"IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U"} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.2.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.3.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI"} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.3.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJFUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.4.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","crv":"P-521","x":"AekpBQ8ST8a8VcfVOTNl353vSrDCLLJXmPk06wTjxrrjcBpXp5EOnYG_NjFZ6OvLFV1jSfS9tsz4qUxcWceqwQGk","y":"ADSmRA43Z1DSNx_RvcLI87cdL07l6jQyyBXMoxVg_l2Th-x3S1WDhjDly79ajL4Kkd0AZMaZmh9ubmf63e3kyMj2","d":"AY5pb7A0UFiB3RELSD64fTLOSV_jazdF7fLYyuTw8lOfRhWg6Y6rUrPAxerEzgdRhajnu0ferB0d53vM9mE15j2C"} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.4.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJFUzUxMiJ9.UGF5bG9hZA.AdwMgeerwtHoh-l192l60hp9wAHZFVJbLfD_UxMi70cwnZOYaRI1bKPWROc-mZZqwqT2SI-KGDKB34XO0aw_7XdtAG8GaSwFKdCAPZgoXD2YBJZCPEX3xKpRwcdOO8KpEHwJjyqOgzDO7iKvU8vcnwNrmxYbSW9ERBXukOXolLzeO_Jn -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.5.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJub25lIn0.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ. -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.6.1.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","n":"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ","e":"AQAB","d":"Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ","p":"4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc","q":"uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc","dp":"BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0","dq":"h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU","qi":"IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.6.2.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.6.jwkset: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"RSA","n":"ofgWCuLjybRlzo0tZWJjNiuSfb4p4fAkd_wWJcyQoTbji9k0l8W26mPddxHmfHQp-Vaw-4qPCJrcS2mJPMEzP1Pt0Bm4d4QlL-yRT-SFd2lZS-pCgNMsD1W_YpRPEwOWvG6b32690r2jZ47soMZo9wGzjb_7OMg0LOL-bSf63kpaSHSXndS5z5rexMdbBYUsLA9e-KXBdQOS-UTo7WTBEMa2R2CapHg665xsmtdVMTBQY4uDZlxvb3qCo5ZwKh9kG4LT6_I5IhlJH7aGhyxXFvUK-DWNmoudF8NAco9_h9iaGNj8q2ethFkMLs91kzk2PAcDTW9gb54h4FRWyuXpoQ","e":"AQAB","d":"Eq5xpGnNCivDflJsRQBXHx1hdR1k6Ulwe2JZD50LpXyWPEAeP88vLNO97IjlA7_GQ5sLKMgvfTeXZx9SE-7YwVol2NXOoAJe46sui395IW_GO-pWJ1O0BkTGoVEn2bKVRUCgu-GjBVaYLU6f3l9kJfFNS3E0QbVdxzubSu3Mkqzjkn439X0M_V51gfpRLI9JYanrC4D4qAdGcopV_0ZHHzQlBjudU2QvXt4ehNYTCBr6XCLQUShb1juUO1ZdiYoFaFQT5Tw8bGUl_x_jTj3ccPDVZFD9pIuhLhBOneufuBiB4cS98l2SR_RQyGWSeWjnczT0QU91p1DhOVRuOopznQ","p":"4BzEEOtIpmVdVEZNCqS7baC4crd0pqnRH_5IB3jw3bcxGn6QLvnEtfdUdiYrqBdss1l58BQ3KhooKeQTa9AB0Hw_Py5PJdTJNPY8cQn7ouZ2KKDcmnPGBY5t7yLc1QlQ5xHdwW1VhvKn-nXqhJTBgIPgtldC-KDV5z-y2XDwGUc","q":"uQPEfgmVtjL0Uyyx88GZFF1fOunH3-7cepKmtH4pxhtCoHqpWmT8YAmZxaewHgHAjLYsp1ZSe7zFYHj7C6ul7TjeLQeZD_YwD66t62wDmpe_HlB-TnBA-njbglfIsRLtXlnDzQkv5dTltRJ11BKBBypeeF6689rjcJIDEz9RWdc","dp":"BwKfV3Akq5_MFZDFZCnW-wzl-CCo83WoZvnLQwCTeDv8uzluRSnm71I3QCLdhrqE2e9YkxvuxdBfpT_PI7Yz-FOKnu1R6HsJeDCjn12Sk3vmAktV2zb34MCdy7cpdTh_YVr7tss2u6vneTwrA86rZtu5Mbr1C1XsmvkxHQAdYo0","dq":"h_96-mK1R_7glhsum81dZxjTnYynPbZpHziZjeeHcXYsXaaMwkOlODsWa7I9xXDoRwbKgB719rrmI2oKr6N3Do9U0ajaHF-NKJnwgjMd2w9cjz3_-kyNlxAr2v4IKhGNpmM5iIgOS1VZnOZ68m6_pbLBSp3nssTdlqvd0tIiTHU","qi":"IYd7DHOhrWvxkwPQsRM2tOgrjbcrfvtQJipd-DlcxyVuuM9sQLdgjVk2oy26F0EmpScGLq2MowX7fhd_QJQ3ydy5cY7YIBi87w93IKLEdfnbJtoOPLUW0ITrJReOgo1cq9SbsxYawBgfp_gh6A5603k2-ZQwVK0JKSHuLFkuQ3U"},{"kty":"EC","crv":"P-256","x":"f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU","y":"x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0","d":"jpsQnnGQmL-YBIffH1136cspYG6-0iY7X1fCE9-E9LI"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.6.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"2010-12-29"},"signature":"cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO75vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-eOkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"},{"protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.7.jwk: -------------------------------------------------------------------------------- 1 | rfc7515_A.3.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7515_A.7.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ","protected":"eyJhbGciOiJFUzI1NiJ9","header":{"kid":"e9bc097a-ce51-4036-9562-d2ade882db0d"},"signature":"DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"} -------------------------------------------------------------------------------- /tests/vectors/rfc7517_A.1.jwkset: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"EC","crv":"P-256","x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4","y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM","use":"enc","kid":"1"},{"kty":"RSA","n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw","e":"AQAB","alg":"RS256","kid":"2011-04-29"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7517_A.2.jwkset: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"EC","crv":"P-256","x":"MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4","y":"4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM","d":"870MB6gfuTJ4HtUnUvYMyJpr5eUZNP4Bk43bVdj3eAE","use":"enc","kid":"1"},{"kty":"RSA","n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw","e":"AQAB","d":"X4cTteJY_gn4FYPsXB8rdXix5vwsg1FLN5E3EaG6RJoVH-HLLKD9M7dx5oo7GURknchnrRweUkC7hT5fJLM0WbFAKNLWY2vv7B6NqXSzUvxT0_YSfqijwp3RTzlBaCxWp4doFk5N2o8Gy_nHNKroADIkJ46pRUohsXywbReAdYaMwFs9tv8d_cPVY3i07a3t8MN6TNwm0dSawm9v47UiCl3Sk5ZiG7xojPLu4sbg1U2jx4IBTNBznbJSzFHK66jT8bgkuqsk0GjskDJk19Z4qwjwbsnn4j2WBii3RL-Us2lGVkY8fkFzme1z0HbIkfz0Y6mqnOYtqc0X4jfcKoAC8Q","p":"83i-7IvMGXoMXCskv73TKr8637FiO7Z27zv8oj6pbWUQyLPQBQxtPVnwD20R-60eTDmD2ujnMt5PoqMrm8RfmNhVWDtjjMmCMjOpSXicFHj7XOuVIYQyqVWlWEh6dN36GVZYk93N8Bc9vY41xy8B9RzzOGVQzXvNEvn7O0nVbfs","q":"3dfOR9cuYq-0S-mkFLzgItgMEfFzB2q3hWehMuG0oCuqnb3vobLyumqjVZQO1dIrdwgTnCdpYzBcOfW5r370AFXjiWft_NGEiovonizhKpo9VVS78TzFgxkIdrecRezsZ-1kYd_s1qDbxtkDEgfAITAG9LUnADun4vIcb6yelxk","dp":"G4sPXkc6Ya9y8oJW9_ILj4xuppu0lzi_H7VTkS8xj5SdX3coE0oimYwxIi2emTAue0UOa5dpgFGyBJ4c8tQ2VF402XRugKDTP8akYhFo5tAA77Qe_NmtuYZc3C3m3I24G2GvR5sSDxUyAN2zq8Lfn9EUms6rY3Ob8YeiKkTiBj0","dq":"s9lAH9fggBsoFR8Oac2R_E2gw282rT2kGOAhvIllETE1efrA6huUUvMfBcMpn8lqeW6vzznYY5SSQF7pMdC_agI3nG8Ibp1BUb0JUiraRNqUfLhcQb_d9GF4Dh7e74WbRsobRonujTYN1xCaP6TO61jvWrX-L18txXw494Q_cgk","qi":"GyM_p6JrXySiz1toFgKbWV-JdI3jQ4ypu9rbMWx3rQJBfmt0FoYzgUIZEVFEcOqwemRN81zoDAaa-Bk0KWNGDjJHZDdDmFhW3AN7lI-puxk_mHZGJ11rxyR8O55XLSe3SPmRfKwZI6yU24ZxvQKFYItdldUKGzO6Ia6zTKhAVRU","alg":"RS256","kid":"2011-04-29"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7517_A.3.jwkset: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"oct","alg":"A128KW","k":"GawgguFyGrWKav7AX4VKUg"},{"kty":"oct","k":"AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow","kid":"HMACkeyusedinJWSspecAppendixA.1example"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7517_B.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","use":"sig","kid":"1b94c","n":"vrjOfz9Ccdgx5nQudyhdoR17V-IubWMeOZCwX_jj0hgAsz2J_pqYW08PLbK_PdiVGKPrqzmDIsLI7sA25VEnHU1uCLNwBuUiCO11_-7dYbsr4iJmG0Qu2j8DsVyT1azpJC_NG84Ty5KKthuCaPod7iI7w0LK9orSMhBEwwZDCxTWq4aYWAchc8t-emd9qOvWtVMDC2BXksRngh6X5bUYLy6AyHKvj-nUy1wgzjYQDwHMTplCoLtU-o-8SNnZ1tmRoGE9uJkBLdh5gFENabWnU5m1ZqZPdwS-qo-meMvVfJb6jJVWRpl2SUtCnYG2C32qvbWbjZ_jBPD5eunqsIo1vQ","e":"AQAB","x5c":["MIIDQjCCAiqgAwIBAgIGATz/FuLiMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDAeFw0xMzAyMjEyMzI5MTVaFw0xODA4MTQyMjI5MTVaMGIxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDTzEPMA0GA1UEBxMGRGVudmVyMRwwGgYDVQQKExNQaW5nIElkZW50aXR5IENvcnAuMRcwFQYDVQQDEw5CcmlhbiBDYW1wYmVsbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL64zn8/QnHYMeZ0LncoXaEde1fiLm1jHjmQsF/449IYALM9if6amFtPDy2yvz3YlRij66s5gyLCyO7ANuVRJx1NbgizcAblIgjtdf/u3WG7K+IiZhtELto/A7Fck9Ws6SQvzRvOE8uSirYbgmj6He4iO8NCyvaK0jIQRMMGQwsU1quGmFgHIXPLfnpnfajr1rVTAwtgV5LEZ4Iel+W1GC8ugMhyr4/p1MtcIM42EA8BzE6ZQqC7VPqPvEjZ2dbZkaBhPbiZAS3YeYBRDWm1p1OZtWamT3cEvqqPpnjL1XyW+oyVVkaZdklLQp2Btgt9qr21m42f4wTw+Xrp6rCKNb0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAh8zGlfSlcI0o3rYDPBB07aXNswb4ECNIKG0CETTUxmXl9KUL+9gGlqCz5iWLOgWsnrcKcY0vXPG9J1r9AqBNTqNgHq2G03X09266X5CpOe1zFo+Owb1zxtp3PehFdfQJ610CDLEaS9V9Rqp17hCyybEpOGVwe8fnk+fbEL2Bo3UPGrpsHzUoaGpDftmWssZkhpBJKVMJyf/RuP2SmmaIzmnw9JiSlYhzo4tpzd5rFXhjRbg4zW9C+2qok+2+qDM1iJ684gPHMIY8aLWrdgQTxkumGmTqgawR+N5MDtdPTEQ0XfIBc2cJEUyMTY5MPvACWpkA6SdS4xSvdXK3IVfOWA=="]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.1.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","kid":"bilbo.baggins@hobbiton.example","use":"sig","crv":"P-521","x":"AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt","y":"AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.2.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","kid":"bilbo.baggins@hobbiton.example","use":"sig","crv":"P-521","x":"AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt","y":"AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1","d":"AAhRON2r9cqXX1hg-RoI6R1tX5p2rUAYdmpHZoC1XNM56KtscrX6zbKipQrCW9CGZH3T4ubpnoTKLDYJ_fF3_rJt"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.3.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","kid":"bilbo.baggins@hobbiton.example","use":"sig","n":"n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw","e":"AQAB"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.4.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","kid":"bilbo.baggins@hobbiton.example","use":"sig","n":"n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw","e":"AQAB","d":"bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ","p":"3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k","q":"uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc","dp":"B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik","dq":"CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8","qi":"3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.5.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037","use":"sig","alg":"HS256","k":"hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_3.6.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","kid":"1e571774-2e08-40da-8308-e8d68773842d","use":"enc","alg":"A256GCM","k":"AAPapAv4LbFbiVawEjagUBluYqN5rhna-8nuldDvOx8"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.1.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.4.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.1.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.1.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.1.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"MRjdkly7_-oTPTS3AXP41iQIGKa80A0ZmTuV5MEaHoxnW2e5CZ5NlKtainoFmKZopdHM1O2U4mwzJdQx996ivp83xuglII7PNDi84wnB-BDkoBwA78185hX-Es4JIwmDLJK3lfWRa-XtL0RnltuYv746iYTh_qHRD68BNt1uSNCrUCTJDt5aAE6x8wW1Kt9eRo4QPocSadnHXFxnt8Is9UzpERV0ePPQdLuW3IS_de3xyIrDaLGdjluPxUAhb6L2aXic1U12podGU0KLUQSE_oI-ZnmKJ3F4uOZDnd6QZWJushZ41Axf_fcIe8u9ipH84ogoree7vjbU5y18kDquDg"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.2.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.4.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.2.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.2.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.2.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJQUzM4NCIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"cu22eBqkYDKgIlTpzDXGvaFfz6WGoz7fUDcfT0kkOy42miAh2qyBzk1xEsnk2IpN6-tPid6VrklHkqsGqDqHCdP6O8TTB5dDDItllVo6_1OLPpcbUrhiUSMxbbXUvdvWXzg-UD8biiReQFlfz28zGWVsdiNAUf8ZnyPEgVFn442ZdNqiVJRmBqrYRXe8P_ijQ7p8Vdz0TTrxUeT3lm8d9shnr2lfJT8ImUjvAA2Xez2Mlp8cBE5awDzT0qI0n6uiP1aCN_2_jLAeQTlqRHtfa64QQSUmFAAjVKPbByi7xho0uTOcbH510a6GYmJUAfmWjwZ6oD4ifKo8DYM-X72Eaw"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.3.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.2.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.3.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2 -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.3.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.3.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJFUzUxMiIsImtpZCI6ImJpbGJvLmJhZ2dpbnNAaG9iYml0b24uZXhhbXBsZSJ9","signature":"AE_R_YZCChjn4791jSQCrdPZCNYqHXCTZH0-JZGYNlaAjP2kqaluUIIUnC9qvbu9Plon7KRTzoNEuT4Va2cmL1eJAQy3mtPBu_u_sDDyYjnAMDxXPn7XrT0lw-kvAD890jl8e2puQens_IEKBpHABlsbEPX6sFY8OcGDqoRuBomu9xQ2"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.4.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.5.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.4.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9.SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4.s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0 -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.4.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.4.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.5.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.5.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.5.jwsc: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9..s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0 -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.5.jwsf: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.5.jwsg: -------------------------------------------------------------------------------- 1 | {"signatures":[{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.5.payl: -------------------------------------------------------------------------------- 1 | It’s a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there’s no knowing where you might be swept off to. -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.6.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.5.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.6.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","protected":"eyJhbGciOiJIUzI1NiJ9","header":{"kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"bWUSVaxorn7bEF1djytBd0kHv70Ly5pvbomzMWSOr20"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.6.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJIUzI1NiJ9","header":{"kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"bWUSVaxorn7bEF1djytBd0kHv70Ly5pvbomzMWSOr20"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.7.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.5.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.7.jwsf: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","header":{"alg":"HS256","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"xuLifqLGiblpv9zBpuZczWhNj1gARaLV3UxvxhJxZuk"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.7.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"header":{"alg":"HS256","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037"},"signature":"xuLifqLGiblpv9zBpuZczWhNj1gARaLV3UxvxhJxZuk"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.8.1.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.4.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.8.2.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.2.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.8.3.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_3.5.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.8.jwkset: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"RSA","kid":"bilbo.baggins@hobbiton.example","use":"sig","n":"n4EPtAOCc9AlkeQHPzHStgAbgs7bTZLwUBZdR8_KuKPEHLd4rHVTeT-O-XV2jRojdNhxJWTDvNd7nqQ0VEiZQHz_AJmSCpMaJMRBSFKrKb2wqVwGU_NsYOYL-QtiWN2lbzcEe6XC0dApr5ydQLrHqkHHig3RBordaZ6Aj-oBHqFEHYpPe7Tpe-OfVfHd1E6cS6M1FZcD1NNLYD5lFHpPI9bTwJlsde3uhGqC0ZCuEHg8lhzwOHrtIQbS0FVbb9k3-tVTU4fg_3L_vniUFAKwuCLqKnS2BYwdq_mzSnbLY7h_qixoR7jig3__kRhuaxwUkRz5iaiQkqgc5gHdrNP5zw","e":"AQAB","d":"bWUC9B-EFRIo8kpGfh0ZuyGPvMNKvYWNtB_ikiH9k20eT-O1q_I78eiZkpXxXQ0UTEs2LsNRS-8uJbvQ-A1irkwMSMkK1J3XTGgdrhCku9gRldY7sNA_AKZGh-Q661_42rINLRCe8W-nZ34ui_qOfkLnK9QWDDqpaIsA-bMwWWSDFu2MUBYwkHTMEzLYGqOe04noqeq1hExBTHBOBdkMXiuFhUq1BU6l-DqEiWxqg82sXt2h-LMnT3046AOYJoRioz75tSUQfGCshWTBnP5uDjd18kKhyv07lhfSJdrPdM5Plyl21hsFf4L_mHCuoFau7gdsPfHPxxjVOcOpBrQzwQ","p":"3Slxg_DwTXJcb6095RoXygQCAZ5RnAvZlno1yhHtnUex_fp7AZ_9nRaO7HX_-SFfGQeutao2TDjDAWU4Vupk8rw9JR0AzZ0N2fvuIAmr_WCsmGpeNqQnev1T7IyEsnh8UMt-n5CafhkikzhEsrmndH6LxOrvRJlsPp6Zv8bUq0k","q":"uKE2dh-cTf6ERF4k4e_jy78GfPYUIaUyoSSJuBzp3Cubk3OCqs6grT8bR_cu0Dm1MZwWmtdqDyI95HrUeq3MP15vMMON8lHTeZu2lmKvwqW7anV5UzhM1iZ7z4yMkuUwFWoBvyY898EXvRD-hdqRxHlSqAZ192zB3pVFJ0s7pFc","dp":"B8PVvXkvJrj2L-GYQ7v3y9r6Kw5g9SahXBwsWUzp19TVlgI-YV85q1NIb1rxQtD-IsXXR3-TanevuRPRt5OBOdiMGQp8pbt26gljYfKU_E9xn-RULHz0-ed9E9gXLKD4VGngpz-PfQ_q29pk5xWHoJp009Qf1HvChixRX59ehik","dq":"CLDmDGduhylc9o7r84rEUVn7pzQ6PF83Y-iBZx5NT-TpnOZKF1pErAMVeKzFEl41DlHHqqBLSM0W1sOFbwTxYWZDm6sI6og5iTbwQGIC3gnJKbi_7k_vJgGHwHxgPaX2PnvP-zyEkDERuf-ry4c_Z11Cq9AqC2yeL6kdKT1cYF8","qi":"3PiqvXQN0zwMeE-sBvZgi289XP9XCQF3VWqPzMKnIgQp7_Tugo6-NZBKCQsMf3HaEGBjTVJs_jcK8-TRXvaKe-7ZMaQj8VfBdYkssbu0NKDDhjJ-GtiseaDVWt7dcH0cfwxgFUHpQh7FoCrjFJ6h6ZEpMF6xmujs4qMpPz8aaI4"},{"kty":"EC","kid":"bilbo.baggins@hobbiton.example","use":"sig","crv":"P-521","x":"AHKZLLOsCOzz5cY97ewNUajB957y-C-U88c3v13nmGZx6sYl_oJXu9A5RkTKqjqvjyekWF-7ytDyRXYgCF5cj0Kt","y":"AdymlHvOiLxXkEhayXQnNCvDX4h9htZaCJN34kfmC6pV5OhQHiraVySsUdaQkAgDPrwQrJmbnX9cwlGfP-HqHZR1","d":"AAhRON2r9cqXX1hg-RoI6R1tX5p2rUAYdmpHZoC1XNM56KtscrX6zbKipQrCW9CGZH3T4ubpnoTKLDYJ_fF3_rJt"},{"kty":"oct","kid":"018c0ae5-4d9b-471b-bfd6-eef314bc7037","use":"sig","alg":"HS256","k":"hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_4.8.jwsg: -------------------------------------------------------------------------------- 1 | {"payload":"SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4","signatures":[{"protected":"eyJhbGciOiJSUzI1NiJ9","header":{"kid":"bilbo.baggins@hobbiton.example"},"signature":"MIsjqtVlOpa71KE-Mss8_Nq2YH4FGhiocsqrgi5NvyG53uoimic1tcMdSg-qptrzZc7CG6Svw2Y13TDIqHzTUrL_lR2ZFcryNFiHkSw129EghGpwkpxaTn_THJTCglNbADko1MZBCdwzJxwqZc-1RlpO2HibUYyXSwO97BSe0_evZKdjvvKSgsIqjytKSeAMbhMBdMma622_BG5t4sdbuCHtFjp9iJmkio47AIwqkZV1aIZsv33uPUqBBCXbYoQJwt7mxPftHmNlGoOSMxR_3thmXTCm4US-xiNOyhbm8afKK64jU6_TPtQHiJeQJxz9G3Tx-083B745_AfYOnlC9w"},{"header":{"alg":"ES512","kid":"bilbo.baggins@hobbiton.example"},"signature":"ARcVLnaJJaUWG8fG-8t5BREVAuTY8n8YHjwDO1muhcdCoFZFFjfISu0Cdkn9Ybdlmi54ho0x924DUz8sK7ZXkhc7AFM8ObLfTvNCrqcI3Jkl2U5IX3utNhODH6v7xgy1Qahsn0fyb4zSAkje8bAWz4vIfj5pCMYxxm4fgV3q7ZYhm5eD"},{"protected":"eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9","signature":"s0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.1.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJSU0ExXzUiLCJraWQiOiJmcm9kby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.laLxI0j-nLH-_BgLOXMozKxmy9gffy2gTdvqzfTihJBuuzxg0V7yk1WClnQePFvG2K-pvSlWc9BRIazDrn50RcRai__3TDON395H3c62tIouJJ4XaRvYHFjZTZ2GXfz8YAImcc91Tfk0WXC2F5Xbb71ClQ1DDH151tlpH77f2ff7xiSxh9oSewYrcGTSLUeeCt36r1Kt3OSj7EyBQXoZlN7IxbyhMAfgIe7Mv1rOTOI5I8NQqeXXW8VlzNmoxaGMny3YnGir5Wf6Qt2nBq4qDaPdnaAuuGUGEecelIO1wx1BpyIfgvfjOhMBs9M8XL223Fg47xlGsMXdfuY-4jaqVw.bbd5sTkYwhAIqfHsx8DayA.0fys_TY_na7f8dwSfXLiYdHaA2DxUjD67ieF7fcVbIR62JhJvGZ4_FNVSiGc_raa0HnLQ6s1P2sv3Xzl1p1l_o5wR_RsSzrS8Z-wnI3Jvo0mkpEEnlDmZvDu_k8OWzJv7eZVEqiWKdyVzFhPpiyQU28GLOpRc2VbVbK4dQKPdNTjPPEmRqcaGeTWZVyeSUvf5k59yJZxRuSvWFf6KrNtmRdZ8R4mDOjHSrM_s8uwIFcqt4r5GX8TKaI0zT5CbL5Qlw3sRc7u_hg0yKVOiRytEAEs3vZkcfLkP6nbXdC_PkMdNS-ohP78T2O6_7uInMGhFeX4ctHG7VelHGiT93JfWDEQi5_V9UN1rhXNrYu-0fVMkZAKX3VWi7lzA6BP430m.kvKuFBXHe5mQr4lqgobAUg -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.1.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJSU0ExXzUiLCJraWQiOiJmcm9kby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"laLxI0j-nLH-_BgLOXMozKxmy9gffy2gTdvqzfTihJBuuzxg0V7yk1WClnQePFvG2K-pvSlWc9BRIazDrn50RcRai__3TDON395H3c62tIouJJ4XaRvYHFjZTZ2GXfz8YAImcc91Tfk0WXC2F5Xbb71ClQ1DDH151tlpH77f2ff7xiSxh9oSewYrcGTSLUeeCt36r1Kt3OSj7EyBQXoZlN7IxbyhMAfgIe7Mv1rOTOI5I8NQqeXXW8VlzNmoxaGMny3YnGir5Wf6Qt2nBq4qDaPdnaAuuGUGEecelIO1wx1BpyIfgvfjOhMBs9M8XL223Fg47xlGsMXdfuY-4jaqVw","iv":"bbd5sTkYwhAIqfHsx8DayA","ciphertext":"0fys_TY_na7f8dwSfXLiYdHaA2DxUjD67ieF7fcVbIR62JhJvGZ4_FNVSiGc_raa0HnLQ6s1P2sv3Xzl1p1l_o5wR_RsSzrS8Z-wnI3Jvo0mkpEEnlDmZvDu_k8OWzJv7eZVEqiWKdyVzFhPpiyQU28GLOpRc2VbVbK4dQKPdNTjPPEmRqcaGeTWZVyeSUvf5k59yJZxRuSvWFf6KrNtmRdZ8R4mDOjHSrM_s8uwIFcqt4r5GX8TKaI0zT5CbL5Qlw3sRc7u_hg0yKVOiRytEAEs3vZkcfLkP6nbXdC_PkMdNS-ohP78T2O6_7uInMGhFeX4ctHG7VelHGiT93JfWDEQi5_V9UN1rhXNrYu-0fVMkZAKX3VWi7lzA6BP430m","tag":"kvKuFBXHe5mQr4lqgobAUg"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.1.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"laLxI0j-nLH-_BgLOXMozKxmy9gffy2gTdvqzfTihJBuuzxg0V7yk1WClnQePFvG2K-pvSlWc9BRIazDrn50RcRai__3TDON395H3c62tIouJJ4XaRvYHFjZTZ2GXfz8YAImcc91Tfk0WXC2F5Xbb71ClQ1DDH151tlpH77f2ff7xiSxh9oSewYrcGTSLUeeCt36r1Kt3OSj7EyBQXoZlN7IxbyhMAfgIe7Mv1rOTOI5I8NQqeXXW8VlzNmoxaGMny3YnGir5Wf6Qt2nBq4qDaPdnaAuuGUGEecelIO1wx1BpyIfgvfjOhMBs9M8XL223Fg47xlGsMXdfuY-4jaqVw"}],"protected":"eyJhbGciOiJSU0ExXzUiLCJraWQiOiJmcm9kby5iYWdnaW5zQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","iv":"bbd5sTkYwhAIqfHsx8DayA","ciphertext":"0fys_TY_na7f8dwSfXLiYdHaA2DxUjD67ieF7fcVbIR62JhJvGZ4_FNVSiGc_raa0HnLQ6s1P2sv3Xzl1p1l_o5wR_RsSzrS8Z-wnI3Jvo0mkpEEnlDmZvDu_k8OWzJv7eZVEqiWKdyVzFhPpiyQU28GLOpRc2VbVbK4dQKPdNTjPPEmRqcaGeTWZVyeSUvf5k59yJZxRuSvWFf6KrNtmRdZ8R4mDOjHSrM_s8uwIFcqt4r5GX8TKaI0zT5CbL5Qlw3sRc7u_hg0yKVOiRytEAEs3vZkcfLkP6nbXdC_PkMdNS-ohP78T2O6_7uInMGhFeX4ctHG7VelHGiT93JfWDEQi5_V9UN1rhXNrYu-0fVMkZAKX3VWi7lzA6BP430m","tag":"kvKuFBXHe5mQr4lqgobAUg"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.1.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","kid":"frodo.baggins@hobbiton.example","use":"enc","n":"maxhbsmBtdQ3CNrKvprUE6n9lYcregDMLYNeTAWcLj8NnPU9XIYegTHVHQjxKDSHP2l-F5jS7sppG1wgdAqZyhnWvXhYNvcM7RfgKxqNx_xAHx6f3yy7s-M9PSNCwPC2lh6UAkR4I00EhV9lrypM9Pi4lBUop9t5fS9W5UNwaAllhrd-osQGPjIeI1deHTwx-ZTHu3C60Pu_LJIl6hKn9wbwaUmA4cR5Bd2pgbaY7ASgsjCUbtYJaNIHSoHXprUdJZKUMAzV0WOKPfA6OPI4oypBadjvMZ4ZAj3BnXaSYsEZhaueTXvZB4eZOAjIyh2e_VOIKVMsnDrJYAVotGlvMQ","e":"AQAB","d":"Kn9tgoHfiTVi8uPu5b9TnwyHwG5dK6RE0uFdlpCGnJN7ZEi963R7wybQ1PLAHmpIbNTztfrheoAniRV1NCIqXaW_qS461xiDTp4ntEPnqcKsyO5jMAji7-CL8vhpYYowNFvIesgMoVaPRYMYT9TW63hNM0aWs7USZ_hLg6Oe1mY0vHTI3FucjSM86Nff4oIENt43r2fspgEPGRrdE6fpLc9Oaq-qeP1GFULimrRdndm-P8q8kvN3KHlNAtEgrQAgTTgz80S-3VD0FgWfgnb1PNmiuPUxO8OpI9KDIfu_acc6fg14nsNaJqXe6RESvhGPH2afjHqSy_Fd2vpzj85bQQ","p":"2DwQmZ43FoTnQ8IkUj3BmKRf5Eh2mizZA5xEJ2MinUE3sdTYKSLtaEoekX9vbBZuWxHdVhM6UnKCJ_2iNk8Z0ayLYHL0_G21aXf9-unynEpUsH7HHTklLpYAzOOx1ZgVljoxAdWNn3hiEFrjZLZGS7lOH-a3QQlDDQoJOJ2VFmU","q":"te8LY4-W7IyaqH1ExujjMqkTAlTeRbv0VLQnfLY2xINnrWdwiQ93_VF099aP1ESeLja2nw-6iKIe-qT7mtCPozKfVtUYfz5HrJ_XY2kfexJINb9lhZHMv5p1skZpeIS-GPHCC6gRlKo1q-idn_qxyusfWv7WAxlSVfQfk8d6Et0","dp":"UfYKcL_or492vVc0PzwLSplbg4L3-Z5wL48mwiswbpzOyIgd2xHTHQmjJpFAIZ8q-zf9RmgJXkDrFs9rkdxPtAsL1WYdeCT5c125Fkdg317JVRDo1inX7x2Kdh8ERCreW8_4zXItuTl_KiXZNU5lvMQjWbIw2eTx1lpsflo0rYU","dq":"iEgcO-QfpepdH8FWd7mUFyrXdnOkXJBCogChY6YKuIHGc_p8Le9MbpFKESzEaLlN1Ehf3B6oGBl5Iz_ayUlZj2IoQZ82znoUrpa9fVYNot87ACfzIG7q9Mv7RiPAderZi03tkVXAdaBau_9vs5rS-7HMtxkVrxSUvJY14TkXlHE","qi":"kC-lzZOqoFaZCr5l0tOVtREKoVqaAYhQiqIRGL-MzS4sCmRkxm5vZlXYx6RtE1n_AagjqajlkjieGlxTTThHD8Iga6foGBMaAr5uR1hGQpSc7Gl7CF1DZkBJMTQN6EshYzZfxW08mIO8M6Rzuh0beL6fG9mkDcIyPrBXx2bQ_mM"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.1.pt: -------------------------------------------------------------------------------- 1 | You can trust us to stick with you through thick and thin–to the bitter end. And you can trust us to keep any secret of yours–closer than you keep it yourself. But you cannot trust us to let you face trouble alone, and go off without a word. We are your friends, Frodo. -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.10.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"4YiiQ_ZzH76TaIkJmYfRFgOV9MIpnx4X","aad":"WyJ2Y2FyZCIsW1sidmVyc2lvbiIse30sInRleHQiLCI0LjAiXSxbImZuIix7fSwidGV4dCIsIk1lcmlhZG9jIEJyYW5keWJ1Y2siXSxbIm4iLHt9LCJ0ZXh0IixbIkJyYW5keWJ1Y2siLCJNZXJpYWRvYyIsIk1yLiIsIiJdXSxbImJkYXkiLHt9LCJ0ZXh0IiwiVEEgMjk4MiJdLFsiZ2VuZGVyIix7fSwidGV4dCIsIk0iXV1d","iv":"veCx9ece2orS7c_N","ciphertext":"Z_3cbr0k3bVM6N3oSNmHz7Lyf3iPppGf3Pj17wNZqteJ0Ui8p74SchQP8xygM1oFRWCNzeIa6s6BcEtp8qEFiqTUEyiNkOWDNoF14T_4NFqF-p2Mx8zkbKxI7oPK8KNarFbyxIDvICNqBLba-v3uzXBdB89fzOI-Lv4PjOFAQGHrgv1rjXAmKbgkft9cB4WeyZw8MldbBhc-V_KWZslrsLNygon_JJWd_ek6LQn5NRehvApqf9ZrxB4aq3FXBxOxCys35PhCdaggy2kfUfl2OkwKnWUbgXVD1C6HxLIlqHhCwXDG59weHrRDQeHyMRoBljoV3X_bUTJDnKBFOod7nLz-cj48JMx3SnCZTpbQAkFV","tag":"vOaH_Rajnpy_3hOtqvZHRA"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.10.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"4YiiQ_ZzH76TaIkJmYfRFgOV9MIpnx4X"}],"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0","iv":"veCx9ece2orS7c_N","aad":"WyJ2Y2FyZCIsW1sidmVyc2lvbiIse30sInRleHQiLCI0LjAiXSxbImZuIix7fSwidGV4dCIsIk1lcmlhZG9jIEJyYW5keWJ1Y2siXSxbIm4iLHt9LCJ0ZXh0IixbIkJyYW5keWJ1Y2siLCJNZXJpYWRvYyIsIk1yLiIsIiJdXSxbImJkYXkiLHt9LCJ0ZXh0IiwiVEEgMjk4MiJdLFsiZ2VuZGVyIix7fSwidGV4dCIsIk0iXV1d","ciphertext":"Z_3cbr0k3bVM6N3oSNmHz7Lyf3iPppGf3Pj17wNZqteJ0Ui8p74SchQP8xygM1oFRWCNzeIa6s6BcEtp8qEFiqTUEyiNkOWDNoF14T_4NFqF-p2Mx8zkbKxI7oPK8KNarFbyxIDvICNqBLba-v3uzXBdB89fzOI-Lv4PjOFAQGHrgv1rjXAmKbgkft9cB4WeyZw8MldbBhc-V_KWZslrsLNygon_JJWd_ek6LQn5NRehvApqf9ZrxB4aq3FXBxOxCys35PhCdaggy2kfUfl2OkwKnWUbgXVD1C6HxLIlqHhCwXDG59weHrRDQeHyMRoBljoV3X_bUTJDnKBFOod7nLz-cj48JMx3SnCZTpbQAkFV","tag":"vOaH_Rajnpy_3hOtqvZHRA"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.10.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.8.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.10.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.11.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJlbmMiOiJBMTI4R0NNIn0","unprotected":{"alg":"A128KW","kid":"81b20965-8332-43d9-a468-82160ad91ac8"},"encrypted_key":"jJIcM9J-hbx3wnqhf5FlkEYos0sHsF0H","iv":"WgEJsDS9bkoXQ3nR","ciphertext":"lIbCyRmRJxnB2yLQOTqjCDKV3H30ossOw3uD9DPsqLL2DM3swKkjOwQyZtWsFLYMj5YeLht_StAn21tHmQJuuNt64T8D4t6C7kC9OCCJ1IHAolUv4MyOt80MoPb8fZYbNKqplzYJgIL58g8N2v46OgyG637d6uuKPwhAnTGm_zWhqc_srOvgiLkzyFXPq1hBAURbc3-8BqeRb48iR1-_5g5UjWVD3lgiLCN_P7AW8mIiFvUNXBPJK3nOWL4teUPS8yHLbWeL83olU4UAgL48x-8dDkH23JykibVSQju-f7e-1xreHWXzWLHs1NqBbre0dEwK3HX_xM0LjUz77Krppgegoutpf5qaKg3l-_xMINmf","tag":"fNYLqpUe84KD45lvDiaBAQ"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.11.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"jJIcM9J-hbx3wnqhf5FlkEYos0sHsF0H"}],"unprotected":{"alg":"A128KW","kid":"81b20965-8332-43d9-a468-82160ad91ac8"},"protected":"eyJlbmMiOiJBMTI4R0NNIn0","iv":"WgEJsDS9bkoXQ3nR","ciphertext":"lIbCyRmRJxnB2yLQOTqjCDKV3H30ossOw3uD9DPsqLL2DM3swKkjOwQyZtWsFLYMj5YeLht_StAn21tHmQJuuNt64T8D4t6C7kC9OCCJ1IHAolUv4MyOt80MoPb8fZYbNKqplzYJgIL58g8N2v46OgyG637d6uuKPwhAnTGm_zWhqc_srOvgiLkzyFXPq1hBAURbc3-8BqeRb48iR1-_5g5UjWVD3lgiLCN_P7AW8mIiFvUNXBPJK3nOWL4teUPS8yHLbWeL83olU4UAgL48x-8dDkH23JykibVSQju-f7e-1xreHWXzWLHs1NqBbre0dEwK3HX_xM0LjUz77Krppgegoutpf5qaKg3l-_xMINmf","tag":"fNYLqpUe84KD45lvDiaBAQ"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.11.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.8.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.11.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.12.jwef: -------------------------------------------------------------------------------- 1 | {"unprotected":{"alg":"A128KW","kid":"81b20965-8332-43d9-a468-82160ad91ac8","enc":"A128GCM"},"encrypted_key":"244YHfO_W7RMpQW81UjQrZcq5LSyqiPv","iv":"YihBoVOGsR1l7jCD","ciphertext":"qtPIMMaOBRgASL10dNQhOa7Gqrk7Eal1vwht7R4TT1uq-arsVCPaIeFwQfzrSS6oEUWbBtxEasE0vC6r7sphyVziMCVJEuRJyoAHFSP3eqQPb4Ic1SDSqyXjw_L3svybhHYUGyQuTmUQEDjgjJfBOifwHIsDsRPeBz1NomqeifVPq5GTCWFo5k_MNIQURR2Wj0AHC2k7JZfu2iWjUHLF8ExFZLZ4nlmsvJu_mvifMYiikfNfsZAudISOa6O73yPZtL04k_1FI7WDfrb2w7OqKLWDXzlpcxohPVOLQwpA3mFNRKdY-bQz4Z4KX9lfz1cne31N4-8BKmojpw-OdQjKdLOGkC445Fb_K1tlDQXw2sBF","tag":"e2m0Vm7JvjK2VpCKXS-kyg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.12.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"244YHfO_W7RMpQW81UjQrZcq5LSyqiPv"}],"unprotected":{"alg":"A128KW","kid":"81b20965-8332-43d9-a468-82160ad91ac8","enc":"A128GCM"},"iv":"YihBoVOGsR1l7jCD","ciphertext":"qtPIMMaOBRgASL10dNQhOa7Gqrk7Eal1vwht7R4TT1uq-arsVCPaIeFwQfzrSS6oEUWbBtxEasE0vC6r7sphyVziMCVJEuRJyoAHFSP3eqQPb4Ic1SDSqyXjw_L3svybhHYUGyQuTmUQEDjgjJfBOifwHIsDsRPeBz1NomqeifVPq5GTCWFo5k_MNIQURR2Wj0AHC2k7JZfu2iWjUHLF8ExFZLZ4nlmsvJu_mvifMYiikfNfsZAudISOa6O73yPZtL04k_1FI7WDfrb2w7OqKLWDXzlpcxohPVOLQwpA3mFNRKdY-bQz4Z4KX9lfz1cne31N4-8BKmojpw-OdQjKdLOGkC445Fb_K1tlDQXw2sBF","tag":"e2m0Vm7JvjK2VpCKXS-kyg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.12.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.8.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.12.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.13.1.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.13.2.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.4.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.13.3.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.7.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.13.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"dYOD28kab0Vvf4ODgxVAJXgHcSZICSOp8M51zjwj4w6Y5G4XJQsNNIBiqyvUUAOcpL7S7-cFe7Pio7gV_Q06WmCSa-vhW6me4bWrBf7cHwEQJdXihidAYWVajJIaKMXMvFRMV6iDlRr076DFthg2_AV0_tSiV6xSEIFqt1xnYPpmP91tc5WJDOGb-wqjw0-b-S1laS11QVbuP78dQ7Fa0zAVzzjHX-xvyM2wxj_otxr9clN1LnZMbeYSrRicJK5xodvWgkpIdkMHo4LvdhRRvzoKzlic89jFWPlnBq_V4n5trGuExtp_-dbHcGlihqc_wGgho9fLMK8JOArYLcMDNQ","header":{"alg":"RSA1_5","kid":"frodo.baggins@hobbiton.example"}},{"encrypted_key":"ExInT0io9BqBMYF6-maw5tZlgoZXThD1zWKsHixJuw_elY4gSSId_w","header":{"alg":"ECDH-ES+A256KW","kid":"peregrin.took@tuckborough.example","epk":{"kty":"EC","crv":"P-384","x":"Uzdvk3pi5wKCRc1izp5_r0OjeqT-I68i8g2b8mva8diRhsE2xAn2DtMRb25Ma2CX","y":"VDrRyFJh-Kwd1EjAgmj5Eo-CTHAZ53MC7PjjpLioy3ylEjI1pOMbw91fzZ84pbfm"}}},{"encrypted_key":"a7CclAejo_7JSuPB8zeagxXRam8dwCfmkt9-WyTpS1E","header":{"alg":"A256GCMKW","kid":"18ec08e1-bfa9-4d95-b205-2b4dd1d4321d","tag":"59Nqh1LlYtVIhfD3pgRGvw","iv":"AvpeoPZ9Ncn9mkBn"}}],"unprotected":{"cty":"text/plain"},"protected":"eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","iv":"VgEIHY20EnzUtZFl2RpB1g","ciphertext":"ajm2Q-OpPXCr7-MHXicknb1lsxLdXxK_yLds0KuhJzfWK04SjdxQeSw2L9mu3a_k1C55kCQ_3xlkcVKC5yr__Is48VOoK0k63_QRM9tBURMFqLByJ8vOYQX0oJW4VUHJLmGhF-tVQWB7Kz8mr8zeE7txF0MSaP6ga7-siYxStR7_G07Thd1jh-zGT0wxM5g-VRORtq0K6AXpLlwEqRp7pkt2zRM0ZAXqSpe1O6FJ7FHLDyEFnD-zDIZukLpCbzhzMDLLw2-8I14FQrgi-iEuzHgIJFIJn2wh9Tj0cg_kOZy9BqMRZbmYXMY9YQjorZ_P_JYG3ARAIF3OjDNqpdYe-K_5Q5crGJSDNyij_ygEiItR5jssQVH2ofDQdLChtazE","tag":"BESYyFN7T09KY7i8zKs5_g"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.13.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.2.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJSU0EtT0FFUCIsImtpZCI6InNhbXdpc2UuZ2FtZ2VlQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMjU2R0NNIn0.rT99rwrBTbTI7IJM8fU3Eli7226HEB7IchCxNuh7lCiud48LxeolRdtFF4nzQibeYOl5S_PJsAXZwSXtDePz9hk-BbtsTBqC2UsPOdwjC9NhNupNNu9uHIVftDyucvI6hvALeZ6OGnhNV4v1zx2k7O1D89mAzfw-_kT3tkuorpDU-CpBENfIHX1Q58-Aad3FzMuo3Fn9buEP2yXakLXYa15BUXQsupM4A1GD4_H4Bd7V3u9h8Gkg8BpxKdUV9ScfJQTcYm6eJEBz3aSwIaK4T3-dwWpuBOhROQXBosJzS1asnuHtVMt2pKIIfux5BC6huIvmY7kzV7W7aIUrpYm_3H4zYvyMeq5pGqFmW2k8zpO878TRlZx7pZfPYDSXZyS0CfKKkMozT_qiCwZTSz4duYnt8hS4Z9sGthXn9uDqd6wycMagnQfOTs_lycTWmY-aqWVDKhjYNRf03NiwRtb5BE-tOdFwCASQj3uuAgPGrO2AWBe38UjQb0lvXn1SpyvYZ3WFc7WOJYaTa7A8DRn6MC6T-xDmMuxC0G7S2rscw5lQQU06MvZTlFOt0UvfuKBa03cxA_nIBIhLMjY2kOTxQMmpDPTr6Cbo8aKaOnx6ASE5Jx9paBpnNmOOKH35j_QlrQhDWUN6A2Gg8iFayJ69xDEdHAVCGRzN3woEI2ozDRs.-nBoKLH0YkLZPSI9.o4k2cnGN8rSSw3IDo1YuySkqeS_t2m1GXklSgqBdpACm6UJuJowOHC5ytjqYgRL-I-soPlwqMUf4UgRWWeaOGNw6vGW-xyM01lTYxrXfVzIIaRdhYtEMRBvBWbEwP7ua1DRfvaOjgZv6Ifa3brcAM64d8p5lhhNcizPersuhw5f-pGYzseva-TUaL8iWnctc-sSwy7SQmRkfhDjwbz0fz6kFovEgj64X1I5s7E6GLp5fnbYGLa1QUiML7Cc2GxgvI7zqWo0YIEc7aCflLG1-8BboVWFdZKLK9vNoycrYHumwzKluLWEbSVmaPpOslY2n525DxDfWaVFUfKQxMF56vn4B9QMpWAbnypNimbM8zVOw.UCGiqJxhBI3IFVdPalHHvA -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.2.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJSU0EtT0FFUCIsImtpZCI6InNhbXdpc2UuZ2FtZ2VlQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMjU2R0NNIn0","encrypted_key":"rT99rwrBTbTI7IJM8fU3Eli7226HEB7IchCxNuh7lCiud48LxeolRdtFF4nzQibeYOl5S_PJsAXZwSXtDePz9hk-BbtsTBqC2UsPOdwjC9NhNupNNu9uHIVftDyucvI6hvALeZ6OGnhNV4v1zx2k7O1D89mAzfw-_kT3tkuorpDU-CpBENfIHX1Q58-Aad3FzMuo3Fn9buEP2yXakLXYa15BUXQsupM4A1GD4_H4Bd7V3u9h8Gkg8BpxKdUV9ScfJQTcYm6eJEBz3aSwIaK4T3-dwWpuBOhROQXBosJzS1asnuHtVMt2pKIIfux5BC6huIvmY7kzV7W7aIUrpYm_3H4zYvyMeq5pGqFmW2k8zpO878TRlZx7pZfPYDSXZyS0CfKKkMozT_qiCwZTSz4duYnt8hS4Z9sGthXn9uDqd6wycMagnQfOTs_lycTWmY-aqWVDKhjYNRf03NiwRtb5BE-tOdFwCASQj3uuAgPGrO2AWBe38UjQb0lvXn1SpyvYZ3WFc7WOJYaTa7A8DRn6MC6T-xDmMuxC0G7S2rscw5lQQU06MvZTlFOt0UvfuKBa03cxA_nIBIhLMjY2kOTxQMmpDPTr6Cbo8aKaOnx6ASE5Jx9paBpnNmOOKH35j_QlrQhDWUN6A2Gg8iFayJ69xDEdHAVCGRzN3woEI2ozDRs","iv":"-nBoKLH0YkLZPSI9","ciphertext":"o4k2cnGN8rSSw3IDo1YuySkqeS_t2m1GXklSgqBdpACm6UJuJowOHC5ytjqYgRL-I-soPlwqMUf4UgRWWeaOGNw6vGW-xyM01lTYxrXfVzIIaRdhYtEMRBvBWbEwP7ua1DRfvaOjgZv6Ifa3brcAM64d8p5lhhNcizPersuhw5f-pGYzseva-TUaL8iWnctc-sSwy7SQmRkfhDjwbz0fz6kFovEgj64X1I5s7E6GLp5fnbYGLa1QUiML7Cc2GxgvI7zqWo0YIEc7aCflLG1-8BboVWFdZKLK9vNoycrYHumwzKluLWEbSVmaPpOslY2n525DxDfWaVFUfKQxMF56vn4B9QMpWAbnypNimbM8zVOw","tag":"UCGiqJxhBI3IFVdPalHHvA"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.2.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"rT99rwrBTbTI7IJM8fU3Eli7226HEB7IchCxNuh7lCiud48LxeolRdtFF4nzQibeYOl5S_PJsAXZwSXtDePz9hk-BbtsTBqC2UsPOdwjC9NhNupNNu9uHIVftDyucvI6hvALeZ6OGnhNV4v1zx2k7O1D89mAzfw-_kT3tkuorpDU-CpBENfIHX1Q58-Aad3FzMuo3Fn9buEP2yXakLXYa15BUXQsupM4A1GD4_H4Bd7V3u9h8Gkg8BpxKdUV9ScfJQTcYm6eJEBz3aSwIaK4T3-dwWpuBOhROQXBosJzS1asnuHtVMt2pKIIfux5BC6huIvmY7kzV7W7aIUrpYm_3H4zYvyMeq5pGqFmW2k8zpO878TRlZx7pZfPYDSXZyS0CfKKkMozT_qiCwZTSz4duYnt8hS4Z9sGthXn9uDqd6wycMagnQfOTs_lycTWmY-aqWVDKhjYNRf03NiwRtb5BE-tOdFwCASQj3uuAgPGrO2AWBe38UjQb0lvXn1SpyvYZ3WFc7WOJYaTa7A8DRn6MC6T-xDmMuxC0G7S2rscw5lQQU06MvZTlFOt0UvfuKBa03cxA_nIBIhLMjY2kOTxQMmpDPTr6Cbo8aKaOnx6ASE5Jx9paBpnNmOOKH35j_QlrQhDWUN6A2Gg8iFayJ69xDEdHAVCGRzN3woEI2ozDRs"}],"protected":"eyJhbGciOiJSU0EtT0FFUCIsImtpZCI6InNhbXdpc2UuZ2FtZ2VlQGhvYmJpdG9uLmV4YW1wbGUiLCJlbmMiOiJBMjU2R0NNIn0","iv":"-nBoKLH0YkLZPSI9","ciphertext":"o4k2cnGN8rSSw3IDo1YuySkqeS_t2m1GXklSgqBdpACm6UJuJowOHC5ytjqYgRL-I-soPlwqMUf4UgRWWeaOGNw6vGW-xyM01lTYxrXfVzIIaRdhYtEMRBvBWbEwP7ua1DRfvaOjgZv6Ifa3brcAM64d8p5lhhNcizPersuhw5f-pGYzseva-TUaL8iWnctc-sSwy7SQmRkfhDjwbz0fz6kFovEgj64X1I5s7E6GLp5fnbYGLa1QUiML7Cc2GxgvI7zqWo0YIEc7aCflLG1-8BboVWFdZKLK9vNoycrYHumwzKluLWEbSVmaPpOslY2n525DxDfWaVFUfKQxMF56vn4B9QMpWAbnypNimbM8zVOw","tag":"UCGiqJxhBI3IFVdPalHHvA"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.2.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g.VBiCzVHNoLiR3F4V82uoTQ.23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p.0HlwodAhOCILG5SQ2LQ9dg -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","encrypted_key":"d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g","iv":"VBiCzVHNoLiR3F4V82uoTQ","ciphertext":"23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p","tag":"0HlwodAhOCILG5SQ2LQ9dg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"d3qNhUWfqheyPp4H8sjOWsDYajoej4c5Je6rlUtFPWdgtURtmeDV1g"}],"protected":"eyJhbGciOiJQQkVTMi1IUzUxMitBMjU2S1ciLCJwMnMiOiI4UTFTemluYXNSM3hjaFl6NlpaY0hBIiwicDJjIjo4MTkyLCJjdHkiOiJqd2stc2V0K2pzb24iLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0","iv":"VBiCzVHNoLiR3F4V82uoTQ","ciphertext":"23i-Tb1AV4n0WKVSSgcQrdg6GRqsUKxjruHXYsTHAJLZ2nsnGIX86vMXqIi6IRsfywCRFzLxEcZBRnTvG3nhzPk0GDD7FMyXhUHpDjEYCNA_XOmzg8yZR9oyjo6lTF6si4q9FZ2EhzgFQCLO_6h5EVg3vR75_hkBsnuoqoM3dwejXBtIodN84PeqMb6asmas_dpSsz7H10fC5ni9xIz424givB1YLldF6exVmL93R3fOoOJbmk2GBQZL_SEGllv2cQsBgeprARsaQ7Bq99tT80coH8ItBjgV08AtzXFFsx9qKvC982KLKdPQMTlVJKkqtV4Ru5LEVpBZXBnZrtViSOgyg6AiuwaS-rCrcD_ePOGSuxvgtrokAKYPqmXUeRdjFJwafkYEkiuDCV9vWGAi1DH2xTafhJwcmywIyzi4BqRpmdn_N-zl5tuJYyuvKhjKv6ihbsV_k1hJGPGAxJ6wUpmwC4PTQ2izEm0TuSE8oMKdTw8V3kobXZ77ulMwDs4p","tag":"0HlwodAhOCILG5SQ2LQ9dg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","k":"ZW50cmFwX2_igJNwZXRlcl9sb25n4oCTY3JlZGl0X3R1bg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.pt: -------------------------------------------------------------------------------- 1 | {"keys":[{"kty":"oct","kid":"77c7e2b8-6e13-45cf-8672-617b5b45243a","use":"enc","alg":"A128GCM","k":"XctOhJAkA-pD9Lh7ZgW_2A"},{"kty":"oct","kid":"81b20965-8332-43d9-a468-82160ad91ac8","use":"enc","alg":"A128KW","k":"GZy6sIZ6wl9NJOKB-jnmVQ"},{"kty":"oct","kid":"18ec08e1-bfa9-4d95-b205-2b4dd1d4321d","use":"enc","alg":"A256GCMKW","k":"qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8"}]} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.3.pwd: -------------------------------------------------------------------------------- 1 | "entrap_o–peter_long–credit_tun" -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.4.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImtpZCI6InBlcmVncmluLnRvb2tAdHVja2Jvcm91Z2guZXhhbXBsZSIsImVwayI6eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwieCI6InVCbzRrSFB3Nmtiang1bDB4b3dyZF9vWXpCbWF6LUdLRlp1NHhBRkZrYllpV2d1dEVLNml1RURzUTZ3TmROZzMiLCJ5Ijoic3AzcDVTR2haVkMyZmFYdW1JLWU5SlUyTW84S3BvWXJGRHI1eVBOVnRXNFBnRXdaT3lRVEEtSmRhWTh0YjdFMCJ9LCJlbmMiOiJBMTI4R0NNIn0.0DJjBXri_kBcC46IkU5_Jk9BqaQeHdv2.mH-G2zVqgztUtnW_.tkZuOO9h95OgHJmkkrfLBisku8rGf6nzVxhRM3sVOhXgz5NJ76oID7lpnAi_cPWJRCjSpAaUZ5dOR3Spy7QuEkmKx8-3RCMhSYMzsXaEwDdXta9Mn5B7cCBoJKB0IgEnj_qfo1hIi-uEkUpOZ8aLTZGHfpl05jMwbKkTe2yK3mjF6SBAsgicQDVCkcY9BLluzx1RmC3ORXaM0JaHPB93YcdSDGgpgBWMVrNU1ErkjcMqMoT_wtCex3w03XdLkjXIuEr2hWgeP-nkUZTPU9EoGSPj6fAS-bSz87RCPrxZdj_iVyC6QWcqAu07WNhjzJEPc4jVntRJ6K53NgPQ5p99l3Z408OUqj4ioYezbS6vTPlQ.WuGzxmcreYjpHGJoa17EBg -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.4.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImtpZCI6InBlcmVncmluLnRvb2tAdHVja2Jvcm91Z2guZXhhbXBsZSIsImVwayI6eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwieCI6InVCbzRrSFB3Nmtiang1bDB4b3dyZF9vWXpCbWF6LUdLRlp1NHhBRkZrYllpV2d1dEVLNml1RURzUTZ3TmROZzMiLCJ5Ijoic3AzcDVTR2haVkMyZmFYdW1JLWU5SlUyTW84S3BvWXJGRHI1eVBOVnRXNFBnRXdaT3lRVEEtSmRhWTh0YjdFMCJ9LCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"0DJjBXri_kBcC46IkU5_Jk9BqaQeHdv2","iv":"mH-G2zVqgztUtnW_","ciphertext":"tkZuOO9h95OgHJmkkrfLBisku8rGf6nzVxhRM3sVOhXgz5NJ76oID7lpnAi_cPWJRCjSpAaUZ5dOR3Spy7QuEkmKx8-3RCMhSYMzsXaEwDdXta9Mn5B7cCBoJKB0IgEnj_qfo1hIi-uEkUpOZ8aLTZGHfpl05jMwbKkTe2yK3mjF6SBAsgicQDVCkcY9BLluzx1RmC3ORXaM0JaHPB93YcdSDGgpgBWMVrNU1ErkjcMqMoT_wtCex3w03XdLkjXIuEr2hWgeP-nkUZTPU9EoGSPj6fAS-bSz87RCPrxZdj_iVyC6QWcqAu07WNhjzJEPc4jVntRJ6K53NgPQ5p99l3Z408OUqj4ioYezbS6vTPlQ","tag":"WuGzxmcreYjpHGJoa17EBg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.4.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"0DJjBXri_kBcC46IkU5_Jk9BqaQeHdv2"}],"protected":"eyJhbGciOiJFQ0RILUVTK0ExMjhLVyIsImtpZCI6InBlcmVncmluLnRvb2tAdHVja2Jvcm91Z2guZXhhbXBsZSIsImVwayI6eyJrdHkiOiJFQyIsImNydiI6IlAtMzg0IiwieCI6InVCbzRrSFB3Nmtiang1bDB4b3dyZF9vWXpCbWF6LUdLRlp1NHhBRkZrYllpV2d1dEVLNml1RURzUTZ3TmROZzMiLCJ5Ijoic3AzcDVTR2haVkMyZmFYdW1JLWU5SlUyTW84S3BvWXJGRHI1eVBOVnRXNFBnRXdaT3lRVEEtSmRhWTh0YjdFMCJ9LCJlbmMiOiJBMTI4R0NNIn0","iv":"mH-G2zVqgztUtnW_","ciphertext":"tkZuOO9h95OgHJmkkrfLBisku8rGf6nzVxhRM3sVOhXgz5NJ76oID7lpnAi_cPWJRCjSpAaUZ5dOR3Spy7QuEkmKx8-3RCMhSYMzsXaEwDdXta9Mn5B7cCBoJKB0IgEnj_qfo1hIi-uEkUpOZ8aLTZGHfpl05jMwbKkTe2yK3mjF6SBAsgicQDVCkcY9BLluzx1RmC3ORXaM0JaHPB93YcdSDGgpgBWMVrNU1ErkjcMqMoT_wtCex3w03XdLkjXIuEr2hWgeP-nkUZTPU9EoGSPj6fAS-bSz87RCPrxZdj_iVyC6QWcqAu07WNhjzJEPc4jVntRJ6K53NgPQ5p99l3Z408OUqj4ioYezbS6vTPlQ","tag":"WuGzxmcreYjpHGJoa17EBg"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.4.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","kid":"peregrin.took@tuckborough.example","use":"enc","crv":"P-384","x":"YU4rRUzdmVqmRtWOs2OpDE_T5fsNIodcG8G5FWPrTPMyxpzsSOGaQLpe2FpxBmu2","y":"A8-yxCHxkfBz3hKZfI1jUYMjUhsEveZ9THuwFjH2sCNdtksRJU7D5-SkgaFL1ETP","d":"iTx2pk7wW-GqJkHcEkFQb2EFyYcO7RugmaW3mRrQVAOUiPommT0IdnYK2xDlZh-j"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.4.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.5.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJFQ0RILUVTIiwia2lkIjoibWVyaWFkb2MuYnJhbmR5YnVja0BidWNrbGFuZC5leGFtcGxlIiwiZXBrIjp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoibVBVS1RfYkFXR0hJaGcwVHBqanFWc1AxclhXUXVfdndWT0hIdE5rZFlvQSIsInkiOiI4QlFBc0ltR2VBUzQ2ZnlXdzVNaFlmR1RUMElqQnBGdzJTUzM0RHY0SXJzIn0sImVuYyI6IkExMjhDQkMtSFMyNTYifQ..yc9N8v5sYyv3iGQT926IUg.BoDlwPnTypYq-ivjmQvAYJLb5Q6l-F3LIgQomlz87yW4OPKbWE1zSTEFjDfhU9IPIOSA9Bml4m7iDFwA-1ZXvHteLDtw4R1XRGMEsDIqAYtskTTmzmzNa-_q4F_evAPUmwlO-ZG45Mnq4uhM1fm_D9rBtWolqZSF3xGNNkpOMQKF1Cl8i8wjzRli7-IXgyirlKQsbhhqRzkv8IcY6aHl24j03C-AR2le1r7URUhArM79BY8soZU0lzwI-sD5PZ3l4NDCCei9XkoIAfsXJWmySPoeRb2Ni5UZL4mYpvKDiwmyzGd65KqVw7MsFfI_K767G9C9Azp73gKZD0DyUn1mn0WW5LmyX_yJ-3AROq8p1WZBfG-ZyJ6195_JGG2m9Csg.WCCkNa-x4BeB9hIDIfFuhg -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.5.jweg: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJFQ0RILUVTIiwia2lkIjoibWVyaWFkb2MuYnJhbmR5YnVja0BidWNrbGFuZC5leGFtcGxlIiwiZXBrIjp7Imt0eSI6IkVDIiwiY3J2IjoiUC0yNTYiLCJ4IjoibVBVS1RfYkFXR0hJaGcwVHBqanFWc1AxclhXUXVfdndWT0hIdE5rZFlvQSIsInkiOiI4QlFBc0ltR2VBUzQ2ZnlXdzVNaFlmR1RUMElqQnBGdzJTUzM0RHY0SXJzIn0sImVuYyI6IkExMjhDQkMtSFMyNTYifQ","iv":"yc9N8v5sYyv3iGQT926IUg","ciphertext":"BoDlwPnTypYq-ivjmQvAYJLb5Q6l-F3LIgQomlz87yW4OPKbWE1zSTEFjDfhU9IPIOSA9Bml4m7iDFwA-1ZXvHteLDtw4R1XRGMEsDIqAYtskTTmzmzNa-_q4F_evAPUmwlO-ZG45Mnq4uhM1fm_D9rBtWolqZSF3xGNNkpOMQKF1Cl8i8wjzRli7-IXgyirlKQsbhhqRzkv8IcY6aHl24j03C-AR2le1r7URUhArM79BY8soZU0lzwI-sD5PZ3l4NDCCei9XkoIAfsXJWmySPoeRb2Ni5UZL4mYpvKDiwmyzGd65KqVw7MsFfI_K767G9C9Azp73gKZD0DyUn1mn0WW5LmyX_yJ-3AROq8p1WZBfG-ZyJ6195_JGG2m9Csg","tag":"WCCkNa-x4BeB9hIDIfFuhg"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.5.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"EC","kid":"meriadoc.brandybuck@buckland.example","use":"enc","crv":"P-256","x":"Ze2loSV3wrroKUN_4zhwGhCqo3Xhu1td4QjeQ5wIVR0","y":"HlLtdXARY_f55A3fnzQbPcm6hgr34Mp8p-nuzQCE0Zw","d":"r_kHyZ-a06rmxM3yESK84r1otSg-aQcVStkRhA-iCM8"} -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.5.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.6.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJkaXIiLCJraWQiOiI3N2M3ZTJiOC02ZTEzLTQ1Y2YtODY3Mi02MTdiNWI0NTI0M2EiLCJlbmMiOiJBMTI4R0NNIn0..refa467QzzKx6QAB.JW_i_f52hww_ELQPGaYyeAB6HYGcR559l9TYnSovc23XJoBcW29rHP8yZOZG7YhLpT1bjFuvZPjQS-m0IFtVcXkZXdH_lr_FrdYt9HRUYkshtrMmIUAyGmUnd9zMDB2n0cRDIHAzFVeJUDxkUwVAE7_YGRPdcqMyiBoCO-FBdE-Nceb4h3-FtBP-c_BIwCPTjb9o0SbdcdREEMJMyZBH8ySWMVi1gPD9yxi-aQpGbSv_F9N4IZAxscj5g-NJsUPbjk29-s7LJAGb15wEBtXphVCgyy53CoIKLHHeJHXex45Uz9aKZSRSInZI-wjsY0yu3cT4_aQ3i1o-tiE-F8Ios61EKgyIQ4CWao8PFMj8TTnp.vbb32Xvllea2OtmHAdccRQ -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.6.jweg: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJkaXIiLCJraWQiOiI3N2M3ZTJiOC02ZTEzLTQ1Y2YtODY3Mi02MTdiNWI0NTI0M2EiLCJlbmMiOiJBMTI4R0NNIn0","iv":"refa467QzzKx6QAB","ciphertext":"JW_i_f52hww_ELQPGaYyeAB6HYGcR559l9TYnSovc23XJoBcW29rHP8yZOZG7YhLpT1bjFuvZPjQS-m0IFtVcXkZXdH_lr_FrdYt9HRUYkshtrMmIUAyGmUnd9zMDB2n0cRDIHAzFVeJUDxkUwVAE7_YGRPdcqMyiBoCO-FBdE-Nceb4h3-FtBP-c_BIwCPTjb9o0SbdcdREEMJMyZBH8ySWMVi1gPD9yxi-aQpGbSv_F9N4IZAxscj5g-NJsUPbjk29-s7LJAGb15wEBtXphVCgyy53CoIKLHHeJHXex45Uz9aKZSRSInZI-wjsY0yu3cT4_aQ3i1o-tiE-F8Ios61EKgyIQ4CWao8PFMj8TTnp","tag":"vbb32Xvllea2OtmHAdccRQ"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.6.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","kid":"77c7e2b8-6e13-45cf-8672-617b5b45243a","use":"enc","alg":"A128GCM","k":"XctOhJAkA-pD9Lh7ZgW_2A"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.6.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.7.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJBMjU2R0NNS1ciLCJraWQiOiIxOGVjMDhlMS1iZmE5LTRkOTUtYjIwNS0yYjRkZDFkNDMyMWQiLCJ0YWciOiJrZlBkdVZRM1QzSDZ2bmV3dC0ta3N3IiwiaXYiOiJLa1lUMEdYXzJqSGxmcU5fIiwiZW5jIjoiQTEyOENCQy1IUzI1NiJ9.lJf3HbOApxMEBkCMOoTnnABxs_CvTWUmZQ2ElLvYNok.gz6NjyEFNm_vm8Gj6FwoFQ.Jf5p9-ZhJlJy_IQ_byKFmI0Ro7w7G1QiaZpI8OaiVgD8EqoDZHyFKFBupS8iaEeVIgMqWmsuJKuoVgzR3YfzoMd3GxEm3VxNhzWyWtZKX0gxKdy6HgLvqoGNbZCzLjqcpDiF8q2_62EVAbr2uSc2oaxFmFuIQHLcqAHxy51449xkjZ7ewzZaGV3eFqhpco8o4DijXaG5_7kp3h2cajRfDgymuxUbWgLqaeNQaJtvJmSMFuEOSAzw9Hdeb6yhdTynCRmu-kqtO5Dec4lT2OMZKpnxc_F1_4yDJFcqb5CiDSmA-psB2k0JtjxAj4UPI61oONK7zzFIu4gBfjJCndsZfdvG7h8wGjV98QhrKEnR7xKZ3KCr0_qR1B-gxpNk3xWU.DKW7jrb4WaRSNfbXVPlT5g -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.7.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJBMjU2R0NNS1ciLCJraWQiOiIxOGVjMDhlMS1iZmE5LTRkOTUtYjIwNS0yYjRkZDFkNDMyMWQiLCJ0YWciOiJrZlBkdVZRM1QzSDZ2bmV3dC0ta3N3IiwiaXYiOiJLa1lUMEdYXzJqSGxmcU5fIiwiZW5jIjoiQTEyOENCQy1IUzI1NiJ9","encrypted_key":"lJf3HbOApxMEBkCMOoTnnABxs_CvTWUmZQ2ElLvYNok","iv":"gz6NjyEFNm_vm8Gj6FwoFQ","ciphertext":"Jf5p9-ZhJlJy_IQ_byKFmI0Ro7w7G1QiaZpI8OaiVgD8EqoDZHyFKFBupS8iaEeVIgMqWmsuJKuoVgzR3YfzoMd3GxEm3VxNhzWyWtZKX0gxKdy6HgLvqoGNbZCzLjqcpDiF8q2_62EVAbr2uSc2oaxFmFuIQHLcqAHxy51449xkjZ7ewzZaGV3eFqhpco8o4DijXaG5_7kp3h2cajRfDgymuxUbWgLqaeNQaJtvJmSMFuEOSAzw9Hdeb6yhdTynCRmu-kqtO5Dec4lT2OMZKpnxc_F1_4yDJFcqb5CiDSmA-psB2k0JtjxAj4UPI61oONK7zzFIu4gBfjJCndsZfdvG7h8wGjV98QhrKEnR7xKZ3KCr0_qR1B-gxpNk3xWU","tag":"DKW7jrb4WaRSNfbXVPlT5g"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.7.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"lJf3HbOApxMEBkCMOoTnnABxs_CvTWUmZQ2ElLvYNok"}],"protected":"eyJhbGciOiJBMjU2R0NNS1ciLCJraWQiOiIxOGVjMDhlMS1iZmE5LTRkOTUtYjIwNS0yYjRkZDFkNDMyMWQiLCJ0YWciOiJrZlBkdVZRM1QzSDZ2bmV3dC0ta3N3IiwiaXYiOiJLa1lUMEdYXzJqSGxmcU5fIiwiZW5jIjoiQTEyOENCQy1IUzI1NiJ9","iv":"gz6NjyEFNm_vm8Gj6FwoFQ","ciphertext":"Jf5p9-ZhJlJy_IQ_byKFmI0Ro7w7G1QiaZpI8OaiVgD8EqoDZHyFKFBupS8iaEeVIgMqWmsuJKuoVgzR3YfzoMd3GxEm3VxNhzWyWtZKX0gxKdy6HgLvqoGNbZCzLjqcpDiF8q2_62EVAbr2uSc2oaxFmFuIQHLcqAHxy51449xkjZ7ewzZaGV3eFqhpco8o4DijXaG5_7kp3h2cajRfDgymuxUbWgLqaeNQaJtvJmSMFuEOSAzw9Hdeb6yhdTynCRmu-kqtO5Dec4lT2OMZKpnxc_F1_4yDJFcqb5CiDSmA-psB2k0JtjxAj4UPI61oONK7zzFIu4gBfjJCndsZfdvG7h8wGjV98QhrKEnR7xKZ3KCr0_qR1B-gxpNk3xWU","tag":"DKW7jrb4WaRSNfbXVPlT5g"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.7.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","kid":"18ec08e1-bfa9-4d95-b205-2b4dd1d4321d","use":"enc","alg":"A256GCMKW","k":"qC57l_uxcm7Nm3K-ct4GFjx8tM1U8CZ0NLBvdQstiS8"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.7.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.8.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0.CBI6oDw8MydIx1IBntf_lQcw2MmJKIQx.Qx0pmsDa8KnJc9Jo.AwliP-KmWgsZ37BvzCefNen6VTbRK3QMA4TkvRkH0tP1bTdhtFJgJxeVmJkLD61A1hnWGetdg11c9ADsnWgL56NyxwSYjU1ZEHcGkd3EkU0vjHi9gTlb90qSYFfeF0LwkcTtjbYKCsiNJQkcIp1yeM03OmuiYSoYJVSpf7ej6zaYcMv3WwdxDFl8REwOhNImk2Xld2JXq6BR53TSFkyT7PwVLuq-1GwtGHlQeg7gDT6xW0JqHDPn_H-puQsmthc9Zg0ojmJfqqFvETUxLAF-KjcBTS5dNy6egwkYtOt8EIHK-oEsKYtZRaa8Z7MOZ7UGxGIMvEmxrGCPeJa14slv2-gaqK0kEThkaSqdYw0FkQZF.ER7MWJZ1FBI_NKvn7Zb1Lw -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.8.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0","encrypted_key":"CBI6oDw8MydIx1IBntf_lQcw2MmJKIQx","iv":"Qx0pmsDa8KnJc9Jo","ciphertext":"AwliP-KmWgsZ37BvzCefNen6VTbRK3QMA4TkvRkH0tP1bTdhtFJgJxeVmJkLD61A1hnWGetdg11c9ADsnWgL56NyxwSYjU1ZEHcGkd3EkU0vjHi9gTlb90qSYFfeF0LwkcTtjbYKCsiNJQkcIp1yeM03OmuiYSoYJVSpf7ej6zaYcMv3WwdxDFl8REwOhNImk2Xld2JXq6BR53TSFkyT7PwVLuq-1GwtGHlQeg7gDT6xW0JqHDPn_H-puQsmthc9Zg0ojmJfqqFvETUxLAF-KjcBTS5dNy6egwkYtOt8EIHK-oEsKYtZRaa8Z7MOZ7UGxGIMvEmxrGCPeJa14slv2-gaqK0kEThkaSqdYw0FkQZF","tag":"ER7MWJZ1FBI_NKvn7Zb1Lw"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.8.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"CBI6oDw8MydIx1IBntf_lQcw2MmJKIQx"}],"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIn0","iv":"Qx0pmsDa8KnJc9Jo","ciphertext":"AwliP-KmWgsZ37BvzCefNen6VTbRK3QMA4TkvRkH0tP1bTdhtFJgJxeVmJkLD61A1hnWGetdg11c9ADsnWgL56NyxwSYjU1ZEHcGkd3EkU0vjHi9gTlb90qSYFfeF0LwkcTtjbYKCsiNJQkcIp1yeM03OmuiYSoYJVSpf7ej6zaYcMv3WwdxDFl8REwOhNImk2Xld2JXq6BR53TSFkyT7PwVLuq-1GwtGHlQeg7gDT6xW0JqHDPn_H-puQsmthc9Zg0ojmJfqqFvETUxLAF-KjcBTS5dNy6egwkYtOt8EIHK-oEsKYtZRaa8Z7MOZ7UGxGIMvEmxrGCPeJa14slv2-gaqK0kEThkaSqdYw0FkQZF","tag":"ER7MWJZ1FBI_NKvn7Zb1Lw"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.8.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"oct","kid":"81b20965-8332-43d9-a468-82160ad91ac8","use":"enc","alg":"A128KW","k":"GZy6sIZ6wl9NJOKB-jnmVQ"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.8.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.9.jwec: -------------------------------------------------------------------------------- 1 | eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIiwiemlwIjoiREVGIn0.5vUT2WOtQxKWcekM_IzVQwkGgzlFDwPi.p9pUq6XHY0jfEZIl.HbDtOsdai1oYziSx25KEeTxmwnh8L8jKMFNc1k3zmMI6VB8hry57tDZ61jXyezSPt0fdLVfe6Jf5y5-JaCap_JQBcb5opbmT60uWGml8blyiMQmOn9J--XhhlYg0m-BHaqfDO5iTOWxPxFMUedx7WCy8mxgDHj0aBMG6152PsM-w5E_o2B3jDbrYBKhpYA7qi3AyijnCJ7BP9rr3U8kxExCpG3mK420TjOw.VILuUwuIxaLVmh5X-T7kmA -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.9.jwef: -------------------------------------------------------------------------------- 1 | {"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIiwiemlwIjoiREVGIn0","encrypted_key":"5vUT2WOtQxKWcekM_IzVQwkGgzlFDwPi","iv":"p9pUq6XHY0jfEZIl","ciphertext":"HbDtOsdai1oYziSx25KEeTxmwnh8L8jKMFNc1k3zmMI6VB8hry57tDZ61jXyezSPt0fdLVfe6Jf5y5-JaCap_JQBcb5opbmT60uWGml8blyiMQmOn9J--XhhlYg0m-BHaqfDO5iTOWxPxFMUedx7WCy8mxgDHj0aBMG6152PsM-w5E_o2B3jDbrYBKhpYA7qi3AyijnCJ7BP9rr3U8kxExCpG3mK420TjOw","tag":"VILuUwuIxaLVmh5X-T7kmA"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.9.jweg: -------------------------------------------------------------------------------- 1 | {"recipients":[{"encrypted_key":"5vUT2WOtQxKWcekM_IzVQwkGgzlFDwPi"}],"protected":"eyJhbGciOiJBMTI4S1ciLCJraWQiOiI4MWIyMDk2NS04MzMyLTQzZDktYTQ2OC04MjE2MGFkOTFhYzgiLCJlbmMiOiJBMTI4R0NNIiwiemlwIjoiREVGIn0","iv":"p9pUq6XHY0jfEZIl","ciphertext":"HbDtOsdai1oYziSx25KEeTxmwnh8L8jKMFNc1k3zmMI6VB8hry57tDZ61jXyezSPt0fdLVfe6Jf5y5-JaCap_JQBcb5opbmT60uWGml8blyiMQmOn9J--XhhlYg0m-BHaqfDO5iTOWxPxFMUedx7WCy8mxgDHj0aBMG6152PsM-w5E_o2B3jDbrYBKhpYA7qi3AyijnCJ7BP9rr3U8kxExCpG3mK420TjOw","tag":"VILuUwuIxaLVmh5X-T7kmA"} 2 | -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.9.jwk: -------------------------------------------------------------------------------- 1 | rfc7520_5.8.jwk -------------------------------------------------------------------------------- /tests/vectors/rfc7520_5.9.pt: -------------------------------------------------------------------------------- 1 | rfc7520_5.1.pt -------------------------------------------------------------------------------- /tests/vectors/rfc7638_3.1.jwk: -------------------------------------------------------------------------------- 1 | {"kty":"RSA","n":"0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAtVT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn64tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FDW2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n91CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINHaQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw","e":"AQAB","alg":"RS256","kid":"2011-04-29"} -------------------------------------------------------------------------------- /tests/vectors/rfc7638_3.1.thp: -------------------------------------------------------------------------------- 1 | NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs -------------------------------------------------------------------------------- /tests/vectors/strip.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | while [ $# -gt 0 ]; do 4 | tmp=`tr -d ' \n\r' < $1` 5 | printf '%s' "$tmp" > $1 6 | shift 7 | done 8 | --------------------------------------------------------------------------------