ervu-sign-module/src/utils/jwt.c

75 lines
1.8 KiB
C

#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;
}