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
;
6461 dunkaist 3
;    Copyright (C) 2012-2013,2016 Ivan Baravy (dunkaist)
3431 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
 
6461 dunkaist 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
 
32
 
33
proc sha1._.f
34
        push    ebx ecx edx
35
        xor     ecx, edx
36
        and     ebx, ecx
37
        xor     ebx, edx
38
        mov     esi, ebx
39
        pop     edx ecx ebx
40
        ret
3115 dunkaist 41
endp
42
 
6461 dunkaist 43
proc sha1._.g
44
        push    ebx ecx edx
45
        xor     ebx, ecx
46
        xor     ebx, edx
47
        mov     esi, ebx
48
        pop     edx ecx ebx
49
        ret
3115 dunkaist 50
endp
51
 
6461 dunkaist 52
proc sha1._.h
53
        push    ebx ecx edx
54
        mov     esi, ebx
55
        and     ebx, ecx
56
        and     ecx, edx
57
        and     esi, edx
58
        or      ebx, ecx
59
        or      esi, ebx
60
        pop     edx ecx ebx
61
        ret
3115 dunkaist 62
endp
63
 
6461 dunkaist 64
macro sha1._.round f, k, c
3431 dunkaist 65
{
6461 dunkaist 66
        mov     esi, eax
67
        rol     esi, 5
68
        mov     [temp], esi
69
        call    f
3115 dunkaist 70
 
6461 dunkaist 71
        add     esi, edi
72
        add     [temp], esi
73
        mov     esi, [w + (c)*4]
74
        add     esi, k
75
        add     [temp], esi
3431 dunkaist 76
 
6461 dunkaist 77
        mov     edi, edx
78
        mov     edx, ecx
79
        mov     ecx, ebx
80
        rol     ecx, 30
81
        mov     ebx, eax
82
        mov     eax, [temp]
3431 dunkaist 83
}
84
 
85
 
6461 dunkaist 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
 
99
 
100
proc sha1._.block _hash
3115 dunkaist 101
locals
6461 dunkaist 102
        temp     rd 1
103
        w        rd 80
3115 dunkaist 104
endl
6461 dunkaist 105
        lea     edi, [w]
106
        xor     ecx, ecx
3115 dunkaist 107
    @@:
6461 dunkaist 108
        mov     eax, [esi]
109
        add     esi, 4
110
        bswap   eax
111
        mov     [edi], eax
112
        add     edi, 4
113
        add     ecx, 1
114
        cmp     ecx, 16
115
        jne     @b
3115 dunkaist 116
    @@:
6461 dunkaist 117
        mov     eax, [w + (ecx -  3)*4]
118
        xor     eax, [w + (ecx -  8)*4]
119
        xor     eax, [w + (ecx - 14)*4]
120
        xor     eax, [w + (ecx - 16)*4]
121
        rol     eax, 1
122
        mov     [w + ecx*4], eax
123
        add     ecx, 1
124
        cmp     ecx, 80
125
        jne     @b
3115 dunkaist 126
 
6461 dunkaist 127
        mov     edi, [_hash]
128
        mov     eax, [edi + 0x00]
129
        mov     ebx, [edi + 0x04]
130
        mov     ecx, [edi + 0x08]
131
        mov     edx, [edi + 0x0c]
132
        mov     edi, [edi + 0x10]
3115 dunkaist 133
 
6461 dunkaist 134
        push    esi
3115 dunkaist 135
 
3431 dunkaist 136
repeat 20
6461 dunkaist 137
        sha1._.round    sha1._.f, 0x5a827999, %-1
3431 dunkaist 138
end repeat
3115 dunkaist 139
 
3431 dunkaist 140
repeat 20
6461 dunkaist 141
        sha1._.round    sha1._.g, 0x6ed9eba1, %-1+20
3431 dunkaist 142
end repeat
3115 dunkaist 143
 
3431 dunkaist 144
repeat 20
6461 dunkaist 145
        sha1._.round    sha1._.h, 0x8f1bbcdc, %-1+40
3431 dunkaist 146
end repeat
3115 dunkaist 147
 
3431 dunkaist 148
repeat 20
6461 dunkaist 149
        sha1._.round    sha1._.g, 0xca62c1d6, %-1+60
3431 dunkaist 150
end repeat
3115 dunkaist 151
 
6461 dunkaist 152
        pop     esi
3115 dunkaist 153
 
6461 dunkaist 154
        mov     [temp], edi
155
        mov     edi, [_hash]
156
        add     [edi + 0x00], eax
157
        add     [edi + 0x04], ebx
158
        add     [edi + 0x08], ecx
159
        add     [edi + 0x0c], edx
160
        mov     eax, [temp]
161
        add     [edi + 0x10], eax
3115 dunkaist 162
 
6461 dunkaist 163
        ret
3115 dunkaist 164
endp
165
 
6461 dunkaist 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
287