From d36c331137eb2016d044ce948cf0989c23fecab0 Mon Sep 17 00:00:00 2001 From: Vivien Kraus Date: Wed, 1 Jan 2020 00:00:00 +0100 Subject: Add a function to hash a public key for DPoP. --- src/jwk/ChangeLog | 4 ++++ src/jwk/generate-key.c | 4 ++++ src/jwk/libwebidoidc-jwk.c | 14 ++++++++++++++ 3 files changed, 22 insertions(+) (limited to 'src/jwk') diff --git a/src/jwk/ChangeLog b/src/jwk/ChangeLog index ebd0873..88b04e0 100644 --- a/src/jwk/ChangeLog +++ b/src/jwk/ChangeLog @@ -6,6 +6,10 @@ 2020-11-25 Vivien Kraus + * libwebidoidc-jwk.c (jkt): Implement the jkt function. + + * generate-key.c (run): display the hash of the key. + * libwebidoidc-jwk.c: new file. Add the strip function. diff --git a/src/jwk/generate-key.c b/src/jwk/generate-key.c index ec8ce76..e875b24 100644 --- a/src/jwk/generate-key.c +++ b/src/jwk/generate-key.c @@ -10,6 +10,8 @@ #define _(s) gettext (s) SCM webidoidc_generate_key_g (SCM args); +SCM webidoidc_strip_key_g (SCM key); +SCM webidoidc_jkt_g (SCM key); extern int init_webidoidc (void); @@ -48,6 +50,8 @@ run (void *params, int argc, char *argv[]) (scm_from_utf8_keyword ("n-size"), scm_from_size_t (n_size))); } + scm_display (webidoidc_jkt_g (data), scm_current_error_port ()); + fprintf (stderr, "\n"); scm_display (data, scm_current_output_port ()); } 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 */ -- cgit v1.2.3