diff --git a/subsys/jwt/jwt.c b/subsys/jwt/jwt.c index b8a7a33143c..e5411fc6267 100644 --- a/subsys/jwt/jwt.c +++ b/subsys/jwt/jwt.c @@ -127,16 +127,6 @@ static int base64_append_bytes(const char *bytes, size_t len, return 0; } -struct jwt_header { - char *typ; - char *alg; -}; - -static struct json_obj_descr jwt_header_desc[] = { - JSON_OBJ_DESCR_PRIM(struct jwt_header, alg, JSON_TOK_STRING), - JSON_OBJ_DESCR_PRIM(struct jwt_header, typ, JSON_TOK_STRING), -}; - struct jwt_payload { int32_t exp; int32_t iat; @@ -152,25 +142,31 @@ static struct json_obj_descr jwt_payload_desc[] = { /* * Add the JWT header to the buffer. */ -static void jwt_add_header(struct jwt_builder *builder) +static int jwt_add_header(struct jwt_builder *builder) { - static const struct jwt_header head = { - .typ = "JWT", + /* + * Pre-computed JWT header + * Use https://www.base64encode.org/ for update + */ + const char jwt_header[] = #ifdef CONFIG_JWT_SIGN_RSA - .alg = "RS256", + /* {"alg":"RS256","typ":"JWT"} */ + "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9"; #endif #ifdef CONFIG_JWT_SIGN_ECDSA - .alg = "ES256", + /* {"alg":"ES256","typ":"JWT"} */ + "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9"; #endif - }; + int jwt_header_len = ARRAY_SIZE(jwt_header); - int res = json_obj_encode(jwt_header_desc, ARRAY_SIZE(jwt_header_desc), - &head, base64_append_bytes, builder); - if (res != 0) { - /* Log an error here. */ - return; + if (jwt_header_len > builder->len) { + builder->overflowed = true; + return -ENOSPC; } - base64_flush(builder); + strcpy(builder->buf, jwt_header); + builder->buf += jwt_header_len - 1; + builder->len -= jwt_header_len - 1; + return 0; } int jwt_add_payload(struct jwt_builder *builder, @@ -314,7 +310,5 @@ int jwt_init_builder(struct jwt_builder *builder, builder->overflowed = false; builder->pending = 0; - jwt_add_header(builder); - - return 0; + return jwt_add_header(builder); }