diff options
Diffstat (limited to 'src/jwk/libwebidoidc-jwk.c')
-rw-r--r-- | src/jwk/libwebidoidc-jwk.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/jwk/libwebidoidc-jwk.c b/src/jwk/libwebidoidc-jwk.c index 84da5da..71cb71c 100644 --- a/src/jwk/libwebidoidc-jwk.c +++ b/src/jwk/libwebidoidc-jwk.c @@ -3,6 +3,7 @@ #define _(s) dgettext (PACKAGE, s) void webid_oidc_random (size_t len, uint8_t * dst); +SCM webidoidc_hash_g (SCM alg, SCM payload); /* Register "generate-key", a guile function to generate a keypair. */ void init_webidoidc_jwk (void); @@ -173,9 +174,22 @@ SCM_DEFINE (webidoidc_strip_key_g, "strip-key", 1, 0, 0, (SCM key), scm_throw (unsupported_kty, scm_list_1 (key)); } +static SCM scm_to_json_string; + +SCM_SYMBOL (sha256, "SHA-256"); + +SCM_DEFINE (webidoidc_jkt_g, "jkt", 1, 0, 0, (SCM key), "Hash a public key.") +{ + SCM stripped = webidoidc_strip_key_g (key); + SCM as_json = scm_call_1 (scm_to_json_string, stripped); + SCM as_bytevector = scm_string_to_utf8 (as_json); + return webidoidc_hash_g (sha256, as_bytevector); +} + void init_webidoidc_jwk (void) { + scm_to_json_string = scm_c_public_ref ("json", "scm->json-string"); #ifndef SCM_MAGIC_SNARFER #include "libwebidoidc-jwk.x" #endif /* not SCM_MAGIC_SNARFER */ |