static bool ExtractJWSSections()

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