Subversion Repositories Kolibri OS

Rev

Rev 6461 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6465 hidnplayr 1
;    libcrash -- cryptographic hash functions
2
;
3
;    Copyright (C) 2013,2016 Ivan Baravy (dunkaist)
4
;
5
;    This program is free software: you can redistribute it and/or modify
6
;    it under the terms of the GNU General Public License as published by
7
;    the Free Software Foundation, either version 3 of the License, or
8
;    (at your option) any later version.
9
;
10
;    This program is distributed in the hope that it will be useful,
11
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
;    GNU General Public License for more details.
14
;
15
;    You should have received a copy of the GNU General Public License
16
;    along with this program.  If not, see .
17
 
18
 
19
macro sha3._.rol_xor nd, ncl, ncr
20
{
21
        movq    mm0, [C + 8*(ncl)]
22
        movq    mm1, mm0
23
        psllq   mm0, 1
24
        psrlq   mm1, 63
25
        por     mm0, mm1
26
        pxor    mm0, [C + 8*(ncr)]
27
        movq    [D + 8*(nd)], mm0
28
}
29
 
30
proc sha3._.theta
31
;locals
32
;        C       rq 5
33
;        D       rq 5
34
;endl
35
C equ ebx + ctx_sha3.C
36
D equ ebx + ctx_sha3.D
37
 
38
repeat 5
39
        movq    mm0, [edi + 8*(%-1 +  0)]
40
        pxor    mm0, [edi + 8*(%-1 +  5)]
41
        pxor    mm0, [edi + 8*(%-1 + 10)]
42
        pxor    mm0, [edi + 8*(%-1 + 15)]
43
        pxor    mm0, [edi + 8*(%-1 + 20)]
44
        movq    [C + 8*(%-1)], mm0
45
end repeat
46
 
47
        sha3._.rol_xor  0, 1, 4
48
        sha3._.rol_xor  1, 2, 0
49
        sha3._.rol_xor  2, 3, 1
50
        sha3._.rol_xor  3, 4, 2
51
        sha3._.rol_xor  4, 0, 3
52
 
53
repeat 5
54
        movq    mm1, [D + 8*(%-1)]
55
        movq    mm0, mm1
56
        pxor    mm0, [edi + 8*(%-1 +  0)]
57
        movq    [edi + 8*(%-1 +  0)], mm0
58
        movq    mm0, mm1
59
        pxor    mm0, [edi + 8*(%-1 +  5)]
60
        movq    [edi + 8*(%-1 +  5)], mm0
61
        movq    mm0, mm1
62
        pxor    mm0, [edi + 8*(%-1 + 10)]
63
        movq    [edi + 8*(%-1 + 10)], mm0
64
        movq    mm0, mm1
65
        pxor    mm0, [edi + 8*(%-1 + 15)]
66
        movq    [edi + 8*(%-1 + 15)], mm0
67
        movq    mm0, mm1
68
        pxor    mm0, [edi + 8*(%-1 + 20)]
69
        movq    [edi + 8*(%-1 + 20)], mm0
70
end repeat
71
 
72
restore C,D
73
        ret
74
endp
75
 
76
 
77
proc sha3._.pi
78
        movq    mm1, [edi + 8*1]
79
        movq    mm0, [edi + 8*6]
80
        movq    [edi + 8*1], mm0
81
        movq    mm0, [edi + 8*9]
82
        movq    [edi + 8*6], mm0
83
        movq    mm0, [edi + 8*22]
84
        movq    [edi + 8*9], mm0
85
        movq    mm0, [edi + 8*14]
86
        movq    [edi + 8*22], mm0
87
        movq    mm0, [edi + 8*20]
88
        movq    [edi + 8*14], mm0
89
        movq    mm0, [edi + 8*2]
90
        movq    [edi + 8*20], mm0
91
        movq    mm0, [edi + 8*12]
92
        movq    [edi + 8*2], mm0
93
        movq    mm0, [edi + 8*13]
94
        movq    [edi + 8*12], mm0
95
        movq    mm0, [edi + 8*19]
96
        movq    [edi + 8*13], mm0
97
        movq    mm0, [edi + 8*23]
98
        movq    [edi + 8*19], mm0
99
        movq    mm0, [edi + 8*15]
100
        movq    [edi + 8*23], mm0
101
        movq    mm0, [edi + 8*4]
102
        movq    [edi + 8*15], mm0
103
        movq    mm0, [edi + 8*24]
104
        movq    [edi + 8*4], mm0
105
        movq    mm0, [edi + 8*21]
106
        movq    [edi + 8*24], mm0
107
        movq    mm0, [edi + 8*8]
108
        movq    [edi + 8*21], mm0
109
        movq    mm0, [edi + 8*16]
110
        movq    [edi + 8*8], mm0
111
        movq    mm0, [edi + 8*5]
112
        movq    [edi + 8*16], mm0
113
        movq    mm0, [edi + 8*3]
114
        movq    [edi + 8*5], mm0
115
        movq    mm0, [edi + 8*18]
116
        movq    [edi + 8*3], mm0
117
        movq    mm0, [edi + 8*17]
118
        movq    [edi + 8*18], mm0
119
        movq    mm0, [edi + 8*11]
120
        movq    [edi + 8*17], mm0
121
        movq    mm0, [edi + 8*7]
122
        movq    [edi + 8*11], mm0
123
        movq    mm0, [edi + 8*10]
124
        movq    [edi + 8*7], mm0
125
        movq    [edi + 8*10], mm1
126
 
127
        ret
128
endp
129
 
130
 
131
proc sha3._.chi
132
 
133
        mov     eax, 0xffffffff
134
        movd    mm0, eax
135
        movq    mm2, mm0
136
        punpckldq       mm2, mm0
137
 
138
repeat 5
139
        movq    mm6, [edi + 8*(0 + 5*(%-1))]
140
        movq    mm7, [edi + 8*(1 + 5*(%-1))]
141
 
142
        movq    mm0, [edi + 8*(0 + 5*(%-1))]
143
        movq    mm1, mm7
144
        pandn   mm1, mm2
145
        pand    mm1, [edi + 8*(2 + 5*(%-1))]
146
        pxor    mm0, mm1
147
        movq    [edi + 8*(0 + 5*(%-1))], mm0
148
 
149
        movq    mm0, [edi + 8*(1 + 5*(%-1))]
150
        movq    mm1, [edi + 8*(2 + 5*(%-1))]
151
        pandn   mm1, mm2
152
        pand    mm1, [edi + 8*(3 + 5*(%-1))]
153
        pxor    mm0, mm1
154
        movq    [edi + 8*(1 + 5*(%-1))], mm0
155
 
156
        movq    mm0, [edi + 8*(2 + 5*(%-1))]
157
        movq    mm1, [edi + 8*(3 + 5*(%-1))]
158
        pandn   mm1, mm2
159
        pand    mm1, [edi + 8*(4 + 5*(%-1))]
160
        pxor    mm0, mm1
161
        movq    [edi + 8*(2 + 5*(%-1))], mm0
162
 
163
        movq    mm0, [edi + 8*(3 + 5*(%-1))]
164
        movq    mm1, [edi + 8*(4 + 5*(%-1))]
165
        pandn   mm1, mm2
166
        pand    mm1, mm6
167
        pxor    mm0, mm1
168
        movq    [edi + 8*(3 + 5*(%-1))], mm0
169
 
170
        movq    mm0, [edi + 8*(4 + 5*(%-1))]
171
        movq    mm1, mm6
172
        pandn   mm1, mm2
173
        pand    mm1, mm7
174
        pxor    mm0, mm1
175
        movq    [edi + 8*(4 + 5*(%-1))], mm0
176
end repeat
177
        ret
178
endp
179
 
180
 
181
macro sha3._.rol_mov n, c
182
{
183
        movq    mm0, [edi + 8*(n)]
184
        movq    mm1, mm0
185
        psllq   mm0, (c)
186
        psrlq   mm1, (64-(c))
187
        por     mm0, mm1
188
        movq    [edi + 8*(n)], mm0
189
}
190
 
191
proc sha3._.permutation
192
 
193
repeat 24
194
        stdcall sha3._.theta
195
 
196
        sha3._.rol_mov   1,  1
197
        sha3._.rol_mov   2, 62
198
        sha3._.rol_mov   3, 28
199
        sha3._.rol_mov   4, 27
200
        sha3._.rol_mov   5, 36
201
        sha3._.rol_mov   6, 44
202
        sha3._.rol_mov   7,  6
203
        sha3._.rol_mov   8, 55
204
        sha3._.rol_mov   9, 20
205
        sha3._.rol_mov  10,  3
206
        sha3._.rol_mov  11, 10
207
        sha3._.rol_mov  12, 43
208
        sha3._.rol_mov  13, 25
209
        sha3._.rol_mov  14, 39
210
        sha3._.rol_mov  15, 41
211
        sha3._.rol_mov  16, 45
212
        sha3._.rol_mov  17, 15
213
        sha3._.rol_mov  18, 21
214
        sha3._.rol_mov  19,  8
215
        sha3._.rol_mov  20, 18
216
        sha3._.rol_mov  21,  2
217
        sha3._.rol_mov  22, 61
218
        sha3._.rol_mov  23, 56
219
        sha3._.rol_mov  24, 14
220
 
221
        stdcall sha3._.pi
222
        stdcall sha3._.chi
223
 
224
        movq    mm0, [edi + 8*(0)]
225
        pxor    mm0, [sha3._.round + 8*(%-1)]
226
        movq    [edi + 8*(0)], mm0
227
end repeat
228
 
229
        ret
230
endp
231
 
232
 
233
proc sha3._.init _ctx
234
        mov     [ebx + ctx_sha3.block_size], eax
235
        shr     eax, 3
236
        dec     eax
237
        mov     [ebx + ctx_sha3.rounds_cnt], eax
238
        xor     eax, eax
239
        lea     edi, [ebx + ctx_sha3.hash]
240
        mov     ecx, SHA3_INIT_SIZE/4
241
        rep     stosd
242
        mov     [ebx + ctx_sha3.index], eax
243
        ret
244
endp
245
 
246
 
247
proc sha3224.init _ctx
248
        mov     ebx, [_ctx]
249
        mov     eax, SHA3224_BLOCK_SIZE
250
        stdcall sha3._.init
251
        ret
252
endp
253
 
254
 
255
proc sha3256.init _ctx
256
        mov     ebx, [_ctx]
257
        mov     eax, SHA3256_BLOCK_SIZE
258
        stdcall sha3._.init
259
        ret
260
endp
261
 
262
 
263
proc sha3384.init _ctx
264
        mov     ebx, [_ctx]
265
        mov     eax, SHA3384_BLOCK_SIZE
266
        stdcall sha3._.init
267
        ret
268
endp
269
 
270
 
271
proc sha3512.init _ctx
272
        mov     ebx, [_ctx]
273
        mov     eax, SHA3512_BLOCK_SIZE
274
        stdcall sha3._.init
275
        ret
276
endp
277
 
278
 
279
proc sha3._.block _hash
280
        mov     ecx, [ebx + ctx_sha3.rounds_cnt]
281
        mov     edi, [_hash]
282
 
283
    @@:
284
        movq    mm0, [esi + 8*ecx]
285
        pxor    mm0, [edi + 8*ecx]
286
        movq    [edi + 8*ecx], mm0
287
        dec     ecx
288
        jns     @b
289
 
290
        stdcall sha3._.permutation
291
 
292
        ret
293
endp
294
 
295
 
296
sha3224.update = sha3.update
297
sha3256.update = sha3.update
298
sha3384.update = sha3.update
299
sha3512.update = sha3.update
300
proc sha3.update _ctx, _msg, _size
301
  .next_block:
302
        mov     ebx, [_ctx]
303
        mov     esi, [_msg]
304
        mov     eax, [ebx + ctx_sha3.index]
305
        test    eax, eax
306
        jnz     .copy_to_buf
307
        test    esi, SHA3_ALIGN_MASK
308
        jnz     .copy_to_buf
309
  .no_copy:
310
        ; data is aligned, hash it in place without copying
311
        mov     ebx, [_ctx]
312
        mov     eax, [ebx + ctx_sha3.block_size]
313
        cmp     [_size], eax
314
        jb      .copy_quit
315
        lea     eax, [ebx + ctx_sha3.hash]
316
        push    ebx esi
317
        stdcall sha3._.block, eax
318
        pop     esi ebx
319
        mov     eax, [ebx + ctx_sha3.block_size]
320
        sub     [_size], eax
321
        add     esi, [ebx + ctx_sha3.block_size]
322
        jmp     .no_copy
323
 
324
  .copy_to_buf:
325
        lea     edi, [ebx + ctx_sha3.block]
326
        add     edi, eax
327
        mov     ecx, [ebx + ctx_sha3.block_size]
328
        sub     ecx, eax
329
        cmp     [_size], ecx
330
        jb      .copy_quit
331
        sub     [_size], ecx
332
        add     [_msg], ecx
333
        add     [ebx + ctx_sha3.index], ecx
334
        mov     eax, [ebx + ctx_sha3.block_size]
335
        cmp     [ebx + ctx_sha3.index], eax
336
        jb      @f
337
        sub     [ebx + ctx_sha3.index], eax
338
    @@:
339
        rep     movsb
340
        lea     eax, [ebx + ctx_sha3.hash]
341
        lea     esi, [ebx + ctx_sha3.block]
342
        stdcall sha3._.block, eax
343
        jmp     .next_block
344
 
345
  .copy_quit:
346
        mov     ebx, [_ctx]
347
        lea     edi, [ebx + ctx_sha3.block]
348
        mov     eax, [ebx + ctx_sha3.index]
349
        add     edi, eax
350
        mov     ecx, [_size]
351
        add     [ebx + ctx_sha3.index], ecx
352
        rep     movsb
353
  .quit:
354
        ret
355
endp
356
 
357
 
358
sha3224.final = sha3.final
359
sha3256.final = sha3.final
360
sha3384.final = sha3.final
361
sha3512.final = sha3.final
362
proc sha3.final _ctx
363
        pushad
364
        mov     ebx, [_ctx]
365
        mov     eax, [ebx + ctx_sha3.index]
366
        xor     edx, edx
367
        mov     ecx, [ebx + ctx_sha3.block_size]
368
        div     ecx
369
        sub     ecx, edx
370
        ja      @f
371
        add     ecx, [ebx + ctx_sha3.block_size]
372
    @@:
373
        add     [ebx + ctx_sha3.index], ecx
374
        mov     eax, [ebx + ctx_sha3.block_size]
375
        cmp     [ebx + ctx_sha3.index], eax
376
        jb      @f
377
        sub     [ebx + ctx_sha3.index], eax
378
    @@:
379
 
380
        mov     byte[edi], 0x06
381
        inc     edi
382
        dec     ecx
383
        xor     eax, eax
384
        rep     stosb
385
        or      byte[edi - 1], 0x80
386
 
387
        mov     ebx, [_ctx]
388
        lea     esi, [ebx + ctx_sha3.block]
389
        lea     eax, [ebx + ctx_sha3.hash]
390
        stdcall sha3._.block, eax
391
 
392
        mov     ebx, [_ctx]
393
        lea     eax, [ebx + ctx_sha3.hash]
394
        stdcall sha3._.postprocess, ebx, eax
395
 
396
        popad
397
        ret
398
endp
399
 
400
 
401
proc sha3._.postprocess _ctx, _hash
402
        emms
403
        ret
404
endp
405
 
406
 
407
align SHA3_ALIGN
408
 
409
sha3._.round    dq 0x0000000000000001, 0x0000000000008082, 0x800000000000808A,\
410
                   0x8000000080008000, 0x000000000000808B, 0x0000000080000001,\
411
                   0x8000000080008081, 0x8000000000008009, 0x000000000000008A,\
412
                   0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
413
                   0x000000008000808B, 0x800000000000008B, 0x8000000000008089,\
414
                   0x8000000000008003, 0x8000000000008002, 0x8000000000000080,\
415
                   0x000000000000800A, 0x800000008000000A, 0x8000000080008081,\
416
                   0x8000000000008080, 0x0000000080000001, 0x8000000080008008
417