in source/azure_iot_hub_client.c [511:580]
static uint32_t prvIoTHubClientGetToken( AzureIoTHubClient_t * pxAzureIoTHubClient,
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 ulSignatureLength;
uint32_t ulBytesUsed;
uint32_t ulBufferLeft;
size_t xLength;
xCoreResult = az_iot_hub_client_sas_get_signature( &( pxAzureIoTHubClient->_internal.xAzureIoTHubClientCore ),
ullExpiryTimeSecs, xSpan, &xSpan );
if( az_result_failed( xCoreResult ) )
{
AZLogError( ( "AzureIoTHubClient 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 < azureiothubHMACBufferLength )
{
AZLogError( ( "AzureIoTHubClient 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 -= azureiothubHMACBufferLength;
pucHMACBuffer = pucSASBuffer + ulSasBufferLen - azureiothubHMACBufferLength;
if( AzureIoT_Base64HMACCalculate( pxAzureIoTHubClient->_internal.xHMACFunction,
ucKey, ulKeyLen, pucSASBuffer, ulBytesUsed,
pucSASBuffer + ulBytesUsed, ulBufferLeft,
pucHMACBuffer, azureiothubHMACBufferLength,
&ulSignatureLength ) != eAzureIoTSuccess )
{
AZLogError( ( "AzureIoTHubClient failed to encode HMAC hash" ) );
return eAzureIoTErrorFailed;
}
if( ( ulSasBufferLen <= azureiothubHMACBufferLength ) )
{
AZLogError( ( "AzureIoTHubClient failed with insufficient buffer size" ) );
return eAzureIoTErrorOutOfMemory;
}
xSpan = az_span_create( pucHMACBuffer, ( int32_t ) ulSignatureLength );
xCoreResult = az_iot_hub_client_sas_get_password( &( pxAzureIoTHubClient->_internal.xAzureIoTHubClientCore ),
ullExpiryTimeSecs, xSpan, AZ_SPAN_EMPTY, ( char * ) pucSASBuffer,
ulSasBufferLen - azureiothubHMACBufferLength,
&xLength );
if( az_result_failed( xCoreResult ) )
{
AZLogError( ( "AzureIoTHubClient failed to generate token: core error=0x%08x", ( uint16_t ) xCoreResult ) );
return AzureIoT_TranslateCoreError( xCoreResult );
}
*pulSaSLength = ( uint32_t ) xLength;
return eAzureIoTSuccess;
}