in source/azure_iot_provisioning_client.c [644:712]
static uint32_t prvProvClientGetToken( AzureIoTProvisioningClient_t * pxAzureProvClient,
uint64_t ullExpiryTimeSecs,
const uint8_t * ucKey,
uint32_t ulKeyLen,
uint8_t * pucSASBuffer,
uint32_t ulSasBufferLen,
uint32_t * pulSaSLength )
{
uint8_t * pucHMACBuffer;
az_span xSpan = az_span_create( pucSASBuffer, ( int32_t ) ulSasBufferLen );
az_result xCoreResult;
uint32_t ulBytesUsed;
uint32_t ulSignatureLength;
uint32_t ulBufferLeft;
size_t xLength;
xCoreResult = az_iot_provisioning_client_sas_get_signature( &( pxAzureProvClient->_internal.xProvisioningClientCore ),
ullExpiryTimeSecs, xSpan, &xSpan );
if( az_result_failed( xCoreResult ) )
{
AZLogError( ( "AzureIoTProvisioning failed to get signature: core error=0x%08x", ( uint16_t ) xCoreResult ) );
return AzureIoT_TranslateCoreError( xCoreResult );
}
ulBytesUsed = ( uint32_t ) az_span_size( xSpan );
ulBufferLeft = ulSasBufferLen - ulBytesUsed;
if( ulBufferLeft < azureiotprovisioningHMACBufferLength )
{
AZLogError( ( "AzureIoTProvisioning token generation failed with insufficient buffer size" ) );
return eAzureIoTErrorOutOfMemory;
}
/* Calculate HMAC at the end of buffer, so we do less data movement when returning back to caller. */
ulBufferLeft -= azureiotprovisioningHMACBufferLength;
pucHMACBuffer = pucSASBuffer + ulSasBufferLen - azureiotprovisioningHMACBufferLength;
if( AzureIoT_Base64HMACCalculate( pxAzureProvClient->_internal.xHMACFunction,
ucKey, ulKeyLen, pucSASBuffer, ulBytesUsed, pucSASBuffer + ulBytesUsed, ulBufferLeft,
pucHMACBuffer, azureiotprovisioningHMACBufferLength,
&ulSignatureLength ) )
{
AZLogError( ( "AzureIoTProvisioning failed to encoded HMAC hash" ) );
return eAzureIoTErrorFailed;
}
if( ( ulSasBufferLen <= azureiotprovisioningHMACBufferLength ) )
{
AZLogError( ( "AzureIoTProvisioning failed with insufficient buffer size" ) );
return eAzureIoTErrorOutOfMemory;
}
xSpan = az_span_create( pucHMACBuffer, ( int32_t ) ulSignatureLength );
xCoreResult = az_iot_provisioning_client_sas_get_password( &( pxAzureProvClient->_internal.xProvisioningClientCore ),
xSpan, ullExpiryTimeSecs, AZ_SPAN_EMPTY, ( char * ) pucSASBuffer,
ulSasBufferLen - azureiotprovisioningHMACBufferLength,
&xLength );
if( az_result_failed( xCoreResult ) )
{
AZLogError( ( "AzureIoTProvisioning failed to generate token: core error=0x%08x", ( uint16_t ) xCoreResult ) );
return AzureIoT_TranslateCoreError( xCoreResult );
}
*pulSaSLength = ( uint32_t ) xLength;
return eAzureIoTSuccess;
}