Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7698 dunkaist 1
;    libcrash -- cryptographic hash functions
2
;
3
;    Copyright (C) 2012-2013,2016,2019 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
SHA384512_BLOCK_SIZE = 128
20
SHA384_BLOCK_SIZE    = SHA384512_BLOCK_SIZE
21
SHA512_BLOCK_SIZE    = SHA384512_BLOCK_SIZE
22
SHA384_HASH_SIZE     = 48
23
SHA512_HASH_SIZE     = 64
24
 
25
SHA384512_INIT_SIZE  = 64
26
SHA384512_ALIGN      = 16
27
SHA384512_ALIGN_MASK = SHA384512_ALIGN - 1
28
 
29
struct ctx_sha384512
30
        hash            rb SHA384512_INIT_SIZE
31
        block           rb SHA384512_BLOCK_SIZE
32
        index           rd 1
33
        msglen_0        rd 1
34
        msglen_1        rd 1
35
        msglen_2        rd 1
36
        msglen_3        rd 1
37
                        rd 3    ; align
38
        ; tmp vars
39
        w               rq 80
40
        A               rq 1
41
        B               rq 1
42
        C               rq 1
43
        D               rq 1
44
        E               rq 1
45
        F               rq 1
46
        G               rq 1
47
        H               rq 1
48
        temp            rq 1
49
ends
50
 
51
if defined sizeof.crash_ctx
52
  assert sizeof.crash_ctx >= sizeof.ctx_sha384512
53
end if
54
 
55
macro sha384512._.chn x, y, z
56
{
57
        movq    mm0, [y]
58
        pxor    mm0, [z]
59
        pand    mm0, [x]
60
        pxor    mm0, [z]
61
}
62
 
63
macro sha384512._.maj x, y, z
64
{
65
        movq    mm0, [x]
66
        pxor    mm0, [y]
67
        pand    mm0, [z]
68
        movq    mm2, [x]
69
        pand    mm2, [y]
70
        pxor    mm0, mm2
71
}
72
 
73
macro sha384512._.Sigma0 x
74
{
75
        movq    mm0, x
76
        movq    mm2, mm0
77
        movq    mm7, mm2
78
        psrlq   mm2, 28
79
        psllq   mm7, 36
80
        por     mm2, mm7
81
        movq    mm7, mm0
82
        psrlq   mm0, 34
83
        psllq   mm7, 30
84
        por     mm0, mm7
85
        pxor    mm0, mm2
86
        movq    mm2, x
87
        movq    mm7, mm2
88
        psrlq   mm2, 39
89
        psllq   mm7, 25
90
        por     mm2, mm7
91
        pxor    mm0, mm2
92
}
93
 
94
macro sha384512._.Sigma1 x
95
{
96
        movq    mm0, x
97
        movq    mm2, mm0
98
        movq    mm7, mm2
99
        psrlq   mm2, 14
100
        psllq   mm7, 50
101
        por     mm2, mm7
102
        movq    mm7, mm0
103
        psrlq   mm0, 18
104
        psllq   mm7, 46
105
        por     mm0, mm7
106
        pxor    mm0, mm2
107
        movq    mm2, x
108
        movq    mm7, mm2
109
        psrlq   mm2, 41
110
        psllq   mm7, 23
111
        por     mm2, mm7
112
        pxor    mm0, mm2
113
}
114
 
115
macro sha384512._.sigma0 x
116
{
117
        movq    mm0, x
118
        movq    mm2, mm0
119
        movq    mm7, mm2
120
        psrlq   mm2, 1
121
        psllq   mm7, 63
122
        por     mm2, mm7
123
        movq    mm7, mm0
124
        psrlq   mm0, 8
125
        psllq   mm7, 56
126
        por     mm0, mm7
127
        pxor    mm0, mm2
128
        movq    mm2, x
129
        psrlq   mm2, 7
130
        pxor    mm0, mm2
131
}
132
 
133
macro sha384512._.sigma1 x
134
{
135
        movq    mm0, x
136
        movq    mm2, mm0
137
        movq    mm7, mm2
138
        psrlq   mm2, 19
139
        psllq   mm7, 45
140
        por     mm2, mm7
141
        movq    mm7, mm0
142
        psrlq   mm0, 61
143
        psllq   mm7, 3
144
        por     mm0, mm7
145
        pxor    mm0, mm2
146
        movq    mm2, x
147
        psrlq   mm2, 6
148
        pxor    mm0, mm2
149
}
150
 
151
macro sha384512._.recalculate_w n
152
{
153
        movq    mm3, [w + ((n-2) and 15)*8]
154
        sha384512._.sigma1  mm3
155
        paddq   mm0, [w + ((n-7) and 15)*8]
156
        movq    mm6, mm0
157
        movq    mm3, [w + ((n-15) and 15)*8]
158
        sha384512._.sigma0  mm3
159
        movq    mm2, mm6
160
        paddq   mm0, mm2
161
        movq    mm7, [w + (n)*8]
162
        paddq   mm7, mm0
163
        movq    [w + (n)*8], mm7
164
}
165
 
166
macro sha384512._.round a, b, c, d, e, f, g, h, k
167
{
168
        movq    mm1, [h]
169
        movq    mm3, [e]
170
        sha384512._.Sigma1  mm3
171
        paddq   mm1, mm0
172
        sha384512._.chn     e, f, g
173
        paddq   mm1, mm0
174
        paddq   mm1, [k]
175
        paddq   mm1, mm5
176
        movq    mm7, [d]
177
        paddq   mm7, mm1
178
        movq    [d], mm7
179
        movq    mm3, [a]
180
        sha384512._.Sigma0  mm3
181
        paddq   mm1, mm0
182
        sha384512._.maj     a, b, c
183
        paddq   mm0, mm1
184
        movq    [h], mm0
185
}
186
 
187
 
188
macro sha384512._.round_1_16 a, b, c, d, e, f, g, h, n
189
{
190
 
191
        movq    mm0, [esi + (n)*8]
192
        movq    [temp], mm0
193
        mov     eax, dword[temp]
194
        bswap   eax
195
        push    eax
196
        mov     eax, dword[temp + 4]
197
        bswap   eax
198
        mov     dword[temp], eax
199
        pop     eax
200
        mov     dword[temp + 4], eax
201
        movq    mm0, [temp]
202
        movq    [w + (n)*8], mm0
203
        movq    mm5, mm0
204
        sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n)*8)
205
}
206
 
207
macro sha384512._.round_17_64 a, b, c, d, e, f, g, h, n, rep_num
208
{
209
        sha384512._.recalculate_w n
210
        movq    mm5, [w + (n)*8]
211
        sha384512._.round a, b, c, d, e, f, g, h, (sha384512._.table + (n+16*rep_num)*8)
212
}
213
 
214
 
215
proc sha384.init _ctx
216
        mov     ebx, [_ctx]
217
        lea     edi, [ebx + ctx_sha384512.hash]
218
        mov     esi, sha384._.hash_init
219
        mov     ecx, SHA384512_INIT_SIZE/4
220
        rep     movsd
221
        xor     eax, eax
222
        mov     [ebx + ctx_sha384512.index], eax
223
        mov     [ebx + ctx_sha384512.msglen_0], eax
224
        mov     [ebx + ctx_sha384512.msglen_1], eax
225
        mov     [ebx + ctx_sha384512.msglen_2], eax
226
        mov     [ebx + ctx_sha384512.msglen_3], eax
227
        ret
228
endp
229
 
230
 
231
proc sha512.init _ctx
232
        mov     ebx, [_ctx]
233
        lea     edi, [ebx + ctx_sha384512.hash]
234
        mov     esi, sha512._.hash_init
235
        mov     ecx, SHA384512_INIT_SIZE/4
236
        rep     movsd
237
        xor     eax, eax
238
        mov     [ebx + ctx_sha384512.index], eax
239
        mov     [ebx + ctx_sha384512.msglen_0], eax
240
        mov     [ebx + ctx_sha384512.msglen_1], eax
241
        mov     [ebx + ctx_sha384512.msglen_2], eax
242
        mov     [ebx + ctx_sha384512.msglen_3], eax
243
        ret
244
endp
245
 
246
 
247
proc sha384512._.block _hash
248
;locals
249
;        w       rq 80
250
;        A       rq 1
251
;        B       rq 1
252
;        C       rq 1
253
;        D       rq 1
254
;        E       rq 1
255
;        F       rq 1
256
;        G       rq 1
257
;        H       rq 1
258
;        temp    rq 1
259
;endl
260
w equ ebx + ctx_sha384512.w
261
A equ ebx + ctx_sha384512.A
262
B equ ebx + ctx_sha384512.B
263
C equ ebx + ctx_sha384512.C
264
D equ ebx + ctx_sha384512.D
265
E equ ebx + ctx_sha384512.E
266
F equ ebx + ctx_sha384512.F
267
G equ ebx + ctx_sha384512.G
268
H equ ebx + ctx_sha384512.H
269
temp equ ebx + ctx_sha384512.temp
270
 
271
        mov     edi, [_hash]
272
        movq    mm0, [edi + 0x00]
273
        movq    [A], mm0
274
        movq    mm0, [edi + 0x08]
275
        movq    [B], mm0
276
        movq    mm0, [edi + 0x10]
277
        movq    [C], mm0
278
        movq    mm0, [edi + 0x18]
279
        movq    [D], mm0
280
        movq    mm0, [edi + 0x20]
281
        movq    [E], mm0
282
        movq    mm0, [edi + 0x28]
283
        movq    [F], mm0
284
        movq    mm0, [edi + 0x30]
285
        movq    [G], mm0
286
        movq    mm0, [edi + 0x38]
287
        movq    [H], mm0
288
 
289
 
290
        sha384512._.round_1_16  A, B, C, D, E, F, G, H,  0
291
        sha384512._.round_1_16  H, A, B, C, D, E, F, G,  1
292
        sha384512._.round_1_16  G, H, A, B, C, D, E, F,  2
293
        sha384512._.round_1_16  F, G, H, A, B, C, D, E,  3
294
        sha384512._.round_1_16  E, F, G, H, A, B, C, D,  4
295
        sha384512._.round_1_16  D, E, F, G, H, A, B, C,  5
296
        sha384512._.round_1_16  C, D, E, F, G, H, A, B,  6
297
        sha384512._.round_1_16  B, C, D, E, F, G, H, A,  7
298
        sha384512._.round_1_16  A, B, C, D, E, F, G, H,  8
299
        sha384512._.round_1_16  H, A, B, C, D, E, F, G,  9
300
        sha384512._.round_1_16  G, H, A, B, C, D, E, F, 10
301
        sha384512._.round_1_16  F, G, H, A, B, C, D, E, 11
302
        sha384512._.round_1_16  E, F, G, H, A, B, C, D, 12
303
        sha384512._.round_1_16  D, E, F, G, H, A, B, C, 13
304
        sha384512._.round_1_16  C, D, E, F, G, H, A, B, 14
305
        sha384512._.round_1_16  B, C, D, E, F, G, H, A, 15
306
 
307
repeat 4
308
        sha384512._.round_17_64 A, B, C, D, E, F, G, H,  0, %
309
        sha384512._.round_17_64 H, A, B, C, D, E, F, G,  1, %
310
        sha384512._.round_17_64 G, H, A, B, C, D, E, F,  2, %
311
        sha384512._.round_17_64 F, G, H, A, B, C, D, E,  3, %
312
        sha384512._.round_17_64 E, F, G, H, A, B, C, D,  4, %
313
        sha384512._.round_17_64 D, E, F, G, H, A, B, C,  5, %
314
        sha384512._.round_17_64 C, D, E, F, G, H, A, B,  6, %
315
        sha384512._.round_17_64 B, C, D, E, F, G, H, A,  7, %
316
        sha384512._.round_17_64 A, B, C, D, E, F, G, H,  8, %
317
        sha384512._.round_17_64 H, A, B, C, D, E, F, G,  9, %
318
        sha384512._.round_17_64 G, H, A, B, C, D, E, F, 10, %
319
        sha384512._.round_17_64 F, G, H, A, B, C, D, E, 11, %
320
        sha384512._.round_17_64 E, F, G, H, A, B, C, D, 12, %
321
        sha384512._.round_17_64 D, E, F, G, H, A, B, C, 13, %
322
        sha384512._.round_17_64 C, D, E, F, G, H, A, B, 14, %
323
        sha384512._.round_17_64 B, C, D, E, F, G, H, A, 15, %
324
end repeat
325
 
326
 
327
        mov     edi, [_hash]
328
        movq    mm0, [A]
329
        paddq   mm0, [edi + 0x00]
330
        movq    [edi + 0x00], mm0
331
        movq    mm0, [B]
332
        paddq   mm0, [edi + 0x08]
333
        movq    [edi + 0x08], mm0
334
        movq    mm0, [C]
335
        paddq   mm0, [edi + 0x10]
336
        movq    [edi + 0x10], mm0
337
        movq    mm0, [D]
338
        paddq   mm0, [edi + 0x18]
339
        movq    [edi + 0x18], mm0
340
        movq    mm0, [E]
341
        paddq   mm0, [edi + 0x20]
342
        movq    [edi + 0x20], mm0
343
        movq    mm0, [F]
344
        paddq   mm0, [edi + 0x28]
345
        movq    [edi + 0x28], mm0
346
        movq    mm0, [G]
347
        paddq   mm0, [edi + 0x30]
348
        movq    [edi + 0x30], mm0
349
        movq    mm0, [H]
350
        paddq   mm0, [edi + 0x38]
351
        movq    [edi + 0x38], mm0
352
 
353
        ret
354
restore w,A,B,C,D,E,F,G,H,temp
355
endp
356
 
357
 
358
sha384.update = sha384512.update
359
sha512.update = sha384512.update
360
proc sha384512.update _ctx, _msg, _size
361
        mov     ebx, [_ctx]
362
        mov     ecx, [_size]
363
        add     [ebx + ctx_sha384512.msglen_0], ecx
364
        adc     [ebx + ctx_sha384512.msglen_1], 0
365
        adc     [ebx + ctx_sha384512.msglen_2], 0
366
        adc     [ebx + ctx_sha384512.msglen_3], 0
367
 
368
  .next_block:
369
        mov     ebx, [_ctx]
370
        mov     esi, [_msg]
371
        mov     eax, [ebx + ctx_sha384512.index]
372
        and     eax, SHA384512_BLOCK_SIZE-1
373
        jnz     .copy_to_buf
374
        test    esi, SHA384512_ALIGN_MASK
375
        jnz     .copy_to_buf
376
  .no_copy:
377
        ; data is aligned, hash it in place without copying
378
        mov     ebx, [_ctx]
379
        cmp     [_size], SHA384512_BLOCK_SIZE
380
        jb      .copy_quit
381
        lea     eax, [ebx + ctx_sha384512.hash]
382
        stdcall sha384512._.block, eax
383
        sub     [_size], SHA384512_BLOCK_SIZE
384
        add     esi, SHA384512_BLOCK_SIZE           ; FIXME
385
        jmp     .no_copy
386
 
387
  .copy_to_buf:
388
        lea     edi, [ebx + ctx_sha384512.block]
389
        add     edi, eax
390
        mov     ecx, SHA384512_BLOCK_SIZE
391
        sub     ecx, eax
392
        cmp     [_size], ecx
393
        jb      .copy_quit
394
        sub     [_size], ecx
395
        add     [_msg], ecx
396
        add     [ebx + ctx_sha384512.index], ecx
397
        rep     movsb
398
        lea     eax, [ebx + ctx_sha384512.hash]
399
        lea     esi, [ebx + ctx_sha384512.block]
400
        stdcall sha384512._.block, eax
401
        jmp     .next_block
402
 
403
  .copy_quit:
404
        mov     ebx, [_ctx]
405
        lea     edi, [ebx + ctx_sha384512.block]
406
        mov     eax, [ebx + ctx_sha384512.index]
407
        and     eax, SHA384512_BLOCK_SIZE-1
408
        add     edi, eax
409
        mov     ecx, [_size]
410
        add     [ebx + ctx_sha384512.index], ecx
411
        rep     movsb
412
  .quit:
413
 
414
        ret
415
endp
416
 
417
 
418
sha384.final = sha384512.final
419
sha512.final = sha384512.final
420
proc sha384512.final _ctx
421
        mov     ebx, [_ctx]
422
        lea     edi, [ebx + ctx_sha384512.block]
423
        mov     ecx, [ebx + ctx_sha384512.msglen_0]
424
        and     ecx, SHA384512_BLOCK_SIZE-1
425
        add     edi, ecx
426
        mov     byte[edi], 0x80
427
        inc     edi
428
        neg     ecx
429
        add     ecx, SHA384512_BLOCK_SIZE
430
        cmp     ecx, 16
431
        ja      .last
432
 
433
        dec     ecx
434
        xor     eax, eax
435
        rep     stosb
436
        lea     esi, [ebx + ctx_sha384512.block]
437
        lea     eax, [ebx + ctx_sha384512.hash]
438
        stdcall sha384512._.block, eax
439
        mov     ebx, [_ctx]
440
        lea     edi, [ebx + ctx_sha384512.block]
441
        mov     ecx, SHA384512_BLOCK_SIZE+1
442
  .last:
443
        dec     ecx
444
        sub     ecx, 16
445
        xor     eax, eax
446
        rep     stosb
447
        mov     eax, [ebx + ctx_sha384512.msglen_1]
448
        shld    [ebx + ctx_sha384512.msglen_0], eax, 3
449
        mov     eax, [ebx + ctx_sha384512.msglen_2]
450
        shld    [ebx + ctx_sha384512.msglen_1], eax, 3
451
        mov     eax, [ebx + ctx_sha384512.msglen_3]
452
        shld    [ebx + ctx_sha384512.msglen_2], eax, 3
453
        shl     eax, 3
454
        bswap   eax
455
        mov     dword[edi + 0], eax
456
        mov     eax, [ebx + ctx_sha384512.msglen_2]
457
        bswap   eax
458
        mov     dword[edi + 4], eax
459
        mov     eax, [ebx + ctx_sha384512.msglen_1]
460
        bswap   eax
461
        mov     dword[edi + 8], eax
462
        mov     eax, [ebx + ctx_sha384512.msglen_0]
463
        bswap   eax
464
        mov     dword[edi + 12], eax
465
        mov     ebx, [_ctx]
466
        lea     esi, [ebx + ctx_sha384512.block]
467
        lea     eax, [ebx + ctx_sha384512.hash]
468
        stdcall sha384512._.block, eax
469
 
470
        mov     ebx, [_ctx]
471
        lea     eax, [ebx + ctx_sha384512.hash]
472
        stdcall sha384512._.postprocess, ebx, eax
473
 
474
        ret
475
endp
476
 
477
 
478
proc sha384512._.postprocess _ctx, _hash
479
        mov     ecx, 8
480
        mov     esi, [_hash]
481
        mov     edi, esi
482
    @@:
483
        lodsd
484
        mov     ebx, eax
485
        lodsd
486
        bswap   eax
487
        bswap   ebx
488
        stosd
489
        mov     eax, ebx
490
        stosd
491
        dec     ecx     ; FIXME: what should I fix here?
492
        jnz     @b
493
        emms
494
        ret
495
endp
496
 
497
 
498
proc sha384.oneshot _ctx, _data, _len
499
	stdcall	sha384.init, [_ctx]
500
	stdcall	sha384.update, [_ctx], [_data], [_len]
501
	stdcall	sha384.final, [_ctx]
502
	ret
503
endp
504
 
505
 
506
proc sha512.oneshot _ctx, _data, _len
507
	stdcall	sha512.init, [_ctx]
508
	stdcall	sha512.update, [_ctx], [_data], [_len]
509
	stdcall	sha512.final, [_ctx]
510
	ret
511
endp
512
 
513
 
514
iglobal
515
align SHA384512_ALIGN
516
sha384._.hash_init      dq 0xcbbb9d5dc1059ed8, 0x629a292a367cd507,\
517
                           0x9159015a3070dd17, 0x152fecd8f70e5939,\
518
                           0x67332667ffc00b31, 0x8eb44a8768581511,\
519
                           0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
520
 
521
sha512._.hash_init      dq 0x6a09e667f3bcc908, 0xbb67ae8584caa73b,\
522
                           0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
523
                           0x510e527fade682d1, 0x9b05688c2b3e6c1f,\
524
                           0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
525
 
526
sha384512._.table       dq 0x428a2f98d728ae22, 0x7137449123ef65cd,\
527
                           0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
528
                           0x3956c25bf348b538, 0x59f111f1b605d019,\
529
                           0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
530
                           0xd807aa98a3030242, 0x12835b0145706fbe,\
531
                           0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
532
                           0x72be5d74f27b896f, 0x80deb1fe3b1696b1,\
533
                           0x9bdc06a725c71235, 0xc19bf174cf692694,\
534
                           0xe49b69c19ef14ad2, 0xefbe4786384f25e3,\
535
                           0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
536
                           0x2de92c6f592b0275, 0x4a7484aa6ea6e483,\
537
                           0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
538
                           0x983e5152ee66dfab, 0xa831c66d2db43210,\
539
                           0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
540
                           0xc6e00bf33da88fc2, 0xd5a79147930aa725,\
541
                           0x06ca6351e003826f, 0x142929670a0e6e70,\
542
                           0x27b70a8546d22ffc, 0x2e1b21385c26c926,\
543
                           0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
544
                           0x650a73548baf63de, 0x766a0abb3c77b2a8,\
545
                           0x81c2c92e47edaee6, 0x92722c851482353b,\
546
                           0xa2bfe8a14cf10364, 0xa81a664bbc423001,\
547
                           0xc24b8b70d0f89791, 0xc76c51a30654be30,\
548
                           0xd192e819d6ef5218, 0xd69906245565a910,\
549
                           0xf40e35855771202a, 0x106aa07032bbd1b8,\
550
                           0x19a4c116b8d2d0c8, 0x1e376c085141ab53,\
551
                           0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
552
                           0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,\
553
                           0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
554
                           0x748f82ee5defb2fc, 0x78a5636f43172f60,\
555
                           0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
556
                           0x90befffa23631e28, 0xa4506cebde82bde9,\
557
                           0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
558
                           0xca273eceea26619c, 0xd186b8c721c0c207,\
559
                           0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
560
                           0x06f067aa72176fba, 0x0a637dc5a2c898a6,\
561
                           0x113f9804bef90dae, 0x1b710b35131c471b,\
562
                           0x28db77f523047d84, 0x32caab7b40c72493,\
563
                           0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
564
                           0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,\
565
                           0x5fcb6fab3ad6faec, 0x6c44198c4a475817
566
endg