1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
$NetBSD: patch-ac,v 1.1 2003/05/25 19:55:56 seb Exp $
--- snmp/g_sha.c.orig Wed Aug 22 14:46:07 2001
+++ snmp/g_sha.c
@@ -124,6 +124,133 @@ SHAInit(SHA_CTX * shaInfo )
shaInfo->countLo = shaInfo->countHi = 0;
}
+#ifdef __sparc_v9__
+#define nR1(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f1, K1, i)
+#define nR2(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f2, K2, i)
+#define nR3(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f3, K3, i)
+#define nR4(v,w,x,y,z,i) subRound(*v, *w, *x, *y, *z, f4, K4, i)
+
+void doexpand1(guint32 *eData)
+{
+ expand(eData,16); expand(eData,17); expand(eData,18); expand(eData,19);
+ expand(eData,20); expand(eData,21); expand(eData,22); expand(eData,23);
+ expand(eData,24); expand(eData,25); expand(eData,26); expand(eData,27);
+ expand(eData,28); expand(eData,29); expand(eData,30); expand(eData,31);
+ expand(eData,32); expand(eData,33); expand(eData,34); expand(eData,35);
+ expand(eData,36); expand(eData,37); expand(eData,38); expand(eData,39);
+ expand(eData,40); expand(eData,41); expand(eData,42); expand(eData,43);
+ expand(eData,44); expand(eData,45); expand(eData,46); expand(eData,47);
+ expand(eData,48);
+}
+
+void doexpand2(guint32 *eData)
+{
+ expand(eData,49); expand(eData,50); expand(eData,51); expand(eData,52);
+ expand(eData,53); expand(eData,54); expand(eData,55); expand(eData,56);
+ expand(eData,57); expand(eData,58); expand(eData,59); expand(eData,60);
+ expand(eData,61); expand(eData,62); expand(eData,63); expand(eData,64);
+ expand(eData,65); expand(eData,66); expand(eData,67); expand(eData,68);
+ expand(eData,69); expand(eData,70); expand(eData,71); expand(eData,72);
+ expand(eData,73); expand(eData,74); expand(eData,75); expand(eData,76);
+ expand(eData,77); expand(eData,78); expand(eData,79);
+}
+
+void do_R1(guint32 *A, guint32 *B, guint32 *C, guint32 *D, guint32 *E, guint32 *eData)
+{
+ nR1( A, B, C, D, E, eData[ 0] );
+ nR1( E, A, B, C, D, eData[ 1] );
+ nR1( D, E, A, B, C, eData[ 2] );
+ nR1( C, D, E, A, B, eData[ 3] );
+ nR1( B, C, D, E, A, eData[ 4] );
+ nR1( A, B, C, D, E, eData[ 5] );
+ nR1( E, A, B, C, D, eData[ 6] );
+ nR1( D, E, A, B, C, eData[ 7] );
+ nR1( C, D, E, A, B, eData[ 8] );
+ nR1( B, C, D, E, A, eData[ 9] );
+ nR1( A, B, C, D, E, eData[10] );
+ nR1( E, A, B, C, D, eData[11] );
+ nR1( D, E, A, B, C, eData[12] );
+ nR1( C, D, E, A, B, eData[13] );
+ nR1( B, C, D, E, A, eData[14] );
+ nR1( A, B, C, D, E, eData[15] );
+ nR1( E, A, B, C, D, eData[16] );
+ nR1( D, E, A, B, C, eData[17] );
+ nR1( C, D, E, A, B, eData[18] );
+ nR1( B, C, D, E, A, eData[19] );
+}
+
+void do_R2(guint32 *A, guint32 *B, guint32 *C, guint32 *D, guint32 *E, guint32 *eData)
+{
+ nR2( A, B, C, D, E, eData[20]);
+ nR2( E, A, B, C, D, eData[21]);
+ nR2( D, E, A, B, C, eData[22]);
+ nR2( C, D, E, A, B, eData[23]);
+ nR2( B, C, D, E, A, eData[24]);
+ nR2( A, B, C, D, E, eData[25]);
+ nR2( E, A, B, C, D, eData[26]);
+ nR2( D, E, A, B, C, eData[27]);
+ nR2( C, D, E, A, B, eData[28]);
+ nR2( B, C, D, E, A, eData[29]);
+ nR2( A, B, C, D, E, eData[30]);
+ nR2( E, A, B, C, D, eData[31]);
+ nR2( D, E, A, B, C, eData[32]);
+ nR2( C, D, E, A, B, eData[33]);
+ nR2( B, C, D, E, A, eData[34]);
+ nR2( A, B, C, D, E, eData[35]);
+ nR2( E, A, B, C, D, eData[36]);
+ nR2( D, E, A, B, C, eData[37]);
+ nR2( C, D, E, A, B, eData[38]);
+ nR2( B, C, D, E, A, eData[39]);
+}
+
+void do_R3(guint32 *A, guint32 *B, guint32 *C, guint32 *D, guint32 *E, guint32 *eData)
+{
+ nR3( A, B, C, D, E, eData[40]);
+ nR3( E, A, B, C, D, eData[41]);
+ nR3( D, E, A, B, C, eData[42]);
+ nR3( C, D, E, A, B, eData[43]);
+ nR3( B, C, D, E, A, eData[44]);
+ nR3( A, B, C, D, E, eData[45]);
+ nR3( E, A, B, C, D, eData[46]);
+ nR3( D, E, A, B, C, eData[47]);
+ nR3( C, D, E, A, B, eData[48]);
+ nR3( B, C, D, E, A, eData[49]);
+ nR3( A, B, C, D, E, eData[50]);
+ nR3( E, A, B, C, D, eData[51]);
+ nR3( D, E, A, B, C, eData[52]);
+ nR3( C, D, E, A, B, eData[53]);
+ nR3( B, C, D, E, A, eData[54]);
+ nR3( A, B, C, D, E, eData[55]);
+ nR3( E, A, B, C, D, eData[56]);
+ nR3( D, E, A, B, C, eData[57]);
+ nR3( C, D, E, A, B, eData[58]);
+ nR3( B, C, D, E, A, eData[59]);
+}
+
+void do_R4(guint32 *A, guint32 *B, guint32 *C, guint32 *D, guint32 *E, guint32 *eData)
+{
+ nR4( A, B, C, D, E, eData[60]);
+ nR4( E, A, B, C, D, eData[61]);
+ nR4( D, E, A, B, C, eData[62]);
+ nR4( C, D, E, A, B, eData[63]);
+ nR4( B, C, D, E, A, eData[64]);
+ nR4( A, B, C, D, E, eData[65]);
+ nR4( E, A, B, C, D, eData[66]);
+ nR4( D, E, A, B, C, eData[67]);
+ nR4( C, D, E, A, B, eData[68]);
+ nR4( B, C, D, E, A, eData[69]);
+ nR4( A, B, C, D, E, eData[70]);
+ nR4( E, A, B, C, D, eData[71]);
+ nR4( D, E, A, B, C, eData[72]);
+ nR4( C, D, E, A, B, eData[73]);
+ nR4( B, C, D, E, A, eData[74]);
+ nR4( A, B, C, D, E, eData[75]);
+ nR4( E, A, B, C, D, eData[76]);
+ nR4( D, E, A, B, C, eData[77]);
+ nR4( C, D, E, A, B, eData[78]);
+ nR4( B, C, D, E, A, eData[79]);
+}
+#endif /* __sparc_v9__ */
/* Perform the SHA transformation. Note that this code, like MD5, seems to
break some optimizing compilers due to the complexity of the expressions
@@ -146,6 +273,14 @@ SHATransform(guint32 *digest, guint32 *d
E = digest[ 4 ];
g_memmove( eData, data, SHA_DATASIZE );
+#ifdef __sparc_v9__
+ doexpand1(eData);
+ doexpand1(eData);
+ do_R1(&A, &B, &C, &D, &E, eData);
+ do_R2(&A, &B, &C, &D, &E, eData);
+ do_R3(&A, &B, &C, &D, &E, eData);
+ do_R4(&A, &B, &C, &D, &E, eData);
+#else
/* Heavy mangling, in 4 sub-rounds of 20 interations each. */
subRound( A, B, C, D, E, f1, K1, eData[ 0 ] );
subRound( E, A, B, C, D, f1, K1, eData[ 1 ] );
@@ -230,6 +365,7 @@ SHATransform(guint32 *digest, guint32 *d
subRound( D, E, A, B, C, f4, K4, expand( eData, 77 ) );
subRound( C, D, E, A, B, f4, K4, expand( eData, 78 ) );
subRound( B, C, D, E, A, f4, K4, expand( eData, 79 ) );
+#endif /* __sparc_v9__ */
/* Build message digest */
digest[ 0 ] += A;
|