#include "jwt.h" #include "json_parser.h" #include "logger.h" #define JWT_ALG_FIELD_NAME "alg" int jwt_get_header_payload_and_sign(const str_t *jwt, /*out*/ str_t *header, /*out*/ str_t *header_payload, /*out*/ str_t *sign) { LOG_TRACE("jwt_get_header_payload_and_sign enter"); size_t p_start = 0, p_end = 0; for (size_t i = 0; i < jwt->len; i++) { if (jwt->data[i] == '.') { if (p_start == 0) { p_start = i + 1; } else { p_end = i; break; } } } if (p_start == 0 || p_end == 0) { LOG_ERROR("Could not parse jwt. p_start = %zd, p_end = %zd", p_start, p_end); return -1; } header->data = (char*)jwt->data; header->len = p_start - 1; header_payload->data = (char*)jwt->data; header_payload->len = p_end; sign->data = (char*)jwt->data + p_end + 1; sign->len = jwt->len - p_end - 1; LOG_DEBUG("header: %.*s", (int) header->len, header->data); LOG_DEBUG("header_payload: %.*s", (int) header_payload->len, header_payload->data); LOG_DEBUG("sign: %.*s", (int) sign->len, sign->data); LOG_TRACE("jwt_get_header_payload_and_sign exit"); return 0; } int jwt_get_alg_from_header(const str_t *header, /*out*/ str_t *alg) { LOG_TRACE("jwt_get_alg_from_header enter"); Hjson_parser parser = json_parser_create(header->data, header->len); if (parser == NULL) { goto error; } if (json_get_string_member(parser, JWT_ALG_FIELD_NAME, alg)) { goto error; } json_parser_free(parser); LOG_TRACE("jwt_get_alg_from_header exit"); return 0; error: json_parser_free(parser); LOG_ERROR("jwt_get_alg_from_header exit with error"); return -1; }