75 lines
1.8 KiB
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;
|
|
}
|