blapitest.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,834 行 · 第 1/4 页
C
1,834 行
PQGParams *params; /* DSA only */ unsigned int rounds; /* RC5 only */ unsigned int wordsize; /* RC5 only */ unsigned int rsapubexp; /* RSA only */ unsigned int repetitions; /* performance tests only */} blapitestInfo;/* Macros for performance timing. */#define TIMESTART() \ if (info->performance) \ time1 = PR_IntervalNow();#define TIMEFINISH(mode, nb) \ if (info->performance) { \ time2 = (PRIntervalTime)(PR_IntervalNow() - time1); \ time1 = PR_IntervalToMilliseconds(time2); \ printf("%s,%d,%.3f\n", mode, nb, ((float)(time1))/info->repetitions); \ }SECStatusfillitem(SECItem *item, int numbytes, char *filename){ if (item->len == 0) return get_and_write_random_bytes(item, numbytes, filename); return SECSuccess;}/************************** DES ************************//* encrypt/decrypt for all DES */static SECStatusdes_common(DESContext *descx, blapitestInfo *info){ PRInt32 maxsize; SECStatus rv; PRIntervalTime time1, time2; int i, numiter; numiter = info->repetitions; maxsize = info->in.len; info->out.data = (unsigned char *)PORT_ZAlloc(maxsize); if (info->encrypt) { TIMESTART(); for (i=0; i<numiter; i++) rv = DES_Encrypt(descx, info->out.data, &info->out.len, maxsize, info->in.data, info->in.len); TIMEFINISH("DES ENCRYPT", maxsize); if (rv) { fprintf(stderr, "%s: Failed to encrypt!\n", progName); CHECKERROR(rv, __LINE__); } } else { TIMESTART(); for (i=0; i<numiter; i++) rv = DES_Decrypt(descx, info->out.data, &info->out.len, maxsize, info->in.data, info->in.len); TIMEFINISH("DES DECRYPT", maxsize); if (rv) { fprintf(stderr, "%s: Failed to decrypt!\n", progName); CHECKERROR(rv, __LINE__); } } return rv;}/* DES codebook mode */static SECStatusdes_ecb_test(blapitestInfo *info){ SECStatus rv; DESContext *descx; PRIntervalTime time1, time2; int i, numiter = info->repetitions; fillitem(&info->key, DES_KEY_LENGTH, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); TIMESTART(); for (i=0; i<numiter-1; i++) { descx = DES_CreateContext(info->key.data, NULL, NSS_DES, info->encrypt); DES_DestroyContext(descx, PR_TRUE); } descx = DES_CreateContext(info->key.data, NULL, NSS_DES, info->encrypt); TIMEFINISH("DES ECB CONTEXT CREATE", info->key.len); if (!descx) { fprintf(stderr,"%s: Failed to create encryption context!\n", progName); return SECFailure; } rv = des_common(descx, info); CHECKERROR(rv, __LINE__); DES_DestroyContext(descx, PR_TRUE); return rv;}/* DES chaining mode */static SECStatusdes_cbc_test(blapitestInfo *info){ SECStatus rv; DESContext *descx; PRIntervalTime time1, time2; int i, numiter = info->repetitions; fillitem(&info->key, DES_KEY_LENGTH, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); fillitem(&info->iv, DES_KEY_LENGTH, "tmp.iv"); TIMESTART(); for (i=0; i<numiter-1; i++) { descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, info->encrypt); DES_DestroyContext(descx, PR_TRUE); } descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, info->encrypt); TIMEFINISH("DES CBC CONTEXT CREATE", info->key.len); if (!descx) { PR_fprintf(PR_STDERR, "%s: Failed to create encryption context!\n", progName); return SECFailure; } if (info->performance) { /* In chaining mode, repeated iterations of the encryption * function using the same context will alter the final output. * So, once the performance test is done, reset the context * and perform a single iteration to obtain the correct result. */ int tmp = info->repetitions; rv = des_common(descx, info); DES_DestroyContext(descx, PR_TRUE); descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_CBC, info->encrypt); info->performance = PR_FALSE; info->repetitions = 1; rv = des_common(descx, info); info->performance = PR_TRUE; info->repetitions = tmp; } else { rv = des_common(descx, info); } CHECKERROR(rv, __LINE__); DES_DestroyContext(descx, PR_TRUE); return rv;}/* 3-key Triple-DES codebook mode */static SECStatusdes_ede_ecb_test(blapitestInfo *info){ SECStatus rv; DESContext *descx; PRIntervalTime time1, time2; int i, numiter = info->repetitions; fillitem(&info->key, 3*DES_KEY_LENGTH, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); TIMESTART(); for (i=0; i<numiter-1; i++) { descx = DES_CreateContext(info->key.data, NULL, NSS_DES_EDE3, info->encrypt); DES_DestroyContext(descx, PR_TRUE); } descx = DES_CreateContext(info->key.data, NULL, NSS_DES_EDE3, info->encrypt); TIMEFINISH("3DES ECB CONTEXT CREATE", info->key.len); if (!descx) { fprintf(stderr,"%s: Failed to create encryption context!\n", progName); return SECFailure; } rv = des_common(descx, info); CHECKERROR(rv, __LINE__); DES_DestroyContext(descx, PR_TRUE); return rv;}/* 3-key Triple-DES chaining mode */static SECStatusdes_ede_cbc_test(blapitestInfo *info){ SECStatus rv; DESContext *descx; PRIntervalTime time1, time2; int i, numiter = info->repetitions; fillitem(&info->key, 3*DES_KEY_LENGTH, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); fillitem(&info->iv, DES_KEY_LENGTH, "tmp.iv"); TIMESTART(); for (i=0; i<numiter-1; i++) { descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_EDE3_CBC, info->encrypt); DES_DestroyContext(descx, PR_TRUE); } descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_EDE3_CBC, info->encrypt); TIMEFINISH("3DES CBC CONTEXT CREATE", info->key.len); if (!descx) { fprintf(stderr,"%s: Failed to create encryption context!\n", progName); return SECFailure; } if (info->performance) { /* In chaining mode, repeated iterations of the encryption * function using the same context will alter the final output. * So, once the performance test is done, reset the context * and perform a single iteration to obtain the correct result. */ int tmp = info->repetitions; rv = des_common(descx, info); DES_DestroyContext(descx, PR_TRUE); descx = DES_CreateContext(info->key.data, info->iv.data, NSS_DES_EDE3_CBC, info->encrypt); info->performance = PR_FALSE; info->repetitions = 1; rv = des_common(descx, info); info->performance = PR_TRUE; info->repetitions = tmp; } else { rv = des_common(descx, info); } CHECKERROR(rv, __LINE__); DES_DestroyContext(descx, PR_TRUE); return rv;}/************************** RC2 ************************//* RC2 ECB */static SECStatusrc2_ecb_test(blapitestInfo *info){ SECStatus rv; RC2Context *rc2cx; PRIntervalTime time1, time2; int i, numiter = info->repetitions; fillitem(&info->key, info->keysize, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); TIMESTART(); for (i=0; i<numiter-1; i++) { rc2cx = RC2_CreateContext(info->key.data, info->key.len, NULL, NSS_RC2, info->key.len); RC2_DestroyContext(rc2cx, PR_TRUE); } rc2cx = RC2_CreateContext(info->key.data, info->key.len, NULL, NSS_RC2, info->key.len); TIMEFINISH("RC2 ECB CONTEXT CREATE", info->key.len); if (!rc2cx) { 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 = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC2 ECB ENCRYPT", info->in.len); CHECKERROR(rv, __LINE__); } else { TIMESTART(); for (i=0; i<numiter; i++) rv = RC2_Decrypt(rc2cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC2 ECB DECRYPT", info->in.len); CHECKERROR(rv, __LINE__); } RC2_DestroyContext(rc2cx, PR_TRUE); return rv;}/* RC2 CBC */static SECStatusrc2_cbc_test(blapitestInfo *info){ SECStatus rv; RC2Context *rc2cx; PRIntervalTime time1, time2; int i, 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++) { rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, NSS_RC2_CBC, info->key.len); RC2_DestroyContext(rc2cx, PR_TRUE); } rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, NSS_RC2_CBC, info->key.len); TIMEFINISH("RC2 CBC CONTEXT CREATE", info->key.len); if (!rc2cx) { 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 = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC2 CBC ENCRYPT", info->in.len); if (info->performance) { /* reset the context */ RC2_DestroyContext(rc2cx, PR_TRUE); rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, NSS_RC2_CBC, info->key.len); rv = RC2_Encrypt(rc2cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); } CHECKERROR(rv, __LINE__); if (rv) { fprintf(stderr, "%s: Failed to encrypt!\n", progName); CHECKERROR(rv, __LINE__); } } else { TIMESTART(); for (i=0; i<numiter; i++) rv = RC2_Decrypt(rc2cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC2 CBC DECRYPT", info->in.len); if (info->performance) { /* reset the context */ RC2_DestroyContext(rc2cx, PR_TRUE); rc2cx = RC2_CreateContext(info->key.data, info->key.len, info->iv.data, NSS_RC2_CBC, info->key.len); rv = RC2_Decrypt(rc2cx, 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__); } } RC2_DestroyContext(rc2cx, PR_TRUE); return rv;}/************************** RC4 ************************/static SECStatusrc4_test(blapitestInfo *info){ SECStatus rv; RC4Context *rc4cx; PRIntervalTime time1, time2; int i, numiter; numiter = info->repetitions; fillitem(&info->key, info->keysize, "tmp.key"); fillitem(&info->in, info->bufsize, "tmp.pt"); TIMESTART(); for (i=0; i<numiter-1; i++) { rc4cx = RC4_CreateContext(info->key.data, info->key.len); RC4_DestroyContext(rc4cx, PR_TRUE); } rc4cx = RC4_CreateContext(info->key.data, info->key.len); TIMEFINISH("RC4 CONTEXT CREATE", info->key.len); if (!rc4cx) { 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 = RC4_Encrypt(rc4cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC4 ENCRYPT", info->in.len); if (info->performance) { /* reset the context */ RC4_DestroyContext(rc4cx, PR_TRUE); rc4cx = RC4_CreateContext(info->key.data, info->key.len); rv = RC4_Encrypt(rc4cx, 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 = RC4_Decrypt(rc4cx, info->out.data, &info->out.len, info->out.len, info->in.data, info->in.len); TIMEFINISH("RC4 DECRYPT", info->in.len); if (info->performance) { /* reset the context */ RC4_DestroyContext(rc4cx, PR_TRUE); rc4cx = RC4_CreateContext(info->key.data, info->key.len); rv = RC4_Decrypt(rc4cx, 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__); } } RC4_DestroyContext(rc4cx, PR_TRUE); return rv;}#if NSS_SOFTOKEN_DOES_RC5/************************** RC5 ************************//* RC5 ECB */static SECStatusrc5_ecb_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"); TIMESTART(); for (i=0; i<numiter-1; i++) { rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, NULL, NSS_RC5); RC5_DestroyContext(rc5cx, PR_TRUE); } rc5cx = RC5_CreateContext(&info->key, info->rounds, info->wordsize, NULL, NSS_RC5); TIMEFINISH("RC5 ECB 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 ECB ENCRYPT", 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 ECB ENCRYPT", info->in.len); if (rv) { fprintf(stderr, "%s: Failed to decrypt!\n", progName); CHECKERROR(rv, __LINE__); } } RC5_DestroyContext(rc5cx, PR_TRUE); return rv;}/* RC5 CBC */static SECStatus
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?