⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genkat.c

📁 Keccak hash加密算法
💻 C
📖 第 1 页 / 共 2 页
字号:
/*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 + -