#include "testParams.h"
#include <Security/cssm.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <security_cdsa_utils/cuFileIo.h>
#include <utilLib/common.h>
#include <utilLib/cspwrap.h>
#include <strings.h>
#define DO_PAUSE 0
#define PTEXT_SIZE 1024
#define USAGE_DEF "noUsage"
int symTestInit(TestParams *testParams)
{
return 0;
}
int symTest(TestParams *testParams)
{
unsigned loop;
CSSM_RETURN crtn;
CSSM_DATA ptext = {0, NULL};
CSSM_DATA ctext = {0, NULL};
CSSM_DATA rptext = {0, NULL};
CSSM_KEY_PTR symKey;
CSSM_PADDING padding;
CSSM_ALGORITHMS keyAlg;
CSSM_ALGORITHMS encrAlg;
CSSM_ENCRYPT_MODE encrMode;
CSSM_BOOL keyIsRef;
CSSM_DATA initVector;
initVector.Data = (uint8 *)"someStrangeInitVect";
ptext.Data = (uint8 *)CSSM_MALLOC(PTEXT_SIZE);
ptext.Length = PTEXT_SIZE;
for(loop=0; loop<testParams->numLoops; loop++) {
if(testParams->verbose) {
printf("symTest thread %d: loop %d\n",
testParams->threadNum, loop);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
crtn = threadGetRandData(testParams, &ptext, PTEXT_SIZE);
if(crtn) {
return 1;
}
if(loop & 1) {
keyAlg = CSSM_ALGID_DES;
encrAlg = CSSM_ALGID_DES;
encrMode = CSSM_ALGMODE_CBCPadIV8;
padding = CSSM_PADDING_PKCS1;
initVector.Length = 8;
}
else {
keyAlg = CSSM_ALGID_AES;
encrAlg = CSSM_ALGID_AES;
encrMode = CSSM_ALGMODE_CBCPadIV8;
padding = CSSM_PADDING_PKCS5;
initVector.Length = 16;
}
if(loop & 2) {
keyIsRef = CSSM_TRUE;
}
else {
keyIsRef = CSSM_FALSE;
}
symKey = cspGenSymKey(testParams->cspHand,
keyAlg,
USAGE_DEF,
strlen(USAGE_DEF),
CSSM_KEYUSE_ENCRYPT | CSSM_KEYUSE_DECRYPT,
CSP_KEY_SIZE_DEFAULT,
keyIsRef);
if(symKey == NULL) {
return 1;
}
crtn = cspEncrypt(testParams->cspHand,
encrAlg,
encrMode,
padding,
symKey,
NULL, 0, 0, &initVector,
&ptext,
&ctext,
CSSM_TRUE); if(crtn) {
return 1;
}
crtn = cspDecrypt(testParams->cspHand,
encrAlg,
encrMode,
padding,
symKey,
NULL, 0, 0, &initVector,
&ctext,
&rptext,
CSSM_TRUE); if(crtn) {
return 1;
}
if(ptext.Length != rptext.Length) {
printf("Ptext length mismatch: expect %lu, got %lu\n",
ptext.Length, rptext.Length);
return 1;
}
if(memcmp(ptext.Data, rptext.Data, ptext.Length)) {
printf("***data miscompare\n");
return 1;
}
appFreeCssmData(&ctext, CSSM_FALSE);
appFreeCssmData(&rptext, CSSM_FALSE);
cspFreeKey(testParams->cspHand, symKey);
CSSM_FREE(symKey);
#if DO_PAUSE
fpurge(stdin);
printf("Hit CR to proceed: ");
getchar();
#endif
}
return 0;
}