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

📄 timing.c

📁 Keccak hash加密算法
💻 C
字号:
/*Algorithm Name: KeccakAuthors: Guido Bertoni, Joan Daemen, Michaël Peeters and Gilles Van AsscheDate: January 9, 2009For more information, feedback or questions, please refer to our website:http://keccak.noekeon.org/*/#include <stdio.h>/************** Timing routine (for performance measurements) ***********//* By Doug Whiting *//* unfortunately, this is generally assembly code and not very portable */#if defined(_M_IX86) || defined(__i386) || defined(_i386) || defined(__i386__) || defined(i386) || \    defined(_X86_)   || defined(__x86_64__) || defined(_M_X64) || defined(__x86_64)#define _Is_X86_    1#endif#if  defined(_Is_X86_) && (!defined(__STRICT_ANSI__)) && (defined(__GNUC__) || !defined(__STDC__)) && \    (defined(__BORLANDC__) || defined(_MSC_VER) || defined(__MINGW_H) || defined(__GNUC__))#define HI_RES_CLK_OK         1          /* it's ok to use RDTSC opcode */#if defined(_MSC_VER) // && defined(_M_X64)#include <intrin.h>#pragma intrinsic(__rdtsc)         /* use MSVC rdtsc call where defined */#endif#endiftypedef unsigned int uint_32t;uint_32t HiResTime(void)           /* return the current value of time stamp counter */    {#if defined(HI_RES_CLK_OK)    uint_32t x[2];#if   defined(__BORLANDC__)#define COMPILER_ID "BCC"    __emit__(0x0F,0x31);           /* RDTSC instruction */    _asm { mov x[0],eax };#elif defined(_MSC_VER)#define COMPILER_ID "MSC"#if defined(_MSC_VER) // && defined(_M_X64)    x[0] = (uint_32t) __rdtsc();#else    _asm { _emit 0fh }; _asm { _emit 031h };    _asm { mov x[0],eax };#endif#elif defined(__MINGW_H) || defined(__GNUC__)#define COMPILER_ID "GCC"    asm volatile("rdtsc" : "=a"(x[0]), "=d"(x[1]));#else#error  "HI_RES_CLK_OK -- but no assembler code for this platform (?)"#endif    return x[0];#else    /* avoid annoying MSVC 9.0 compiler warning #4720 in ANSI mode! */#if (!defined(_MSC_VER)) || (!defined(__STDC__)) || (_MSC_VER < 1300)    FatalError("No support for RDTSC on this CPU platform\n");#endif    return 0;#endif /* defined(HI_RES_CLK_OK) */    }#define TIMER_SAMPLE_CNT (10)uint_32t calibrate(){    uint_32t dtMin = 0xFFFFFFFF;        /* big number to start */    uint_32t t0,t1,i;    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        t1 = HiResTime();        if (dtMin > t1-t0)              /* keep only the minimum time */            dtMin = t1-t0;        }    return dtMin;}#include "KeccakPermutationInterface.h"uint_32t measureKeccakAbsorb1024bits(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    unsigned char state[200];    unsigned char input[128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        KeccakAbsorb1024bits(state, input);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakAbsorb512bits(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    unsigned char state[200];    unsigned char input[64];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        KeccakAbsorb512bits(state, input);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakPermutation(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    unsigned char state[200];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        KeccakPermutation(state);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}#include "KeccakNISTInterface.h"uint_32t measureKeccakHash1block(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash2blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[256];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 1024+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash3blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[384];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 2048+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash10blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[10*128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 9*1024+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash30blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[30*128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 29*1024+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash100blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[100*128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 99*1024+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}uint_32t measureKeccakHash1000blocks(uint_32t dtMin){    uint_32t tMin = 0xFFFFFFFF;         /* big number to start */    uint_32t t0,t1,i;    hashState state;    unsigned char digest[32];    unsigned char data[1000*128];    for (i=0;i < TIMER_SAMPLE_CNT;i++)  /* calibrate the overhead for measuring time */        {        t0 = HiResTime();        Init(&state, 256);        Update(&state, data, 999*1024+29);        Final(&state, digest);        t1 = HiResTime();        if (tMin > t1-t0 - dtMin)       /* keep only the minimum time */            tMin = t1-t0 - dtMin;        }    /* now tMin = # clocks required for running RoutineToBeTimed() */        return tMin;}void doTiming(){    uint_32t calibration;    uint_32t measurementKeccakPermutation;    uint_32t measurementKeccakAbsorb1024bits;    uint_32t measurementKeccakAbsorb512bits;    uint_32t measurementKeccakHash1block;    uint_32t measurementKeccakHash2blocks;    uint_32t measurementKeccakHash3blocks;    uint_32t measurementKeccakHash10blocks;    uint_32t measurementKeccakHash30blocks;    uint_32t measurementKeccakHash100blocks;    uint_32t measurementKeccakHash1000blocks;        calibration = calibrate();    measurementKeccakPermutation = measureKeccakPermutation(calibration);    printf("Cycles for KeccakPermutation(state): %d\n", measurementKeccakPermutation);    printf("Cycles per byte for rate 1024: %f\n", measurementKeccakPermutation/128.0);    printf("\n");    measurementKeccakAbsorb1024bits = measureKeccakAbsorb1024bits(calibration);    printf("Cycles for KeccakAbsorb1024bits(state, input): %d\n", measurementKeccakAbsorb1024bits);    printf("Cycles per byte for rate 1024: %f\n", measurementKeccakAbsorb1024bits/128.0);    printf("\n");    measurementKeccakAbsorb512bits = measureKeccakAbsorb512bits(calibration);    printf("Cycles for KeccakAbsorb512bits(state, input): %d\n", measurementKeccakAbsorb512bits);    printf("Cycles per byte for rate 512: %f\n", measurementKeccakAbsorb512bits/64.0);    printf("\n");    measurementKeccakHash1block = measureKeccakHash1block(calibration);    printf("Cycles for Init, Update, Finalize (1 block): %d\n", measurementKeccakHash1block);    printf("\n");    measurementKeccakHash2blocks = measureKeccakHash2blocks(calibration);    printf("Cycles for Init, Update, Finalize (2 blocks): %d\n", measurementKeccakHash2blocks);    printf("\n");    measurementKeccakHash3blocks = measureKeccakHash3blocks(calibration);    printf("Cycles for Init, Update, Finalize (3 blocks): %d\n", measurementKeccakHash3blocks);    printf("\n");    measurementKeccakHash10blocks = measureKeccakHash10blocks(calibration);    printf("Cycles for Init, Update, Finalize (10 blocks): %d\n", measurementKeccakHash10blocks);    printf("\n");    measurementKeccakHash30blocks = measureKeccakHash30blocks(calibration);    printf("Cycles for Init, Update, Finalize (30 blocks): %d\n", measurementKeccakHash30blocks);    printf("\n");    measurementKeccakHash100blocks = measureKeccakHash100blocks(calibration);    printf("Cycles for Init, Update, Finalize (100 blocks): %d\n", measurementKeccakHash100blocks);    printf("\n");    measurementKeccakHash1000blocks = measureKeccakHash1000blocks(calibration);    printf("Cycles for Init, Update, Finalize (1000 blocks): %d\n", measurementKeccakHash1000blocks);    printf("\n");}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -