📄 genkat.c
字号:
if ( FindMarker(fp_in, "Repeat = ") ) fscanf(fp_in, "%d", &repeat); else { printf("ERROR: unable to read 'Repeat' from <ExtremelyLongMsgKAT.txt>\n"); return KAT_DATA_ERROR; } if ( FindMarker(fp_in, "Text = ") ) fscanf(fp_in, "%s", Text); else { printf("ERROR: unable to read 'Text' from <ExtremelyLongMsgKAT.txt>\n"); return KAT_DATA_ERROR; } // memcpy(Text, "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmno", 64); if ( (retval = Init(&state, hashbitlen)) != KAT_SUCCESS ) { printf("Init returned <%d> in genExtremelyLongMsg\n", retval); return KAT_HASH_ERROR; } for ( i=0; i<repeat; i++ ) if ( (retval = Update(&state, Text, 512)) != KAT_SUCCESS ) { printf("Update returned <%d> in genExtremelyLongMsg\n", retval); return KAT_HASH_ERROR; } if ( (retval = Final(&state, MD)) != KAT_SUCCESS ) { printf("Final returned <%d> in genExtremelyLongMsg\n", retval); return KAT_HASH_ERROR; }#ifdef TestSqueezing if (hashbitlen == 0) Squeeze(&state, Squeezed, SqueezingOutputLength);#endif fprintf(fp_out, "Repeat = %d\n", repeat); fprintf(fp_out, "Text = %s\n", Text);#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 printf("finished ExtremelyLongMsgKAT for <%d>\n", hashbitlen); fclose(fp_in); fclose(fp_out); return KAT_SUCCESS;}STATUS_CODESgenMonteCarlo(int hashbitlen){ char fn[32], line[SUBMITTER_INFO_LEN]; BitSequence Seed[128], Msg[128], MD[64], Temp[128]; int i, j, bytelen; FILE *fp_in, *fp_out; if ( (fp_in = fopen("MonteCarlo.txt", "r")) == NULL ) { printf("Couldn't open <MonteCarlo.txt> for read\n"); return KAT_FILE_OPEN_ERROR; } sprintf(fn, "MonteCarlo_%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("genMonteCarlo: 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("genMonteCarlo: Couldn't read Principal Submitter\n"); return KAT_HEADER_ERROR; } if ( !ReadHex(fp_in, Seed, 128, "Seed = ") ) { printf("ERROR: unable to read 'Seed' from <MonteCarlo.txt>\n"); return KAT_DATA_ERROR; } bytelen = hashbitlen / 8; memcpy(Msg, Seed, 128); fprintBstr(fp_out, "Seed = ", Seed, 128); for ( j=0; j<100; j++ ) { for ( i=0; i<1000; i++ ) { Hash(hashbitlen, Msg, 1024, MD); memcpy(Temp, Msg, 128-bytelen); memcpy(Msg, MD, bytelen); memcpy(Msg+bytelen, Temp, 128-bytelen); } fprintf(fp_out, "\nj = %d\n", j); fprintBstr(fp_out, "MD = ", MD, bytelen); } printf("finished MonteCarloKAT for <%d>\n", hashbitlen); fclose(fp_in); fclose(fp_out); return KAT_SUCCESS;}#ifdef TestSqueezingSTATUS_CODESgenMonteCarloSqueezing(int hashbitlen){ char fn[32], line[SUBMITTER_INFO_LEN]; BitSequence Seed[128], Msg[128], MD[64], Temp[128]; int i, j, bytelen; FILE *fp_in, *fp_out; hashState state; HashReturn retval; if ( (fp_in = fopen("MonteCarlo.txt", "r")) == NULL ) { printf("Couldn't open <MonteCarlo.txt> for read\n"); return KAT_FILE_OPEN_ERROR; } sprintf(fn, "MonteCarlo_%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("genMonteCarlo: 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("genMonteCarlo: Couldn't read Principal Submitter\n"); return KAT_HEADER_ERROR; } if ( !ReadHex(fp_in, Seed, 128, "Seed = ") ) { printf("ERROR: unable to read 'Seed' from <MonteCarlo.txt>\n"); return KAT_DATA_ERROR; } fprintBstr(fp_out, "Seed = ", Seed, 128); if ( (retval = Init(&state, hashbitlen)) != KAT_SUCCESS ) { printf("Init returned <%d> in genMonteCarloSqueezing\n", retval); return KAT_HASH_ERROR; } if ( (retval = Update(&state, Seed, 128*8)) != KAT_SUCCESS ) { printf("Update returned <%d> in genMonteCarloSqueezing\n", retval); return KAT_HASH_ERROR; } if ( (retval = Final(&state, 0)) != KAT_SUCCESS ) { printf("Final returned <%d> in genMonteCarloSqueezing\n", retval); return KAT_HASH_ERROR; } bytelen = 64; for ( j=0; j<100; j++ ) { for ( i=0; i<1000; i++ ) { if ( (retval = Squeeze(&state, MD, bytelen*8)) != KAT_SUCCESS ) { printf("Squeeze returned <%d> in genMonteCarloSqueezing\n", retval); return KAT_HASH_ERROR; } } fprintf(fp_out, "\nj = %d\n", j); fprintBstr(fp_out, "MD = ", MD, bytelen); } printf("finished MonteCarloKAT for <%d>\n", hashbitlen); fclose(fp_in); fclose(fp_out); return KAT_SUCCESS;}#endif//// ALLOW TO READ HEXADECIMAL ENTRY (KEYS, DATA, TEXT, etc.)//intFindMarker(FILE *infile, const char *marker){ char line[MAX_MARKER_LEN]; int i, len; len = (int)strlen(marker); if ( len > MAX_MARKER_LEN-1 ) len = MAX_MARKER_LEN-1; for ( i=0; i<len; i++ ) if ( (line[i] = fgetc(infile)) == EOF ) return 0; line[len] = '\0'; while ( 1 ) { if ( !strncmp(line, marker, len) ) return 1; for ( i=0; i<len-1; i++ ) line[i] = line[i+1]; if ( (line[len-1] = fgetc(infile)) == EOF ) return 0; line[len] = '\0'; } // shouldn't get here return 0;}//// ALLOW TO READ HEXADECIMAL ENTRY (KEYS, DATA, TEXT, etc.)//intReadHex(FILE *infile, BitSequence *A, int Length, char *str){ int i, ch, started; BitSequence ich; if ( Length == 0 ) { A[0] = 0x00; return 1; } memset(A, 0x00, Length); started = 0; if ( FindMarker(infile, str) ) while ( (ch = fgetc(infile)) != EOF ) { if ( !isxdigit(ch) ) { if ( !started ) { if ( ch == '\n' ) break; else continue; } else break; } started = 1; if ( (ch >= '0') && (ch <= '9') ) ich = ch - '0'; else if ( (ch >= 'A') && (ch <= 'F') ) ich = ch - 'A' + 10; else if ( (ch >= 'a') && (ch <= 'f') ) ich = ch - 'a' + 10; for ( i=0; i<Length-1; i++ ) A[i] = (A[i] << 4) | (A[i+1] >> 4); A[Length-1] = (A[Length-1] << 4) | ich; } else return 0; return 1;}voidfprintBstr(FILE *fp, char *S, BitSequence *A, int L){ int i; fprintf(fp, "%s", S); for ( i=0; i<L; i++ ) fprintf(fp, "%02X", A[i]); if ( L == 0 ) fprintf(fp, "00"); fprintf(fp, "\n");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -