in source/sigv4.c [2281:2328]
static SigV4Status_t completeHashAndHexEncode( const char * pInput,
size_t inputLen,
char * pOutput,
size_t * pOutputLen,
const SigV4CryptoInterface_t * pCryptoInterface )
{
SigV4Status_t returnStatus = SigV4Success;
/* Used to store the hash of the request payload. */
uint8_t hashBuffer[ SIGV4_HASH_MAX_DIGEST_LENGTH ];
SigV4String_t originalHash;
SigV4String_t hexEncodedHash;
assert( pOutput != NULL );
assert( pOutputLen != NULL );
assert( pCryptoInterface != NULL );
assert( pCryptoInterface->hashInit != NULL );
assert( pCryptoInterface->hashUpdate != NULL );
assert( pCryptoInterface->hashFinal != NULL );
originalHash.pData = ( char * ) hashBuffer;
originalHash.dataLen = pCryptoInterface->hashDigestLen;
hexEncodedHash.pData = pOutput;
hexEncodedHash.dataLen = *pOutputLen;
if( completeHash( ( const uint8_t * ) pInput,
inputLen,
hashBuffer,
pCryptoInterface->hashDigestLen,
pCryptoInterface ) != 0 )
{
returnStatus = SigV4HashError;
}
if( returnStatus == SigV4Success )
{
/* Hex-encode the request payload. */
returnStatus = lowercaseHexEncode( &originalHash,
&hexEncodedHash );
}
if( returnStatus == SigV4Success )
{
assert( hexEncodedHash.dataLen == pCryptoInterface->hashDigestLen * 2U );
*pOutputLen = hexEncodedHash.dataLen;
}
return returnStatus;
}