blapitest.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,834 行 · 第 1/4 页
C
1,834 行
rc5_cbc_test(blapitestInfo *info){ SECStatus rv; RC5Context *rc5cx; PRIntervalTime time1, time2; int i, numiter; numiter = info->repetitions; fillitem(&info->key, info->keysize, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); fillitem(&info->iv, info->bufsize, "tmp.iv"); TIMESTART(); for (i=0; i<numiter-1; i++) { rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, info->iv.data, NSS_RC5_CBC); RC5_DestroyContext(rc5cx, PR_TRUE); } rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, info->iv.data, NSS_RC5_CBC); TIMEFINISH("RC5 CBC CONTEXT CREATE", info->key.len); if (!rc5cx) { fprintf(stderr,"%s: Failed to create encryption context!\n", progName); return SECFailure; } info->out.len = 2*info->in.len; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); if (info->encrypt) { TIMESTART(); for (i=0; i<numiter; i++) rv = RC5_Encrypt(rc5cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC5 CBC ENCRYPT", info->in.len); if (info->performance) { /* reset the context */ RC5_DestroyContext(rc5cx, PR_TRUE); rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, info->iv.data, NSS_RC5_CBC); rv = RC5_Encrypt(rc5cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); } if (rv) { fprintf(stderr, "%s: Failed to encrypt!\n", progName); CHECKERROR(rv, __LINE__); } } else { TIMESTART(); for (i=0; i<numiter; i++) rv = RC5_Decrypt(rc5cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC5 CBC DECRYPT", info->in.len); if (info->performance) { /* reset the context */ RC5_DestroyContext(rc5cx, PR_TRUE); rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, info->iv.data, NSS_RC5_CBC); rv = RC5_Decrypt(rc5cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); } if (rv) { fprintf(stderr, "%s: Failed to decrypt!\n", progName); CHECKERROR(rv, __LINE__); } } RC5_DestroyContext(rc5cx, PR_TRUE); return rv;}#endifstatic SECStatusrsa_test(blapitestInfo *info){ RSAPrivateKey *key; SECItem expitem; SECStatus rv; PRIntervalTime time1, time2; int i, j, numiter; unsigned int modLen; numiter = info->repetitions; fillitem(&info->in, info->bufsize, "tmp.pt"); if (info->key.len > 0) { key = rsakey_from_filedata(&info->key); } else { expitem.len = 4; expitem.data = (unsigned char *)PORT_ZAlloc(4); expitem.data[0] = (info->rsapubexp >> 24) & 0xff; expitem.data[1] = (info->rsapubexp >> 16) & 0xff; expitem.data[2] = (info->rsapubexp >> 8) & 0xff; expitem.data[3] = (info->rsapubexp & 0xff); TIMESTART(); for (i=0; i<numiter-1; i++) { key = RSA_NewKey(info->keysize*8, &expitem); PORT_FreeArena(key->arena, PR_TRUE); } key = RSA_NewKey(info->keysize*8, &expitem); TIMEFINISH("RSA KEY GEN", info->keysize); rsakey_to_file(key, "tmp.key"); } if (key->modulus.data[0] == 0) { /* integer value of input must be less than modulus */ if (info->in.data[0] >= key->modulus.data[1]) return SECFailure; } else { if (info->in.data[0] >= key->modulus.data[0]) return SECFailure; } modLen = key->modulus.len - !key->modulus.data[0]; if (info->in.len % modLen != 0) { fprintf(stderr, "Input buffer must be a multiple of modulus length!\n"); return SECFailure; } info->out.len = info->in.len; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); if (info->encrypt) { RSAPublicKey pubkey; SECITEM_CopyItem(key->arena, &pubkey.modulus, &key->modulus); SECITEM_CopyItem(key->arena, &pubkey.publicExponent, &key->publicExponent); TIMESTART(); for (i=0; i<numiter; i++) { for (j=0; j<info->in.len; j+=pubkey.modulus.len) { rv = RSA_PublicKeyOp(&pubkey, &info->out.data[j], &info->in.data[j]); } } TIMEFINISH("RSA ENCRYPT", info->in.len); CHECKERROR(rv, __LINE__); } else { TIMESTART(); for (i=info->repetitions; i>0; i--) { for (j=0; j<info->in.len; j+=key->modulus.len) { rv = RSA_PrivateKeyOp(key, &info->out.data[j], &info->in.data[j]); } } TIMEFINISH("RSA DECRYPT", info->in.len); CHECKERROR(rv, __LINE__); } PORT_FreeArena(key->arena, PR_TRUE); return SECSuccess;}static SECStatuspqg_test(blapitestInfo *info){ SECStatus rv = SECSuccess; PQGVerify *verify; PRIntervalTime time1, time2; int i, numiter; numiter = info->repetitions; if (info->pqg.len > 0) { info->params = pqg_from_filedata(&info->pqg); } else { TIMESTART(); for (i=0; i<numiter-1; i++) { rv = PQG_ParamGen(info->keysize, &info->params, &verify); PORT_FreeArena(info->params->arena, PR_TRUE); } rv = PQG_ParamGen(info->keysize, &info->params, &verify); TIMEFINISH("PQG PARAM GEN", info->keysize); pqg_to_file(info->params, "tmp.pqg"); } CHECKERROR(rv, __LINE__); return rv;}static SECStatusdsa_test(blapitestInfo *info){ DSAPrivateKey *key; SECStatus rv = SECSuccess; PRIntervalTime time1, time2; int i, numiter; numiter = info->repetitions; fillitem(&info->in, info->bufsize, "tmp.pt"); if (info->key.len > 0) { key = dsakey_from_filedata(&info->key); } else { pqg_test(info); if (info->useseed) { if (info->seed.len == 0) get_and_write_random_bytes(&info->seed, DSA_SUBPRIME_LEN, "tmp.seed"); rv = DSA_NewKeyFromSeed(info->params, info->seed.data, &key); } else { rv = DSA_NewKey(info->params, &key); } CHECKERROR(rv, __LINE__); dsakey_to_file(key, "tmp.key"); } if (info->sign) { info->out.len = DSA_SIGNATURE_LEN; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); if (info->usesigseed) { if (info->sigseed.len == 0) get_and_write_random_bytes(&info->sigseed, DSA_SUBPRIME_LEN, "tmp.sigseed"); TIMESTART(); rv = DSA_SignDigestWithSeed(key, &info->out, &info->in, info->sigseed.data); TIMEFINISH("DSA SIGN", info->in.len); } else { TIMESTART(); for (i=0; i<numiter; i++) rv = DSA_SignDigest(key, &info->out, &info->in); TIMEFINISH("DSA SIGN", info->in.len); } CHECKERROR(rv, __LINE__); } else { DSAPublicKey pubkey; PRArenaPool *arena; arena = key->params.arena; SECITEM_CopyItem(arena, &pubkey.params.prime, &key->params.prime); SECITEM_CopyItem(arena, &pubkey.params.subPrime, &key->params.subPrime); SECITEM_CopyItem(arena, &pubkey.params.base, &key->params.base); SECITEM_CopyItem(arena, &pubkey.publicValue, &key->publicValue); TIMESTART(); for (i=0; i<numiter; i++) rv = DSA_VerifyDigest(&pubkey, &info->out, &info->in); TIMEFINISH("DSA VERIFY", info->in.len); if (rv != SECSuccess) { PR_fprintf(PR_STDOUT, "Signature failed verification!\n"); CHECKERROR(rv, __LINE__); } /*else { PR_fprintf(PR_STDOUT, "Signature verified.\n"); }*/ } PORT_FreeArena(key->params.arena, PR_TRUE); return SECSuccess;}static SECStatusmd5_multi_test(blapitestInfo *info){ SECStatus rv = SECSuccess; MD5Context *md5cx; unsigned int len; MD5Context *foomd5cx; unsigned char *foomd5; int i; if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } md5cx = MD5_NewContext(); if (!md5cx) { PR_fprintf(PR_STDERR, "%s: Failed to create hash context!\n", progName); return SECFailure; } info->out.len = MD5_LENGTH; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); MD5_Begin(md5cx); for (i=0; i<info->bufsize/8; i++) { MD5_Update(md5cx, &info->in.data[i*8], 8); len = MD5_FlattenSize(md5cx); foomd5 = PORT_Alloc(len); MD5_Flatten(md5cx, foomd5); foomd5cx = MD5_Resurrect(foomd5, NULL); rv = PORT_Memcmp(foomd5cx, md5cx, len); if (rv != SECSuccess) PR_fprintf(PR_STDERR, "%s: MD5_Resurrect failed!\n", progName); MD5_DestroyContext(foomd5cx, PR_TRUE); PORT_Free(foomd5); } MD5_End(md5cx, info->out.data, &len, MD5_LENGTH); if (len != MD5_LENGTH) PR_fprintf(PR_STDERR, "%s: Bad hash size %d.\n", progName, len); MD5_DestroyContext(md5cx, PR_TRUE); return rv;}static SECStatusmd5_test(blapitestInfo *info){ SECStatus rv = SECSuccess; PRIntervalTime time1, time2; int i; if (!info->hash) return SECFailure; if (info->multihash) return md5_multi_test(info); if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } info->out.len = MD5_LENGTH; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); TIMESTART(); for (i=info->repetitions; i>0; i--) { MD5_HashBuf(info->out.data, info->in.data, info->in.len); } TIMEFINISH("MD5 HASH", info->in.len); return rv;}static SECStatusmd2_multi_test(blapitestInfo *info){ SECStatus rv = SECSuccess; MD2Context *md2cx; unsigned int len; MD2Context *foomd2cx; unsigned char *foomd2; int i; if (!info->hash) return SECFailure; if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } md2cx = MD2_NewContext(); if (!md2cx) { PR_fprintf(PR_STDERR, "%s: Failed to create hash context!\n", progName); return SECFailure; } info->out.len = MD2_LENGTH; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); MD2_Begin(md2cx); for (i=0; i<info->bufsize/8; i++) { MD2_Update(md2cx, &info->in.data[i*8], 8); len = MD2_FlattenSize(md2cx); foomd2 = PORT_Alloc(len); MD2_Flatten(md2cx, foomd2); foomd2cx = MD2_Resurrect(foomd2, NULL); rv = PORT_Memcmp(foomd2cx, md2cx, len); if (rv != SECSuccess) PR_fprintf(PR_STDERR, "%s: MD2_Resurrect failed!\n", progName); MD2_DestroyContext(foomd2cx, PR_TRUE); PORT_Free(foomd2); } MD2_End(md2cx, info->out.data, &len, MD2_LENGTH); if (len != MD2_LENGTH) PR_fprintf(PR_STDERR, "%s: Bad hash size %d.\n", progName, len); MD2_DestroyContext(md2cx, PR_TRUE); return rv;}static SECStatusmd2_test(blapitestInfo *info){ unsigned int len; MD2Context *cx = MD2_NewContext(); SECStatus rv = SECSuccess; PRIntervalTime time1, time2; int i; if (!info->hash) return SECFailure; if (info->multihash) return md2_multi_test(info); if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } info->out.len = 16; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); info->in.data[info->in.len] = '\0'; TIMESTART(); for (i=0; i<info->repetitions; i++) { MD2_Begin(cx); MD2_Update(cx, info->in.data, info->in.len); MD2_End(cx, info->out.data, &len, 16); } TIMEFINISH("MD2 HASH", info->in.len); MD2_DestroyContext(cx, PR_TRUE); return rv;}static SECStatussha1_multi_test(blapitestInfo *info){ SECStatus rv = SECSuccess; SHA1Context *sha1cx; unsigned int len; SHA1Context *foosha1cx; unsigned char *foosha1; int i; if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } sha1cx = SHA1_NewContext(); if (!sha1cx) { PR_fprintf(PR_STDERR, "%s: Failed to create hash context!\n", progName); return SECFailure; } info->out.len = SHA1_LENGTH; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); SHA1_Begin(sha1cx); for (i=0; i<info->bufsize/8; i++) { SHA1_Update(sha1cx, &info->in.data[i*8], 8); len = SHA1_FlattenSize(sha1cx); foosha1 = PORT_Alloc(len); SHA1_Flatten(sha1cx, foosha1); foosha1cx = SHA1_Resurrect(foosha1, NULL); rv = PORT_Memcmp(foosha1cx, sha1cx, len); if (rv != SECSuccess) PR_fprintf(PR_STDERR, "%s: SHA1_Resurrect failed!\n", progName); SHA1_DestroyContext(foosha1cx, PR_TRUE); PORT_Free(foosha1); } SHA1_End(sha1cx, info->out.data, &len, SHA1_LENGTH); if (len != SHA1_LENGTH) PR_fprintf(PR_STDERR, "%s: Bad hash size %d.\n", progName, len); SHA1_DestroyContext(sha1cx, PR_TRUE); return rv;}static SECStatussha1_test(blapitestInfo *info){ unsigned int len; SHA1Context *cx = SHA1_NewContext(); SECStatus rv = SECSuccess; PRIntervalTime time1, time2; int i; if (!info->hash) return SECFailure; if (info->multihash) return sha1_multi_test(info); if (info->in.len == 0) { rv = get_and_write_random_bytes(&info->in, info->bufsize, "tmp.pt"); CHECKERROR(rv, __LINE__); } info->out.len = SHA1_LENGTH; info->out.data = (unsigned char *)PORT_ZAlloc(info->out.len); info->in.data[info->in.len] = '\0'; TIMESTART(); for (i=info->repetitions; i>0; i--) { SHA1_Begin(cx); SHA1_Update(cx, info->in.data, info->in.len); SHA1_End(cx, info->out.data, &len, SHA1_LENGTH); } TIMEFINISH("SHA1 HASH", info->in.len); SHA1_DestroyContext(cx, PR_TRUE); return rv;}typedef SECStatus (* blapitestCryptoFn)(blapitestInfo *);static blapitestCryptoFn crypto_fns[] ={ des_ecb_test, des_cbc_test, des_ede_ecb_test, des_ede_cbc_test, rc2_ecb_test, rc2_cbc_test, rc4_test,#if NSS_SOFTOKEN_DOES_RC5 rc5_ecb_test, rc5_cbc_test,#endif rsa_test, NULL, pqg_test, dsa_test, NULL, md5_test, md2_test, sha1_test, NULL};static char *mode_strings[] ={
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?