static CK_RV prvGetCertificateHandle()

in components/ota_pal/source/ota_pal.c [101:175]


static CK_RV prvGetCertificateHandle(CK_FUNCTION_LIST_PTR pxFunctionList,
                                     CK_SESSION_HANDLE xSession,
                                     const char *pcLabelName,
                                     CK_OBJECT_HANDLE_PTR pxCertHandle);
static CK_RV prvGetCertificate(const char *pcLabelName,
                               uint8_t **ppucData,
                               uint32_t *pulDataSize);


static bool prvIsPatchFile( const char *pFilePath );
static OtaPalStatus_t prvCreatePatchFile( OtaFileContext_t *const pFileContext );
static OtaPalStatus_t prvCreateOtaFile( OtaFileContext_t *const pFileContext );
static int prvfseek( esp_partition_context_t *fileCtx, long int offset, int whence );
static size_t prvfread( void *buffer, size_t size, size_t count, esp_partition_context_t *pCtx );
static size_t prvfwrite( const void *buffer, size_t size, size_t count, esp_partition_context_t *pCtx );
static long int prvftell( esp_partition_context_t *pCtx );
static uint32_t prvGetRunningPartitionSize( void );
static void prvPatchProgress( uint8_t pct );
static int prvApplyPatch( void );

static OtaPalMainStatus_t asn1_to_raw_ecdsa(uint8_t *signature,
                                            uint16_t sig_len,
                                            uint8_t *out_signature)
{
    int ret = 0;
    const unsigned char *end = signature + sig_len;
    size_t len;
    mbedtls_mpi r = {0};
    mbedtls_mpi s = {0};

    if (out_signature == NULL)
    {
        LogError(("ASN1 invalid argument !"));
        goto cleanup;
    }

    mbedtls_mpi_init(&r);
    mbedtls_mpi_init(&s);

    if ((ret = mbedtls_asn1_get_tag(&signature, end, &len,
                                    MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SEQUENCE)) != 0)
    {
        LogError(("Bad Input Signature"));
        goto cleanup;
    }

    if (signature + len != end)
    {
        LogError(("Incorrect ASN1 Signature Length"));
        goto cleanup;
    }

    if (((ret = mbedtls_asn1_get_mpi(&signature, end, &r)) != 0) ||
        ((ret = mbedtls_asn1_get_mpi(&signature, end, &s)) != 0))
    {
        LogError(("ASN1 parsing failed"));
        goto cleanup;
    }

    ret = mbedtls_mpi_write_binary(&r, out_signature, ECDSA_INTEGER_LEN);
    ret = mbedtls_mpi_write_binary(&s, out_signature + ECDSA_INTEGER_LEN, ECDSA_INTEGER_LEN);

cleanup:
    mbedtls_mpi_free(&r);
    mbedtls_mpi_free(&s);

    if (ret == 0)
    {
        return OtaPalSuccess;
    }
    else
    {
        return OtaPalBadSignerCert;
    }
}