- 1.51 MB
- 2022-08-13 发布
- 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
- 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
- 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
- 网站客服QQ:403074932
ek);deskey(key,DE1,skey->dk);returnCRYPT_OK;}2.des_ecb_encrypt函数voiddes_ecb_encrypt(constunsignedchar*pt,unsignedchar*ct,des_key*key){ulong32work[2];_ARGCHK(pt!=NULL);_ARGCHK(ct!=NULL);_ARGCHK(key!=NULL);LOAD32H(work[0],pt+0);LOAD32H(work[1],pt+4);desfunc(work,key->ek);STORE32H(work[0],ct+0);STORE32H(work[1],ct+4);}3.des_ecb_decrypt函数voiddes_ecb_decrypt(constunsignedchar*ct,unsignedchar*pt,des_key*key){ulong32work[2];_ARGCHK(pt!=NULL);_ARGCHK(ct!=NULL);_ARGCHK(key!=NULL);LOAD32H(work[0],ct+0);LOAD32H(work[1],ct+4);desfunc(work,key->dk);STORE32H(work[0],pt+0);STORE32H(work[1],pt+4);}intdes_test(void){#ifndefLTC_TESTreturnCRYPT_NOP;#elseinterr;staticconststructdes_test_case{intnum,mode;//mode1=encryptunsignedcharkey[8],txt[8],out[8];}cases[]={{1,1,{0x10,0x31,0x6E,0x02,0x8C,0x8F,0x3B,0x4A},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x82,0xDC,0xBA,0xFB,0xDE,0xAB,0x66,0x02}},{2,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00},28\n{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{3,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0xDD,0x7F,0x12,0x1C,0xA5,0x01,0x56,0x19},{0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{4,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x2E,0x86,0x53,0x10,0x4F,0x38,0x34,0xEA},{0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{5,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x4B,0xD3,0x88,0xFF,0x6C,0xD8,0x1D,0x4F},{0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{6,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x20,0xB9,0xE7,0x67,0xB2,0xFB,0x14,0x56},{0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{7,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x55,0x57,0x93,0x80,0xD7,0x71,0x38,0xEF},{0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{8,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x6C,0xC5,0xDE,0xFA,0xAF,0x04,0x51,0x2F},{0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{9,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x0D,0x9F,0x27,0x9B,0xA5,0xD8,0x72,0x60},{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{10,1,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0xD9,0x03,0x1B,0x02,0x71,0xBD,0x5A,0x0A},{0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00}},{1,0,{0x10,0x31,0x6E,0x02,0x8C,0x8F,0x3B,0x4A},{0x82,0xDC,0xBA,0xFB,0xDE,0xAB,0x66,0x02},{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}},{2,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00}},{3,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0xDD,0x7F,0x12,0x1C,0xA5,0x01,0x56,0x19}},{4,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x2E,0x86,0x53,0x10,0x4F,0x38,0x34,0xEA}},{5,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x4B,0xD3,0x88,0xFF,0x6C,0xD8,0x1D,0x4F}},{6,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x20,0xB9,0xE7,0x67,0xB2,0xFB,0x14,0x56}},{7,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x55,0x57,0x93,0x80,0xD7,0x71,0x38,0xEF}},{8,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x6C,0xC5,0xDE,0xFA,0xAF,0x04,0x51,0x2F}},{9,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00},{0x0D,0x9F,0x27,0x9B,0xA5,0xD8,0x72,0x60}},{10,0,{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},{0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00},{0xD9,0x03,0x1B,0x02,0x71,0xBD,0x5A,0x0A}}/***moretestcasesyoucouldaddifyouarenotconvinced(theabovetestcasesaren'treallytoogood):keyplaintextciphertext000000000000000000000000000000008CA64DE9C1B123A7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7359B2163E4EDC5830000000000000001000000000000001958E6E627A05557B11111111111111111111111111111111F40379AB9E0EC5330123456789ABCDEF111111111111111117668DFC7292532D11111111111111110123456789ABCDEF8A5AE1F81AB8F2DD000000000000000000000000000000008CA64DE9C1B123A7FEDCBA98765432100123456789ABCDEFED39D950FA74BCC47CA110454A1A6E5701A1D6D039776742690F5B0D9A26939B28\n0131D9619DC1376E5CD54CA83DEF57DA7A389D10354BD27107A1133E4A0B26860248D43806F67172868EBB51CAB4599A3849674C2602319E51454B582DDF440A7178876E01F19B2A04B915BA43FEB5B642FD443059577FA2AF37FB421F8C40950113B970FD34F2CE059B5E0851CF143A86A560F10EC6D85B0170F175468FB5E60756D8E0774761D20CD3DA020021DC0943297FAD38E373FE762514B829BF486AEA676B2CB7DB2B7A07A7137045DA2A163BDD119049372802DFD64A815CAF1A0F04689104C2FD3B2F26955F6835AF609A5C513C9C4886C08837D06BB516CB7546164D5E404F2752320A2AEEAE3FF4AB771F08260D1AC2465E6B056E18759F5CCAEF1BF03E5DFA575A584023641ABA6176004BD6EF0917606288BF0DB6D70DEE56025816164629B007480D39006EE762F2A1F9915541020B5649793EBC79B3258F437540C8698F3CFA6FBF1CAFCFFD05564FB05E1515AB73A7072D43A0770752922F22E49BAB7CA1AC49E95D6D4CA229BF02FE55778117F12A5A6B612CC26CCE4A018310DC409B26D61D9D5C5018F728C25F4C038ED12B2E411C587F1C13924FEF305532286D6F295A63FAC0D034D9F79301010101010101010123456789ABCDEF617B3A0CE8F071001F1F1F1F0E0E0E0E0123456789ABCDEFDB958605F8C8C606E0FEE0FEF1FEF1FE0123456789ABCDEFEDBFD1C66C29CCC70000000000000000FFFFFFFFFFFFFFFF355550B2150E2451FFFFFFFFFFFFFFFF0000000000000000CAAAAF4DEAF1DBAE0123456789ABCDEF0000000000000000D5D44FF720683D0DFEDCBA9876543210FFFFFFFFFFFFFFFF2A2BB008DF97C2F2http://www.ecs.soton.ac.uk/~prw99r/ez438/vectors.txt***/};inti,y;unsignedchartmp[8];des_keydes;for(i=0;i<(int)(sizeof(cases)/sizeof(cases[0]));i++){if((err=des_setup(cases[i].key,8,0,&des))!=CRYPT_OK){returnerr;}if(cases[i].mode!=0){des_ecb_encrypt(cases[i].txt,tmp,&des);}else{des_ecb_decrypt(cases[i].txt,tmp,&des);}if(memcmp(cases[i].out,tmp,sizeof(tmp))!=0){returnCRYPT_FAIL_TESTVECTOR;}/*nowseeifwecanencryptallzerobytes1000times,decryptandcomebackwherewestarted*/for(y=0;y<8;y++)tmp[y]=0;for(y=0;y<1000;y++)des_ecb_encrypt(tmp,tmp,&des);for(y=0;y<1000;y++)des_ecb_decrypt(tmp,tmp,&des);for(y=0;y<8;y++)if(tmp[y]!=0)returnCRYPT_FAIL_TESTVECTOR;}returnCRYPT_OK;#endif}intdes_keysize(int*desired_keysize){_ARGCHK(desired_keysize!=NULL);if(*desired_keysize<8){returnCRYPT_INVALID_KEYSIZE;}*desired_keysize=8;returnCRYPT_OK;}28\n4.rsa_make_key函数intrsa_make_key(prng_state*prng,intwprng,intsize,longe,rsa_key*key){mp_intp,q,tmp1,tmp2,tmp3;interr;_ARGCHK(key!=NULL);if((size<(MIN_RSA_SIZE/8))||(size>(MAX_RSA_SIZE/8))){returnCRYPT_INVALID_KEYSIZE;}if((e<3)||((e&1)==0)){returnCRYPT_INVALID_ARG;}if((err=prng_is_valid(wprng))!=CRYPT_OK){returnerr;}if((err=mp_init_multi(&p,&q,&tmp1,&tmp2,&tmp3,NULL))!=MP_OKAY){returnmpi_to_ltc_error(err);}/*makeprimespandq(optimizationprovidedbyWayneScott)*/if((err=mp_set_int(&tmp3,e))!=MP_OKAY){gotoerror;}/*tmp3=e*//*makeprime"p"*/do{if((err=rand_prime(&p,size*4,prng,wprng))!=CRYPT_OK){gotodone;}if((err=mp_sub_d(&p,1,&tmp1))!=MP_OKAY){gotoerror;}/*tmp1=p-1*/if((err=mp_gcd(&tmp1,&tmp3,&tmp2))!=MP_OKAY){gotoerror;}/*tmp2=gcd(p-1,e)*/}while(mp_cmp_d(&tmp2,1)!=0);/*whileedividesp-1*//*makeprime"q"*/do{if((err=rand_prime(&q,size*4,prng,wprng))!=CRYPT_OK){gotodone;}if((err=mp_sub_d(&q,1,&tmp1))!=MP_OKAY){gotoerror;}/*tmp1=q-1*/if((err=mp_gcd(&tmp1,&tmp3,&tmp2))!=MP_OKAY){gotoerror;}/*tmp2=gcd(q-1,e)*/}while(mp_cmp_d(&tmp2,1)!=0);/*whileedividesq-1*//*tmp1=lcm(p-1,q-1)*/if((err=mp_sub_d(&p,1,&tmp2))!=MP_OKAY){gotoerror;}/*tmp2=p-1*//*tmp1=q-1(previousdo/whileloop)*/if((err=mp_lcm(&tmp1,&tmp2,&tmp1))!=MP_OKAY){gotoerror;}/*tmp1=lcm(p-1,q-1)*//*makekey*/if((err=mp_init_multi(&key->e,&key->d,&key->N,&key->dQ,&key->dP,&key->qP,&key->pQ,&key->p,&key->q,NULL))!=MP_OKAY){gotoerror;}if((err=mp_set_int(&key->e,e))!=MP_OKAY){gotoerror2;}/*key->e=e*/if((err=mp_invmod(&key->e,&tmp1,&key->d))!=MP_OKAY){gotoerror2;}/*key->d=1/emodlcm(p-1,q-1)*/if((err=mp_mul(&p,&q,&key->N))!=MP_OKAY){gotoerror2;}/*key->N=pq*//*optimizeforCRTnow*//*finddmodq-1anddmodp-1*/if((err=mp_sub_d(&p,1,&tmp1))!=MP_OKAY){gotoerror2;}/*tmp1=q-1*/if((err=mp_sub_d(&q,1,&tmp2))!=MP_OKAY){gotoerror2;}/*tmp2=p-1*/if((err=mp_mod(&key->d,&tmp1,&key->dP))!=MP_OKAY){gotoerror2;}/*dP=dmodp-1*/if((err=mp_mod(&key->d,&tmp2,&key->dQ))!=MP_OKAY){gotoerror2;}/*dQ=dmodq-1*/if((err=mp_invmod(&q,&p,&key->qP))!=MP_OKAY){gotoerror2;}/*qP=1/qmodp*/if((err=mp_mulmod(&key->qP,&q,&key->N,&key->qP))!=MP_OKAY){gotoerror2;}/*qP=q*(1/qmodp)modN*/28\nif((err=mp_invmod(&p,&q,&key->pQ))!=MP_OKAY){gotoerror2;}/*pQ=1/pmodq*/if((err=mp_mulmod(&key->pQ,&p,&key->N,&key->pQ))!=MP_OKAY){gotoerror2;}/*pQ=p*(1/pmodq)modN*/if((err=mp_copy(&p,&key->p))!=MP_OKAY){gotoerror2;}if((err=mp_copy(&q,&key->q))!=MP_OKAY){gotoerror2;}/*shrinkramrequired*/if((err=mp_shrink(&key->e))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->d))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->N))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->dQ))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->dP))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->qP))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->pQ))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->p))!=MP_OKAY){gotoerror2;}if((err=mp_shrink(&key->q))!=MP_OKAY){gotoerror2;}err=CRYPT_OK;key->type=PK_PRIVATE_OPTIMIZED;gotodone;error2:mp_clear_multi(&key->d,&key->e,&key->N,&key->dQ,&key->dP,&key->qP,&key->pQ,&key->p,&key->q,NULL);error:err=mpi_to_ltc_error(err);done:mp_clear_multi(&tmp3,&tmp2,&tmp1,&p,&q,NULL);returnerr;}5.rsa_encrypt_key函数intrsa_encrypt_key(constunsignedchar*inkey,unsignedlonginlen,unsignedchar*outkey,unsignedlong*outlen,constunsignedchar*lparam,unsignedlonglparamlen,prng_state*prng,intprng_idx,inthash_idx,rsa_key*key){unsignedlongmodulus_bitlen,modulus_bytelen,x;interr;_ARGCHK(inkey!=NULL);_ARGCHK(outkey!=NULL);_ARGCHK(outlen!=NULL);_ARGCHK(key!=NULL);/*validprngandhash?*/if((err=prng_is_valid(prng_idx))!=CRYPT_OK){returnerr;}if((err=hash_is_valid(hash_idx))!=CRYPT_OK){returnerr;}/*getmodulusleninbits*/modulus_bitlen=mp_count_bits(&(key->N));/*outlenmustbeatleastthesizeofthemodulus*/modulus_bytelen=mp_unsigned_bin_size(&(key->N));if(modulus_bytelen>*outlen){returnCRYPT_BUFFER_OVERFLOW;}/*OAEPpadthekey*/x=*outlen;if((err=pkcs_1_oaep_encode(inkey,inlen,lparam,lparamlen,modulus_bitlen,prng,prng_idx,hash_idx,outkey,&x))!=CRYPT_OK){returnerr;}28\n/*rsaexptmodtheOAEPpad*/returnrsa_exptmod(outkey,x,outkey,outlen,PK_PUBLIC,prng,prng_idx,key);}6.md5_init函数voidmd5_init(hash_state*md){_ARGCHK(md!=NULL);md->md5.state[0]=0x67452301UL;md->md5.state[1]=0xefcdab89UL;md->md5.state[2]=0x98badcfeUL;md->md5.state[3]=0x10325476UL;md->md5.curlen=0;md->md5.length=0;}7.md5_process函数intmd5_process(md5_state*md,constunsignedchar*buf,unsignedlonglen){unsignedlongn;_ARGCHK(md!=NULL);_ARGCHK(buf!=NULL);if(md->curlen>sizeof(md->buf)){returnCRYPT_INVALID_ARG;}while(len>0){if(md->curlen==0&&len>=len){md5_compress(md,(unsignedchar*)buf);md->length+=len*8;buf+=len;len-=len;}else{n=MIN(len,(len-md->curlen));memcpy(md->buf+md->curlen,buf,(size_t)n);md->curlen+=n;buf+=n;len-=n;if(md->curlen==len){md5_compress(md,md->buf);md->length+=8*len;md->curlen=0;}}}returnCRYPT_OK;}8.md5_done函数intmd5_done(hash_state*md,unsignedchar*hash){inti;_ARGCHK(md!=NULL);_ARGCHK(hash!=NULL);if(md->md5.curlen>=sizeof(md->md5.buf)){returnCRYPT_INVALID_ARG;}/*increasethelengthofthemessage*/md->md5.length+=md->md5.curlen*8;/*appendthe'1'bit*/md->md5.buf[md->md5.curlen++]=(unsignedchar)0x80;/*ifthelengthiscurrentlyabove56bytesweappendzeros*thencompress.Thenwecanfallbacktopaddingzerosandlength*encodinglikenormal.*/28\nif(md->md5.curlen>56){while(md->md5.curlen<64){md->md5.buf[md->md5.curlen++]=(unsignedchar)0;}md5_compress(md,md->md5.buf);md->md5.curlen=0;}/*padupto56bytesofzeroes*/while(md->md5.curlen<56){md->md5.buf[md->md5.curlen++]=(unsignedchar)0;}/*storelength*/STORE64L(md->md5.length,md->md5.buf+56);md5_compress(md,md->md5.buf);/*copyoutput*/for(i=0;i<4;i++){STORE32L(md->md5.state[i],hash+(4*i));}#ifdefCLEAN_STACKzeromem(md,sizeof(hash_state));#endifreturnCRYPT_OK;}9.md5_test函数intmd5_test(void){#ifndefLTC_TESTreturnCRYPT_NOP;#elsestaticconststruct{char*msg;unsignedcharhash[16];}tests[]={{"",{0xd4,0x1d,0x8c,0xd9,0x8f,0x00,0xb2,0x04,0xe9,0x80,0x09,0x98,0xec,0xf8,0x42,0x7e}},{"a",{0x0c,0xc1,0x75,0xb9,0xc0,0xf1,0xb6,0xa8,0x31,0xc3,0x99,0xe2,0x69,0x77,0x26,0x61}},{"abc",{0x90,0x01,0x50,0x98,0x3c,0xd2,0x4f,0xb0,0xd6,0x96,0x3f,0x7d,0x28,0xe1,0x7f,0x72}},{"messagedigest",{0xf9,0x6b,0x69,0x7d,0x7c,0xb7,0x93,0x8d,0x52,0x5a,0x2f,0x31,0xaa,0xf1,0x61,0xd0}},{"abcdefghijklmnopqrstuvwxyz",{0xc3,0xfc,0xd3,0xd7,0x61,0x92,0xe4,0x00,0x7d,0xfb,0x49,0x6c,0xca,0x67,0xe1,0x3b}},{"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",{0xd1,0x74,0xab,0x98,0xd2,0x77,0xd9,0xf5,0xa5,0x61,0x1c,0x2c,0x9f,0x41,0x9d,0x9f}},{"12345678901234567890123456789012345678901234567890123456789012345678901234567890",{0x57,0xed,0xf4,0xa2,0x2b,0xe3,0xc9,0x55,0xac,0x49,0xda,0x2e,0x21,0x07,0xb6,0x7a}},{NULL,{0}}};inti;unsignedchartmp[16];hash_statemd;for(i=0;tests[i].msg!=NULL;i++){md5_init(&md);md5_process(&md,(unsignedchar*)tests[i].msg,(unsignedlong)strlen(tests[i].msg));md5_done(&md,tmp);if(memcmp(tmp,tests[i].hash,16)!=0){28\nreturnCRYPT_FAIL_TESTVECTOR;}}returnCRYPT_OK;#endif}10.sha1.c#include"mycrypt.h"#ifdefSHA1conststruct_hash_descriptorsha1_desc={"sha1",2,20,64,/*DERidentifier*/{0x30,0x21,0x30,0x09,0x06,0x05,0x2B,0x0E,0x03,0x02,0x1A,0x05,0x00,0x04,0x14},15,&sha1_init,&sha1_process,&sha1_done,&sha1_test};#defineF0(x,y,z)(z^(x&(y^z)))#defineF1(x,y,z)(x^y^z)#defineF2(x,y,z)((x&y)|(z&(x|y)))#defineF3(x,y,z)(x^y^z)#ifdefCLEAN_STACKstaticvoid_sha1_compress(hash_state*md,unsignedchar*buf)#elsestaticvoidsha1_compress(hash_state*md,unsignedchar*buf)#endif{ulong32a,b,c,d,e,W[80],i;#ifdefSMALL_CODEulong32t;#endif/*copythestateinto512-bitsintoW[0..15]*/for(i=0;i<16;i++){LOAD32H(W[i],buf+(4*i));}/*copystate*/a=md->sha1.state[0];b=md->sha1.state[1];c=md->sha1.state[2];d=md->sha1.state[3];e=md->sha1.state[4];/*expandit*/for(i=16;i<80;i++){W[i]=ROL(W[i-3]^W[i-8]^W[i-14]^W[i-16],1);}/*compress*//*roundone*/#defineFF0(a,b,c,d,e,i)e=(ROL(a,5)+F0(b,c,d)+e+W[i]+0x5a827999UL);b=ROL(b,30);#defineFF1(a,b,c,d,e,i)e=(ROL(a,5)+F1(b,c,d)+e+W[i]+0x6ed9eba1UL);b=ROL(b,30);#defineFF2(a,b,c,d,e,i)e=(ROL(a,5)+F2(b,c,d)+e+W[i]+0x8f1bbcdcUL);b=ROL(b,30);#defineFF3(a,b,c,d,e,i)e=(ROL(a,5)+F3(b,c,d)+e+W[i]+0xca62c1d6UL);b=ROL(b,30);28\n#ifdefSMALL_CODEfor(i=0;i<20;){FF0(a,b,c,d,e,i++);t=e;e=d;d=c;c=b;b=a;a=t;}for(;i<40;){FF1(a,b,c,d,e,i++);t=e;e=d;d=c;c=b;b=a;a=t;}for(;i<60;){FF2(a,b,c,d,e,i++);t=e;e=d;d=c;c=b;b=a;a=t;}for(;i<80;){FF3(a,b,c,d,e,i++);t=e;e=d;d=c;c=b;b=a;a=t;}#elsefor(i=0;i<20;){FF0(a,b,c,d,e,i++);FF0(e,a,b,c,d,i++);FF0(d,e,a,b,c,i++);FF0(c,d,e,a,b,i++);FF0(b,c,d,e,a,i++);}/*roundtwo*/for(;i<40;){FF1(a,b,c,d,e,i++);FF1(e,a,b,c,d,i++);FF1(d,e,a,b,c,i++);FF1(c,d,e,a,b,i++);FF1(b,c,d,e,a,i++);}/*roundthree*/for(;i<60;){FF2(a,b,c,d,e,i++);FF2(e,a,b,c,d,i++);FF2(d,e,a,b,c,i++);FF2(c,d,e,a,b,i++);FF2(b,c,d,e,a,i++);}/*roundfour*/for(;i<80;){FF3(a,b,c,d,e,i++);FF3(e,a,b,c,d,i++);FF3(d,e,a,b,c,i++);FF3(c,d,e,a,b,i++);FF3(b,c,d,e,a,i++);}#endif#undefFF0#undefFF1#undefFF2#undefFF3/*store*/md->sha1.state[0]=md->sha1.state[0]+a;md->sha1.state[1]=md->sha1.state[1]+b;md->sha1.state[2]=md->sha1.state[2]+c;md->sha1.state[3]=md->sha1.state[3]+d;md->sha1.state[4]=md->sha1.state[4]+e;}28\n#ifdefCLEAN_STACKstaticvoidsha1_compress(hash_state*md,unsignedchar*buf){_sha1_compress(md,buf);burn_stack(sizeof(ulong32)*87);}#endifvoidsha1_init(hash_state*md){_ARGCHK(md!=NULL);md->sha1.state[0]=0x67452301UL;md->sha1.state[1]=0xefcdab89UL;md->sha1.state[2]=0x98badcfeUL;md->sha1.state[3]=0x10325476UL;md->sha1.state[4]=0xc3d2e1f0UL;md->sha1.curlen=0;md->sha1.length=0;}HASH_PROCESS(sha1_process,sha1_compress,sha1,64)intsha1_done(hash_state*md,unsignedchar*hash){inti;_ARGCHK(md!=NULL);_ARGCHK(hash!=NULL);if(md->sha1.curlen>=sizeof(md->sha1.buf)){returnCRYPT_INVALID_ARG;}/*increasethelengthofthemessage*/md->sha1.length+=md->sha1.curlen*8;/*appendthe'1'bit*/md->sha1.buf[md->sha1.curlen++]=(unsignedchar)0x80;/*ifthelengthiscurrentlyabove56bytesweappendzeros*thencompress.Thenwecanfallbacktopaddingzerosandlength*encodinglikenormal.*/if(md->sha1.curlen>56){while(md->sha1.curlen<64){md->sha1.buf[md->sha1.curlen++]=(unsignedchar)0;}sha1_compress(md,md->sha1.buf);md->sha1.curlen=0;}/*padupto56bytesofzeroes*/while(md->sha1.curlen<56){md->sha1.buf[md->sha1.curlen++]=(unsignedchar)0;}/*storelength*/STORE64H(md->sha1.length,md->sha1.buf+56);sha1_compress(md,md->sha1.buf);/*copyoutput*/for(i=0;i<5;i++){STORE32H(md->sha1.state[i],hash+(4*i));}#ifdefCLEAN_STACKzeromem(md,sizeof(hash_state));#endifreturnCRYPT_OK;}28\nintsha1_test(void){#ifndefLTC_TESTreturnCRYPT_NOP;#elsestaticconststruct{char*msg;unsignedcharhash[20];}tests[]={{"abc",{0xa9,0x99,0x3e,0x36,0x47,0x06,0x81,0x6a,0xba,0x3e,0x25,0x71,0x78,0x50,0xc2,0x6c,0x9c,0xd0,0xd8,0x9d}},{"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",{0x84,0x98,0x3E,0x44,0x1C,0x3B,0xD2,0x6E,0xBA,0xAE,0x4A,0xA1,0xF9,0x51,0x29,0xE5,0xE5,0x46,0x70,0xF1}}};inti;unsignedchartmp[20];hash_statemd;for(i=0;i<(int)(sizeof(tests)/sizeof(tests[0]));i++){sha1_init(&md);sha1_process(&md,(unsignedchar*)tests[i].msg,(unsignedlong)strlen(tests[i].msg));sha1_done(&md,tmp);if(memcmp(tmp,tests[i].hash,20)!=0){returnCRYPT_FAIL_TESTVECTOR;}}returnCRYPT_OK;#endif}#endif28