+++ /dev/null
-/*
- * Simple RSA sign/verify threadTest module
- */
-/*
- * Simple sign/verify test
- */
-#include "testParams.h"
-#include <Security/cssmtype.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <time.h>
-#include <cspxutils/cspwrap.h>
-#include <cspxutils/common.h>
-#include <BSafe/bsafe.h>
-
-/* for memory leak debug only, with only one thread running */
-#define DO_PAUSE 0
-
-#define SAFE_RAND_DATA 0
-
-#define KEY_SIZE CSP_RSA_KEY_SIZE_DEFAULT /* key size, bits */
-#define MAX_SIG_SIZE ((KEY_SIZE / 8) * 2) /* max signature size, bytes */
-#define PTEXT_SIZE 1024
-#define NUM_SEED_BYTES 32
-
-static B_ALGORITHM_METHOD *BSAFE_ALGORITHM_CHOOSER[] = {
- &AM_MD5_RANDOM,
- &AM_MD,
- &AM_MD5,
- &AM_MAC,
- &AM_SHA,
- &AM_RSA_CRT_DECRYPT,
- &AM_RSA_CRT_ENCRYPT,
- &AM_RSA_DECRYPT,
- &AM_RSA_ENCRYPT,
- &AM_RSA_KEY_GEN,
- (B_ALGORITHM_METHOD *)NULL_PTR
-};
-
-/* generate RSA key pair */
-static int RsaGenKeyPair(
- const TestParams *testParams,
- unsigned keySize,
- B_KEY_OBJ *pubKey,
- B_KEY_OBJ *privKey)
-{
- int brtn;
- B_ALGORITHM_OBJ keypairGenerator = (B_ALGORITHM_OBJ)NULL_PTR;
- static unsigned char f4Data[3] = {0x01, 0x00, 0x01};
- B_ALGORITHM_OBJ randomAlgorithm = (B_ALGORITHM_OBJ)NULL_PTR;
- uint8 seedBytes[NUM_SEED_BYTES];
- CSSM_DATA seedData = {NUM_SEED_BYTES, seedBytes};
- A_RSA_KEY_GEN_PARAMS keygenParams;
-
- /* boilerplate RSA key pair generate */
- /* first the random algorithm object */
- brtn = B_CreateAlgorithmObject(&randomAlgorithm);
- if(brtn) {
- printf("***B_CreateAlgorithmObject error (%d)\n", brtn);
- return 1;
- }
- brtn = B_SetAlgorithmInfo(randomAlgorithm,
- AI_MD5Random,
- NULL_PTR);
- if(brtn) {
- printf("***B_SetAlgorithmInfo error (%d)\n", brtn);
- return 1;
- }
- brtn = B_RandomInit(randomAlgorithm,
- BSAFE_ALGORITHM_CHOOSER,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_RandomInit error (%d)\n", brtn);
- return 1;
- }
- #if SAFE_RAND_DATA
- threadGetRandData(testParams, &seedData, NUM_SEED_BYTES);
- #else
- simpleGenData(&seedData, NUM_SEED_BYTES,NUM_SEED_BYTES);
- #endif
-
- brtn = B_RandomUpdate(randomAlgorithm, seedBytes, NUM_SEED_BYTES,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_RandomUpdate error (%d)\n", brtn);
- return 1;
- }
-
- /* create a keypair generator */
- brtn = B_CreateAlgorithmObject(&keypairGenerator);
- if(brtn) {
- printf("***B_CreateAlgorithmObject error (%d)\n", brtn);
- return 1;
- }
- keygenParams.modulusBits = keySize;
- keygenParams.publicExponent.data = f4Data;
- keygenParams.publicExponent.len = 3;
-
- brtn = B_SetAlgorithmInfo(keypairGenerator,
- AI_RSAKeyGen,
- (POINTER)&keygenParams);
- if(brtn) {
- printf("***B_SetAlgorithmInfo error (%d)\n", brtn);
- return 1;
- }
-
- /* go for it */
- brtn = B_GenerateInit(keypairGenerator,
- BSAFE_ALGORITHM_CHOOSER,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_GenerateInit error (%d)\n", brtn);
- return 1;
- }
- brtn = B_CreateKeyObject(pubKey);
- if(brtn) {
- printf("***B_CreateKeyObject error (%d)\n", brtn);
- return 1;
- }
- brtn = B_CreateKeyObject(privKey);
- if(brtn) {
- printf("***B_CreateKeyObject error (%d)\n", brtn);
- return 1;
- }
-
- brtn = B_GenerateKeypair(keypairGenerator,
- *pubKey,
- *privKey,
- randomAlgorithm,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_GenerateKeypair error (%d)\n", brtn);
- return 1;
- }
-
- B_DestroyAlgorithmObject (&keypairGenerator);
- B_DestroyAlgorithmObject (&randomAlgorithm);
- return 0;
-}
-
-static int rsaSign(
- const TestParams *testParams,
- B_KEY_OBJ privKey,
- const CSSM_DATA *ptext,
- uint8 *sigBytes,
- unsigned maxSigSize,
- unsigned *actSigSize) // RETURNED
-{
- int brtn;
- B_ALGORITHM_OBJ signer = (B_ALGORITHM_OBJ)NULL_PTR;
-
- brtn = B_CreateAlgorithmObject(&signer);
- if(brtn) {
- printf("***B_CreateAlgorithmObject error (%d)\n", brtn);
- return 1;
- }
-
- /* we happen to know that no info is needed for any signing algs */
- brtn = B_SetAlgorithmInfo(signer,
- AI_MD5WithRSAEncryption,
- NULL);
- if(brtn) {
- printf("***B_SetAlgorithmInfo error (%d)\n", brtn);
- return 1;
- }
- brtn = B_SignInit(signer,
- privKey,
- BSAFE_ALGORITHM_CHOOSER,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_SignInit error (%d)\n", brtn);
- return 1;
- }
- brtn = B_SignUpdate(signer,
- ptext->Data,
- ptext->Length,
- NULL);
- if(brtn) {
- printf("***B_SignUpdate error (%d)\n", brtn);
- return 1;
- }
- brtn = B_SignFinal(signer,
- sigBytes,
- actSigSize,
- maxSigSize,
- NULL, // randAlg
- NULL);
- if(brtn) {
- printf("***B_SignFinal error (%d)\n", brtn);
- }
- B_DestroyAlgorithmObject(&signer);
- return brtn;
-}
-
-static int rsaSigVerify(
- const TestParams *testParams,
- B_KEY_OBJ pubKey,
- const CSSM_DATA *ptext,
- uint8 *sigBytes,
- unsigned sigSize) // RETURNED
-{
- int brtn;
- B_ALGORITHM_OBJ verifier = (B_ALGORITHM_OBJ)NULL_PTR;
-
- brtn = B_CreateAlgorithmObject(&verifier);
- if(brtn) {
- printf("***B_CreateAlgorithmObject error (%d)\n", brtn);
- return 1;
- }
-
- /* we happen to know that no info is needed for any verifying algs */
- brtn = B_SetAlgorithmInfo(verifier,
- AI_MD5WithRSAEncryption,
- NULL);
- if(brtn) {
- printf("***B_SetAlgorithmInfo error (%d)\n", brtn);
- return 1;
- }
- brtn = B_VerifyInit(verifier,
- pubKey,
- BSAFE_ALGORITHM_CHOOSER,
- (A_SURRENDER_CTX *)NULL_PTR);
- if(brtn) {
- printf("***B_VerifyInit error (%d)\n", brtn);
- return 1;
- }
- brtn = B_VerifyUpdate(verifier,
- ptext->Data,
- ptext->Length,
- NULL);
- if(brtn) {
- printf("***B_VerifyUpdate error (%d)\n", brtn);
- return 1;
- }
- brtn = B_VerifyFinal(verifier,
- sigBytes,
- sigSize,
- NULL, // randAlg
- NULL);
- if(brtn) {
- printf("***B_VerifyFinal error (%d)\n", brtn);
- }
- B_DestroyAlgorithmObject(&verifier);
- return brtn;
-}
-
-/* per-thread info */
-typedef struct {
- B_KEY_OBJ privKey;
- B_KEY_OBJ pubKey;
- CSSM_DATA ptext;
-} TT_RsaSignParams;
-
-int rsaSignInit(TestParams *testParams)
-{
- int rtn;
- TT_RsaSignParams *svParams;
-
- svParams = (TT_RsaSignParams *)CSSM_MALLOC(sizeof(TT_RsaSignParams));
- rtn = RsaGenKeyPair(testParams,
- KEY_SIZE,
- &svParams->pubKey,
- &svParams->privKey);
- if(rtn) {
- printf("***Error generating key pair; aborting\n");
- return 1;
- }
- svParams->ptext.Data = (uint8 *)CSSM_MALLOC(PTEXT_SIZE);
- svParams->ptext.Length = PTEXT_SIZE;
-
- testParams->perThread = svParams;
- return 0;
-}
-
-int rsaSignTest(TestParams *testParams)
-{
- TT_RsaSignParams *svParams = (TT_RsaSignParams *)testParams->perThread;
- unsigned loop;
- int rtn;
- uint8 sigBytes[MAX_SIG_SIZE];
- unsigned actSigSize;
-
- for(loop=0; loop<testParams->numLoops; loop++) {
- if(testParams->verbose) {
- printf("signVerify thread %d: loop %d\n",
- testParams->threadNum, loop);
- }
- else if(!testParams->quiet) {
- printChar(testParams->progressChar);
- }
- #if SAFE_RAND_DATA
- CSSM_RETURN crtn = threadGetRandData(testParams, &svParams->ptext, PTEXT_SIZE);
- if(crtn) {
- return 1;
- }
- #else
- simpleGenData(&svParams->ptext, PTEXT_SIZE,PTEXT_SIZE);
- #endif
- rtn = rsaSign(testParams,
- svParams->privKey,
- &svParams->ptext,
- sigBytes,
- MAX_SIG_SIZE,
- &actSigSize);
- if(rtn) {
- return 1;
- }
- rtn = rsaSigVerify(testParams,
- svParams->pubKey,
- &svParams->ptext,
- sigBytes,
- actSigSize);
- if(rtn) {
- return 1;
- }
-
- #if DO_PAUSE
- fpurge(stdin);
- printf("Hit CR to proceed: ");
- getchar();
- #endif
- }
- return 0;
-}
-