1fc8cec516
with the "db4" package without problems. This is the first half of the fix for PR pkg/39500.
103 lines
4.5 KiB
Text
103 lines
4.5 KiB
Text
$NetBSD: patch-ac,v 1.1 2008/09/09 22:23:33 tron Exp $
|
|
|
|
--- hmac/sha1.c.orig 2008-01-09 19:15:23.000000000 +0100
|
|
+++ hmac/sha1.c
|
|
@@ -98,6 +98,64 @@ A million repetitions of "a"
|
|
#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30);
|
|
#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30);
|
|
|
|
+typedef union {
|
|
+ unsigned char c[64];
|
|
+ u_int32_t l[16];
|
|
+} CHAR64LONG16;
|
|
+
|
|
+#ifdef __sparc_v9__
|
|
+void do_R01(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *, int is_bigendian);
|
|
+void do_R2(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *, int is_bigendian);
|
|
+void do_R3(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *, int is_bigendian);
|
|
+void do_R4(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *, int is_bigendian);
|
|
+
|
|
+#define nR0(v,w,x,y,z,i) R0(*v,*w,*x,*y,*z,i)
|
|
+#define nR1(v,w,x,y,z,i) R1(*v,*w,*x,*y,*z,i)
|
|
+#define nR2(v,w,x,y,z,i) R2(*v,*w,*x,*y,*z,i)
|
|
+#define nR3(v,w,x,y,z,i) R3(*v,*w,*x,*y,*z,i)
|
|
+#define nR4(v,w,x,y,z,i) R4(*v,*w,*x,*y,*z,i)
|
|
+
|
|
+void
|
|
+do_R01(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *block, int is_bigendian)
|
|
+{
|
|
+ nR0(a,b,c,d,e, 0); nR0(e,a,b,c,d, 1); nR0(d,e,a,b,c, 2); nR0(c,d,e,a,b, 3);
|
|
+ nR0(b,c,d,e,a, 4); nR0(a,b,c,d,e, 5); nR0(e,a,b,c,d, 6); nR0(d,e,a,b,c, 7);
|
|
+ nR0(c,d,e,a,b, 8); nR0(b,c,d,e,a, 9); nR0(a,b,c,d,e,10); nR0(e,a,b,c,d,11);
|
|
+ nR0(d,e,a,b,c,12); nR0(c,d,e,a,b,13); nR0(b,c,d,e,a,14); nR0(a,b,c,d,e,15);
|
|
+ nR1(e,a,b,c,d,16); nR1(d,e,a,b,c,17); nR1(c,d,e,a,b,18); nR1(b,c,d,e,a,19);
|
|
+}
|
|
+
|
|
+void
|
|
+do_R2(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *block, int is_bigendian)
|
|
+{
|
|
+ nR2(a,b,c,d,e,20); nR2(e,a,b,c,d,21); nR2(d,e,a,b,c,22); nR2(c,d,e,a,b,23);
|
|
+ nR2(b,c,d,e,a,24); nR2(a,b,c,d,e,25); nR2(e,a,b,c,d,26); nR2(d,e,a,b,c,27);
|
|
+ nR2(c,d,e,a,b,28); nR2(b,c,d,e,a,29); nR2(a,b,c,d,e,30); nR2(e,a,b,c,d,31);
|
|
+ nR2(d,e,a,b,c,32); nR2(c,d,e,a,b,33); nR2(b,c,d,e,a,34); nR2(a,b,c,d,e,35);
|
|
+ nR2(e,a,b,c,d,36); nR2(d,e,a,b,c,37); nR2(c,d,e,a,b,38); nR2(b,c,d,e,a,39);
|
|
+}
|
|
+
|
|
+void
|
|
+do_R3(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *block, int is_bigendian)
|
|
+{
|
|
+ nR3(a,b,c,d,e,40); nR3(e,a,b,c,d,41); nR3(d,e,a,b,c,42); nR3(c,d,e,a,b,43);
|
|
+ nR3(b,c,d,e,a,44); nR3(a,b,c,d,e,45); nR3(e,a,b,c,d,46); nR3(d,e,a,b,c,47);
|
|
+ nR3(c,d,e,a,b,48); nR3(b,c,d,e,a,49); nR3(a,b,c,d,e,50); nR3(e,a,b,c,d,51);
|
|
+ nR3(d,e,a,b,c,52); nR3(c,d,e,a,b,53); nR3(b,c,d,e,a,54); nR3(a,b,c,d,e,55);
|
|
+ nR3(e,a,b,c,d,56); nR3(d,e,a,b,c,57); nR3(c,d,e,a,b,58); nR3(b,c,d,e,a,59);
|
|
+}
|
|
+
|
|
+void
|
|
+do_R4(u_int32_t *a, u_int32_t *b, u_int32_t *c, u_int32_t *d, u_int32_t *e, CHAR64LONG16 *block, int is_bigendian)
|
|
+{
|
|
+ nR4(a,b,c,d,e,60); nR4(e,a,b,c,d,61); nR4(d,e,a,b,c,62); nR4(c,d,e,a,b,63);
|
|
+ nR4(b,c,d,e,a,64); nR4(a,b,c,d,e,65); nR4(e,a,b,c,d,66); nR4(d,e,a,b,c,67);
|
|
+ nR4(c,d,e,a,b,68); nR4(b,c,d,e,a,69); nR4(a,b,c,d,e,70); nR4(e,a,b,c,d,71);
|
|
+ nR4(d,e,a,b,c,72); nR4(c,d,e,a,b,73); nR4(b,c,d,e,a,74); nR4(a,b,c,d,e,75);
|
|
+ nR4(e,a,b,c,d,76); nR4(d,e,a,b,c,77); nR4(c,d,e,a,b,78); nR4(b,c,d,e,a,79);
|
|
+}
|
|
+#endif
|
|
+
|
|
#ifdef VERBOSE /* SAK */
|
|
static void __db_SHAPrintContext __P((SHA1_CTX *, char *));
|
|
static void
|
|
@@ -129,10 +187,6 @@ __db_SHA1Transform(state, buffer)
|
|
unsigned char *buffer;
|
|
{
|
|
u_int32_t a, b, c, d, e;
|
|
-typedef union {
|
|
- unsigned char c[64];
|
|
- u_int32_t l[16];
|
|
-} CHAR64LONG16;
|
|
CHAR64LONG16* block;
|
|
int is_bigendian;
|
|
#ifdef SHA1HANDSOFF
|
|
@@ -151,6 +205,13 @@ CHAR64LONG16* block;
|
|
c = state[2];
|
|
d = state[3];
|
|
e = state[4];
|
|
+
|
|
+#ifdef __sparc_v9__
|
|
+ do_R01(&a, &b, &c, &d, &e, block, is_bigendian);
|
|
+ do_R2(&a, &b, &c, &d, &e, block, is_bigendian);
|
|
+ do_R3(&a, &b, &c, &d, &e, block, is_bigendian);
|
|
+ do_R4(&a, &b, &c, &d, &e, block, is_bigendian);
|
|
+#else
|
|
/* 4 rounds of 20 operations each. Loop unrolled. */
|
|
R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3);
|
|
R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7);
|
|
@@ -172,6 +233,8 @@ CHAR64LONG16* block;
|
|
R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71);
|
|
R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75);
|
|
R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79);
|
|
+#endif
|
|
+
|
|
/* Add the working vars back into context.state[] */
|
|
state[0] += a;
|
|
state[1] += b;
|