Subversion Repositories Kolibri OS

Rev

Rev 3431 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3431 Rev 6461
1
;    libcrash -- cryptographic hash functions
1
;    libcrash -- cryptographic hash functions
2
;
2
;
3
;    Copyright (C) 2012-2013 Ivan Baravy (dunkaist)
3
;    Copyright (C) 2012-2013,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.
9
;
9
;
10
;    This program is distributed in the hope that it will be useful,
10
;    This program is distributed in the hope that it will be useful,
11
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
;    but WITHOUT ANY WARRANTY; without even the implied warranty of
12
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
;    GNU General Public License for more details.
13
;    GNU General Public License for more details.
14
;
14
;
15
;    You should have received a copy of the GNU General Public License
15
;    You should have received a copy of the GNU General Public License
16
;    along with this program.  If not, see .
16
;    along with this program.  If not, see .
-
 
17
 
-
 
18
 
-
 
19
SHA1_BLOCK_SIZE = 64
-
 
20
SHA1_HASH_SIZE  = 20
-
 
21
SHA1_ALIGN      = 4
-
 
22
SHA1_ALIGN_MASK = SHA1_ALIGN - 1
-
 
23
 
-
 
24
struct ctx_sha1
-
 
25
        hash            rb SHA1_HASH_SIZE
-
 
26
        block           rb SHA1_BLOCK_SIZE
-
 
27
        index           rd 1
-
 
28
        msglen_0        rd 1
-
 
29
        msglen_1        rd 1
-
 
30
ends
-
 
31
 
17
 
32
 
18
proc crash.sha1.f
33
proc sha1._.f
19
	push	ebx ecx edx
34
        push    ebx ecx edx
20
	xor	ecx, edx
35
        xor     ecx, edx
21
	and	ebx, ecx
36
        and     ebx, ecx
22
	xor	ebx, edx
37
        xor     ebx, edx
23
	mov	esi, ebx
38
        mov     esi, ebx
24
	pop	edx ecx ebx
39
        pop     edx ecx ebx
25
	ret
40
        ret
26
endp
41
endp
27
 
42
 
28
proc crash.sha1.g
43
proc sha1._.g
29
	push	ebx ecx edx
44
        push    ebx ecx edx
30
	xor	ebx, ecx
45
        xor     ebx, ecx
31
	xor	ebx, edx
46
        xor     ebx, edx
32
	mov	esi, ebx
47
        mov     esi, ebx
33
	pop	edx ecx ebx
48
        pop     edx ecx ebx
34
	ret
49
        ret
35
endp
50
endp
36
 
51
 
37
proc crash.sha1.h
52
proc sha1._.h
38
	push	ebx ecx edx
53
        push    ebx ecx edx
39
	mov	esi, ebx
54
        mov     esi, ebx
40
	and	ebx, ecx
55
        and     ebx, ecx
41
	and	ecx, edx
56
        and     ecx, edx
42
	and	esi, edx
57
        and     esi, edx
43
	or	ebx, ecx
58
        or      ebx, ecx
44
	or	esi, ebx
59
        or      esi, ebx
45
	pop	edx ecx ebx
60
        pop     edx ecx ebx
46
	ret
61
        ret
47
endp
62
endp
48
 
63
 
49
macro crash.sha1.round f, k, c
64
macro sha1._.round f, k, c
50
{
65
{
51
	mov	esi, eax
66
        mov     esi, eax
52
	rol	esi, 5
67
        rol     esi, 5
53
	mov	[temp], esi
68
        mov     [temp], esi
54
	call	f
69
        call    f
55
 
70
 
56
	add	esi, edi
71
        add     esi, edi
57
	add	[temp], esi
72
        add     [temp], esi
58
	mov	esi, [w + (c)*4]
73
        mov     esi, [w + (c)*4]
59
	add	esi, k
74
        add     esi, k
60
	add	[temp], esi
75
        add     [temp], esi
61
 
76
 
62
	mov	edi, edx
77
        mov     edi, edx
63
	mov	edx, ecx
78
        mov     edx, ecx
64
	mov	ecx, ebx
79
        mov     ecx, ebx
65
	rol	ecx, 30
80
        rol     ecx, 30
66
	mov	ebx, eax
81
        mov     ebx, eax
67
	mov	eax, [temp]
82
        mov     eax, [temp]
68
}
83
}
69
 
84
 
-
 
85
 
-
 
86
proc sha1.init _ctx
-
 
87
        mov     ebx, [_ctx]
-
 
88
        lea     edi, [ebx + ctx_sha1.hash]
-
 
89
        mov     esi, sha1._.hash_init
-
 
90
        mov     ecx, SHA1_HASH_SIZE/4
-
 
91
        rep     movsd
-
 
92
        xor     eax, eax
-
 
93
        mov     [ebx + ctx_sha1.index], eax
-
 
94
        mov     [ebx + ctx_sha1.msglen_0], eax
-
 
95
        mov     [ebx + ctx_sha1.msglen_1], eax
-
 
96
        ret
-
 
97
endp
-
 
98
 
70
 
99
 
71
proc crash.sha1 _sha1, _data
100
proc sha1._.block _hash
72
locals
101
locals
73
	temp	 rd 1
102
        temp     rd 1
74
	w	 rd 80
103
        w        rd 80
75
endl
104
endl
76
	lea	edi, [w]
105
        lea     edi, [w]
77
	xor	ecx, ecx
106
        xor     ecx, ecx
78
    @@:
107
    @@:
79
	mov	eax, [esi]
108
        mov     eax, [esi]
80
	add	esi, 4
109
        add     esi, 4
81
	bswap	eax
110
        bswap   eax
82
	mov	[edi], eax
111
        mov     [edi], eax
83
	add	edi, 4
112
        add     edi, 4
84
	add	ecx, 1
113
        add     ecx, 1
85
	cmp	ecx, 16
114
        cmp     ecx, 16
86
	jne	@b
115
        jne     @b
87
    @@:
116
    @@:
88
	mov	eax, [w + (ecx -  3)*4]
117
        mov     eax, [w + (ecx -  3)*4]
89
	xor	eax, [w + (ecx -  8)*4]
118
        xor     eax, [w + (ecx -  8)*4]
90
	xor	eax, [w + (ecx - 14)*4]
119
        xor     eax, [w + (ecx - 14)*4]
91
	xor	eax, [w + (ecx - 16)*4]
120
        xor     eax, [w + (ecx - 16)*4]
92
	rol	eax, 1
121
        rol     eax, 1
93
	mov	[w + ecx*4], eax
122
        mov     [w + ecx*4], eax
94
	add	ecx, 1
123
        add     ecx, 1
95
	cmp	ecx, 80
124
        cmp     ecx, 80
96
	jne	@b
125
        jne     @b
97
 
126
 
98
	mov	edi, [_sha1]
127
        mov     edi, [_hash]
99
	mov	eax, [edi + 0x00]
128
        mov     eax, [edi + 0x00]
100
	mov	ebx, [edi + 0x04]
129
        mov     ebx, [edi + 0x04]
101
	mov	ecx, [edi + 0x08]
130
        mov     ecx, [edi + 0x08]
102
	mov	edx, [edi + 0x0c]
131
        mov     edx, [edi + 0x0c]
103
	mov	edi, [edi + 0x10]
132
        mov     edi, [edi + 0x10]
104
 
133
 
105
	push	esi
134
        push    esi
106
 
135
 
107
repeat 20
136
repeat 20
108
	crash.sha1.round	crash.sha1.f, 0x5a827999, %-1
137
        sha1._.round    sha1._.f, 0x5a827999, %-1
109
end repeat
138
end repeat
110
 
139
 
111
repeat 20
140
repeat 20
112
	crash.sha1.round	crash.sha1.g, 0x6ed9eba1, %-1+20
141
        sha1._.round    sha1._.g, 0x6ed9eba1, %-1+20
113
end repeat
142
end repeat
114
 
143
 
115
repeat 20
144
repeat 20
116
	crash.sha1.round	crash.sha1.h, 0x8f1bbcdc, %-1+40
145
        sha1._.round    sha1._.h, 0x8f1bbcdc, %-1+40
117
end repeat
146
end repeat
118
 
147
 
119
repeat 20
148
repeat 20
120
	crash.sha1.round	crash.sha1.g, 0xca62c1d6, %-1+60
149
        sha1._.round    sha1._.g, 0xca62c1d6, %-1+60
121
end repeat
150
end repeat
122
 
151
 
123
	pop	esi
152
        pop     esi
124
 
153
 
125
	mov	[temp], edi
154
        mov     [temp], edi
126
	mov	edi, [_sha1]
155
        mov     edi, [_hash]
127
	add	[edi + 0x00], eax
156
        add     [edi + 0x00], eax
128
	add	[edi + 0x04], ebx
157
        add     [edi + 0x04], ebx
129
	add	[edi + 0x08], ecx
158
        add     [edi + 0x08], ecx
130
	add	[edi + 0x0c], edx
159
        add     [edi + 0x0c], edx
131
	mov	eax, [temp]
160
        mov     eax, [temp]
132
	add	[edi + 0x10], eax
161
        add     [edi + 0x10], eax
133
 
162
 
134
	ret
163
        ret
135
endp
164
endp
-
 
165
 
-
 
166
 
-
 
167
proc sha1.update _ctx, _msg, _size
-
 
168
        mov     ebx, [_ctx]
-
 
169
        mov     ecx, [_size]
-
 
170
        add     [ebx + ctx_sha1.msglen_0], ecx
-
 
171
        adc     [ebx + ctx_sha1.msglen_1], 0
-
 
172
 
-
 
173
  .next_block:
-
 
174
        mov     ebx, [_ctx]
-
 
175
        mov     esi, [_msg]
-
 
176
        mov     eax, [ebx + ctx_sha1.index]
-
 
177
        and     eax, SHA1_BLOCK_SIZE-1
-
 
178
        jnz     .copy_to_buf
-
 
179
        test    esi, SHA1_ALIGN_MASK
-
 
180
        jnz     .copy_to_buf
-
 
181
  .no_copy:
-
 
182
        ; data is aligned, hash it in place without copying
-
 
183
        mov     ebx, [_ctx]
-
 
184
        cmp     [_size], SHA1_BLOCK_SIZE
-
 
185
        jb      .copy_quit
-
 
186
        lea     eax, [ebx + ctx_sha1.hash]
-
 
187
        stdcall sha1._.block, eax
-
 
188
        sub     [_size], SHA1_BLOCK_SIZE
-
 
189
;        add     esi, SHA1_BLOCK_SIZE           ; FIXME
-
 
190
        jmp     .no_copy
-
 
191
 
-
 
192
  .copy_to_buf:
-
 
193
        lea     edi, [ebx + ctx_sha1.block]
-
 
194
        add     edi, eax
-
 
195
        mov     ecx, SHA1_BLOCK_SIZE
-
 
196
        sub     ecx, eax
-
 
197
        cmp     [_size], ecx
-
 
198
        jb      .copy_quit
-
 
199
        sub     [_size], ecx
-
 
200
        add     [_msg], ecx
-
 
201
        add     [ebx + ctx_sha1.index], ecx
-
 
202
        rep     movsb
-
 
203
        lea     eax, [ebx + ctx_sha1.hash]
-
 
204
        lea     esi, [ebx + ctx_sha1.block]
-
 
205
        stdcall sha1._.block, eax
-
 
206
        jmp     .next_block
-
 
207
 
-
 
208
  .copy_quit:
-
 
209
        mov     ebx, [_ctx]
-
 
210
        lea     edi, [ebx + ctx_sha1.block]
-
 
211
        mov     eax, [ebx + ctx_sha1.index]
-
 
212
        and     eax, SHA1_BLOCK_SIZE-1
-
 
213
        add     edi, eax
-
 
214
        mov     ecx, [_size]
-
 
215
        add     [ebx + ctx_sha1.index], ecx
-
 
216
        rep     movsb
-
 
217
  .quit:
-
 
218
 
-
 
219
        ret
-
 
220
endp
-
 
221
 
-
 
222
 
-
 
223
proc sha1.final _ctx
-
 
224
        mov     ebx, [_ctx]
-
 
225
        lea     edi, [ebx + ctx_sha1.block]
-
 
226
        mov     ecx, [ebx + ctx_sha1.msglen_0]
-
 
227
        and     ecx, SHA1_BLOCK_SIZE-1
-
 
228
        add     edi, ecx
-
 
229
        mov     byte[edi], 0x80
-
 
230
        inc     edi
-
 
231
        neg     ecx
-
 
232
        add     ecx, SHA1_BLOCK_SIZE
-
 
233
        cmp     ecx, 8
-
 
234
        ja      .last
-
 
235
 
-
 
236
        dec     ecx
-
 
237
        xor     eax, eax
-
 
238
        rep     stosb
-
 
239
        lea     esi, [ebx + ctx_sha1.block]
-
 
240
        lea     eax, [ebx + ctx_sha1.hash]
-
 
241
        stdcall sha1._.block, eax
-
 
242
        mov     ebx, [_ctx]
-
 
243
        lea     edi, [ebx + ctx_sha1.block]
-
 
244
        mov     ecx, SHA1_BLOCK_SIZE+1
-
 
245
  .last:
-
 
246
        dec     ecx
-
 
247
        sub     ecx, 8
-
 
248
        xor     eax, eax
-
 
249
        rep     stosb
-
 
250
        mov     eax, [ebx + ctx_sha1.msglen_0]
-
 
251
        mov     edx, [ebx + ctx_sha1.msglen_1]
-
 
252
        shld    edx, eax, 3
-
 
253
        shl     eax, 3
-
 
254
        bswap   eax
-
 
255
        bswap   edx
-
 
256
        mov     dword[edi], edx
-
 
257
        mov     dword[edi+4], eax
-
 
258
        lea     esi, [ebx + ctx_sha1.block]
-
 
259
        lea     eax, [ebx + ctx_sha1.hash]
-
 
260
        stdcall sha1._.block, eax
-
 
261
 
-
 
262
        mov     ebx, [_ctx]
-
 
263
        lea     eax, [ebx + ctx_sha1.hash]
-
 
264
        stdcall sha1._.postprocess, ebx, eax
-
 
265
 
-
 
266
        ret
-
 
267
endp
-
 
268
 
-
 
269
 
-
 
270
proc sha1._.postprocess _ctx, _hash
-
 
271
        mov     ecx, 5
-
 
272
        mov     esi, [_hash]
-
 
273
        mov     edi, esi
-
 
274
    @@:
-
 
275
        lodsd
-
 
276
        bswap   eax
-
 
277
        stosd
-
 
278
        dec     ecx
-
 
279
        jnz     @b
-
 
280
        ret
-
 
281
endp
-
 
282
 
-
 
283
 
-
 
284
align SHA1_ALIGN
-
 
285
 
-
 
286
sha1._.hash_init dd 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0