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 #include <linux/linkage.h>
57
58 #define DIGEST_PTR %rdi
59 #define DATA_PTR %rsi
60 #define NUM_BLKS %rdx
61
62 #define RSPSAVE %rax
63
64
65 #define FRAME_SIZE 32
66
67 #define ABCD %xmm0
68 #define E0 %xmm1
69 #define E1 %xmm2
70 #define MSG0 %xmm3
71 #define MSG1 %xmm4
72 #define MSG2 %xmm5
73 #define MSG3 %xmm6
74 #define SHUF_MASK %xmm7
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 .text
97 .align 32
98 ENTRY(sha1_ni_transform)
99 mov %rsp, RSPSAVE
100 sub $FRAME_SIZE, %rsp
101 and $~0xF, %rsp
102
103 shl $6, NUM_BLKS
104 jz .Ldone_hash
105 add DATA_PTR, NUM_BLKS
106
107
108 pinsrd $3, 1*16(DIGEST_PTR), E0
109 movdqu 0*16(DIGEST_PTR), ABCD
110 pand UPPER_WORD_MASK(%rip), E0
111 pshufd $0x1B, ABCD, ABCD
112
113 movdqa PSHUFFLE_BYTE_FLIP_MASK(%rip), SHUF_MASK
114
115 .Lloop0:
116
117 movdqa E0, (0*16)(%rsp)
118 movdqa ABCD, (1*16)(%rsp)
119
120
121 movdqu 0*16(DATA_PTR), MSG0
122 pshufb SHUF_MASK, MSG0
123 paddd MSG0, E0
124 movdqa ABCD, E1
125 sha1rnds4 $0, E0, ABCD
126
127
128 movdqu 1*16(DATA_PTR), MSG1
129 pshufb SHUF_MASK, MSG1
130 sha1nexte MSG1, E1
131 movdqa ABCD, E0
132 sha1rnds4 $0, E1, ABCD
133 sha1msg1 MSG1, MSG0
134
135
136 movdqu 2*16(DATA_PTR), MSG2
137 pshufb SHUF_MASK, MSG2
138 sha1nexte MSG2, E0
139 movdqa ABCD, E1
140 sha1rnds4 $0, E0, ABCD
141 sha1msg1 MSG2, MSG1
142 pxor MSG2, MSG0
143
144
145 movdqu 3*16(DATA_PTR), MSG3
146 pshufb SHUF_MASK, MSG3
147 sha1nexte MSG3, E1
148 movdqa ABCD, E0
149 sha1msg2 MSG3, MSG0
150 sha1rnds4 $0, E1, ABCD
151 sha1msg1 MSG3, MSG2
152 pxor MSG3, MSG1
153
154
155 sha1nexte MSG0, E0
156 movdqa ABCD, E1
157 sha1msg2 MSG0, MSG1
158 sha1rnds4 $0, E0, ABCD
159 sha1msg1 MSG0, MSG3
160 pxor MSG0, MSG2
161
162
163 sha1nexte MSG1, E1
164 movdqa ABCD, E0
165 sha1msg2 MSG1, MSG2
166 sha1rnds4 $1, E1, ABCD
167 sha1msg1 MSG1, MSG0
168 pxor MSG1, MSG3
169
170
171 sha1nexte MSG2, E0
172 movdqa ABCD, E1
173 sha1msg2 MSG2, MSG3
174 sha1rnds4 $1, E0, ABCD
175 sha1msg1 MSG2, MSG1
176 pxor MSG2, MSG0
177
178
179 sha1nexte MSG3, E1
180 movdqa ABCD, E0
181 sha1msg2 MSG3, MSG0
182 sha1rnds4 $1, E1, ABCD
183 sha1msg1 MSG3, MSG2
184 pxor MSG3, MSG1
185
186
187 sha1nexte MSG0, E0
188 movdqa ABCD, E1
189 sha1msg2 MSG0, MSG1
190 sha1rnds4 $1, E0, ABCD
191 sha1msg1 MSG0, MSG3
192 pxor MSG0, MSG2
193
194
195 sha1nexte MSG1, E1
196 movdqa ABCD, E0
197 sha1msg2 MSG1, MSG2
198 sha1rnds4 $1, E1, ABCD
199 sha1msg1 MSG1, MSG0
200 pxor MSG1, MSG3
201
202
203 sha1nexte MSG2, E0
204 movdqa ABCD, E1
205 sha1msg2 MSG2, MSG3
206 sha1rnds4 $2, E0, ABCD
207 sha1msg1 MSG2, MSG1
208 pxor MSG2, MSG0
209
210
211 sha1nexte MSG3, E1
212 movdqa ABCD, E0
213 sha1msg2 MSG3, MSG0
214 sha1rnds4 $2, E1, ABCD
215 sha1msg1 MSG3, MSG2
216 pxor MSG3, MSG1
217
218
219 sha1nexte MSG0, E0
220 movdqa ABCD, E1
221 sha1msg2 MSG0, MSG1
222 sha1rnds4 $2, E0, ABCD
223 sha1msg1 MSG0, MSG3
224 pxor MSG0, MSG2
225
226
227 sha1nexte MSG1, E1
228 movdqa ABCD, E0
229 sha1msg2 MSG1, MSG2
230 sha1rnds4 $2, E1, ABCD
231 sha1msg1 MSG1, MSG0
232 pxor MSG1, MSG3
233
234
235 sha1nexte MSG2, E0
236 movdqa ABCD, E1
237 sha1msg2 MSG2, MSG3
238 sha1rnds4 $2, E0, ABCD
239 sha1msg1 MSG2, MSG1
240 pxor MSG2, MSG0
241
242
243 sha1nexte MSG3, E1
244 movdqa ABCD, E0
245 sha1msg2 MSG3, MSG0
246 sha1rnds4 $3, E1, ABCD
247 sha1msg1 MSG3, MSG2
248 pxor MSG3, MSG1
249
250
251 sha1nexte MSG0, E0
252 movdqa ABCD, E1
253 sha1msg2 MSG0, MSG1
254 sha1rnds4 $3, E0, ABCD
255 sha1msg1 MSG0, MSG3
256 pxor MSG0, MSG2
257
258
259 sha1nexte MSG1, E1
260 movdqa ABCD, E0
261 sha1msg2 MSG1, MSG2
262 sha1rnds4 $3, E1, ABCD
263 pxor MSG1, MSG3
264
265
266 sha1nexte MSG2, E0
267 movdqa ABCD, E1
268 sha1msg2 MSG2, MSG3
269 sha1rnds4 $3, E0, ABCD
270
271
272 sha1nexte MSG3, E1
273 movdqa ABCD, E0
274 sha1rnds4 $3, E1, ABCD
275
276
277 sha1nexte (0*16)(%rsp), E0
278 paddd (1*16)(%rsp), ABCD
279
280
281 add $64, DATA_PTR
282 cmp NUM_BLKS, DATA_PTR
283 jne .Lloop0
284
285
286 pshufd $0x1B, ABCD, ABCD
287 movdqu ABCD, 0*16(DIGEST_PTR)
288 pextrd $3, E0, 1*16(DIGEST_PTR)
289
290 .Ldone_hash:
291 mov RSPSAVE, %rsp
292
293 ret
294 ENDPROC(sha1_ni_transform)
295
296 .section .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
297 .align 16
298 PSHUFFLE_BYTE_FLIP_MASK:
299 .octa 0x000102030405060708090a0b0c0d0e0f
300
301 .section .rodata.cst16.UPPER_WORD_MASK, "aM", @progbits, 16
302 .align 16
303 UPPER_WORD_MASK:
304 .octa 0xFFFFFFFF000000000000000000000000