Subversion Repositories Kolibri OS

Rev

Rev 3532 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3532 Rev 6461
Line 1... Line 1...
1
;    libcrash -- cryptographic hash functions
1
;    libcrash -- cryptographic hash functions
2
;
2
;
3
;    Copyright (C) 2012-2013 Ivan Baravy (dunkaist)
3
;    Copyright (C) 2012-2014,2016 Ivan Baravy (dunkaist)
4
;
4
;
5
;    This program is free software: you can redistribute it and/or modify
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
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
7
;    the Free Software Foundation, either version 3 of the License, or
8
;    (at your option) any later version.
8
;    (at your option) any later version.
Line 26... Line 26...
26
;include '../../../../debug.inc'
26
;include '../../../../debug.inc'
Line 27... Line 27...
27
 
27
 
28
purge section,mov,add,sub
28
purge section,mov,add,sub
Line 29... Line -...
29
section '.flat' code readable align 16
-
 
30
 
29
section '.flat' code readable align 16
-
 
30
 
31
 
31
include 'libcrash.inc'
32
include 'libcrash.inc'
32
include 'crc32.asm'
33
include 'md4.asm'
33
include 'md4.asm'
34
include 'md5.asm'
34
include 'md5.asm'
35
include 'sha1.asm'
35
include 'sha1.asm'
Line 41... Line 41...
41
proc lib_init
41
proc lib_init
42
	ret
42
	ret
43
endp
43
endp
Line 44... Line 44...
44
 
44
 
45
 
45
 
46
proc crash.hash  _hid, _hash, _data, _len, _callback, _msglen
46
proc crash.hash  _hid, _data, _callback, _ctx
47
locals
-
 
48
	hash_func	rd	1
-
 
49
	final		rd	1
47
locals
-
 
48
        size dd ?
50
	hi		rd	1
49
endl
51
endl
50
        mov     [size], 0
52
	mov	eax, [_hid]
51
        mov     eax, [_hid]
53
	imul	eax, sizeof.crash_item
52
        imul    eax, sizeof.crash_item
Line 54... Line -...
54
	lea	eax, [crash._.table + eax]
-
 
55
	mov	[hi], eax
-
 
56
 
53
        lea     edx, [crash._.table + eax]
57
	mov	eax, [hi]
-
 
58
	mov	edx, [eax + crash_item.function]
-
 
59
	mov	esi, [eax + crash_item.init_val]
-
 
60
	mov	edi, [_hash]
-
 
61
	mov	[hash_func], edx
-
 
62
	mov	ecx, [hi]
-
 
63
	mov	ecx, [ecx + crash_item.len_in]
-
 
64
	rep	movsd
-
 
65
 
-
 
66
	mov	[final], 0
-
 
67
  .first:
-
 
68
	mov	eax, [_msglen]
-
 
69
	mov	ecx, [_len]
-
 
70
	add	[eax], ecx
-
 
71
	mov	esi, [_data]
-
 
72
	test	ecx, ecx
-
 
73
	jz	.callback
-
 
74
  .begin:
-
 
75
	mov	eax, [hi]
-
 
76
	mov	eax, [eax + crash_item.len_blk]
-
 
77
	sub	[_len], eax
-
 
78
	jnc	@f
-
 
79
	add	[_len], eax
-
 
80
	jmp	.endofblock
-
 
81
    @@:
-
 
82
	stdcall	[hash_func], [_hash], [_data]
-
 
83
	jmp	.begin
-
 
84
  .endofblock:
-
 
85
	cmp	[final], 1
-
 
86
	je	.quit
-
 
87
 
-
 
88
  .callback:
-
 
89
	mov	edi, [_data]
-
 
90
	mov	ecx, [_len]
-
 
91
	rep	movsb
-
 
92
	push	esi edi
-
 
93
	stdcall	[_callback], [_len]
-
 
94
	pop	edi esi
-
 
95
	test	eax, eax
-
 
96
	jz	@f
-
 
97
	mov	edx, [_msglen]
-
 
98
	mov	ecx, [_len]
-
 
99
	sub	[edx], ecx
-
 
100
	add	[_len], eax
-
 
101
	jmp	.first
-
 
102
    @@:
-
 
103
 
-
 
104
	mov	eax, [_msglen]
-
 
105
	mov	eax, [eax]
-
 
106
	xor	edx, edx
-
 
107
	mov	ecx, [hi]
-
 
108
	mov	ecx, [ecx + crash_item.len_blk]
-
 
109
	div	ecx
-
 
110
	mov	eax, edx
-
 
111
	mov	edx, [hi]
-
 
112
	mov	ecx, [edx + crash_item.len_blk]
-
 
113
	sub	ecx, [edx + crash_item.len_size]
-
 
114
	sub	ecx, eax
-
 
115
	ja	@f
-
 
Line -... Line 54...
-
 
54
        mov     ebx, [_ctx]
-
 
55
 
-
 
56
        stdcall [edx + crash_item.init], [_ctx]
116
	add	ecx, [edx + crash_item.len_blk]
57
 
-
 
58
  .hash:
117
    @@:
59
        mov     esi, [_data]
Line 118... Line 60...
118
	add	[_len], ecx
60
        push    edx
-
 
61
        stdcall [edx + crash_item.update], [_ctx], [_data], [size]
-
 
62
        mov     [size], 0
-
 
63
        pop     edx
119
 
64
 
-
 
65
        mov     eax, [_callback]
-
 
66
        test    eax, eax
-
 
67
        jz      .quit
-
 
68
        push    edx
Line 120... Line 69...
120
	mov	eax, [edx + crash_item.len_size]
69
        stdcall [_callback], [size]
121
	add	[_len], eax
-
 
122
 
70
        pop     edx
123
	mov	eax, [hi]
-
 
124
	stdcall	[eax + crash_item.finalproc], [hi], [_msglen]
-
 
125
 
-
 
126
	mov	[final], 1
-
 
127
	jmp	.first
-
 
128
  .quit:
-
 
129
	mov	eax, [hi]
-
 
130
	stdcall [eax + crash_item.postproc], [eax + crash_item.len_out], [_hash]
-
 
131
	ret
-
 
132
endp
-
 
133
 
-
 
134
 
-
 
135
crash._.md4_finalproc:
-
 
136
proc crash._.md5_finalproc _hi, _msglen
-
 
137
	mov	byte[edi], 0x80
-
 
138
	add	edi, 1
-
 
139
	sub	ecx, 1
-
 
140
	mov	al, 0
-
 
141
	rep	stosb
-
 
142
	push	ecx
-
 
143
	xor	eax, eax
-
 
144
	mov	ecx, [_hi]
-
 
145
	mov	ecx, [ecx + crash_item.len_size]
-
 
146
	sub	ecx, 8			; FIXME for > 2^64 input length
-
 
147
	shr	ecx, 2
-
 
148
	rep	stosd
-
 
149
	pop	ecx
-
 
150
	mov	eax, [_msglen]
-
 
151
	mov	eax, [eax]
-
 
152
	mov	edx, 8
-
 
153
	mul	edx
-
 
154
	mov	ecx, [_hi]
-
 
155
	mov	dword[edi], eax
-
 
156
	mov	dword[edi + 4], edx
-
 
157
	ret
-
 
158
endp
-
 
159
 
-
 
160
 
-
 
161
crash._.sha1_finalproc:
-
 
162
crash._.sha224_finalproc:
-
 
163
proc crash._.sha256_finalproc _hi, _msglen
-
 
164
	mov	byte[edi], 0x80
-
 
165
	add	edi, 1
-
 
166
	sub	ecx, 1
-
 
167
	mov	al, 0
-
 
168
	rep	stosb
-
 
169
	push	ecx
-
 
170
	xor	eax, eax
-
 
171
	mov	ecx, [_hi]
-
 
172
	mov	ecx, [ecx + crash_item.len_size]
-
 
173
	sub	ecx, 8			; FIXME for > 2^64 input length
-
 
174
	shr	ecx, 2
-
 
175
	rep	stosd
-
 
176
	pop	ecx
-
 
177
	mov	eax, [_msglen]
-
 
178
	mov	eax, [eax]
-
 
179
	mov	edx, 8
-
 
180
	mul	edx
-
 
181
	mov	ecx, [_hi]
-
 
182
	bswap	eax
-
 
183
	bswap	edx
-
 
184
	xchg	eax, edx
-
 
185
	mov	dword[edi], eax
-
 
186
	mov	dword[edi + 4], edx
-
 
187
 
-
 
188
	ret
-
 
189
endp
-
 
190
 
-
 
191
 
-
 
192
crash._.sha384_finalproc:
-
 
193
proc crash._.sha512_finalproc _hi, _msglen
-
 
194
	mov	byte[edi], 0x80
-
 
195
	add	edi, 1
-
 
196
	sub	ecx, 1
-
 
197
	mov	al, 0
-
 
198
	rep	stosb
-
 
199
	push	ecx
-
 
200
	xor	eax, eax
-
 
201
	mov	ecx, [_hi]
-
 
202
	mov	ecx, [ecx + crash_item.len_size]
-
 
203
	sub	ecx, 8			; FIXME for > 2^64 input length
-
 
204
	shr	ecx, 2
-
 
205
	rep	stosd
-
 
206
	pop	ecx
-
 
207
	mov	eax, [_msglen]
-
 
208
	mov	eax, [eax]
-
 
209
	mov	edx, 8
-
 
210
	mul	edx
-
 
211
	mov	ecx, [_hi]
-
 
212
	bswap	eax
71
        mov     [size], eax
213
	bswap	edx
72
        test    eax, eax
Line 214... Line -...
214
	xchg	eax, edx
-
 
215
	mov	dword[edi], eax
-
 
216
	mov	dword[edi + 4], edx
-
 
217
 
-
 
218
	ret
-
 
219
endp
-
 
220
 
-
 
221
 
-
 
222
crash._.sha3_224_finalproc:
-
 
223
crash._.sha3_256_finalproc:
-
 
224
crash._.sha3_384_finalproc:
-
 
225
proc crash._.sha3_512_finalproc _hi, _msglen
-
 
226
	mov	byte[edi], 0x01
-
 
227
	add	edi, 1
-
 
228
	sub	ecx, 1
-
 
229
	mov	eax, 0
-
 
230
	rep	stosb
-
 
231
	or	byte[edi - 1], 0x80
-
 
232
	ret
-
 
233
endp
-
 
234
 
-
 
235
 
-
 
236
crash._.md4_postprocess:
-
 
237
proc crash._.md5_postprocess _len_out, _hash
-
 
238
	ret
-
 
239
endp
-
 
240
 
-
 
241
 
-
 
242
crash._.sha1_postprocess:
-
 
243
crash._.sha224_postprocess:
-
 
244
proc crash._.sha256_postprocess _len_out, _hash
-
 
245
	mov	ecx, [_len_out]
-
 
246
	mov	esi, [_hash]
-
 
247
	mov	edi, esi
-
 
248
    @@:
-
 
249
	lodsd
-
 
250
	bswap	eax
-
 
251
	stosd
-
 
252
	dec	ecx
-
 
253
	jnz	@b
-
 
254
	ret
-
 
255
endp
-
 
256
 
-
 
257
 
-
 
258
crash._.sha384_postprocess:
-
 
259
proc crash._.sha512_postprocess _len_out, _hash
-
 
260
	mov	ecx, [_len_out]
-
 
261
	mov	esi, [_hash]
-
 
262
	mov	edi, esi
-
 
263
    @@:
-
 
264
	lodsd
-
 
265
	mov	ebx, eax
-
 
266
	lodsd
-
 
267
	bswap	eax
-
 
268
	bswap	ebx
-
 
269
	stosd
-
 
270
	mov	eax, ebx
-
 
271
	stosd
-
 
272
	dec	ecx
-
 
273
	jnz	@b
-
 
274
	emms
-
 
275
	ret
-
 
276
endp
-
 
277
 
-
 
278
 
-
 
279
crash._.sha3_224_postprocess:
-
 
280
crash._.sha3_256_postprocess:
73
        jnz     .hash
281
crash._.sha3_384_postprocess:
74
 
282
proc crash._.sha3_512_postprocess _len_out, _hash
75
        stdcall [edx + crash_item.final], [_ctx]
283
	emms
76
  .quit:
284
	ret
77
        ret
285
endp
78
endp
286
 
79
 
287
 
-
 
288
proc crash.bin2hex _bin, _hex, _hid	; FIXME _hid param?
80
 
289
	mov	eax, [_hid]
81
proc crash.bin2hex _bin, _hex, _hid
290
	imul	eax, sizeof.crash_item
82
        mov     eax, [_hid]
291
	mov	ecx, [crash._.table + eax + crash_item.len_out]
83
        imul    eax, sizeof.crash_item
292
	mov	ebx, crash._.bin2hex_table
84
        mov     ecx, [crash._.table + eax + crash_item.len_out]
Line 308... Line 100...
308
	stosb
100
        stosb
309
	ret
101
        ret
310
endp
102
endp
Line -... Line 103...
-
 
103
 
311
 
104
 
Line 312... Line -...
312
 
-
 
313
crash._.bin2hex_table	db	'0123456789abcdef'
-
 
314
 
-
 
315
; see crash_item struct for details
-
 
316
crash._.table		dd	crash.md4,	crash._.md4_init,      crash._.md4_finalproc,      crash._.md4_postprocess,       4,  4,  64,  8
-
 
317
			dd	crash.md5,	crash._.md5_init,      crash._.md5_finalproc,      crash._.md5_postprocess,       4,  4,  64,  8
-
 
318
			dd	crash.sha1,	crash._.sha1_init,     crash._.sha1_finalproc,     crash._.sha1_postprocess,      5,  5,  64,  8
-
 
319
			dd	crash.sha256,	crash._.sha224_init,   crash._.sha224_finalproc,   crash._.sha224_postprocess,    8,  7,  64,  8
-
 
320
			dd	crash.sha256,	crash._.sha256_init,   crash._.sha256_finalproc,   crash._.sha256_postprocess,    8,  8,  64,  8
-
 
321
			dd	crash.sha512,	crash._.sha384_init,   crash._.sha384_finalproc,   crash._.sha384_postprocess,   16, 12, 128, 16
-
 
322
			dd	crash.sha512,	crash._.sha512_init,   crash._.sha512_finalproc,   crash._.sha512_postprocess,   16, 16, 128, 16
-
 
323
			dd	crash.sha3_224,	crash._.sha3_224_init, crash._.sha3_224_finalproc, crash._.sha3_224_postprocess, 50,  7, 144,  0
-
 
324
			dd	crash.sha3_256,	crash._.sha3_256_init, crash._.sha3_256_finalproc, crash._.sha3_256_postprocess, 50,  8, 136,  0
-
 
325
			dd	crash.sha3_384,	crash._.sha3_384_init, crash._.sha3_384_finalproc, crash._.sha3_384_postprocess, 50, 12, 104,  0
-
 
326
			dd	crash.sha3_512,	crash._.sha3_512_init, crash._.sha3_512_finalproc, crash._.sha3_512_postprocess, 50, 16,  72,  0
105
section '.data' data readable align 16
327
 
106
crash._.bin2hex_table   db      '0123456789abcdef'
328
crash._.md4_init:
-
 
329
crash._.md5_init:
-
 
330
crash._.sha1_init	dd	0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
-
 
331
 
-
 
332
crash._.sha224_init	dd	0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
-
 
333
 
-
 
334
crash._.sha256_init	dd	0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
107
 
335
 
-
 
336
crash._.sha384_init	dq	0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,\
108
crash._.table   dd \
337
				0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
109
        crc32.init,   crc32.update,     crc32.final,     CRC32_HASH_SIZE,  \
338
 
-
 
339
crash._.sha512_init	dq	0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
-
 
340
				0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
-
 
341
 
-
 
342
crash._.sha3_512_init:
110
        md4.init,     md4.update,       md4.final,       MD4_HASH_SIZE,    \
343
crash._.sha3_384_init:
-
 
344
crash._.sha3_256_init:
-
 
345
crash._.sha3_224_init	dq	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
-
 
346
 
-
 
347
crash._.sha256_table	dd	0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\
-
 
348
				0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\
-
 
349
				0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\
-
 
350
				0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\
-
 
351
				0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\
-
 
352
				0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\
-
 
353
				0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\
-
 
354
				0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
111
        md5.init,     md5.update,       md5.final,       MD5_HASH_SIZE,    \
355
 
112
        sha1.init,    sha1.update,      sha1.final,      SHA1_HASH_SIZE,   \
356
crash._.sha512_table	dq	0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
-
 
357
				0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
-
 
358
				0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
-
 
359
				0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\
113
        sha224.init,  sha224256.update, sha224256.final, SHA224_HASH_SIZE, \
360
				0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
114
        sha256.init,  sha224256.update, sha224256.final, SHA256_HASH_SIZE, \
361
				0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\
-
 
362
				0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,\
-
 
363
				0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,\
-
 
364
				0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\
-
 
365
				0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,\
-
 
366
				0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,\
115
        sha384.init,  sha384512.update, sha384512.final, SHA384_HASH_SIZE, \
367
				0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\
-
 
368
				0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
116
        sha512.init,  sha384512.update, sha384512.final, SHA512_HASH_SIZE, \
369
				0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
-
 
370
				0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
117
        sha3224.init, sha3.update,      sha3.final,      SHA3224_HASH_SIZE,\
371
				0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,\
-
 
372
				0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\
-
 
373
				0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\
-
 
374
				0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\
-
 
375
				0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817
-
 
376
 
-
 
377
crash._.sha3_round	dq	0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000,\
-
 
378
				0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,\
-
 
379
				0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
-
 
380
				0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003,\
-
 
Line 381... Line 118...
381
				0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A,\
118
        sha3256.init, sha3.update,      sha3.final,      SHA3256_HASH_SIZE,\
382
				0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
119
        sha3384.init, sha3.update,      sha3.final,      SHA3384_HASH_SIZE,\
Line 383... Line 120...
383
 
120
        sha3512.init, sha3.update,      sha3.final,      SHA3512_HASH_SIZE