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