📄 genkat.c
字号:
/*Algorithm Name: KeccakAuthors: Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van AsscheDate: October 27, 2008For more information, feedback or questions, please refer to our website:http://keccak.noekeon.org/*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <ctype.h>#include "KeccakNISTInterface.h"#define MAX_MARKER_LEN 50#define SUBMITTER_INFO_LEN 128typedef enum { KAT_SUCCESS = 0, KAT_FILE_OPEN_ERROR = 1, KAT_HEADER_ERROR = 2, KAT_DATA_ERROR = 3, KAT_HASH_ERROR = 4 } STATUS_CODES;#define TestSqueezing//#define ExcludeExtremelyLong#ifdef TestSqueezing#define SqueezingOutputLength 4096#endifSTATUS_CODES genShortMsg(int hashbitlen);STATUS_CODES genLongMsg(int hashbitlen);STATUS_CODES genExtremelyLongMsg(int hashbitlen);STATUS_CODES genMonteCarlo(int hashbitlen);#ifdef TestSqueezingSTATUS_CODES genMonteCarloSqueezing(int hashbitlen);#endifint FindMarker(FILE *infile, const char *marker);int ReadHex(FILE *infile, BitSequence *A, int Length, char *str);void fprintBstr(FILE *fp, char *S, BitSequence *A, int L);STATUS_CODESgenKAT_main(){ int i, ret_val, bitlens[4] = { 224, 256, 384, 512 };#ifdef TestSqueezing if ( (ret_val = genShortMsg(0)) != KAT_SUCCESS ) return ret_val; if ( (ret_val = genLongMsg(0)) != KAT_SUCCESS ) return ret_val;#ifndef ExcludeExtremelyLong if ( (ret_val = genExtremelyLongMsg(0)) != KAT_SUCCESS ) return ret_val;#endif if ( (ret_val = genMonteCarloSqueezing(0)) != KAT_SUCCESS ) return ret_val;#endif for ( i=0; i<4; i++ ) { if ( (ret_val = genShortMsg(bitlens[i])) != KAT_SUCCESS ) return ret_val; if ( (ret_val = genLongMsg(bitlens[i])) != KAT_SUCCESS ) return ret_val;#ifndef ExcludeExtremelyLong if ( (ret_val = genExtremelyLongMsg(bitlens[i])) != KAT_SUCCESS ) return ret_val;#endif if ( (ret_val = genMonteCarlo(bitlens[i])) != KAT_SUCCESS ) return ret_val; } return KAT_SUCCESS;}STATUS_CODESgenShortMsg(int hashbitlen){ char fn[32], line[SUBMITTER_INFO_LEN]; int msglen, msgbytelen, done; BitSequence Msg[256], MD[64];#ifdef TestSqueezing BitSequence Squeezed[SqueezingOutputLength/8]; hashState state;#endif FILE *fp_in, *fp_out; if ( (fp_in = fopen("ShortMsgKAT.txt", "r")) == NULL ) { printf("Couldn't open <ShortMsgKAT.txt> for read\n"); return KAT_FILE_OPEN_ERROR; } sprintf(fn, "ShortMsgKAT_%d.txt", hashbitlen); if ( (fp_out = fopen(fn, "w")) == NULL ) { printf("Couldn't open <%s> for write\n", fn); return KAT_FILE_OPEN_ERROR; } fprintf(fp_out, "# %s\n", fn); if ( FindMarker(fp_in, "# Algorithm Name:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Algorithm Name:%s\n", line); } else { printf("genShortMsg: Couldn't read Algorithm Name\n"); return KAT_HEADER_ERROR; } if ( FindMarker(fp_in, "# Principal Submitter:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Principal Submitter:%s\n", line); } else { printf("genShortMsg: Couldn't read Principal Submitter\n"); return KAT_HEADER_ERROR; } done = 0; do { if ( FindMarker(fp_in, "Len = ") ) fscanf(fp_in, "%d", &msglen); else { done = 1; break; } msgbytelen = (msglen+7)/8; if ( !ReadHex(fp_in, Msg, msgbytelen, "Msg = ") ) { printf("ERROR: unable to read 'Msg' from <ShortMsgKAT.txt>\n"); return KAT_DATA_ERROR; }#ifdef TestSqueezing if (hashbitlen > 0) Hash(hashbitlen, Msg, msglen, MD); else { Init(&state, hashbitlen); Update(&state, Msg, msglen); Final(&state, 0); Squeeze(&state, Squeezed, SqueezingOutputLength); }#else Hash(hashbitlen, Msg, msglen, MD);#endif fprintf(fp_out, "\nLen = %d\n", msglen); fprintBstr(fp_out, "Msg = ", Msg, msgbytelen);#ifdef TestSqueezing if (hashbitlen > 0) fprintBstr(fp_out, "MD = ", MD, hashbitlen/8); else fprintBstr(fp_out, "Squeezed = ", Squeezed, SqueezingOutputLength/8);#else fprintBstr(fp_out, "MD = ", MD, hashbitlen/8);#endif } while ( !done ); printf("finished ShortMsgKAT for <%d>\n", hashbitlen); fclose(fp_in); fclose(fp_out); return KAT_SUCCESS;}STATUS_CODESgenLongMsg(int hashbitlen){ char fn[32], line[SUBMITTER_INFO_LEN]; int msglen, msgbytelen, done; BitSequence Msg[4288], MD[64];#ifdef TestSqueezing BitSequence Squeezed[SqueezingOutputLength/8]; hashState state;#endif FILE *fp_in, *fp_out; if ( (fp_in = fopen("LongMsgKAT.txt", "r")) == NULL ) { printf("Couldn't open <LongMsgKAT.txt> for read\n"); return KAT_FILE_OPEN_ERROR; } sprintf(fn, "LongMsgKAT_%d.txt", hashbitlen); if ( (fp_out = fopen(fn, "w")) == NULL ) { printf("Couldn't open <%s> for write\n", fn); return KAT_FILE_OPEN_ERROR; } fprintf(fp_out, "# %s\n", fn); if ( FindMarker(fp_in, "# Algorithm Name:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Algorithm Name:%s\n", line); } else { printf("genLongMsg: Couldn't read Algorithm Name\n"); return KAT_HEADER_ERROR; } if ( FindMarker(fp_in, "# Principal Submitter:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Principal Submitter:%s\n\n", line); } else { printf("genLongMsg: Couldn't read Principal Submitter\n"); return KAT_HEADER_ERROR; } done = 0; do { if ( FindMarker(fp_in, "Len = ") ) fscanf(fp_in, "%d", &msglen); else break; msgbytelen = (msglen+7)/8; if ( !ReadHex(fp_in, Msg, msgbytelen, "Msg = ") ) { printf("ERROR: unable to read 'Msg' from <LongMsgKAT.txt>\n"); return KAT_DATA_ERROR; }#ifdef TestSqueezing if (hashbitlen > 0) Hash(hashbitlen, Msg, msglen, MD); else { Init(&state, hashbitlen); Update(&state, Msg, msglen); Final(&state, 0); Squeeze(&state, Squeezed, SqueezingOutputLength); }#else Hash(hashbitlen, Msg, msglen, MD);#endif fprintf(fp_out, "Len = %d\n", msglen); fprintBstr(fp_out, "Msg = ", Msg, msgbytelen);#ifdef TestSqueezing if (hashbitlen > 0) fprintBstr(fp_out, "MD = ", MD, hashbitlen/8); else fprintBstr(fp_out, "Squeezed = ", Squeezed, SqueezingOutputLength/8);#else fprintBstr(fp_out, "MD = ", MD, hashbitlen/8);#endif } while ( !done ); printf("finished LongMsgKAT for <%d>\n", hashbitlen); fclose(fp_in); fclose(fp_out); return KAT_SUCCESS;}STATUS_CODESgenExtremelyLongMsg(int hashbitlen){ char fn[32], line[SUBMITTER_INFO_LEN]; BitSequence Text[65], MD[64];#ifdef TestSqueezing BitSequence Squeezed[SqueezingOutputLength/8];#endif int i, repeat; FILE *fp_in, *fp_out; hashState state; HashReturn retval; if ( (fp_in = fopen("ExtremelyLongMsgKAT.txt", "r")) == NULL ) { printf("Couldn't open <ExtremelyLongMsgKAT.txt> for read\n"); return KAT_FILE_OPEN_ERROR; } sprintf(fn, "ExtremelyLongMsgKAT_%d.txt", hashbitlen); if ( (fp_out = fopen(fn, "w")) == NULL ) { printf("Couldn't open <%s> for write\n", fn); return KAT_FILE_OPEN_ERROR; } fprintf(fp_out, "# %s\n", fn); if ( FindMarker(fp_in, "# Algorithm Name:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Algorithm Name:%s\n", line); } else { printf("genExtremelyLongMsg: Couldn't read Algorithm Name\n"); return KAT_HEADER_ERROR; } if ( FindMarker(fp_in, "# Principal Submitter:") ) { fscanf(fp_in, "%[^\n]\n", line); fprintf(fp_out, "# Principal Submitter:%s\n\n", line); } else { printf("genExtremelyLongMsg: Couldn't read Principal Submitter\n"); return KAT_HEADER_ERROR; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -