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

📄 libsha1.cpp

📁 编写一个电子签名的小程序
💻 CPP
字号:
/*
	Library Function
--------------------------------------------------------------------------
	FILE  libsha1.c
--------------------------------------------------------------------------
    INTRODUCTION
    ============
    Created :		2005-07-10		Xiaoxi Jiang
    Last modified :	2005-07-10		Xiaoxi Jiang
    Module :
    Purpose :
        Source file.

    List of routines in file :

    File history :
*/

#include "stdafx.h"
//#include <tools.h>

typedef struct
{
    unsigned long aulState[5];
    unsigned long aulCount[2];
    unsigned char aucBuf[64];
}SHA1_CTX;

typedef union
{
    unsigned char ulC[64];
    unsigned long l[16];
}CHAR64LONG16;

void SHA1_Init(SHA1_CTX* pCtx);
void SHA1_Transform(unsigned long *pulState,unsigned char *pucBuf);
void SHA1_Update(SHA1_CTX* context, unsigned char* data, unsigned int len);
void SHA1_Final(unsigned char digest[20], SHA1_CTX* context);

#define SHA1_ROL(v,b) (((v) << (b))|((v) >> (32 - (b))))

#ifdef __BIG_ENDIAN
#define SHA1_BLK0(i) (pBlk->l[i])
#else
#define SHA1_BLK0(i) (pBlk->l[i] = (SHA1_ROL(pBlk->l[i],24)&0xFF00FF00)|(SHA1_ROL(pBlk->l[i],8)&0x00FF00FF))
#endif
#define SHA1_BLK(i) (pBlk->l[i&15] = SHA1_ROL(pBlk->l[(i+13)&15]^pBlk->l[(i+8)&15]^pBlk->l[(i+2)&15]^pBlk->l[i&15],1))

#define SHA1_R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+SHA1_BLK0(i)+0x5A827999+SHA1_ROL(v,5);w=SHA1_ROL(w,30);
#define SHA1_R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+SHA1_BLK(i)+0x5A827999+SHA1_ROL(v,5);w=SHA1_ROL(w,30);
#define SHA1_R2(v,w,x,y,z,i) z+=(w^x^y)+SHA1_BLK(i)+0x6ED9EBA1+SHA1_ROL(v,5);w=SHA1_ROL(w,30);
#define SHA1_R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+SHA1_BLK(i)+0x8F1BBCDC+SHA1_ROL(v,5);w=SHA1_ROL(w,30);
#define SHA1_R4(v,w,x,y,z,i) z+=(w^x^y)+SHA1_BLK(i)+0xCA62C1D6+SHA1_ROL(v,5);w=SHA1_ROL(w,30);


void SHA1_Init(SHA1_CTX *pCtx)
{
    pCtx->aulState[0] = 0x67452301;
    pCtx->aulState[1] = 0xEFCDAB89;
    pCtx->aulState[2] = 0x98BADCFE;
    pCtx->aulState[3] = 0x10325476;
    pCtx->aulState[4] = 0xC3D2E1F0;
    pCtx->aulCount[0] = pCtx->aulCount[1] = 0;
}

void SHA1_Transform(unsigned long *pulState, unsigned char *pucBuf)
{
    unsigned long ulA;
    unsigned long ulB;
    unsigned long ulC;
    unsigned long ulD;
    unsigned long ulE;
    CHAR64LONG16* pBlk;

    pBlk = (CHAR64LONG16 *)pucBuf;
    ulA = pulState[0];
    ulB = pulState[1];
    ulC = pulState[2];
    ulD = pulState[3];
    ulE = pulState[4];
    SHA1_R0(ulA,ulB,ulC,ulD,ulE, 0);
    SHA1_R0(ulE,ulA,ulB,ulC,ulD, 1);
    SHA1_R0(ulD,ulE,ulA,ulB,ulC, 2);
    SHA1_R0(ulC,ulD,ulE,ulA,ulB, 3);
    SHA1_R0(ulB,ulC,ulD,ulE,ulA, 4);
    SHA1_R0(ulA,ulB,ulC,ulD,ulE, 5);
    SHA1_R0(ulE,ulA,ulB,ulC,ulD, 6);
    SHA1_R0(ulD,ulE,ulA,ulB,ulC, 7);
    SHA1_R0(ulC,ulD,ulE,ulA,ulB, 8);
    SHA1_R0(ulB,ulC,ulD,ulE,ulA, 9);
    SHA1_R0(ulA,ulB,ulC,ulD,ulE,10);
    SHA1_R0(ulE,ulA,ulB,ulC,ulD,11);
    SHA1_R0(ulD,ulE,ulA,ulB,ulC,12);
    SHA1_R0(ulC,ulD,ulE,ulA,ulB,13);
    SHA1_R0(ulB,ulC,ulD,ulE,ulA,14);
    SHA1_R0(ulA,ulB,ulC,ulD,ulE,15);
    SHA1_R1(ulE,ulA,ulB,ulC,ulD,16);
    SHA1_R1(ulD,ulE,ulA,ulB,ulC,17);
    SHA1_R1(ulC,ulD,ulE,ulA,ulB,18);
    SHA1_R1(ulB,ulC,ulD,ulE,ulA,19);
    SHA1_R2(ulA,ulB,ulC,ulD,ulE,20);
    SHA1_R2(ulE,ulA,ulB,ulC,ulD,21);
    SHA1_R2(ulD,ulE,ulA,ulB,ulC,22);
    SHA1_R2(ulC,ulD,ulE,ulA,ulB,23);
    SHA1_R2(ulB,ulC,ulD,ulE,ulA,24);
    SHA1_R2(ulA,ulB,ulC,ulD,ulE,25);
    SHA1_R2(ulE,ulA,ulB,ulC,ulD,26);
    SHA1_R2(ulD,ulE,ulA,ulB,ulC,27);
    SHA1_R2(ulC,ulD,ulE,ulA,ulB,28);
    SHA1_R2(ulB,ulC,ulD,ulE,ulA,29);
    SHA1_R2(ulA,ulB,ulC,ulD,ulE,30);
    SHA1_R2(ulE,ulA,ulB,ulC,ulD,31);
    SHA1_R2(ulD,ulE,ulA,ulB,ulC,32);
    SHA1_R2(ulC,ulD,ulE,ulA,ulB,33);
    SHA1_R2(ulB,ulC,ulD,ulE,ulA,34);
    SHA1_R2(ulA,ulB,ulC,ulD,ulE,35);
    SHA1_R2(ulE,ulA,ulB,ulC,ulD,36);
    SHA1_R2(ulD,ulE,ulA,ulB,ulC,37);
    SHA1_R2(ulC,ulD,ulE,ulA,ulB,38);
    SHA1_R2(ulB,ulC,ulD,ulE,ulA,39);
    SHA1_R3(ulA,ulB,ulC,ulD,ulE,40);
    SHA1_R3(ulE,ulA,ulB,ulC,ulD,41);
    SHA1_R3(ulD,ulE,ulA,ulB,ulC,42);
    SHA1_R3(ulC,ulD,ulE,ulA,ulB,43);
    SHA1_R3(ulB,ulC,ulD,ulE,ulA,44);
    SHA1_R3(ulA,ulB,ulC,ulD,ulE,45);
    SHA1_R3(ulE,ulA,ulB,ulC,ulD,46);
    SHA1_R3(ulD,ulE,ulA,ulB,ulC,47);
    SHA1_R3(ulC,ulD,ulE,ulA,ulB,48);
    SHA1_R3(ulB,ulC,ulD,ulE,ulA,49);
    SHA1_R3(ulA,ulB,ulC,ulD,ulE,50);
    SHA1_R3(ulE,ulA,ulB,ulC,ulD,51);
    SHA1_R3(ulD,ulE,ulA,ulB,ulC,52);
    SHA1_R3(ulC,ulD,ulE,ulA,ulB,53);
    SHA1_R3(ulB,ulC,ulD,ulE,ulA,54);
    SHA1_R3(ulA,ulB,ulC,ulD,ulE,55);
    SHA1_R3(ulE,ulA,ulB,ulC,ulD,56);
    SHA1_R3(ulD,ulE,ulA,ulB,ulC,57);
    SHA1_R3(ulC,ulD,ulE,ulA,ulB,58);
    SHA1_R3(ulB,ulC,ulD,ulE,ulA,59);
    SHA1_R4(ulA,ulB,ulC,ulD,ulE,60);
    SHA1_R4(ulE,ulA,ulB,ulC,ulD,61);
    SHA1_R4(ulD,ulE,ulA,ulB,ulC,62);
    SHA1_R4(ulC,ulD,ulE,ulA,ulB,63);
    SHA1_R4(ulB,ulC,ulD,ulE,ulA,64);
    SHA1_R4(ulA,ulB,ulC,ulD,ulE,65);
    SHA1_R4(ulE,ulA,ulB,ulC,ulD,66);
    SHA1_R4(ulD,ulE,ulA,ulB,ulC,67);
    SHA1_R4(ulC,ulD,ulE,ulA,ulB,68);
    SHA1_R4(ulB,ulC,ulD,ulE,ulA,69);
    SHA1_R4(ulA,ulB,ulC,ulD,ulE,70);
    SHA1_R4(ulE,ulA,ulB,ulC,ulD,71);
    SHA1_R4(ulD,ulE,ulA,ulB,ulC,72);
    SHA1_R4(ulC,ulD,ulE,ulA,ulB,73);
    SHA1_R4(ulB,ulC,ulD,ulE,ulA,74);
    SHA1_R4(ulA,ulB,ulC,ulD,ulE,75);
    SHA1_R4(ulE,ulA,ulB,ulC,ulD,76);
    SHA1_R4(ulD,ulE,ulA,ulB,ulC,77);
    SHA1_R4(ulC,ulD,ulE,ulA,ulB,78);
    SHA1_R4(ulB,ulC,ulD,ulE,ulA,79);
    pulState[0] += ulA;
    pulState[1] += ulB;
    pulState[2] += ulC;
    pulState[3] += ulD;
    pulState[4] += ulE;
}

void SHA1_Update(SHA1_CTX *pCtx,unsigned char *pucInData,unsigned int uiInLen)
{
    unsigned int uiI;
    unsigned int uiJ;

    uiJ = (pCtx->aulCount[0] >> 3) & 63;
    if( (pCtx->aulCount[0]+=uiInLen<<3)<(uiInLen << 3) )
        pCtx->aulCount[1]++;
    pCtx->aulCount[1] += (uiInLen >> 29);
    if( (uiJ+uiInLen) > 63)
    {
        uiI = 64-uiJ;
        memcpy(&pCtx->aucBuf[uiJ], pucInData,uiI);
        SHA1_Transform(pCtx->aulState, pCtx->aucBuf);
        for( ;(uiI+63)<uiInLen;uiI+=64)
            SHA1_Transform(pCtx->aulState, pucInData+uiI);
        uiJ = 0;
    }else
        uiI = 0;
    memcpy(&pCtx->aucBuf[uiJ],&pucInData[uiI],uiInLen-uiI);
}

void SHA1_Final(unsigned char *pucDigest, SHA1_CTX *pCtx)
{
    unsigned long ulI;
    unsigned char aucFinal[8];

    for(ulI=0;ulI< 8;ulI++)
    {
        aucFinal[ulI] = (unsigned char)((pCtx->aulCount[(ulI>=4 ? 0:1)]>>((3-(ulI&3))*8))&255);
    }
    SHA1_Update(pCtx, (unsigned char *)"\200", 1);
    while( (pCtx->aulCount[0]&504) != 448)
    {
        SHA1_Update(pCtx,(unsigned char *)"\0", 1);
    }
    SHA1_Update(pCtx, aucFinal, 8);
    for(ulI=0;ulI<20;ulI++)
    {
        pucDigest[ulI]=(unsigned char)((pCtx->aulState[ulI>>2]>>((3-(ulI&3))*8))&255);
    }
    memset(pCtx->aucBuf, 0, 64);
    memset(pCtx->aulState, 0, 20);
    memset(pCtx->aulCount, 0, 8);
}

void SHA1_Compute(unsigned char *pucInData,unsigned int uiInLen,unsigned char *pucDigest)
{
	SHA1_CTX Context;

    SHA1_Init(&Context);

    SHA1_Update(&Context,pucInData,uiInLen);

    SHA1_Final(pucDigest,&Context);

}

⌨️ 快捷键说明

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