summaryrefslogtreecommitdiff
path: root/src/jwk/libwebidoidc-jwk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/jwk/libwebidoidc-jwk.c')
-rw-r--r--src/jwk/libwebidoidc-jwk.c14
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 */