2 * asymPerform.c - measure performance of RSA and FEE encrypt and decrypt
8 #include <Security/cssm.h>
9 #include <Security/cssmapple.h>
13 #include <CoreFoundation/CoreFoundation.h>
18 #define ENC_LOOPS_DEF 1000
19 #define KEYSIZE_DEF 1024
20 #define PTEXT_SIZE 20 /* e.g., a SHA1 digest */
22 static void usage(char **argv
)
24 printf("usage: %s [options]\n", argv
[0]);
25 printf(" Options:\n");
26 printf(" a=algorithm (r=RSA; f=FEED; F=FEEDExp; default=RSA)\n");
27 printf(" l=numLoop (default=%d)\n", ENC_LOOPS_DEF
);
28 printf(" k=keySizeInBits; default=%d\n", KEYSIZE_DEF
);
29 printf(" D (CSP/DL; default = bare CSP)\n");
30 printf(" b (RSA blinding enabled)\n");
31 printf(" v(erbose)\n");
38 int main(int argc
, char **argv
)
42 CSSM_CSP_HANDLE cspHand
;
46 CSSM_DATA_PTR ptext
; // different for each loop
47 CSSM_DATA_PTR ctext
; // ditto
48 CSSM_DATA_PTR rptext
; // ditto
50 CFAbsoluteTime start
, end
;
51 CSSM_CC_HANDLE ccHand
;
53 CSSM_ACCESS_CREDENTIALS creds
;
60 uint32 keySizeInBits
= KEYSIZE_DEF
;
61 unsigned encLoops
= ENC_LOOPS_DEF
;
62 CSSM_BOOL verbose
= CSSM_FALSE
;
63 CSSM_BOOL quiet
= CSSM_FALSE
;
64 CSSM_BOOL bareCsp
= CSSM_TRUE
;
65 CSSM_BOOL rsaBlinding
= CSSM_FALSE
;
66 CSSM_ALGORITHMS keyAlg
= CSSM_ALGID_RSA
;
67 CSSM_ALGORITHMS encrAlg
= CSSM_ALGID_RSA
;
68 CSSM_PADDING padding
= CSSM_PADDING_PKCS1
;
70 for(arg
=1; arg
<argc
; arg
++) {
79 encrAlg
= keyAlg
= CSSM_ALGID_RSA
;
82 encrAlg
= CSSM_ALGID_FEED
;
83 keyAlg
= CSSM_ALGID_FEE
;
84 padding
= CSSM_PADDING_NONE
;
87 encrAlg
= CSSM_ALGID_FEEDEXP
;
88 keyAlg
= CSSM_ALGID_FEE
;
89 padding
= CSSM_PADDING_NONE
;
96 encLoops
= atoi(&argp
[2]);
99 keySizeInBits
= atoi(&argp
[2]);
105 bareCsp
= CSSM_FALSE
;
108 rsaBlinding
= CSSM_TRUE
;
119 cspHand
= cspDlDbStartup(bareCsp
, NULL
);
124 /* malloc encLoops ptext and ctext structs and the data they contain */
125 ptext
= (CSSM_DATA_PTR
)CSSM_MALLOC(encLoops
* sizeof(CSSM_DATA
));
126 ctext
= (CSSM_DATA_PTR
)CSSM_MALLOC(encLoops
* sizeof(CSSM_DATA
));
127 rptext
= (CSSM_DATA_PTR
)CSSM_MALLOC(encLoops
* sizeof(CSSM_DATA
));
128 memset(ptext
, 0, encLoops
* sizeof(CSSM_DATA
));
129 memset(ctext
, 0, encLoops
* sizeof(CSSM_DATA
));
130 memset(rptext
, 0, encLoops
* sizeof(CSSM_DATA
));
131 ctextSize
= (keySizeInBits
+ 7) / 8;
132 if(keyAlg
!= CSSM_ALGID_RSA
) {
135 for(i
=0; i
<encLoops
; i
++) {
136 appSetupCssmData(&ptext
[i
], PTEXT_SIZE
);
137 appSetupCssmData(&ctext
[i
], ctextSize
);
140 /* generate random "digests" */
141 for(i
=0; i
<encLoops
; i
++) {
142 simpleGenData(&ptext
[i
], PTEXT_SIZE
, PTEXT_SIZE
);
145 printf("Generating keys....\n");
146 crtn
= cspGenKeyPair(cspHand
,
152 CSSM_TRUE
, // reference key for speed
154 CSSM_KEYBLOB_RAW_FORMAT_NONE
,
158 CSSM_KEYBLOB_RAW_FORMAT_NONE
,
159 CSSM_FALSE
); // genSeed not used
161 return testError(quiet
);
164 printf("Encrypting....\n");
166 /* set up a reusable crypt context */
167 memset(&creds
, 0, sizeof(CSSM_ACCESS_CREDENTIALS
));
168 crtn
= CSSM_CSP_CreateAsymmetricContext(cspHand
,
171 (encrAlg
== CSSM_ALGID_FEED
) ? &privKey
: &pubKey
,
175 printError("CSSM_CSP_CreateAsymmetricContext (1)", crtn
);
178 if(encrAlg
== CSSM_ALGID_FEED
) {
179 AddContextAttribute(ccHand
, CSSM_ATTRIBUTE_PUBLIC_KEY
,
180 sizeof(CSSM_KEY
), CAT_Ptr
, &pubKey
, 0);
183 /* go - critical encrypt loop */
184 start
= CFAbsoluteTimeGetCurrent();
185 for(i
=0; i
<encLoops
; i
++) {
186 crtn
= CSSM_EncryptData(ccHand
,
193 ctext
[i
].Length
= processed
;
195 printError("CSSM_EncryptData", crtn
);
199 end
= CFAbsoluteTimeGetCurrent();
200 printf("%d encr ops in %f seconds, %f ms/op\n", encLoops
, end
-start
,
201 ((end
- start
) * 1000.0) / encLoops
);
203 CSSM_DeleteContext(ccHand
);
205 /* set up a reusable encryption context */
206 crtn
= CSSM_CSP_CreateAsymmetricContext(cspHand
,
213 printError("CSSM_CSP_CreateAsymmetricContext (2)", crtn
);
217 CSSM_CONTEXT_ATTRIBUTE newAttr
;
218 newAttr
.AttributeType
= CSSM_ATTRIBUTE_RSA_BLINDING
;
219 newAttr
.AttributeLength
= sizeof(uint32
);
220 newAttr
.Attribute
.Uint32
= 1;
221 crtn
= CSSM_UpdateContextAttributes(ccHand
, 1, &newAttr
);
223 printError("CSSM_UpdateContextAttributes", crtn
);
227 if(encrAlg
== CSSM_ALGID_FEED
) {
228 AddContextAttribute(ccHand
, CSSM_ATTRIBUTE_PUBLIC_KEY
,
229 sizeof(CSSM_KEY
), CAT_Ptr
, &pubKey
, 0);
232 /* go - critical decrypt loop */
233 start
= CFAbsoluteTimeGetCurrent();
234 for(i
=0; i
<encLoops
; i
++) {
235 crtn
= CSSM_DecryptData(ccHand
,
243 printError("CSSM_DecryptData", crtn
);
247 end
= CFAbsoluteTimeGetCurrent();
248 printf("%d decr ops in %f seconds, %f ms/op\n", encLoops
, end
-start
,
249 ((end
- start
) * 1000.0) / encLoops
);
250 CSSM_DeleteContext(ccHand
);
252 cspFreeKey(cspHand
, &privKey
);
253 cspFreeKey(cspHand
, &pubKey
);
254 for(i
=0; i
<encLoops
; i
++) {
255 appFreeCssmData(&ptext
[i
], CSSM_FALSE
);
256 appFreeCssmData(&ctext
[i
], CSSM_FALSE
);
257 appFreeCssmData(&rptext
[i
], CSSM_FALSE
);
262 cspShutdown(cspHand
, bareCsp
);