2 * rawRsaSig.c - Test compatiblity of CSSM_ALGID_{SHA1,MD5}WithRSA and
3 * manual digest followed by raw RSA sign.
9 #include <Security/cssm.h>
10 #include <Security/cssmapple.h>
13 #include "bsafeUtils.h"
19 #define OLOOPS_DEF 10 /* outer loops, one key pair per loop */
20 #define ILOOPS_DEF 10 /* sig loops */
21 #define MAX_TEXT_SIZE 1024
23 #define LOOP_NOTIFY 20
24 #define DO_MULTI_UPDATE CSSM_TRUE
26 static void usage(char **argv
)
28 printf("usage: %s [options]\n", argv
[0]);
29 printf(" Options:\n");
30 printf(" a=alg (r=RSA, d=DSA; default=RSA)\n");
31 printf(" l=outerloops (default=%d; 0=forever)\n", OLOOPS_DEF
);
32 printf(" i=innerLoops (default=%d)\n", ILOOPS_DEF
);
33 printf(" k=keySizeInBits; default is random\n");
34 printf(" p=pauseInterval (default=0, no pause)\n");
35 printf(" D (CSP/DL; default = bare CSP)\n");
36 printf(" v(erbose)\n");
42 int main(int argc
, char **argv
)
48 CSSM_DATA ptext
= {0, NULL
};
49 CSSM_CSP_HANDLE cspHand
;
52 uint32 keySizeInBits
= 0;
55 CSSM_DATA sig
= {0, NULL
};
56 CSSM_DATA digest
= {0, NULL
};
58 const char *digestStr
;
63 CSSM_BOOL keySizeSpec
= CSSM_FALSE
;
64 unsigned oloops
= OLOOPS_DEF
;
65 unsigned iloops
= ILOOPS_DEF
;
66 CSSM_BOOL verbose
= CSSM_FALSE
;
67 CSSM_BOOL quiet
= CSSM_FALSE
;
68 unsigned pauseInterval
= 0;
69 CSSM_BOOL bareCsp
= CSSM_TRUE
;
70 CSSM_ALGORITHMS rawSigAlg
= CSSM_ALGID_RSA
;
72 for(arg
=1; arg
<argc
; arg
++) {
78 rawSigAlg
= CSSM_ALGID_RSA
;
81 rawSigAlg
= CSSM_ALGID_DSA
;
88 oloops
= atoi(&argp
[2]);
91 iloops
= atoi(&argp
[2]);
94 keySizeInBits
= atoi(&argp
[2]);
95 keySizeSpec
= CSSM_TRUE
;
101 bareCsp
= CSSM_FALSE
;
107 pauseInterval
= atoi(&argp
[2]);;
115 ptext
.Data
= (uint8
*)CSSM_MALLOC(MAX_TEXT_SIZE
);
116 if(ptext
.Data
== NULL
) {
117 printf("Insufficient heap space\n");
120 /* ptext length set in inner test loop */
122 printf("Starting rawRsaSig; args: ");
123 for(i
=1; i
<argc
; i
++) {
124 printf("%s ", argv
[i
]);
127 cspHand
= cspDlDbStartup(bareCsp
, NULL
);
133 printf("Top of test; hit CR to proceed: ");
136 for(oloop
=0; ; oloop
++) {
140 /* random key size */
141 keySizeInBits
= randKeySizeBits(rawSigAlg
, OT_Sign
);
145 if(verbose
|| ((oloop
% LOOP_NOTIFY
) == 0)) {
146 printf("...oloop %d keySize %u\n", oloop
, (unsigned)keySizeInBits
);
150 /* generate a key pair */
151 crtn
= cspGenKeyPair(cspHand
,
157 CSSM_TRUE
, // all keys ref for speed
159 CSSM_KEYBLOB_RAW_FORMAT_NONE
,
163 CSSM_KEYBLOB_RAW_FORMAT_NONE
,
164 CSSM_FALSE
); // genSeed not used
166 return testError(quiet
);
169 for(iloop
=0; iloop
<iloops
; iloop
++) {
171 CSSM_ALGORITHMS sigAlg
;
172 CSSM_ALGORITHMS digestAlg
;
173 CSSM_CC_HANDLE sigHand
;
175 /* alternate digest algs for RSA */
176 if(rawSigAlg
== CSSM_ALGID_RSA
) {
178 sigAlg
= CSSM_ALGID_SHA1WithRSA
;
179 digestAlg
= CSSM_ALGID_SHA1
;
183 sigAlg
= CSSM_ALGID_MD5WithRSA
;
184 digestAlg
= CSSM_ALGID_MD5
;
189 sigAlg
= CSSM_ALGID_SHA1WithDSA
;
190 digestAlg
= CSSM_ALGID_SHA1
;
194 /* new plaintext each inner loop */
195 simpleGenData(&ptext
, 1, MAX_TEXT_SIZE
);
197 if(verbose
|| ((iloop
% LOOP_NOTIFY
) == 0)) {
198 printf(" ...iloop %d digest %s text size %lu\n",
199 iloop
, digestStr
, ptext
.Length
);
206 crtn
= cspStagedSign(cspHand
,
210 DO_MULTI_UPDATE
, // multiUpdates
212 if(crtn
&& testError(quiet
)) {
217 crtn
= cspStagedDigest(cspHand
,
219 CSSM_FALSE
, // mallocDigest
220 DO_MULTI_UPDATE
, // multiUpdates
223 if(crtn
&& testError(quiet
)) {
227 /* raw RSA/DSA verify */
228 crtn
= CSSM_CSP_CreateSignatureContext(cspHand
,
234 printError("CSSM_CSP_CreateSignatureContext (1)", crtn
);
237 crtn
= CSSM_VerifyData(sigHand
,
243 printError("CSSM_VerifyData(raw RSA)", crtn
);
244 if(testError(quiet
)) {
249 /* free resources - reuse the digest for raw sign */
250 appFreeCssmData(&sig
, CSSM_FALSE
);
251 CSSM_DeleteContext(sigHand
);
255 /* raw RSA/DSA sign */
256 crtn
= CSSM_CSP_CreateSignatureContext(cspHand
,
262 printError("CSSM_CSP_CreateSignatureContext (1)", crtn
);
265 crtn
= CSSM_SignData(sigHand
,
271 printError("CSSM_SignData(raw RSA)", crtn
);
272 if(testError(quiet
)) {
277 /* all-in-one verify */
278 crtn
= cspStagedSigVerify(cspHand
,
283 DO_MULTI_UPDATE
, // multiUpdates
285 if(crtn
&& testError(quiet
)) {
290 appFreeCssmData(&sig
, CSSM_FALSE
);
291 appFreeCssmData(&digest
, CSSM_FALSE
);
292 CSSM_DeleteContext(sigHand
);
293 } /* end of inner loop */
296 cspFreeKey(cspHand
, &pubKey
);
297 cspFreeKey(cspHand
, &privKey
);
299 if(oloops
&& (oloop
== oloops
)) {
302 if(pauseInterval
&& ((oloop
% pauseInterval
) == 0)) {
304 printf("hit CR to proceed: ");
310 cspShutdown(cspHand
, bareCsp
);
313 printf("ModuleDetach/Unload complete; hit CR to exit: ");
316 if((rtn
== 0) && !quiet
) {
317 printf("%s test complete\n", argv
[0]);
319 CSSM_FREE(ptext
.Data
);