This adds support for HMAC algorithms in jws_b64_protected(), but also
makes nonce field optional, because it isn't needed in some cases where
HMAC is used, primarily ACME EAB requires that nonce field must not
exist.
---
src/jws.c | 34 ++++++++++++++--------------------
1 file changed, 14 insertions(+), 20 deletions(-)
diff --git a/src/jws.c b/src/jws.c
index e4ea30de6..31808a4e3 100644
--- a/src/jws.c
+++ b/src/jws.c
@@ -219,6 +219,7 @@ size_t EVP_PKEY_to_pub_jwk(EVP_PKEY *pkey, char *dst,
size_t dsize)
/*
* Generate the JWS payload and converts it to base64url.
* Use either <kid> or <jwk>, but won't use both
+ * <nonce> is optional.
*
* Return the size of the data or 0
*/
@@ -226,13 +227,14 @@ size_t EVP_PKEY_to_pub_jwk(EVP_PKEY *pkey, char *dst,
size_t dsize)
size_t jws_b64_protected(enum jwt_alg alg, char *kid, char *jwk, char *nonce,
char *url,
char *dst, size_t dsize)
{
- char *acc;
- char *acctype;
int ret = 0;
struct buffer *json = NULL;
const char *algstr;
switch (alg) {
+ case JWS_ALG_HS256: algstr = "HS256"; break;
+ case JWS_ALG_HS384: algstr = "HS384"; break;
+ case JWS_ALG_HS512: algstr = "HS512"; break;
case JWS_ALG_RS256: algstr = "RS256"; break;
case JWS_ALG_RS384: algstr = "RS384"; break;
case JWS_ALG_RS512: algstr = "RS512"; break;
@@ -246,24 +248,16 @@ size_t jws_b64_protected(enum jwt_alg alg, char *kid,
char *jwk, char *nonce, ch
if ((json = alloc_trash_chunk()) == NULL)
goto out;
- /* kid or jwk ? */
- acc = kid ? kid : jwk;
- acctype = kid ? "kid" : "jwk";
-
- ret = snprintf(json->area, json->size, "{\n"
- " \"alg\": \"%s\",\n"
- " \"%s\": %s%s%s,\n"
- " \"nonce\": \"%s\",\n"
- " \"url\": \"%s\"\n"
- "}\n",
- algstr, acctype, kid ? "\"" : "", acc, kid ? "\"" : "",
nonce, url);
- if (ret >= json->size) {
- ret = 0;
- goto out;
- }
-
-
- json->data = ret;
+ chunk_appendf(json, "{");
+ if (kid)
+ chunk_appendf(json, "\"kid\": \"%s\",", kid);
+ else
+ chunk_appendf(json, "\"jwk\": %s,", jwk);
+ if (nonce)
+ chunk_appendf(json, "\"nonce\": \"%s\",", nonce);
+ chunk_appendf(json, "\"alg\": \"%s\",", algstr);
+ chunk_appendf(json, "\"url\": \"%s\"", url);
+ chunk_appendf(json, "}");
ret = a2base64url(json->area, json->data, dst, dsize);
out:
--
2.53.0