Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
3431 dunkaist 1
;    libcrash -- cryptographic hash functions
2
;
3
;    Copyright (C) 2012-2013 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
 
3115 dunkaist 18
format MS COFF
19
 
20
public @EXPORT as 'EXPORTS'
21
 
22
include '../../../../struct.inc'
23
include '../../../../proc32.inc'
24
include '../../../../macros.inc'
25
include '../../../../config.inc'
26
;include '../../../../debug.inc'
27
 
28
purge section,mov,add,sub
29
section '.flat' code readable align 16
30
 
3431 dunkaist 31
 
3115 dunkaist 32
include 'libcrash.inc'
33
include 'md4.asm'
34
include 'md5.asm'
35
include 'sha1.asm'
36
include 'sha224_256.asm'
37
include 'sha384_512.asm'
3532 dunkaist 38
include 'sha3.asm'
3115 dunkaist 39
 
40
 
41
proc lib_init
42
	ret
43
endp
44
 
45
 
3431 dunkaist 46
proc crash.hash  _hid, _hash, _data, _len, _callback, _msglen
3115 dunkaist 47
locals
48
	hash_func	rd	1
3431 dunkaist 49
	final		rd	1
50
	hi		rd	1
3115 dunkaist 51
endl
3431 dunkaist 52
	mov	eax, [_hid]
53
	imul	eax, sizeof.crash_item
54
	lea	eax, [crash._.table + eax]
55
	mov	[hi], eax
56
 
57
	mov	eax, [hi]
58
	mov	edx, [eax + crash_item.function]
59
	mov	esi, [eax + crash_item.init_val]
3115 dunkaist 60
	mov	edi, [_hash]
61
	mov	[hash_func], edx
3431 dunkaist 62
	mov	ecx, [hi]
63
	mov	ecx, [ecx + crash_item.len_in]
3115 dunkaist 64
	rep	movsd
65
 
3431 dunkaist 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
3115 dunkaist 87
 
3431 dunkaist 88
  .callback:
3532 dunkaist 89
	mov	edi, [_data]
90
	mov	ecx, [_len]
91
	rep	movsb
92
	push	esi edi
93
	stdcall	[_callback], [_len]
94
	pop	edi esi
3431 dunkaist 95
	test	eax, eax
96
	jz	@f
3532 dunkaist 97
	mov	edx, [_msglen]
98
	mov	ecx, [_len]
99
	sub	[edx], ecx
100
	add	[_len], eax
3431 dunkaist 101
	jmp	.first
102
    @@:
103
 
104
	mov	eax, [_msglen]
105
	mov	eax, [eax]
3532 dunkaist 106
	xor	edx, edx
107
	mov	ecx, [hi]
108
	mov	ecx, [ecx + crash_item.len_blk]
109
	div	ecx
110
	mov	eax, edx
3431 dunkaist 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
116
	add	ecx, [edx + crash_item.len_blk]
117
    @@:
118
	add	[_len], ecx
3532 dunkaist 119
 
120
	mov	eax, [edx + crash_item.len_size]
121
	add	[_len], eax
122
 
3431 dunkaist 123
	mov	eax, [hi]
3532 dunkaist 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
3431 dunkaist 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
3532 dunkaist 144
	mov	ecx, [_hi]
3431 dunkaist 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
3532 dunkaist 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]
3431 dunkaist 182
	bswap	eax
183
	bswap	edx
184
	xchg	eax, edx
185
	mov	dword[edi], eax
186
	mov	dword[edi + 4], edx
3532 dunkaist 187
 
3115 dunkaist 188
	ret
189
endp
190
 
191
 
3532 dunkaist 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
213
	bswap	edx
214
	xchg	eax, edx
215
	mov	dword[edi], eax
216
	mov	dword[edi + 4], edx
217
 
3431 dunkaist 218
	ret
219
endp
220
 
221
 
3532 dunkaist 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
3431 dunkaist 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
 
3532 dunkaist 258
crash._.sha384_postprocess:
259
proc crash._.sha512_postprocess _len_out, _hash
3431 dunkaist 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
 
3532 dunkaist 279
crash._.sha3_224_postprocess:
280
crash._.sha3_256_postprocess:
281
crash._.sha3_384_postprocess:
282
proc crash._.sha3_512_postprocess _len_out, _hash
283
	emms
284
	ret
285
endp
286
 
287
 
3431 dunkaist 288
proc crash.bin2hex _bin, _hex, _hid	; FIXME _hid param?
289
	mov	eax, [_hid]
290
	imul	eax, sizeof.crash_item
291
	mov	ecx, [crash._.table + eax + crash_item.len_out]
3115 dunkaist 292
	mov	ebx, crash._.bin2hex_table
293
	mov	esi, [_bin]
294
	mov	edi, [_hex]
3431 dunkaist 295
	shl	ecx, 2
296
  .next_byte:
297
	xor	eax, eax
3115 dunkaist 298
	lodsb
3431 dunkaist 299
	shl	eax, 4
300
	shr	al, 4
3115 dunkaist 301
	xlatb
302
	xchg	al, ah
303
	xlatb
304
	stosw
305
	dec	ecx
3431 dunkaist 306
	jnz	.next_byte
307
	xor	al, al
308
	stosb
3115 dunkaist 309
	ret
310
endp
311
 
312
 
313
crash._.bin2hex_table	db	'0123456789abcdef'
314
 
3431 dunkaist 315
; see crash_item struct for details
3532 dunkaist 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
3431 dunkaist 327
 
3115 dunkaist 328
crash._.md4_init:
329
crash._.md5_init:
330
crash._.sha1_init	dd	0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0
3431 dunkaist 331
 
3115 dunkaist 332
crash._.sha224_init	dd	0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
3431 dunkaist 333
 
3115 dunkaist 334
crash._.sha256_init	dd	0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19
3431 dunkaist 335
 
3115 dunkaist 336
crash._.sha384_init	dq	0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939,\
337
				0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4
3431 dunkaist 338
 
3115 dunkaist 339
crash._.sha512_init	dq	0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1,\
340
				0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179
341
 
3532 dunkaist 342
crash._.sha3_512_init:
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
 
3115 dunkaist 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
355
 
356
crash._.sha512_table	dq	0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\
357
				0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\
358
				0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\
359
				0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\
360
				0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\
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,\
367
				0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\
368
				0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\
369
				0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\
370
				0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\
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
 
3532 dunkaist 377
crash._.sha3_round	dq	0x0000000000000001, 0x0000000000008082, 0x800000000000808A, 0x8000000080008000,\
378
				0x000000000000808B, 0x0000000080000001, 0x8000000080008081, 0x8000000000008009,\
379
				0x000000000000008A, 0x0000000000000088, 0x0000000080008009, 0x000000008000000A,\
380
				0x000000008000808B, 0x800000000000008B, 0x8000000000008089, 0x8000000000008003,\
381
				0x8000000000008002, 0x8000000000000080, 0x000000000000800A, 0x800000008000000A,\
382
				0x8000000080008081, 0x8000000000008080, 0x0000000080000001, 0x8000000080008008
3431 dunkaist 383
 
3532 dunkaist 384
 
3115 dunkaist 385
align 4
386
@EXPORT:
387
 
388
export                                   \
389
    lib_init        , 'lib_init'       , \
390
    crash.hash      , 'crash_hash'     , \
391
    crash.bin2hex   , 'crash_bin2hex'
392