void bench_arc4(void) { Arc4 enc; double start, total, persec; int i; #ifdef HAVE_CAVIUM if (Arc4InitCavium(&enc, CAVIUM_DEV_ID) != 0) printf("arc4 init cavium failed\n"); #endif Arc4SetKey(&enc, key, 16); start = current_time(1); for(i = 0; i < numBlocks; i++) Arc4Process(&enc, cipher, plain, sizeof(plain)); total = current_time(0) - start; persec = 1 / total * numBlocks; #ifdef BENCH_EMBEDDED /* since using kB, convert to MB/s */ persec = persec / 1024; #endif printf("ARC4 %d %s took %5.3f seconds, %7.3f MB/s\n", numBlocks, blockType, total, persec); #ifdef HAVE_CAVIUM Arc4FreeCavium(&enc); #endif }
void tr_rc4_process (tr_rc4_ctx_t handle, const void * input, void * output, size_t length) { assert (handle != NULL); if (length == 0) return; assert (input != NULL); assert (output != NULL); Arc4Process (handle, output, input, length); }
void bench_arc4(void) { Arc4 enc; double start, total, persec; int i; Arc4SetKey(&enc, key, 16); start = current_time(); for(i = 0; i < megs; i++) Arc4Process(&enc, cipher, plain, sizeof(plain)); total = current_time() - start; persec = 1 / total * megs; printf("ARC4 %d megs took %5.3f seconds, %6.2f MB/s\n", megs, total, persec); }
/* place a generated block in output */ void RNG_GenerateBlock(RNG* rng, byte* output, word32 sz) { XMEMSET(output, 0, sz); Arc4Process(&rng->cipher, output, output, sz); }
int arc4_test() { byte cipher[16]; byte plain[16]; const char* keys[] = { "\x01\x23\x45\x67\x89\xab\xcd\xef", "\x01\x23\x45\x67\x89\xab\xcd\xef", "\x00\x00\x00\x00\x00\x00\x00\x00", "\xef\x01\x23\x45" }; testVector a, b, c, d; testVector test_arc4[4]; int times = sizeof(test_arc4) / sizeof(testVector), i; a.input = "\x01\x23\x45\x67\x89\xab\xcd\xef"; a.output = "\x75\xb7\x87\x80\x99\xe0\xc5\x96"; a.inLen = strlen(a.input); a.outLen = strlen(a.output); b.input = "\x00\x00\x00\x00\x00\x00\x00\x00"; b.output = "\x74\x94\xc2\xe7\x10\x4b\x08\x79"; b.inLen = strlen(b.input); b.outLen = strlen(b.output); c.input = "\x00\x00\x00\x00\x00\x00\x00\x00"; c.output = "\xde\x18\x89\x41\xa3\x37\x5d\x3a"; c.inLen = strlen(c.input); c.outLen = strlen(c.output); d.input = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; d.output = "\xd6\xa1\x41\xa7\xec\x3c\x38\xdf\xbd\x61"; d.inLen = strlen(d.input); d.outLen = strlen(d.output); test_arc4[0] = a; test_arc4[1] = b; test_arc4[2] = c; test_arc4[3] = d; for (i = 0; i < times; ++i) { Arc4 enc; Arc4 dec; Arc4SetKey(&enc, (byte*)keys[i], (word32)strlen(keys[i])); Arc4SetKey(&dec, (byte*)keys[i], (word32)strlen(keys[i])); Arc4Process(&enc, cipher, (byte*)test_arc4[i].input, (word32)test_arc4[i].outLen); Arc4Process(&dec, plain, cipher, (word32)test_arc4[i].outLen); if (memcmp(plain, test_arc4[i].input, test_arc4[i].outLen)) return -20 - i; if (memcmp(cipher, test_arc4[i].output, test_arc4[i].outLen)) return -20 - 5 - i; } return 0; }