in source/ota_base64.c [316:402]
static Base64Status_t decodeBase64IndexBuffer( uint32_t * pBase64IndexBuffer,
uint32_t * pNumDataInBuffer,
uint8_t * pDest,
const size_t destLen,
size_t * pOutputLen )
{
Base64Status_t returnVal = Base64Success;
size_t outputLen;
uint32_t base64IndexBuffer;
uint32_t numDataInBuffer;
uint32_t numDataToWrite;
assert( pBase64IndexBuffer != NULL );
assert( pNumDataInBuffer != NULL );
assert( ( *pNumDataInBuffer == 2U ) ||
( *pNumDataInBuffer == 3U ) ||
( *pNumDataInBuffer == 4U ) );
assert( pDest != NULL );
assert( pOutputLen != NULL );
outputLen = *pOutputLen;
base64IndexBuffer = *pBase64IndexBuffer;
numDataInBuffer = *pNumDataInBuffer;
numDataToWrite = ( numDataInBuffer * 3U ) / 4U;
if( destLen < ( outputLen + numDataToWrite ) )
{
returnVal = Base64InvalidBufferSize;
}
else
{
/* If the buffer is full, convert the 4 sextets of encoded data into
* three sequential octets of decoded data starting from the most
* significant bits and ending at the least significant bits. */
if( numDataInBuffer == MAX_NUM_BASE64_DATA )
{
pDest[ outputLen ] = ( uint8_t ) ( ( base64IndexBuffer >> SIZE_OF_TWO_OCTETS ) & 0xFFU );
pDest[ outputLen + 1U ] = ( uint8_t ) ( ( base64IndexBuffer >> SIZE_OF_ONE_OCTET ) & 0xFFU );
pDest[ outputLen + 2U ] = ( uint8_t ) ( base64IndexBuffer & 0xFFU );
outputLen += 3U;
}
if( numDataInBuffer == 3U )
{
/* When there are only three sextets of data remaining at the end of the encoded data,
* it is assumed that these three sextets should be decoded into two octets of data. In
* this case, the two least significant bits are ignored and the following sixteen
* least significant bits are converted into two octets of data. */
if( ( base64IndexBuffer & 0x3U ) != 0U )
{
returnVal = Base64NonZeroPadding;
}
if( returnVal == Base64Success )
{
base64IndexBuffer = base64IndexBuffer >> SIZE_OF_PADDING_WITH_THREE_SEXTETS;
pDest[ outputLen ] = ( uint8_t ) ( ( base64IndexBuffer >> SIZE_OF_ONE_OCTET ) & 0xFFU );
pDest[ outputLen + 1U ] = ( uint8_t ) ( base64IndexBuffer & 0xFFU );
outputLen += 2U;
}
}
if( numDataInBuffer == 2U )
{
/* When there are only two sextets of data remaining at the end of the encoded data, it
* is assumed that these two sextets should be decoded into one octet of data. In this
* case, the four least significant bits are ignored and the following eight least
* significant bits are converted into one octet of data. */
if( ( base64IndexBuffer & 0xFU ) != 0U )
{
returnVal = Base64NonZeroPadding;
}
if( returnVal == Base64Success )
{
base64IndexBuffer = base64IndexBuffer >> SIZE_OF_PADDING_WITH_TWO_SEXTETS;
pDest[ outputLen ] = ( uint8_t ) ( base64IndexBuffer & 0xFFU );
outputLen += 1U;
}
}
}
*pNumDataInBuffer = 0;
*pOutputLen = outputLen;
*pBase64IndexBuffer = 0;
return returnVal;
}