123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- #include "crypto_hashblocks.h"
- typedef unsigned int uint32;
- static uint32 load_bigendian(const unsigned char *x)
- {
- return
- (uint32) (x[3]) \
- | (((uint32) (x[2])) << 8) \
- | (((uint32) (x[1])) << 16) \
- | (((uint32) (x[0])) << 24)
- ;
- }
- static void store_bigendian(unsigned char *x,uint32 u)
- {
- x[3] = u; u >>= 8;
- x[2] = u; u >>= 8;
- x[1] = u; u >>= 8;
- x[0] = u;
- }
- #define SHR(x,c) ((x) >> (c))
- #define ROTR(x,c) (((x) >> (c)) | ((x) << (32 - (c))))
- #define Ch(x,y,z) ((x & y) ^ (~x & z))
- #define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
- #define Sigma0(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
- #define Sigma1(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
- #define sigma0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
- #define sigma1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
- #define M(w0,w14,w9,w1) w0 = sigma1(w14) + w9 + sigma0(w1) + w0;
- #define EXPAND \
- M(w0 ,w14,w9 ,w1 ) \
- M(w1 ,w15,w10,w2 ) \
- M(w2 ,w0 ,w11,w3 ) \
- M(w3 ,w1 ,w12,w4 ) \
- M(w4 ,w2 ,w13,w5 ) \
- M(w5 ,w3 ,w14,w6 ) \
- M(w6 ,w4 ,w15,w7 ) \
- M(w7 ,w5 ,w0 ,w8 ) \
- M(w8 ,w6 ,w1 ,w9 ) \
- M(w9 ,w7 ,w2 ,w10) \
- M(w10,w8 ,w3 ,w11) \
- M(w11,w9 ,w4 ,w12) \
- M(w12,w10,w5 ,w13) \
- M(w13,w11,w6 ,w14) \
- M(w14,w12,w7 ,w15) \
- M(w15,w13,w8 ,w0 )
- #define F(w,k) \
- T1 = h + Sigma1(e) + Ch(e,f,g) + k + w; \
- T2 = Sigma0(a) + Maj(a,b,c); \
- h = g; \
- g = f; \
- f = e; \
- e = d + T1; \
- d = c; \
- c = b; \
- b = a; \
- a = T1 + T2;
- int crypto_hashblocks(unsigned char *statebytes,const unsigned char *in,unsigned long long inlen)
- {
- uint32 state[8];
- uint32 a;
- uint32 b;
- uint32 c;
- uint32 d;
- uint32 e;
- uint32 f;
- uint32 g;
- uint32 h;
- uint32 T1;
- uint32 T2;
- a = load_bigendian(statebytes + 0); state[0] = a;
- b = load_bigendian(statebytes + 4); state[1] = b;
- c = load_bigendian(statebytes + 8); state[2] = c;
- d = load_bigendian(statebytes + 12); state[3] = d;
- e = load_bigendian(statebytes + 16); state[4] = e;
- f = load_bigendian(statebytes + 20); state[5] = f;
- g = load_bigendian(statebytes + 24); state[6] = g;
- h = load_bigendian(statebytes + 28); state[7] = h;
- while (inlen >= 64) {
- uint32 w0 = load_bigendian(in + 0);
- uint32 w1 = load_bigendian(in + 4);
- uint32 w2 = load_bigendian(in + 8);
- uint32 w3 = load_bigendian(in + 12);
- uint32 w4 = load_bigendian(in + 16);
- uint32 w5 = load_bigendian(in + 20);
- uint32 w6 = load_bigendian(in + 24);
- uint32 w7 = load_bigendian(in + 28);
- uint32 w8 = load_bigendian(in + 32);
- uint32 w9 = load_bigendian(in + 36);
- uint32 w10 = load_bigendian(in + 40);
- uint32 w11 = load_bigendian(in + 44);
- uint32 w12 = load_bigendian(in + 48);
- uint32 w13 = load_bigendian(in + 52);
- uint32 w14 = load_bigendian(in + 56);
- uint32 w15 = load_bigendian(in + 60);
- F(w0 ,0x428a2f98)
- F(w1 ,0x71374491)
- F(w2 ,0xb5c0fbcf)
- F(w3 ,0xe9b5dba5)
- F(w4 ,0x3956c25b)
- F(w5 ,0x59f111f1)
- F(w6 ,0x923f82a4)
- F(w7 ,0xab1c5ed5)
- F(w8 ,0xd807aa98)
- F(w9 ,0x12835b01)
- F(w10,0x243185be)
- F(w11,0x550c7dc3)
- F(w12,0x72be5d74)
- F(w13,0x80deb1fe)
- F(w14,0x9bdc06a7)
- F(w15,0xc19bf174)
- EXPAND
- F(w0 ,0xe49b69c1)
- F(w1 ,0xefbe4786)
- F(w2 ,0x0fc19dc6)
- F(w3 ,0x240ca1cc)
- F(w4 ,0x2de92c6f)
- F(w5 ,0x4a7484aa)
- F(w6 ,0x5cb0a9dc)
- F(w7 ,0x76f988da)
- F(w8 ,0x983e5152)
- F(w9 ,0xa831c66d)
- F(w10,0xb00327c8)
- F(w11,0xbf597fc7)
- F(w12,0xc6e00bf3)
- F(w13,0xd5a79147)
- F(w14,0x06ca6351)
- F(w15,0x14292967)
- EXPAND
- F(w0 ,0x27b70a85)
- F(w1 ,0x2e1b2138)
- F(w2 ,0x4d2c6dfc)
- F(w3 ,0x53380d13)
- F(w4 ,0x650a7354)
- F(w5 ,0x766a0abb)
- F(w6 ,0x81c2c92e)
- F(w7 ,0x92722c85)
- F(w8 ,0xa2bfe8a1)
- F(w9 ,0xa81a664b)
- F(w10,0xc24b8b70)
- F(w11,0xc76c51a3)
- F(w12,0xd192e819)
- F(w13,0xd6990624)
- F(w14,0xf40e3585)
- F(w15,0x106aa070)
- EXPAND
- F(w0 ,0x19a4c116)
- F(w1 ,0x1e376c08)
- F(w2 ,0x2748774c)
- F(w3 ,0x34b0bcb5)
- F(w4 ,0x391c0cb3)
- F(w5 ,0x4ed8aa4a)
- F(w6 ,0x5b9cca4f)
- F(w7 ,0x682e6ff3)
- F(w8 ,0x748f82ee)
- F(w9 ,0x78a5636f)
- F(w10,0x84c87814)
- F(w11,0x8cc70208)
- F(w12,0x90befffa)
- F(w13,0xa4506ceb)
- F(w14,0xbef9a3f7)
- F(w15,0xc67178f2)
- a += state[0];
- b += state[1];
- c += state[2];
- d += state[3];
- e += state[4];
- f += state[5];
- g += state[6];
- h += state[7];
-
- state[0] = a;
- state[1] = b;
- state[2] = c;
- state[3] = d;
- state[4] = e;
- state[5] = f;
- state[6] = g;
- state[7] = h;
- in += 64;
- inlen -= 64;
- }
- store_bigendian(statebytes + 0,state[0]);
- store_bigendian(statebytes + 4,state[1]);
- store_bigendian(statebytes + 8,state[2]);
- store_bigendian(statebytes + 12,state[3]);
- store_bigendian(statebytes + 16,state[4]);
- store_bigendian(statebytes + 20,state[5]);
- store_bigendian(statebytes + 24,state[6]);
- store_bigendian(statebytes + 28,state[7]);
- return 0;
- }
|