2 * Simple interactive CSP RNG exerciser.
7 #include <Security/cssm.h>
8 #include <Security/cssmapple.h>
12 #define RAND_ALG CSSM_ALGID_APPLE_YARROW
15 static void usage(char **argv
)
17 printf("usage: %s [options]\n", argv
[0]);
19 printf(" D (CSP/DL; default = bare CSP)\n");
23 static void dumpBuf(uint8
*buf
,
29 for(i
=0; i
<len
; i
++) {
30 printf("%02X ", buf
[i
]);
39 CSSM_CSP_HANDLE cspHand
,
40 CSSM_CC_HANDLE ccHand
, // 0 ==> gen a new one
42 CSSM_CRYPTO_DATA_PTR seed
, // optional
47 CSSM_DATA data
= {0, NULL
};
49 /* optional existing context */
51 crtn
= CSSM_CSP_CreateRandomGenContext(
58 printError("CSSM_CSP_CreateRandomGenContext", crtn
);
63 /* who mallocs the data? */
65 data
.Data
= (uint8
*)appMalloc(len
, NULL
);
66 if(data
.Data
== NULL
) {
67 printf("***malloc failure\n");
74 crtn
= CSSM_GenerateRandom(ccHand
, &data
);
76 printError("CSSM_GenerateRandom", crtn
);
80 dumpBuf(data
.Data
, data
.Length
);
81 appFree(data
.Data
, NULL
);
88 * CryptoData callback for optional random seed.
90 CSSM_RETURN
seedCallback(
91 CSSM_DATA_PTR OutData
,
95 static unsigned char seed
[SEED_SIZE
];
97 OutData
->Length
= SEED_SIZE
;
99 for(i
=SEED_SIZE
, j
=0; i
>0; i
--, j
++) {
105 int main(int argc
, char **argv
)
109 CSSM_CSP_HANDLE cspHand
;
110 CSSM_CC_HANDLE ccHand
= 0;
112 CSSM_BOOL bareCsp
= CSSM_TRUE
;
114 // initial op = get random data
115 CSSM_BOOL weMalloc
= CSSM_FALSE
;
116 unsigned char seed
[SEED_SIZE
];
117 CSSM_CRYPTO_DATA cseed
;
119 unsigned reqLen
= 16;
120 CSSM_BOOL explicitSeed
;
122 for(arg
=1; arg
<argc
; arg
++) {
124 switch(argv
[arg
][0]) {
126 bareCsp
= CSSM_FALSE
;
132 cspHand
= cspDlDbStartup(bareCsp
, NULL
);
137 /* set up for explicit seed */
138 cseed
.Param
.Length
= SEED_SIZE
;
139 cseed
.Param
.Data
= seed
;
140 for(i
=0; i
<SEED_SIZE
; i
++) {
143 cseed
.Callback
= NULL
;
144 cseed
.CallerCtx
= NULL
;
145 explicitSeed
= CSSM_TRUE
;
148 printf(" g Get random data w/seed\n");
149 printf(" n Get random data w/o seed\n");
150 printf(" c Get random data using current context\n");
151 printf(" m we malloc (current: %s)\n",
152 weMalloc
? "True" : "False");
153 printf(" M CSP mallocs\n");
154 printf(" s seed via explicit data (current: %d)\n", (int)explicitSeed
);
155 printf(" S seed via callback\n");
158 printf("\ncommand me: ");
167 crtn
= CSSM_DeleteContext(ccHand
);
169 printError("CSSM_DeleteContext", crtn
);
173 doGenRand(cspHand
, ccHand
, &cseed
, reqLen
, weMalloc
);
177 crtn
= CSSM_DeleteContext(ccHand
);
179 printError("CSSM_DeleteContext", crtn
);
183 doGenRand(cspHand
, ccHand
, NULL
, reqLen
, weMalloc
);
186 doGenRand(cspHand
, ccHand
, NULL
, reqLen
, weMalloc
);
189 weMalloc
= CSSM_TRUE
;
192 weMalloc
= CSSM_FALSE
;
195 printf("New length: ");
196 scanf("%d", &reqLen
);
199 /* explicit seed - presence of callback is the determinant */
200 cseed
.Callback
= NULL
;
201 explicitSeed
= CSSM_TRUE
;
204 /* seed by calllback */
205 cseed
.Callback
= seedCallback
;
206 explicitSeed
= CSSM_FALSE
;
214 if((crtn
= CSSM_ModuleDetach(cspHand
))) {
215 printError("CSSM_ModuleDetach", crtn
);