in unittest/lib/perf.cpp [1064:1184]
VOID measurePerfOneAlg( AlgorithmImplementation * pAlgImp )
{
PerfDataFn dataFn = pAlgImp->m_perfDataFunction;
PerfDataFn decryptFn = pAlgImp->m_perfDecryptFunction;
PerfKeyFn keyFn = pAlgImp->m_perfKeyFunction;
PerfCleanFn cleanFn = pAlgImp->m_perfCleanFunction;
CHECK4( keyFn == NULL || cleanFn != NULL, "No clean function in %s/%s", pAlgImp->m_implementationName.c_str(), pAlgImp->m_algorithmName.c_str() );
const ALG_MEASURE_PARAMS * pParams = NULL;
String algMode = pAlgImp->m_algorithmName + pAlgImp->m_modeName;
//print( "%s\n", algMode.c_str() );
for( int i=0; i<ARRAY_SIZE( g_algMeasureParams ); i++ )
{
if( g_algMeasureParams[i].algName == algMode )
{
pParams = &g_algMeasureParams[i];
}
}
if( pParams == NULL )
{
return;
}
std::set<SIZE_T> keySizes;
std::set<SIZE_T> dataSizes;
createSizeSet( pParams->keySizes, &keySizes );
createSizeSet( pParams->dataSizes, &dataSizes );
SIZE_T nKeySizes = keySizes.size();
CHECK3( nKeySizes <= MAX_SIZES, "Too many sizes for algorithm %s", pParams->algName );
for( std::set<SIZE_T>::const_iterator k = keySizes.begin(); k != keySizes.end(); ++k )
{
UINT32 keyBytes = *k & 0x00ffffff;
UINT32 keyFlags = *k & 0xff000000;
AlgorithmImplementation::ALG_PERF_INFO perfInfo;
if( nKeySizes > 1 )
{
perfInfo.keySize = keyBytes;
} else {
perfInfo.keySize = 0;
}
//
// First we measure the speed of the key expansion, if any
//
if( keyFn != NULL && (pParams->flags & PERF_NO_KEYPERF) == 0 )
{
perfInfo.dataSize = 0;
perfInfo.cPerByte = 0;
perfInfo.cFixed = measurePerfOneSize( *k, 0, keyFn, NULL, NULL, cleanFn, TRUE );
perfInfo.strPostfix = "key";
pAlgImp->m_perfInfo.push_back( perfInfo );
}
if( dataFn != NULL )
{
if( decryptFn != NULL )
{
perfInfo.strPostfix = "enc";
} else {
perfInfo.strPostfix = NULL;
for( int i=0; i < ARRAY_SIZE( g_exKeyParamMapping ); i++ )
{
if( keyFlags == g_exKeyParamMapping[i].exKeyParam )
{
perfInfo.strPostfix = g_exKeyParamMapping[i].str;
break;
}
}
CHECK3( perfInfo.strPostfix != NULL, "Extended key param not found %08x", *k );
}
if(!g_measure_specific_sizes)
{
measurePerfData( keyFn, NULL, dataFn, cleanFn, &dataSizes, *k, &perfInfo );
pAlgImp->m_perfInfo.push_back( perfInfo );
}
else
{
for(UINT32 dataSize = g_measure_sizes_start; dataSize <= g_measure_sizes_end; dataSize+=g_measure_sizes_increment)
{
perfInfo.dataSize = dataSize;
perfInfo.cFixed = measurePerfOneSize( *k, dataSize, keyFn, NULL, dataFn, cleanFn, FALSE );
pAlgImp->m_perfInfo.push_back( perfInfo );
}
}
}
if( decryptFn != NULL )
{
perfInfo.strPostfix = "dec";
if(!g_measure_specific_sizes)
{
measurePerfData( keyFn, dataFn, decryptFn, cleanFn, &dataSizes, *k, &perfInfo );
pAlgImp->m_perfInfo.push_back( perfInfo );
}
else
{
for(UINT32 dataSize = g_measure_sizes_start; dataSize <= g_measure_sizes_end; dataSize+=g_measure_sizes_increment)
{
perfInfo.dataSize = dataSize;
perfInfo.cFixed = measurePerfOneSize( *k, dataSize, keyFn, dataFn, decryptFn, cleanFn, FALSE );
pAlgImp->m_perfInfo.push_back( perfInfo );
}
}
}
}
}