#include "testParams.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <utilLib/common.h>
#include <utilLib/cspwrap.h>
#include <Security/SecAsn1Coder.h>
#include <Security/SecAsn1Templates.h>
#include <stddef.h>
#include <unistd.h>
#define DO_BAD_DECODE 0
#define DO_PAUSE 0
static CSSM_DATA goodDer;
static CSSM_DATA badDer;
typedef struct {
CSSM_DATA int1;
CSSM_DATA int2;
} twoInts;
static const SecAsn1Template twoIntsTemp[] = {
{ SEC_ASN1_SEQUENCE,
0, NULL, sizeof(twoInts) },
{ SEC_ASN1_INTEGER, offsetof(twoInts, int1) },
{ SEC_ASN1_INTEGER, offsetof(twoInts, int2) },
{0}
};
static uint8 int1[] = {1,2,3};
static uint8 int2[] = {3,4,5,6,7};
#define DECODES_PER_LOOP 1
int derDecodeInit(
TestParams *testParams)
{
twoInts ti;
ti.int1.Data = int1;
ti.int1.Length = sizeof(int1);
ti.int2.Data = int2;
ti.int2.Length = sizeof(int2);
SecAsn1CoderRef coder;
SecAsn1CoderCreate(&coder);
CSSM_DATA tmpDer = {0, NULL};
if(SecAsn1EncodeItem(coder, &ti, twoIntsTemp, &tmpDer)) {
printf("***derDecodeInit: Error on encodeItem()\n");
return -1;
}
appCopyCssmData(&tmpDer, &goodDer);
appCopyCssmData(&tmpDer, &badDer);
badDer.Data[1]++;
SecAsn1CoderRelease(coder);
return 0;
}
int derDecodeTest(TestParams *testParams)
{
const CSSM_DATA *derSrc;
bool expectErr = false;
if((testParams->threadNum & 1) || !DO_BAD_DECODE) {
derSrc = &goodDer;
}
else {
derSrc = &badDer;
expectErr = true;
}
for(unsigned loop=0; loop<testParams->numLoops; loop++) {
if(testParams->verbose) {
printf("derDecode thread %d: loop %d\n",
testParams->threadNum, loop);
}
else if(!testParams->quiet) {
printChar(testParams->progressChar);
}
for(unsigned dex=0; dex<DECODES_PER_LOOP; dex++) {
SecAsn1CoderRef coder;
SecAsn1CoderCreate(&coder);
twoInts ti;
OSStatus perr1, perr2;
memset(&ti, 0, sizeof(ti));
perr1 = SecAsn1DecodeData(coder, derSrc, twoIntsTemp, &ti);
usleep(100);
perr2 = SecAsn1DecodeData(coder, derSrc, twoIntsTemp, &ti);
if(perr1 != perr2) {
printf("***derDecodeTest: different errors (%d, %d)\n",
(int)perr1, (int)perr2);
return 1;
}
if(expectErr) {
if(!perr1) {
printf("derDecodeTest: expect failure, got success\n");
return 1;
}
}
else {
if(perr1) {
printf("derDecodeTest: expect success, got %d\n", (int)perr1);
return 1;
}
}
SecAsn1CoderRelease(coder);
}
#if DO_PAUSE
fflush(stdin);
printf("End of loop, CR to continue: ");
getchar();
#endif
}
return 0;
}