Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3115 dunkaist 1
macro chn x, y, z
2
{
3
	movq	mm0, [y]
4
	pxor	mm0, [z]
5
	pand	mm0, [x]
6
	pxor	mm0, [z]
7
}
8
 
9
macro maj x, y, z
10
{
11
	movq	mm0, [x]
12
	pxor	mm0, [y]
13
	pand	mm0, [z]
14
	movq	mm2, [x]
15
	pand	mm2, [y]
16
	pxor	mm0, mm2
17
}
18
 
19
macro Sigma0 x
20
{
21
	movq	mm0, x
22
	movq	mm2, mm0
23
	movq	mm7, mm2
24
	psrlq	mm2, 28
25
	psllq	mm7, 36
26
	por	mm2, mm7
27
	movq	mm7, mm0
28
	psrlq	mm0, 34
29
	psllq	mm7, 30
30
	por	mm0, mm7
31
	pxor	mm0, mm2
32
	movq	mm2, x
33
	movq	mm7, mm2
34
	psrlq	mm2, 39
35
	psllq	mm7, 25
36
	por	mm2, mm7
37
	pxor	mm0, mm2
38
}
39
 
40
macro Sigma1 x
41
{
42
	movq	mm0, x
43
	movq	mm2, mm0
44
	movq	mm7, mm2
45
	psrlq	mm2, 14
46
	psllq	mm7, 50
47
	por	mm2, mm7
48
	movq	mm7, mm0
49
	psrlq	mm0, 18
50
	psllq	mm7, 46
51
	por	mm0, mm7
52
	pxor	mm0, mm2
53
	movq	mm2, x
54
	movq	mm7, mm2
55
	psrlq	mm2, 41
56
	psllq	mm7, 23
57
	por	mm2, mm7
58
	pxor	mm0, mm2
59
}
60
 
61
macro sigma0 x
62
{
63
	movq	mm0, x
64
	movq	mm2, mm0
65
	movq	mm7, mm2
66
	psrlq	mm2, 1
67
	psllq	mm7, 63
68
	por	mm2, mm7
69
	movq	mm7, mm0
70
	psrlq	mm0, 8
71
	psllq	mm7, 56
72
	por	mm0, mm7
73
	pxor	mm0, mm2
74
	movq	mm2, x
75
	psrlq	mm2, 7
76
	pxor	mm0, mm2
77
}
78
 
79
macro sigma1 x
80
{
81
	movq	mm0, x
82
	movq	mm2, mm0
83
	movq	mm7, mm2
84
	psrlq	mm2, 19
85
	psllq	mm7, 45
86
	por	mm2, mm7
87
	movq	mm7, mm0
88
	psrlq	mm0, 61
89
	psllq	mm7, 3
90
	por	mm0, mm7
91
	pxor	mm0, mm2
92
	movq	mm2, x
93
	psrlq	mm2, 6
94
	pxor	mm0, mm2
95
}
96
 
97
macro recalculate_w n
98
{
99
	movq	mm3, [w + ((n-2) and 15)*8]
100
	sigma1	mm3
101
	paddq	mm0, [w + ((n-7) and 15)*8]
102
	movq	mm6, mm0
103
	movq	mm3, [w + ((n-15) and 15)*8]
104
	sigma0	mm3
105
	movq	mm2, mm6
106
	paddq	mm0, mm2
107
	movq	mm7, [w + (n)*8]
108
	paddq	mm7, mm0
109
	movq	[w + (n)*8], mm7
110
}
111
 
112
macro crash.sha512.round a, b, c, d, e, f, g, h, k
113
{
114
	movq	mm1, [h]
115
	movq	mm3, [e]
116
	Sigma1	mm3
117
	paddq	mm1, mm0
118
	chn	e, f, g
119
	paddq	mm1, mm0
120
	paddq	mm1, [k]
121
	paddq	mm1, mm5
122
	movq	mm7, [d]
123
	paddq	mm7, mm1
124
	movq	[d], mm7
125
	movq	mm3, [a]
126
	Sigma0	mm3
127
	paddq	mm1, mm0
128
	maj	a, b, c
129
	paddq	mm0, mm1
130
	movq	[h], mm0
131
}
132
 
133
 
134
macro crash.sha512.round_1_16 a, b, c, d, e, f, g, h, n
135
{
136
 
137
	movq	mm0, [esi + (n)*8]
138
	movq	[temp], mm0
139
	mov	eax, dword[temp]
140
	bswap	eax
141
	push	eax
142
	mov	eax, dword[temp + 4]
143
	bswap	eax
144
	mov	dword[temp], eax
145
	pop	eax
146
	mov	dword[temp + 4], eax
147
	movq	mm0, [temp]
148
	movq	[w + (n)*8], mm0
149
	movq	mm5, mm0
150
	crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n)*8)
151
}
152
 
153
macro crash.sha512.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
154
{
155
	recalculate_w n
156
	movq	mm5, [w + (n)*8]
157
	crash.sha512.round a, b, c, d, e, f, g, h, (crash._.sha512_table + (n+16*rep_num)*8)
158
}
159
 
160
 
161
proc crash.sha512 _sha512, _data, _len, _callback, _msglen
162
locals
163
	final	rd 1
164
	w	rq 80
165
	A	rq 1
166
	B	rq 1
167
	C	rq 1
168
	D	rq 1
169
	E	rq 1
170
	F	rq 1
171
	G	rq 1
172
	H	rq 1
173
	temp	rq 1
174
endl
175
	mov	[final], 0
176
  .first:
177
	mov	eax, [_msglen]
178
	mov	ecx, [_len]
179
	add	[eax], ecx
180
	mov	esi, [_data]
181
	test	ecx, ecx
182
	jz	.callback
183
  .begin:
184
	sub	[_len], 128
185
	jnc	@f
186
	add	[_len], 128
187
	jmp	.endofblock
188
    @@:
189
	mov	edi, [_sha512]
190
	movq	mm0, [edi + 0x00]
191
	movq	[A], mm0
192
	movq	mm0, [edi + 0x08]
193
	movq	[B], mm0
194
	movq	mm0, [edi + 0x10]
195
	movq	[C], mm0
196
	movq	mm0, [edi + 0x18]
197
	movq	[D], mm0
198
	movq	mm0, [edi + 0x20]
199
	movq	[E], mm0
200
	movq	mm0, [edi + 0x28]
201
	movq	[F], mm0
202
	movq	mm0, [edi + 0x30]
203
	movq	[G], mm0
204
	movq	mm0, [edi + 0x38]
205
	movq	[H], mm0
206
 
207
 
208
	crash.sha512.round_1_16		A, B, C, D, E, F, G, H,  0
209
	crash.sha512.round_1_16		H, A, B, C, D, E, F, G,  1
210
	crash.sha512.round_1_16		G, H, A, B, C, D, E, F,  2
211
	crash.sha512.round_1_16		F, G, H, A, B, C, D, E,  3
212
	crash.sha512.round_1_16		E, F, G, H, A, B, C, D,  4
213
	crash.sha512.round_1_16		D, E, F, G, H, A, B, C,  5
214
	crash.sha512.round_1_16		C, D, E, F, G, H, A, B,  6
215
	crash.sha512.round_1_16		B, C, D, E, F, G, H, A,  7
216
	crash.sha512.round_1_16		A, B, C, D, E, F, G, H,  8
217
	crash.sha512.round_1_16		H, A, B, C, D, E, F, G,  9
218
	crash.sha512.round_1_16		G, H, A, B, C, D, E, F, 10
219
	crash.sha512.round_1_16		F, G, H, A, B, C, D, E, 11
220
	crash.sha512.round_1_16		E, F, G, H, A, B, C, D, 12
221
	crash.sha512.round_1_16		D, E, F, G, H, A, B, C, 13
222
	crash.sha512.round_1_16		C, D, E, F, G, H, A, B, 14
223
	crash.sha512.round_1_16		B, C, D, E, F, G, H, A, 15
224
 
225
repeat 4
226
	crash.sha512.round_17_64	A, B, C, D, E, F, G, H,  0, %
227
	crash.sha512.round_17_64	H, A, B, C, D, E, F, G,  1, %
228
	crash.sha512.round_17_64	G, H, A, B, C, D, E, F,  2, %
229
	crash.sha512.round_17_64	F, G, H, A, B, C, D, E,  3, %
230
	crash.sha512.round_17_64	E, F, G, H, A, B, C, D,  4, %
231
	crash.sha512.round_17_64	D, E, F, G, H, A, B, C,  5, %
232
	crash.sha512.round_17_64	C, D, E, F, G, H, A, B,  6, %
233
	crash.sha512.round_17_64	B, C, D, E, F, G, H, A,  7, %
234
	crash.sha512.round_17_64	A, B, C, D, E, F, G, H,  8, %
235
	crash.sha512.round_17_64	H, A, B, C, D, E, F, G,  9, %
236
	crash.sha512.round_17_64	G, H, A, B, C, D, E, F, 10, %
237
	crash.sha512.round_17_64	F, G, H, A, B, C, D, E, 11, %
238
	crash.sha512.round_17_64	E, F, G, H, A, B, C, D, 12, %
239
	crash.sha512.round_17_64	D, E, F, G, H, A, B, C, 13, %
240
	crash.sha512.round_17_64	C, D, E, F, G, H, A, B, 14, %
241
	crash.sha512.round_17_64	B, C, D, E, F, G, H, A, 15, %
242
end repeat
243
 
244
 
245
	mov	edi, [_sha512]
246
	movq	mm0, [A]
247
	paddq	mm0, [edi + 0x00]
248
	movq	[edi + 0x00], mm0
249
	movq	mm0, [B]
250
	paddq	mm0, [edi + 0x08]
251
	movq	[edi + 0x08], mm0
252
	movq	mm0, [C]
253
	paddq	mm0, [edi + 0x10]
254
	movq	[edi + 0x10], mm0
255
	movq	mm0, [D]
256
	paddq	mm0, [edi + 0x18]
257
	movq	[edi + 0x18], mm0
258
	movq	mm0, [E]
259
	paddq	mm0, [edi + 0x20]
260
	movq	[edi + 0x20], mm0
261
	movq	mm0, [F]
262
	paddq	mm0, [edi + 0x28]
263
	movq	[edi + 0x28], mm0
264
	movq	mm0, [G]
265
	paddq	mm0, [edi + 0x30]
266
	movq	[edi + 0x30], mm0
267
	movq	mm0, [H]
268
	paddq	mm0, [edi + 0x38]
269
	movq	[edi + 0x38], mm0
270
	add	esi, 128
271
	jmp	.begin
272
  .endofblock:
273
	cmp	[final], 1
274
	je	.quit
275
 
276
  .callback:
277
	mov	eax, [_callback]
278
	test	eax, eax
279
	jz	@f
280
	call	eax
281
	test	eax, eax
282
	jz	@f
283
	mov	[_len], eax
284
	jmp	.first
285
    @@:
286
 
287
	mov	edi, [_data]
288
	mov	ecx, [_len]
289
	rep	movsb
290
	mov	eax, [_msglen]
291
	mov	eax, [eax]
292
	and	eax, 127
293
	mov	ecx, 112
294
	sub	ecx, eax
295
	ja	@f
296
	add	ecx, 128
297
    @@:
298
	add	[_len], ecx
299
	mov	byte[edi], 0x80
300
	add	edi, 1
301
	sub	ecx, 1
302
	mov	al, 0
303
	rep	stosb
304
	xor	eax, eax
305
	stosd
306
	stosd
307
	mov	eax, [_msglen]
308
	mov	eax, [eax]
309
	mov	edx, 8
310
	mul	edx
311
	bswap	eax
312
	bswap	edx
313
	mov	dword[edi], edx
314
	mov	dword[edi + 4], eax
315
	add	[_len], 16
316
	mov	[final], 1
317
	jmp	.first
318
  .quit:
319
	mov	esi, [_sha512]
320
	mov	edi, esi
321
	mov	ecx, 8
322
    @@:
323
	lodsd
324
	bswap	eax
325
	mov	ebx, eax
326
	lodsd
327
	bswap	eax
328
	stosd
329
	mov	eax, ebx
330
	stosd
331
	sub	ecx, 1
332
	jnz	@b
333
	emms
334
	ret
335
endp
336