in src/utils/jws_utils/src/jws_utils.c [110:190]
static bool ExtractJWSSections(const char* jws, char** header, char** payload, char** signature)
{
bool success = false;
*header = NULL;
*payload = NULL;
*signature = NULL;
if (jws == NULL)
{
goto done;
}
const size_t jwsLen = strlen(jws);
if (jwsLen == 0)
{
Log_Error("JWS zero len");
goto done;
}
char* headerEnd = NULL;
size_t headerLen = FindCharInString(jws, '.', &headerEnd);
if (headerLen == 0 || headerLen + 1 >= jwsLen)
{
Log_Error("Invalid header len");
goto done;
}
char* payloadEnd = NULL;
size_t payloadLen = FindCharInString((headerEnd + 1), '.', &payloadEnd);
if (payloadLen == 0 || (headerLen + payloadLen + 2 >= jwsLen))
{
Log_Error("Invalid payload len");
goto done;
}
// From payloadEnd to the end of jws is the signature
size_t sigLen = jwsLen - payloadLen - headerLen - 2; // 2 is for the periods
*header = (char*)malloc(headerLen + 1);
*payload = (char*)malloc(payloadLen + 1);
*signature = (char*)malloc(sigLen + 1);
if (*header == NULL || *payload == NULL || *signature == NULL)
{
Log_Error("NULL hdr, payload, or sig");
goto done;
}
ADUC_Safe_StrCopyN(*header, jws, headerLen + 1, headerLen);
ADUC_Safe_StrCopyN(*payload, (headerEnd + 1), payloadLen + 1, payloadLen);
ADUC_Safe_StrCopyN(*signature, (payloadEnd + 1), sigLen + 1, sigLen);
success = true;
done:
if (!success)
{
if (*header != NULL)
{
free(*header);
*header = NULL;
}
if (*payload != NULL)
{
free(*payload);
*payload = NULL;
}
if (*signature != NULL)
{
free(*signature);
*signature = NULL;
}
}
return success;
}