📄 rijndaeltest-fst.c
字号:
/* rijndaeltest-fst.c v2.0 August '99 * Optimised ANSI C code * authors: v1.0: Paulo Barreto * Antoon Bosselaers * v2.0: Vincent Rijmen */#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include "rijndael-api-fst.h"#define SUBMITTER "Joan Daemen"static void blockPrint (FILE *fp, const BYTE *block, const char *tag){ int i; fprintf (fp, "%s=", tag); for (i = 0; i < 16; i++) { fprintf (fp, "%02X", block[i]); } fprintf (fp, "\n"); fflush (fp);} /* blockPrint */static void rijndaelVKKAT (FILE *fp, int keyLength){ int i, j, r; BYTE block[4*4]; BYTE keyMaterial[320]; BYTE byteVal = (BYTE)'8'; keyInstance keyInst; cipherInstance cipherInst;#ifdef TRACE_KAT_MCT printf ("Executing Variable-Key KAT (key %d): ", keyLength); fflush (stdout);#endif /* ?TRACE_KAT_MCT */ fprintf (fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); fflush (fp); memset (block, 0, 16); blockPrint (fp, block, "PT"); memset (keyMaterial, 0, sizeof (keyMaterial)); memset (keyMaterial, '0', keyLength/4); for (i = 0; i < keyLength; i++) { keyMaterial[i/4] = byteVal; /* set only the i-th bit of the i-th test key */ r = makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); if (TRUE != r) { fprintf(stderr,"makeKey error %d\n",r); exit(-1); } fprintf (fp, "\nI=%d\n", i+1); fprintf (fp, "KEY=%s\n", keyMaterial); memset (block, 0, 16); r = cipherInit (&cipherInst, MODE_ECB, NULL); if (TRUE != r) { fprintf(stderr,"cipherInit error %d\n",r); exit(-1); } r = blockEncrypt(&cipherInst, &keyInst, block, 128, block); if (128 != r) { fprintf(stderr,"blockEncrypt error %d\n",r); exit(-1); } blockPrint (fp, block, "CT"); /* now check decryption: */ makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); blockDecrypt(&cipherInst, &keyInst, block, 128, block); for (j = 0; j < 16; j++) { assert (block[j] == 0); } /* undo changes for the next iteration: */ keyMaterial[i/4] = (BYTE)'0'; byteVal = (byteVal == '8') ? '4' : (byteVal == '4') ? '2' : (byteVal == '2') ? '1' : /* (byteVal == '1') */ '8'; } assert (byteVal == (BYTE)'8'); #ifdef TRACE_KAT_MCT printf (" done.\n");#endif /* ?TRACE_KAT_MCT */} /* rijndaelVKKAT */static void rijndaelVTKAT (FILE *fp, int keyLength){ int i; BYTE block[4*4]; BYTE keyMaterial[320]; keyInstance keyInst; cipherInstance cipherInst;#ifdef TRACE_KAT_MCT printf ("Executing Variable-Text KAT (key %d): ", keyLength); fflush (stdout);#endif /* ?TRACE_KAT_MCT */ fprintf (fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); fflush (fp); memset (keyMaterial, 0, sizeof (keyMaterial)); memset (keyMaterial, '0', keyLength/4); makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); fprintf (fp, "KEY=%s\n", keyMaterial); for (i = 0; i < 128; i++) { memset (block, 0, 16); block[i/8] |= 1 << (7 - i%8); /* set only the i-th bit of the i-th test block */ fprintf (fp, "\nI=%d\n", i+1); blockPrint (fp, block, "PT"); cipherInit (&cipherInst, MODE_ECB, NULL); blockEncrypt(&cipherInst, &keyInst, block, 128, block); blockPrint (fp, block, "CT"); }#ifdef TRACE_KAT_MCT printf (" done.\n");#endif /* ?TRACE_KAT_MCT */}static void rijndaelTKAT (FILE *fp, int keyLength, FILE *in){ int i, j; unsigned int s; BYTE block[4*4], block2[4*4]; BYTE keyMaterial[320]; keyInstance keyInst; cipherInstance cipherInst;#ifdef TRACE_KAT_MCT printf ("Executing Tables KAT (key %d): ", keyLength); fflush (stdout);#endif /* ?TRACE_KAT_MCT */ fprintf (fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n" "\n", keyLength); fflush (fp); memset (keyMaterial, 0, sizeof (keyMaterial)); for(i = 0; i < 64; i++) { fprintf (fp, "\nI=%d\n", i+1); for(j = 0; j < keyLength/4; j++) { fscanf(in,"%c",&keyMaterial[j]); } makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); fprintf (fp, "KEY=%s\n", keyMaterial); for(j = 0; j < 16; j++) { fscanf(in,"%02x",&s); block[j] = s; } fscanf(in,"%c",&s); fscanf(in,"%c",&s); blockPrint (fp, block, "PT"); cipherInit (&cipherInst, MODE_ECB, NULL); blockEncrypt(&cipherInst, &keyInst, block, 128, block2); blockPrint (fp, block2, "CT"); } for(i = 64; i < 128; i++) { fprintf (fp, "\nI=%d\n", i+1); for(j = 0; j < keyLength/4; j++) { fscanf(in,"%c",&keyMaterial[j]); } makeKey(&keyInst, DIR_DECRYPT, keyLength, keyMaterial); fprintf (fp, "KEY=%s\n", keyMaterial); for(j = 0; j < 16; j++) { fscanf(in,"%02x",&s); block[j] = s; } fscanf(in,"%c",&s); fscanf(in,"%c",&s); cipherInit (&cipherInst, MODE_ECB, NULL); blockDecrypt(&cipherInst, &keyInst, block, 128, block2); blockPrint (fp, block2, "PT"); blockPrint (fp, block, "CT"); }#ifdef TRACE_KAT_MCT printf (" done.\n");#endif /* ?TRACE_KAT_MCT */}static void rijndaelIVKAT (FILE *fp, int keyLength){ int i; BYTE block[4*4], block2[4*4]; BYTE keyMaterial[320]; keyInstance keyInst; cipherInstance cipherInst; char format[10];#ifdef TRACE_KAT_MCT printf ("Executing Intermediate value KAT (key %d): ", keyLength); fflush (stdout);#endif /* ?TRACE_KAT_MCT */ fprintf (fp, "\n" "==========\n" "\n" "KEYSIZE=%d\n", keyLength); fflush (fp); memset (keyMaterial, 0, sizeof (keyMaterial)); for (i = 0; i < keyLength/8; i++) { sprintf (&keyMaterial[2*i], "%02X", i); } makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); fprintf (fp, "KEY=%s\n", keyMaterial); fprintf (fp, "\nIntermediate Ciphertext Values (Encryption)\n\n"); for (i = 0; i < 16; i++) { block[i] = i; } blockPrint (fp, block, "PT"); cipherInit (&cipherInst, MODE_ECB, NULL); for(i = 1; i < ROUNDS; i++) { cipherUpdateRounds (&cipherInst, &keyInst, block, 16, block2, i); sprintf(format,"CT%d",i); blockPrint (fp, block2, format); } cipherUpdateRounds (&cipherInst, &keyInst, block, 128, block2, ROUNDS); blockPrint (fp, block2, "CT"); /* hack ! */ /* in order to get the same intermediate values in decryption as in decryption, we need to use the encryption roundkeys, but the key direction has to be DIR_DECRYPT consider it as a dirty trick */ makeKey(&keyInst, DIR_ENCRYPT, keyLength, keyMaterial); keyInst.direction = DIR_DECRYPT; /* end hack */ fprintf (fp, "\nIntermediate Ciphertext Values (Decryption)\n\n"); blockPrint (fp, block2, "CT"); cipherInit (&cipherInst, MODE_ECB, NULL); for(i = 1; i < ROUNDS; i++) { cipherUpdateRounds (&cipherInst, &keyInst, block2, 128,block, ROUNDS-i); sprintf(format,"PT%d",i); blockPrint (fp, block, format); } cipherUpdateRounds (&cipherInst, &keyInst, block2, 128, block, 0); blockPrint (fp, block, "PT"); #ifdef TRACE_KAT_MCT printf (" done.\n");#endif }static void makeKATs (const char *vkFile, const char *vtFile, const char *tblFile, const char *ivFile){ FILE *fp, *fp2; /* prepare Variable Key Known Answer Tests: */ fp = fopen (vkFile, "w"); fprintf (fp, "\n" "=========================\n" "\n" "FILENAME: \"%s\"\n" "\n" "Electronic Codebook (ECB) Mode\n" "Variable Key Known Answer Tests\n" "\n" "Algorithm Name: Rijndael\n" "Principal Submitter: %s\n", vkFile,SUBMITTER); fflush (fp); rijndaelVKKAT (fp, 128); /* test for 128-bit key */ rijndaelVKKAT (fp, 192); /* test for 192-bit key */ rijndaelVKKAT (fp, 256); /* test for 256-bit key */ fprintf (fp, "\n" "=========="); fclose (fp); /* prepare Variable Text Known Answer Tests: */ fp = fopen (vtFile, "w"); fprintf (fp, "\n" "=========================\n" "\n" "FILENAME: \"%s\"\n" "\n" "Electronic Codebook (ECB) Mode\n" "Variable Text Known Answer Tests\n" "\n" "Algorithm Name: Rijndael\n" "Principal Submitter: %s\n", vtFile,SUBMITTER); fflush (fp); rijndaelVTKAT (fp, 128); rijndaelVTKAT (fp, 192); rijndaelVTKAT (fp, 256); fprintf (fp, "\n" "=========="); fclose (fp); /* prepare Tables Known Answer Tests: */ fp = fopen (tblFile, "w"); fprintf (fp, "/* Description of what tables are tested:\n" " The provided implementations each use a different set of tables\n" " - Java implementation: uses no tables\n" " - reference C implementation: uses Logtable, Alogtable, S, Si, rcon\n" " - fast C implementation: uses Logtable, Alogtable, rcon\n" " and additionally, T1, T2, T3, T4, T5, T6, T7, T8\n" " All these tables are tested.\n" "\n" "=========================\n" "\n" "FILENAME: \"%s\"\n" "\n" "Electronic Codebook (ECB) Mode\n" "Tables Known Answer Tests\n" "\n" "Algorithm Name: Rijndael\n" "Principal Submitter: %s\n", tblFile,SUBMITTER); fflush (fp); if (NULL != (fp2 = fopen("table.128","r"))) { rijndaelTKAT (fp, 128,fp2); fclose(fp2); } else { printf("Table Known Answer test expects file table.128\n"); fclose(fp); exit (EXIT_FAILURE); } if (NULL != (fp2 = fopen("table.192","r"))) { rijndaelTKAT (fp, 192,fp2); fclose(fp2); } else { printf("Table Known Answer test expects file table.192\n"); fclose(fp); exit (EXIT_FAILURE); } if (NULL != (fp2 = fopen("table.256","r"))) { rijndaelTKAT (fp, 256,fp2); fclose(fp2); } else { printf("Table Known Answer test expects file table.192\n"); fclose(fp); exit (EXIT_FAILURE); } fprintf (fp, "\n" "=========="); fclose (fp); /* prepare Intermediate Values Known Answer Tests: */ fp = fopen (ivFile, "w"); fprintf (fp, "\n" "=========================\n" "\n" "FILENAME: \"%s\"\n" "\n" "Electronic Codebook (ECB) Mode\n" "Intermediate Value Known Answer Tests\n" "\n" "Algorithm Name: Rijndael\n" "Principal Submitter: %s\n", ivFile,SUBMITTER); fflush (fp); rijndaelIVKAT (fp, 128); rijndaelIVKAT (fp, 192); rijndaelIVKAT (fp, 256); fprintf (fp, "\n" "=========="); fclose (fp);}static void rijndaelECB_MCT (FILE *fp, int keyLength, BYTE direction){ int i, j; BYTE inBlock[4*4], outBlock[4*4], binKey[4*MAXKC]; BYTE keyMaterial[320];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -