58 char cryptomod[64] =
"ssl";
59 char outname[256] = {0};
69 int k = strlen(argv[0]);
71 if (p[k] ==
'/')
break;
72 strcpy(outname,p+k+1);
77 printf(
"\n Usage: %s <crypto_module_name>\n",outname);
78 printf(
" e.g. %s ssl\n",outname);
79 printf(
" Assuming <crypto_module_name> = ssl\n\n");
81 strcpy(cryptomod,argv[1]);
83 bool local = !strcmp(cryptomod,
"local");
88 PRINT(outname<<
": cannot instantiate factory "<<cryptomod);
95 PRINT(outname<<
": --------------------------------------------------- ");
96 PRINT(outname<<
": Testing MD ... ");
99 MD_1->
Update(
"prova",strlen(
"prova"));
102 char MD5prova[128] =
"189bbbb00c5f1fb7fba9ad9285f193d1";
104 PRINT(outname<<
": MD mismatch: ");
106 PRINT(outname<<
": instead of: "<<MD5prova);
108 PRINT(outname<<
": MD test OK ");
112 PRINT(outname<<
": MD object could not be instantiated: ");
116 PRINT(outname<<
": --------------------------------------------------- ");
117 PRINT(outname<<
": Testing symmetric cipher ... ");
120 PRINT(outname<<
": cipher length: "<<BF_1->
Length());
122 char tm_1[64] =
"Test message for cipher - 001";
123 PRINT(outname<<
": Test message: "<<tm_1);
124 int ltm_1 = strlen(tm_1);
127 int ltmp = BF_1->
Encrypt(tm_1,ltm_1,tmp_1);
128 char tm_2[128] = {0};
130 PRINT(outname<<
": cipher encrypted (hex):");
133 int lfin = BF_1->
Decrypt(tmp_1,ltmp,tm_3);
136 PRINT(outname<<
": cipher decrypted: "<<tm_3);
137 if (strncmp(tm_1,tm_3,ltm_1)) {
138 PRINT(outname<<
": symmetric cipher test failed: ");
139 PRINT(outname<<
": got: "<<tm_3<<
" ("<<lfin<<
" bytes)");
140 PRINT(outname<<
": instead of: "<<tm_1<<
" ("<<ltm_1<<
" bytes)");
142 PRINT(outname<<
": symmetric cipher test OK ");
146 PRINT(outname<<
": cipher decryption failure");
148 PRINT(outname<<
": cipher encryption failure");
151 PRINT(outname<<
": testing bucket encryption");
154 PRINT(outname<<
": length of string: "<<Bck0.size);
157 PRINT(outname<<
": length of encryption: "<<lo1);
159 PRINT(outname<<
": length of decryption: "<<lo2);
161 PRINT(outname<<
": test bucket encryption failed: ");
162 PRINT(outname<<
": got: "<<lo2<<
" bytes)");
163 PRINT(outname<<
": instead of: "<<lo1<<
" bytes)");
165 PRINT(outname<<
": test bucket encryption OK");
169 PRINT(outname<<
": cipher object could not be instantiated: ");
173 PRINT(outname<<
": --------------------------------------------------- ");
174 PRINT(outname<<
": Testing KDFun ... ");
177 const char *pass =
"pippo";
178 int plen = strlen(pass);
179 const char *salt =
"$$10000$derek";
180 int slen = strlen(salt);
182 char KDFunprova[128] = {0};
185 int klen = (*KDFun)(pass,plen,salt,slen,key,0);
186 PRINT(outname<<
": key is: "<< key<<
" ("<<klen<<
" bytes)");
187 strcpy(KDFunprova,
"igcdgcbcebkplgajngjkfjlbcbiponnkifmeafpdmglp"
188 "lnfkpkjgbmlgbnhehnec");
189 matching = !strncmp(key,KDFunprova,klen);
191 int klen = (*KDFun)(pass,plen,salt,slen,key,0);
192 char khex[2046] = {0};
194 for(; i < klen; i++) sprintf(khex,
"%s%02x",khex, 0xFF & key[i]);
195 PRINT(outname<<
": key is: "<< khex<<
" ("<<klen<<
" bytes)");
196 strcpy(KDFunprova,
"b8d309875d91b050eea1527d91559f6ffa023601da0976de");
197 matching = !strncmp(khex,KDFunprova,strlen(khex));
201 PRINT(outname<<
": KDFun mismatch: ");
202 PRINT(outname<<
": key should have been: "<<KDFunprova);
204 PRINT(outname<<
": KDFun test OK ");
207 PRINT(outname<<
": KDFun object could not be instantiated: ");
211 PRINT(outname<<
": --------------------------------------------------- ");
212 PRINT(outname<<
": Testing RSA ... ");
219 char RSApubexp[4096];
221 PRINT(outname<<
": public export:"<<std::endl<<RSApubexp);
222 PRINT(outname<<
": The two printouts above should be equal");
223 PRINT(outname<<
": --------------------------------------------------- ");
225 PRINT(outname<<
": --------------------------------------------------- ");
226 char RSApriexp[4096];
228 PRINT(outname<<
": private export:"<<std::endl<<RSApriexp);
229 PRINT(outname<<
": --------------------------------------------------- ");
231 PRINT(outname<<
": --------------------------------------------------- ");
232 PRINT(outname<<
": --------------------------------------------------- ");
233 PRINT(outname<<
": testing import/export ");
238 PRINT(outname<<
": --------------------------------------------------- ");
239 char buf_1[128] =
"Here I am ... in test";
240 int lin = strlen(buf_1);
242 PRINT(outname<<
": encrypting (public): "<<buf_1<<
" ("<<strlen(buf_1)<<
" bytes)");
243 int lout1 = TestRSA_1->
EncryptPublic(buf_1,strlen(buf_1),buf_2,512);
244 char buf_2_hex[4096];
246 PRINT(outname<<
": output has "<<lout1<<
" bytes: here is its hex:");
247 PRINT(outname<<
": "<<buf_2_hex);
249 PRINT(outname<<
": decrypting (private): ("<<lout1<<
" bytes)");
251 PRINT(outname<<
": got: "<<buf_3<<
" ("<<lout2<<
" bytes)");
252 if (memcmp(buf_1,buf_3,lin)) {
253 PRINT(outname<<
": RSA public enc / private dec mismatch: ");
254 PRINT(outname<<
": got: "<<buf_3<<
" ("<<lout2<<
" bytes)");
255 PRINT(outname<<
": instead of: "<<buf_1<<
" ("<<strlen(buf_1)<<
" bytes)");
256 }
else if (lout2 > lin) {
257 PRINT(outname<<
": RSA public enc / private dec length mismatch: ");
258 PRINT(outname<<
": got: "<<lout2<<
" instead of "<<lin);
260 for (; j<lout2; j++) printf(
"%s: %d: 0x%x\n",outname,j,(
int)buf_3[j]);
262 PRINT(outname<<
": RSA public enc / private dec test OK ");
264 PRINT(outname<<
": --------------------------------------------------- ");
265 PRINT(outname<<
": encrypting (private): "<<buf_1<<
" ("<<strlen(buf_1)<<
" bytes)");
268 PRINT(outname<<
": output has "<<lout1<<
" bytes: here is its hex:");
269 PRINT(outname<<
": "<<buf_2_hex);
270 PRINT(outname<<
": decrypting (public): ("<<lout1<<
" bytes)");
272 PRINT(outname<<
": got: "<<buf_3<<
" ("<<lout2<<
" bytes)");
273 if (memcmp(buf_1,buf_3,lin)) {
274 PRINT(outname<<
": RSA private enc / public dec mismatch: ");
275 PRINT(outname<<
": got: "<<buf_3<<
" ("<<lout2<<
" bytes)");
276 PRINT(outname<<
": instead of: "<<buf_1<<
" ("<<strlen(buf_1)<<
" bytes)");
277 }
else if (lout2 > lin) {
278 PRINT(outname<<
": RSA private enc / public dec length mismatch: ");
279 PRINT(outname<<
": got: "<<lout2<<
" instead of "<<lin);
281 for (; j<lout2; j++) printf(
"%s: %d: 0x%x\n",outname,j,(
int)buf_3[j]);
283 PRINT(outname<<
": RSA private enc / public dec test OK ");
287 PRINT(outname<<
": testing bucket RSA encryption");
290 PRINT(outname<<
": length of string: "<<Bck0.size);
293 PRINT(outname<<
": length of private encryption: "<<lo1);
295 PRINT(outname<<
": length of public decryption: "<<lo2);
297 PRINT(outname<<
": test bucket RSA priv enc / pub dec failed: ");
298 PRINT(outname<<
": got: "<<lo2<<
" bytes)");
299 PRINT(outname<<
": instead of: "<<lo1<<
" bytes)");
301 PRINT(outname<<
": test bucket RSA priv enc / pub dec OK");
305 PRINT(outname<<
": length of public encryption: "<<lo1);
307 PRINT(outname<<
": length of private decryption: "<<lo2);
309 PRINT(outname<<
": test bucket RSA pub enc / priv dec failed: ");
310 PRINT(outname<<
": got: "<<lo2<<
" bytes)");
311 PRINT(outname<<
": instead of: "<<lo1<<
" bytes)");
313 PRINT(outname<<
": test bucket RSA pub enc / priv dec OK");
318 PRINT(outname<<
": --------------------------------------------------- ");
323 for (; i<1000; i++) {
327 lout1 = TestRSA_1->
EncryptPrivate(buf_1,strlen(buf_1),buf_2,4096);
329 if (memcmp(buf_1,buf_3,lin)) {
330 PRINT(outname<<
": RSA private enc / public dec mismatch: "<<i);
331 PRINT(outname<<
": got: "<<buf_3<<
" ("<<lout2<<
" bytes)");
332 PRINT(outname<<
": instead of: "<<buf_1<<
" ("<<strlen(buf_1)<<
" bytes)");
333 }
else if (lout2 > lin) {
334 PRINT(outname<<
": RSA private enc / public dec length mismatch: "<<i);
335 PRINT(outname<<
": got: "<<lout2<<
" instead of "<<lin);
337 for (; j<lout2; j++) printf(
"%s: %d: 0x%x\n",outname,j,(
int)buf_3[j]);
341 if (i && !(i % 10))
PRINT(outname<<
": done "<<i);
345 PRINT(outname<<
": RSA object could not be instantiated: ");
349 PRINT(outname<<
": --------------------------------------------------- ");
350 PRINT(outname<<
": Testing key agreement for ciphers ... ");
354 PRINT(outname<<
": CF_1: prepare ...");
358 if (!(bp1 = CF_1->
Public(lp1))) {
359 PRINT(outname<<
": CF_1 cipher: problems getting public part ");
363 PRINT(outname<<
": CF_1 cipher object could not be instantiated: ");
368 PRINT(outname<<
": CF_3: instantiate ... with pub");
374 if (!(bp3 = CF_3->
Public(lp3))) {
375 PRINT(outname<<
": CF_3 cipher: problems getting public part ");
379 PRINT(outname<<
": CF_3 cipher object could not be instantiated: ");
382 if (CF_1 && CF_1->
IsValid() && bp3) {
383 PRINT(outname<<
": CF_1: finalize ... with pub");
388 PRINT(outname<<
": CF_1 cipher object could not be finalized ");
392 char chex[128] = {0};
394 PRINT(outname<<
": cipher 1 encrypted (hex):");
396 PRINT(outname<<
": cipher 1 used length: "<<CF_1->
Length());
398 PRINT(outname<<
": cipher 3 encrypted (hex):");
400 PRINT(outname<<
": cipher 3 used length: "<<CF_3->
Length());
403 PRINT(outname<<
": ciphers match !");
405 PRINT(outname<<
": ciphers DO NOT match !");
412 char tm_1[64] =
"Test message for cipher - 001";
413 PRINT(outname<<
": Test message: "<<tm_1);
414 int ltm_1 = strlen(tm_1);
417 int ltmp = CF_1->
Encrypt(tm_1,ltm_1,tmp_1);
418 char tm_2[128] = {0};
420 PRINT(outname<<
": cipher encrypted (hex):");
423 int lfin = CF_3->
Decrypt(tmp_1,ltmp,tm_3);
427 PRINT(outname<<
": cipher decrypted: "<<tm_3);
428 if (strncmp(tm_1,tm_3,ltm_1)) {
429 PRINT(outname<<
": symmetric cipher test failed: ");
430 PRINT(outname<<
": got: "<<tm_3<<
" ("<<lfin<<
" bytes)");
431 PRINT(outname<<
": instead of: "<<tm_1<<
" ("<<ltm_1<<
" bytes)");
433 PRINT(outname<<
": symmetric cipher test OK ");
437 PRINT(outname<<
": cipher decryption failure");
439 PRINT(outname<<
": cipher encryption failure");
442 if (CF_1)
delete CF_1;
443 if (CF_3)
delete CF_3;
452 PRINT(outname<<
": --------------------------------------------------- ");
453 PRINT(outname<<
": Testing X509 functionality ... ");
460 PRINT(outname<<
": --------------------------------------------------- ");
void XrdCryptoSetTrace(kXR_int32 trace)
#define cryptoTRACE_Debug
int(* XrdCryptoKDFun_t)(const char *pass, int plen, const char *salt, int slen, char *key, int klen)
XrdCryptoFactory * gCryptoFactory
int XrdSutToHex(const char *in, int lin, char *out)
void XrdSutSetTrace(kXR_int32 trace)
virtual int Length() const
virtual char * Buffer() const
virtual int Decrypt(const char *in, int lin, char *out)
virtual int DecOutLength(int l)
virtual int Encrypt(const char *in, int lin, char *out)
virtual char * Public(int &lpub)
virtual int EncOutLength(int l)
virtual bool Finalize(bool padded, char *pub, int lpub, const char *t)
virtual XrdCryptoX509 * X509(const char *cf, const char *kf=0)
virtual void SetTrace(kXR_int32 trace)
virtual XrdCryptoKDFun_t KDFun()
virtual XrdCryptoCipher * Cipher(const char *t, int l=0)
virtual XrdCryptoRSA * RSA(int b=0, int e=0)
virtual XrdCryptoMsgDigest * MsgDigest(const char *dgst)
static XrdCryptoFactory * GetCryptoFactory(const char *factoryname)
virtual int Update(const char *b, int l)
virtual int ImportPublic(const char *in, int lin)
virtual int ExportPrivate(char *out, int lout)
virtual int EncryptPublic(const char *in, int lin, char *out, int lout)
virtual int EncryptPrivate(const char *in, int lin, char *out, int lout)
virtual int ImportPrivate(const char *in, int lin)
virtual int DecryptPublic(const char *in, int lin, char *out, int lout)
virtual int ExportPublic(char *out, int lout)
virtual int DecryptPrivate(const char *in, int lin, char *out, int lout)