www.pudn.com > bf-sdk11.zip > CPP_DEMO.CPP
// CPP_DEMO.CPP // test program for BFENG.OBJ // programming language: MS Visual C++ 1.0, QuickWin // memory model: large // last update: 05/25/96 // (c)1996 Markus Hahn #include#include #include #include #include "blowfish.h" // official testvectors from DDJ 10/95... unsigned char key1[] = "abcdefghijklmnopqrstuvwxyz"; unsigned long testdata1_p[2] = {0x424c4f57, 0x46495348}; unsigned long testdata1_c[2] = {0x324ed0fe, 0xf413a203}; unsigned char key2[] = "Who is John Galt?"; unsigned long testdata2_p[2] = {0xfedcba98, 0x76543210}; unsigned long testdata2_c[2] = {0xcc91732b, 0x8022f684}; #define BIGBUFSIZE 32000 #define TESTLOOPS 400UL // random32() - creates 32bit random value, don't use this in real crypt apps unsigned long random32() { return ((unsigned long)rand() << 16) | (unsigned long)rand(); }; // global data... unsigned long ulCBCIVL; // IV == initalisation vector unsigned long ulCBCIVR; unsigned long ulCBCLeft; unsigned long ulCBCRight; unsigned char sMyKey[256]; unsigned long testbuf[6]; unsigned int unI; unsigned long ulStart; unsigned long ulTime; unsigned long ulRate; unsigned long *pBoxes; unsigned long BF_key[1058]; unsigned char biggy[BIGBUFSIZE]; clock_t needed_time; int main() { // init. the random generator srand((unsigned)time(NULL)); // save original boxes Blowfish_GetBoxes(BF_key); Blowfish_SetRounds(16); // en- and decrypt the test vectors... // #1 puts("test vector #1..."); Blowfish_Init(key1, sizeof(key1)-1); // show the first 6 p-boxes pBoxes=(unsigned long*)Blowfish_GetBoxPointer; puts("pboxes:"); for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]); puts(""); // now encrypt, decrypt and compare with the official values printf("plaintext : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]); Blowfish_ECBEncrypt(testdata1_p, 8); printf("ciphertext: %08lx %08lx\n", testdata1_p[0], testdata1_p[1]); printf("DDJ 10/95 : %08lx %08lx\n", testdata1_c[0], testdata1_c[1]); Blowfish_ECBDecrypt(testdata1_p, 8); printf("decrypted : %08lx %08lx\n", testdata1_p[0], testdata1_p[1]); puts(""); // #2 puts("test vector #2..."); Blowfish_SetBoxes(BF_key); // reload original boxes Blowfish_Init(key2, sizeof(key2)-1); pBoxes=(unsigned long*)Blowfish_GetBoxPointer; puts("pboxes:"); for (unI=0; unI<5; unI++) printf("%08lx ", pBoxes[unI]); puts(""); printf("plaintext : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]); Blowfish_ECBEncrypt(testdata2_p, 8); printf("ciphertext: %08lx %08lx\n", testdata2_p[0], testdata2_p[1]); printf("DDJ 10/95 : %08lx %08lx\n", testdata2_c[0], testdata2_c[1]); Blowfish_ECBDecrypt(testdata2_p, 8); printf("decrypted : %08lx %08lx\n", testdata2_p[0], testdata2_p[1]); puts("press ENTER...\n"); getchar(); // start ECB tests with a small buffer... // 16 rounds... Blowfish_SetBoxes(BF_key); // reload original boxes strcpy((char*) sMyKey, "I think I climb aboard!"); Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey)); puts("ECB test 16 round..."); puts("original data:"); // generate and show random numbers... for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]=random32()); puts("\nencrypted data:"); Blowfish_ECBEncrypt(testbuf, 6*4); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\ndecrypted data:"); Blowfish_ECBDecrypt(testbuf, 6*4); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\n"); // 32 rounds... Blowfish_SetRounds(32); // change number of encryption rounds Blowfish_SetBoxes(BF_key); strcpy((char*) sMyKey, "I think I climb aboard!"); Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey)); puts("ECB test 32 round..."); puts("original data:"); // (to show the difference we do NOT create new test data) for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\nencrypted data:"); Blowfish_ECBEncrypt(testbuf, 6*4); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\ndecrypted data:"); Blowfish_ECBDecrypt(testbuf, 6*4); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\npress ENTER...\n"); getchar(); // start CBC tests with a small buffer... // 16 rounds... ulCBCLeft=random32(); // init. and save the CBC IV ulCBCRight=random32(); ulCBCIVL=ulCBCLeft; ulCBCIVR=ulCBCRight; Blowfish_SetRounds(16); // reset to 16 encryption rounds Blowfish_SetBoxes(BF_key); // reload original boxes strcpy((char*) sMyKey, "Who wants some?"); Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey)); puts("CBC test 16 round..."); printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight); puts("original data:"); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\nencrypted data:"); Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\ndecrypted data:"); // restore the original CBC IV for decryption ulCBCIVL=ulCBCLeft; ulCBCIVR=ulCBCRight; Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\n"); // 32 rounds... ulCBCIVL=ulCBCLeft; // use the same CBC IV as above ulCBCIVR=ulCBCRight; Blowfish_SetRounds(32); // set to 32 encryption rounds Blowfish_SetBoxes(BF_key); // reload original boxes strcpy((char*) sMyKey, "Who wants some?"); Blowfish_Init((unsigned char*) sMyKey, strlen((char*) sMyKey)); puts("CBC test 32 round..."); printf("IV: %08lx %08lx\n", ulCBCLeft, ulCBCRight); puts("original data:"); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\nencrypted data:"); Blowfish_CBCEncrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\ndecrypted data:"); ulCBCIVL=ulCBCLeft; ulCBCIVR=ulCBCRight; Blowfish_CBCDecrypt(testbuf, 6*4, &ulCBCIVL, &ulCBCIVR); for (unI=0; unI<6; unI++) printf("%08lx ", testbuf[unI]); puts("\npress ENTER...\n"); getchar(); // benchmark tests, done in CBC mode with a 32kB buffer puts("benchmark test\n16 rounds running..."); Blowfish_SetRounds(16); needed_time=clock(); for (unI=0; unI