$NetBSD: patch-ab,v 1.5 2002/12/07 21:34:04 cjep Exp $ --- lib/cylink/sha.c.orig Tue May 29 05:47:21 2001 +++ lib/cylink/sha.c @@ -150,6 +150,129 @@ int SHA( uchar *message, * PRIVATE FUNCTIONS DEFINITIONS ****************************************************************************/ +#ifdef __sparc_v9__ +#define nR1(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f1, k1SHA, i) +#define nR2(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f2, k2SHA, i) +#define nR3(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f3, k3SHA, i) +#define nR4(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f4, k4SHA, i) + +void doexpand1(u_int32_t *W) +{ + expand(16); expand(17); expand(18); expand(19); expand(20); expand(21); + expand(22); expand(23); expand(24); expand(25); expand(26); expand(27); + expand(28); expand(29); expand(30); expand(31); expand(32); expand(33); + expand(34); expand(35); expand(36); expand(37); expand(38); expand(39); + expand(40); expand(41); expand(42); expand(43); expand(44); expand(45); + expand(46); expand(47); expand(48); +} + +void doexpand2(u_int32_t *W) +{ + expand(49); expand(50); expand(51); expand(52); expand(53); expand(54); + expand(55); expand(56); expand(57); expand(58); expand(59); expand(60); + expand(61); expand(62); expand(63); expand(64); expand(65); expand(66); + expand(67); expand(68); expand(69); expand(70); expand(71); expand(72); + expand(73); expand(74); expand(75); expand(76); expand(77); expand(78); + expand(79); +} + +void do_R1(u_int32_t *A, u_int32_t *B, u_int32_t *C, u_int32_t *D, u_int32_t *E, u_int32_t *W) +{ + nR1( A, B, C, D, E, W[ 0] ); + nR1( E, A, B, C, D, W[ 1] ); + nR1( D, E, A, B, C, W[ 2] ); + nR1( C, D, E, A, B, W[ 3] ); + nR1( B, C, D, E, A, W[ 4] ); + nR1( A, B, C, D, E, W[ 5] ); + nR1( E, A, B, C, D, W[ 6] ); + nR1( D, E, A, B, C, W[ 7] ); + nR1( C, D, E, A, B, W[ 8] ); + nR1( B, C, D, E, A, W[ 9] ); + nR1( A, B, C, D, E, W[10] ); + nR1( E, A, B, C, D, W[11] ); + nR1( D, E, A, B, C, W[12] ); + nR1( C, D, E, A, B, W[13] ); + nR1( B, C, D, E, A, W[14] ); + nR1( A, B, C, D, E, W[15] ); + nR1( E, A, B, C, D, W[16] ); + nR1( D, E, A, B, C, W[17] ); + nR1( C, D, E, A, B, W[18] ); + nR1( B, C, D, E, A, W[19] ); +} + +void do_R2(u_int32_t *A, u_int32_t *B, u_int32_t *C, u_int32_t *D, u_int32_t *E, u_int32_t *W) +{ + nR2( A, B, C, D, E, W[20]); + nR2( E, A, B, C, D, W[21]); + nR2( D, E, A, B, C, W[22]); + nR2( C, D, E, A, B, W[23]); + nR2( B, C, D, E, A, W[24]); + nR2( A, B, C, D, E, W[25]); + nR2( E, A, B, C, D, W[26]); + nR2( D, E, A, B, C, W[27]); + nR2( C, D, E, A, B, W[28]); + nR2( B, C, D, E, A, W[29]); + nR2( A, B, C, D, E, W[30]); + nR2( E, A, B, C, D, W[31]); + nR2( D, E, A, B, C, W[32]); + nR2( C, D, E, A, B, W[33]); + nR2( B, C, D, E, A, W[34]); + nR2( A, B, C, D, E, W[35]); + nR2( E, A, B, C, D, W[36]); + nR2( D, E, A, B, C, W[37]); + nR2( C, D, E, A, B, W[38]); + nR2( B, C, D, E, A, W[39]); +} + +void do_R3(u_int32_t *A, u_int32_t *B, u_int32_t *C, u_int32_t *D, u_int32_t *E, u_int32_t *W) +{ + nR3( A, B, C, D, E, W[40]); + nR3( E, A, B, C, D, W[41]); + nR3( D, E, A, B, C, W[42]); + nR3( C, D, E, A, B, W[43]); + nR3( B, C, D, E, A, W[44]); + nR3( A, B, C, D, E, W[45]); + nR3( E, A, B, C, D, W[46]); + nR3( D, E, A, B, C, W[47]); + nR3( C, D, E, A, B, W[48]); + nR3( B, C, D, E, A, W[49]); + nR3( A, B, C, D, E, W[50]); + nR3( E, A, B, C, D, W[51]); + nR3( D, E, A, B, C, W[52]); + nR3( C, D, E, A, B, W[53]); + nR3( B, C, D, E, A, W[54]); + nR3( A, B, C, D, E, W[55]); + nR3( E, A, B, C, D, W[56]); + nR3( D, E, A, B, C, W[57]); + nR3( C, D, E, A, B, W[58]); + nR3( B, C, D, E, A, W[59]); +} + +void do_R4(u_int32_t *A, u_int32_t *B, u_int32_t *C, u_int32_t *D, u_int32_t *E, u_int32_t *W) +{ + nR4( A, B, C, D, E, W[60]); + nR4( E, A, B, C, D, W[61]); + nR4( D, E, A, B, C, W[62]); + nR4( C, D, E, A, B, W[63]); + nR4( B, C, D, E, A, W[64]); + nR4( A, B, C, D, E, W[65]); + nR4( E, A, B, C, D, W[66]); + nR4( D, E, A, B, C, W[67]); + nR4( C, D, E, A, B, W[68]); + nR4( B, C, D, E, A, W[69]); + nR4( A, B, C, D, E, W[70]); + nR4( E, A, B, C, D, W[71]); + nR4( D, E, A, B, C, W[72]); + nR4( C, D, E, A, B, W[73]); + nR4( B, C, D, E, A, W[74]); + nR4( A, B, C, D, E, W[75]); + nR4( E, A, B, C, D, W[76]); + nR4( D, E, A, B, C, W[77]); + nR4( C, D, E, A, B, W[78]); + nR4( B, C, D, E, A, W[79]); +} +#endif + /**************************************************************************** * NAME: void shaTransform( u_int32_t *state, @@ -182,6 +305,10 @@ int SHA( uchar *message, ByteSwap32( (uchar *)W, 64); /*TKL00201*/ #endif /*TKL00201*/ /* Expand the 16 words into 80 words */ +#ifdef __sparc_v9__ + doexpand1(W); + doexpand2(W); +#else expand(16);expand(17);expand(18);expand(19);expand(20);expand(21); expand(22);expand(23);expand(24);expand(25);expand(26);expand(27); expand(28);expand(29);expand(30);expand(31);expand(32);expand(33); @@ -193,6 +320,7 @@ int SHA( uchar *message, expand(64);expand(65);expand(66);expand(67);expand(68);expand(69); expand(70);expand(71);expand(72);expand(73);expand(74);expand(75); expand(76);expand(77);expand(78);expand(79); +#endif /*Set up first buffer*/ A = state[0]; B = state[1]; @@ -201,6 +329,12 @@ int SHA( uchar *message, E = state[4]; /* Heavy mangling, in 4 sub-rounds of 20 iterations each. */ +#ifdef __sparc_v9__ + do_R1(&A, &B, &C, &D, &E, W); + do_R2(&A, &B, &C, &D, &E, W); + do_R3(&A, &B, &C, &D, &E, W); + do_R4(&A, &B, &C, &D, &E, W); +#else subRound( A, B, C, D, E, f1, k1SHA, W[ 0] ); subRound( E, A, B, C, D, f1, k1SHA, W[ 1] ); subRound( D, E, A, B, C, f1, k1SHA, W[ 2] ); @@ -284,6 +418,7 @@ int SHA( uchar *message, subRound( D, E, A, B, C, f4, k4SHA, W[77]); subRound( C, D, E, A, B, f4, k4SHA, W[78]); subRound( B, C, D, E, A, f4, k4SHA, W[79]); +#endif state[0] += A; state[1] += B;