1
// Copyright 2013 The Go Authors. All rights reserved.
2
// Use of this source code is governed by a BSD-style
3
// license that can be found in the LICENSE file.
5
// SHA1 block routine. See sha1block.go for Go equivalent.
7
// There are 80 rounds of 4 types:
8
// - rounds 0-15 are type 1 and load data (ROUND1 macro).
9
// - rounds 16-19 are type 1 and do not load data (ROUND1x macro).
10
// - rounds 20-39 are type 2 and do not load data (ROUND2 macro).
11
// - rounds 40-59 are type 3 and do not load data (ROUND3 macro).
12
// - rounds 60-79 are type 4 and do not load data (ROUND4 macro).
14
// Each round loads or shuffles the data, then computes a per-round
15
// function of b, c, d, and then mixes the result into and rotates the
16
// five registers a, b, c, d, e holding the intermediate results.
18
// The register rotation is implemented by rotating the arguments to
19
// the round macros instead of by explicit move instructions.
21
// Like sha1block_amd64.s, but we keep the data and limit pointers on the stack.
22
// To free up the word pointer (R10 on amd64, DI here), we add it to e during
23
// LOAD/SHUFFLE instead of during MIX.
25
// The stack holds the intermediate word array - 16 uint32s - at 0(SP) up to 64(SP).
26
// The saved a, b, c, d, e (R11 through R15 on amd64) are at 64(SP) up to 84(SP).
27
// The saved limit pointer (DI on amd64) is at 84(SP).
28
// The saved data pointer (SI on amd64) is at 88(SP).
30
#define LOAD(index, e) \
32
MOVL (index*4)(SI), DI; \
34
MOVL DI, (index*4)(SP); \
37
#define SHUFFLE(index, e) \
38
MOVL (((index)&0xf)*4)(SP), DI; \
39
XORL (((index-3)&0xf)*4)(SP), DI; \
40
XORL (((index-8)&0xf)*4)(SP), DI; \
41
XORL (((index-14)&0xf)*4)(SP), DI; \
43
MOVL DI, (((index)&0xf)*4)(SP); \
46
#define FUNC1(a, b, c, d, e) \
54
#define FUNC2(a, b, c, d, e) \
59
#define FUNC3(a, b, c, d, e) \
69
#define MIX(a, b, c, d, e, const) \
74
LEAL const(e)(SI*1), e
76
#define ROUND1(a, b, c, d, e, index) \
78
FUNC1(a, b, c, d, e); \
79
MIX(a, b, c, d, e, 0x5A827999)
81
#define ROUND1x(a, b, c, d, e, index) \
83
FUNC1(a, b, c, d, e); \
84
MIX(a, b, c, d, e, 0x5A827999)
86
#define ROUND2(a, b, c, d, e, index) \
88
FUNC2(a, b, c, d, e); \
89
MIX(a, b, c, d, e, 0x6ED9EBA1)
91
#define ROUND3(a, b, c, d, e, index) \
93
FUNC3(a, b, c, d, e); \
94
MIX(a, b, c, d, e, 0x8F1BBCDC)
96
#define ROUND4(a, b, c, d, e, index) \
98
FUNC4(a, b, c, d, e); \
99
MIX(a, b, c, d, e, 0xCA62C1D6)
101
// func block(dig *digest, p []byte)
102
TEXT ·block(SB),7,$92-16
130
ROUND1(AX, BX, CX, DX, BP, 0)
131
ROUND1(BP, AX, BX, CX, DX, 1)
132
ROUND1(DX, BP, AX, BX, CX, 2)
133
ROUND1(CX, DX, BP, AX, BX, 3)
134
ROUND1(BX, CX, DX, BP, AX, 4)
135
ROUND1(AX, BX, CX, DX, BP, 5)
136
ROUND1(BP, AX, BX, CX, DX, 6)
137
ROUND1(DX, BP, AX, BX, CX, 7)
138
ROUND1(CX, DX, BP, AX, BX, 8)
139
ROUND1(BX, CX, DX, BP, AX, 9)
140
ROUND1(AX, BX, CX, DX, BP, 10)
141
ROUND1(BP, AX, BX, CX, DX, 11)
142
ROUND1(DX, BP, AX, BX, CX, 12)
143
ROUND1(CX, DX, BP, AX, BX, 13)
144
ROUND1(BX, CX, DX, BP, AX, 14)
145
ROUND1(AX, BX, CX, DX, BP, 15)
147
ROUND1x(BP, AX, BX, CX, DX, 16)
148
ROUND1x(DX, BP, AX, BX, CX, 17)
149
ROUND1x(CX, DX, BP, AX, BX, 18)
150
ROUND1x(BX, CX, DX, BP, AX, 19)
152
ROUND2(AX, BX, CX, DX, BP, 20)
153
ROUND2(BP, AX, BX, CX, DX, 21)
154
ROUND2(DX, BP, AX, BX, CX, 22)
155
ROUND2(CX, DX, BP, AX, BX, 23)
156
ROUND2(BX, CX, DX, BP, AX, 24)
157
ROUND2(AX, BX, CX, DX, BP, 25)
158
ROUND2(BP, AX, BX, CX, DX, 26)
159
ROUND2(DX, BP, AX, BX, CX, 27)
160
ROUND2(CX, DX, BP, AX, BX, 28)
161
ROUND2(BX, CX, DX, BP, AX, 29)
162
ROUND2(AX, BX, CX, DX, BP, 30)
163
ROUND2(BP, AX, BX, CX, DX, 31)
164
ROUND2(DX, BP, AX, BX, CX, 32)
165
ROUND2(CX, DX, BP, AX, BX, 33)
166
ROUND2(BX, CX, DX, BP, AX, 34)
167
ROUND2(AX, BX, CX, DX, BP, 35)
168
ROUND2(BP, AX, BX, CX, DX, 36)
169
ROUND2(DX, BP, AX, BX, CX, 37)
170
ROUND2(CX, DX, BP, AX, BX, 38)
171
ROUND2(BX, CX, DX, BP, AX, 39)
173
ROUND3(AX, BX, CX, DX, BP, 40)
174
ROUND3(BP, AX, BX, CX, DX, 41)
175
ROUND3(DX, BP, AX, BX, CX, 42)
176
ROUND3(CX, DX, BP, AX, BX, 43)
177
ROUND3(BX, CX, DX, BP, AX, 44)
178
ROUND3(AX, BX, CX, DX, BP, 45)
179
ROUND3(BP, AX, BX, CX, DX, 46)
180
ROUND3(DX, BP, AX, BX, CX, 47)
181
ROUND3(CX, DX, BP, AX, BX, 48)
182
ROUND3(BX, CX, DX, BP, AX, 49)
183
ROUND3(AX, BX, CX, DX, BP, 50)
184
ROUND3(BP, AX, BX, CX, DX, 51)
185
ROUND3(DX, BP, AX, BX, CX, 52)
186
ROUND3(CX, DX, BP, AX, BX, 53)
187
ROUND3(BX, CX, DX, BP, AX, 54)
188
ROUND3(AX, BX, CX, DX, BP, 55)
189
ROUND3(BP, AX, BX, CX, DX, 56)
190
ROUND3(DX, BP, AX, BX, CX, 57)
191
ROUND3(CX, DX, BP, AX, BX, 58)
192
ROUND3(BX, CX, DX, BP, AX, 59)
194
ROUND4(AX, BX, CX, DX, BP, 60)
195
ROUND4(BP, AX, BX, CX, DX, 61)
196
ROUND4(DX, BP, AX, BX, CX, 62)
197
ROUND4(CX, DX, BP, AX, BX, 63)
198
ROUND4(BX, CX, DX, BP, AX, 64)
199
ROUND4(AX, BX, CX, DX, BP, 65)
200
ROUND4(BP, AX, BX, CX, DX, 66)
201
ROUND4(DX, BP, AX, BX, CX, 67)
202
ROUND4(CX, DX, BP, AX, BX, 68)
203
ROUND4(BX, CX, DX, BP, AX, 69)
204
ROUND4(AX, BX, CX, DX, BP, 70)
205
ROUND4(BP, AX, BX, CX, DX, 71)
206
ROUND4(DX, BP, AX, BX, CX, 72)
207
ROUND4(CX, DX, BP, AX, BX, 73)
208
ROUND4(BX, CX, DX, BP, AX, 74)
209
ROUND4(AX, BX, CX, DX, BP, 75)
210
ROUND4(BP, AX, BX, CX, DX, 76)
211
ROUND4(DX, BP, AX, BX, CX, 77)
212
ROUND4(CX, DX, BP, AX, BX, 78)
213
ROUND4(BX, CX, DX, BP, AX, 79)