symTestThr.cpp   [plain text]


/*
 * Simple symmetric encrypt/decrypt test
 */
#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>

/* for memory leak debug only, with only one thread running */
#define DO_PAUSE	0

#define PTEXT_SIZE	1024
#define USAGE_DEF	"noUsage"

int symTestInit(TestParams *testParams)
{
	/* nothing for now */
	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);
		}
		
		/* random plaintext */
		crtn = threadGetRandData(testParams, &ptext, PTEXT_SIZE);
		if(crtn) {
			return 1;
		}
		
		/* pick algorithm and params */
		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;
		}
		
		/* cook up a key */
		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;
		}
		
		/* encrypt, decrypt */
		crtn = cspEncrypt(testParams->cspHand,
			encrAlg,
			encrMode,
			padding,
			symKey,
			NULL,		// second key unused
			0,			// efectiveKeySizeInBits,
			0,			// rounds
			&initVector,
			&ptext,
			&ctext,
			CSSM_TRUE);	// mallocCtext
		if(crtn) {
			return 1;
		}
		crtn = cspDecrypt(testParams->cspHand,
			encrAlg,
			encrMode,
			padding,
			symKey,
			NULL,		// second key unused
			0,			// efectiveKeySizeInBits
			0,			// rounds
			&initVector,
			&ctext,
			&rptext,
			CSSM_TRUE);	// mallocCtext
		if(crtn) {
			return 1;
		}
		
		/* compare */
		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;
		}

		/* free everything */
		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;
}