201
149
&add($f,$e); # f+=ROTATE(a,5)
211
local($name, $sclabel)=@_;
213
&function_begin_B($name,"");
215
# parameter 1 is the MD5_CTX structure.
222
&mov("ecx", &wparam(2));
225
&mov("esi", &wparam(1));
227
&add("ecx","esi"); # offset to leave on
229
&mov("ebp", &wparam(0));
231
&mov($D, &DWP(12,"ebp","",0));
233
&mov($E, &DWP(16,"ebp","",0));
234
&mov($C, &DWP( 8,"ebp","",0));
235
&mov(&swtmp(17),"ecx");
237
&comment("First we need to setup the X array");
239
for ($i=0; $i<16; $i+=2)
152
&function_begin("sha1_block_data_order");
153
&mov($tmp1,&wparam(0)); # SHA_CTX *c
154
&mov($T,&wparam(1)); # const void *input
155
&mov($A,&wparam(2)); # size_t num
156
&stack_push(16); # allocate X[16]
159
&mov(&wparam(2),$A); # pointer beyond the end of input
160
&mov($E,&DWP(16,$tmp1));# pre-load E
162
&set_label("loop",16);
164
# copy input chunk to X, but reversing byte order!
165
for ($i=0; $i<16; $i+=4)
241
&mov($A,&DWP(($i+0)*4,"esi","",0));# unless $i == 0;
242
&mov($B,&DWP(($i+1)*4,"esi","",0));
167
&mov($A,&DWP(4*($i+0),$T));
168
&mov($B,&DWP(4*($i+1),$T));
169
&mov($C,&DWP(4*($i+2),$T));
170
&mov($D,&DWP(4*($i+3),$T));
243
175
&mov(&swtmp($i+0),$A);
244
&mov(&swtmp($i+1),$B);
176
&mov(&swtmp($i+1),$B);
177
&mov(&swtmp($i+2),$C);
178
&mov(&swtmp($i+3),$D);
247
&function_end_B($name);
255
&function_begin_B($name,"");
257
# parameter 1 is the MD5_CTX structure.
264
&mov("ecx", &wparam(2));
267
&mov("esi", &wparam(1));
269
&add("ecx","esi"); # offset to leave on
271
&mov("ebp", &wparam(0));
273
&mov($D, &DWP(12,"ebp","",0));
275
&mov($E, &DWP(16,"ebp","",0));
276
&mov($C, &DWP( 8,"ebp","",0));
277
&mov(&swtmp(17),"ecx");
279
&comment("First we need to setup the X array");
281
&set_label("start") unless $normal;
284
&mov(&wparam(1),"esi");
286
&set_label("shortcut", 0, 1);
288
&comment("Start processing");
291
&mov($A, &DWP( 0,"ebp","",0));
292
&mov($B, &DWP( 4,"ebp","",0));
294
&BODY_00_15(-2,$K[0],$X, 0,$A,$B,$C,$D,$E,$T);
295
&BODY_00_15( 0,$K[0],$X, 1,$T,$A,$B,$C,$D,$E);
296
&BODY_00_15( 0,$K[0],$X, 2,$E,$T,$A,$B,$C,$D);
297
&BODY_00_15( 0,$K[0],$X, 3,$D,$E,$T,$A,$B,$C);
298
&BODY_00_15( 0,$K[0],$X, 4,$C,$D,$E,$T,$A,$B);
299
&BODY_00_15( 0,$K[0],$X, 5,$B,$C,$D,$E,$T,$A);
300
&BODY_00_15( 0,$K[0],$X, 6,$A,$B,$C,$D,$E,$T);
301
&BODY_00_15( 0,$K[0],$X, 7,$T,$A,$B,$C,$D,$E);
302
&BODY_00_15( 0,$K[0],$X, 8,$E,$T,$A,$B,$C,$D);
303
&BODY_00_15( 0,$K[0],$X, 9,$D,$E,$T,$A,$B,$C);
304
&BODY_00_15( 0,$K[0],$X,10,$C,$D,$E,$T,$A,$B);
305
&BODY_00_15( 0,$K[0],$X,11,$B,$C,$D,$E,$T,$A);
306
&BODY_00_15( 0,$K[0],$X,12,$A,$B,$C,$D,$E,$T);
307
&BODY_00_15( 0,$K[0],$X,13,$T,$A,$B,$C,$D,$E);
308
&BODY_00_15( 0,$K[0],$X,14,$E,$T,$A,$B,$C,$D);
309
&BODY_00_15( 1,$K[0],$X,15,$D,$E,$T,$A,$B,$C);
310
&BODY_16_19(-1,$K[0],$X,16,$C,$D,$E,$T,$A,$B);
311
&BODY_16_19( 0,$K[0],$X,17,$B,$C,$D,$E,$T,$A);
312
&BODY_16_19( 0,$K[0],$X,18,$A,$B,$C,$D,$E,$T);
313
&BODY_16_19( 1,$K[0],$X,19,$T,$A,$B,$C,$D,$E);
315
&BODY_20_39(-1,$K[1],$X,20,$E,$T,$A,$B,$C,$D);
316
&BODY_20_39( 0,$K[1],$X,21,$D,$E,$T,$A,$B,$C);
317
&BODY_20_39( 0,$K[1],$X,22,$C,$D,$E,$T,$A,$B);
318
&BODY_20_39( 0,$K[1],$X,23,$B,$C,$D,$E,$T,$A);
319
&BODY_20_39( 0,$K[1],$X,24,$A,$B,$C,$D,$E,$T);
320
&BODY_20_39( 0,$K[1],$X,25,$T,$A,$B,$C,$D,$E);
321
&BODY_20_39( 0,$K[1],$X,26,$E,$T,$A,$B,$C,$D);
322
&BODY_20_39( 0,$K[1],$X,27,$D,$E,$T,$A,$B,$C);
323
&BODY_20_39( 0,$K[1],$X,28,$C,$D,$E,$T,$A,$B);
324
&BODY_20_39( 0,$K[1],$X,29,$B,$C,$D,$E,$T,$A);
325
&BODY_20_39( 0,$K[1],$X,30,$A,$B,$C,$D,$E,$T);
326
&BODY_20_39( 0,$K[1],$X,31,$T,$A,$B,$C,$D,$E);
327
&BODY_20_39( 0,$K[1],$X,32,$E,$T,$A,$B,$C,$D);
328
&BODY_20_39( 0,$K[1],$X,33,$D,$E,$T,$A,$B,$C);
329
&BODY_20_39( 0,$K[1],$X,34,$C,$D,$E,$T,$A,$B);
330
&BODY_20_39( 0,$K[1],$X,35,$B,$C,$D,$E,$T,$A);
331
&BODY_20_39( 0,$K[1],$X,36,$A,$B,$C,$D,$E,$T);
332
&BODY_20_39( 0,$K[1],$X,37,$T,$A,$B,$C,$D,$E);
333
&BODY_20_39( 0,$K[1],$X,38,$E,$T,$A,$B,$C,$D);
334
&BODY_20_39( 1,$K[1],$X,39,$D,$E,$T,$A,$B,$C);
336
&BODY_40_59(-1,$K[2],$X,40,$C,$D,$E,$T,$A,$B);
337
&BODY_40_59( 0,$K[2],$X,41,$B,$C,$D,$E,$T,$A);
338
&BODY_40_59( 0,$K[2],$X,42,$A,$B,$C,$D,$E,$T);
339
&BODY_40_59( 0,$K[2],$X,43,$T,$A,$B,$C,$D,$E);
340
&BODY_40_59( 0,$K[2],$X,44,$E,$T,$A,$B,$C,$D);
341
&BODY_40_59( 0,$K[2],$X,45,$D,$E,$T,$A,$B,$C);
342
&BODY_40_59( 0,$K[2],$X,46,$C,$D,$E,$T,$A,$B);
343
&BODY_40_59( 0,$K[2],$X,47,$B,$C,$D,$E,$T,$A);
344
&BODY_40_59( 0,$K[2],$X,48,$A,$B,$C,$D,$E,$T);
345
&BODY_40_59( 0,$K[2],$X,49,$T,$A,$B,$C,$D,$E);
346
&BODY_40_59( 0,$K[2],$X,50,$E,$T,$A,$B,$C,$D);
347
&BODY_40_59( 0,$K[2],$X,51,$D,$E,$T,$A,$B,$C);
348
&BODY_40_59( 0,$K[2],$X,52,$C,$D,$E,$T,$A,$B);
349
&BODY_40_59( 0,$K[2],$X,53,$B,$C,$D,$E,$T,$A);
350
&BODY_40_59( 0,$K[2],$X,54,$A,$B,$C,$D,$E,$T);
351
&BODY_40_59( 0,$K[2],$X,55,$T,$A,$B,$C,$D,$E);
352
&BODY_40_59( 0,$K[2],$X,56,$E,$T,$A,$B,$C,$D);
353
&BODY_40_59( 0,$K[2],$X,57,$D,$E,$T,$A,$B,$C);
354
&BODY_40_59( 0,$K[2],$X,58,$C,$D,$E,$T,$A,$B);
355
&BODY_40_59( 1,$K[2],$X,59,$B,$C,$D,$E,$T,$A);
357
&BODY_60_79(-1,$K[3],$X,60,$A,$B,$C,$D,$E,$T);
358
&BODY_60_79( 0,$K[3],$X,61,$T,$A,$B,$C,$D,$E);
359
&BODY_60_79( 0,$K[3],$X,62,$E,$T,$A,$B,$C,$D);
360
&BODY_60_79( 0,$K[3],$X,63,$D,$E,$T,$A,$B,$C);
361
&BODY_60_79( 0,$K[3],$X,64,$C,$D,$E,$T,$A,$B);
362
&BODY_60_79( 0,$K[3],$X,65,$B,$C,$D,$E,$T,$A);
363
&BODY_60_79( 0,$K[3],$X,66,$A,$B,$C,$D,$E,$T);
364
&BODY_60_79( 0,$K[3],$X,67,$T,$A,$B,$C,$D,$E);
365
&BODY_60_79( 0,$K[3],$X,68,$E,$T,$A,$B,$C,$D);
366
&BODY_60_79( 0,$K[3],$X,69,$D,$E,$T,$A,$B,$C);
367
&BODY_60_79( 0,$K[3],$X,70,$C,$D,$E,$T,$A,$B);
368
&BODY_60_79( 0,$K[3],$X,71,$B,$C,$D,$E,$T,$A);
369
&BODY_60_79( 0,$K[3],$X,72,$A,$B,$C,$D,$E,$T);
370
&BODY_60_79( 0,$K[3],$X,73,$T,$A,$B,$C,$D,$E);
371
&BODY_60_79( 0,$K[3],$X,74,$E,$T,$A,$B,$C,$D);
372
&BODY_60_79( 0,$K[3],$X,75,$D,$E,$T,$A,$B,$C);
373
&BODY_60_79( 0,$K[3],$X,76,$C,$D,$E,$T,$A,$B);
374
&BODY_60_79( 0,$K[3],$X,77,$B,$C,$D,$E,$T,$A);
375
&BODY_60_79( 0,$K[3],$X,78,$A,$B,$C,$D,$E,$T);
376
&BODY_60_79( 2,$K[3],$X,79,$T,$A,$B,$C,$D,$E);
378
&comment("End processing");
389
&mov($tmp1,&wparam(0));
391
&mov($D, &DWP(12,$tmp1,"",0));
393
&mov($B, &DWP( 4,$tmp1,"",0));
396
&mov($A, &DWP( 0,$tmp1,"",0));
397
&mov(&DWP(12,$tmp1,"",0),$D);
400
&mov($E, &DWP(16,$tmp1,"",0));
402
&mov($C, &DWP( 8,$tmp1,"",0));
405
&mov(&DWP( 0,$tmp1,"",0),$A);
406
&mov("esi",&wparam(1));
407
&mov(&DWP( 8,$tmp1,"",0),$C);
409
&mov("eax",&swtmp(17));
410
&mov(&DWP(16,$tmp1,"",0),$E);
412
&mov(&DWP( 4,$tmp1,"",0),$B);
413
&jb(&label("start"));
422
# keep a note of shortcut label so it can be used outside
424
my $sclabel = &label("shortcut");
426
&function_end_B($name);
427
# Putting this here avoids problems with MASM in debugging mode
428
&sha1_block_host("sha1_block_asm_host_order", $sclabel);
180
&mov(&wparam(1),$T); # redundant in 1st spin
182
&mov($A,&DWP(0,$tmp1)); # load SHA_CTX
183
&mov($B,&DWP(4,$tmp1));
184
&mov($C,&DWP(8,$tmp1));
185
&mov($D,&DWP(12,$tmp1));
188
for($i=0;$i<16;$i++) { &BODY_00_15($i,@V); unshift(@V,pop(@V)); }
189
for(;$i<20;$i++) { &BODY_16_19($i,@V); unshift(@V,pop(@V)); }
190
for(;$i<40;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
191
for(;$i<60;$i++) { &BODY_40_59($i,@V); unshift(@V,pop(@V)); }
192
for(;$i<80;$i++) { &BODY_20_39($i,@V); unshift(@V,pop(@V)); }
194
(($V[5] eq $D) and ($V[0] eq $E)) or die; # double-check
196
&mov($tmp1,&wparam(0)); # re-load SHA_CTX*
197
&mov($D,&wparam(1)); # D is last "T" and is discarded
199
&add($E,&DWP(0,$tmp1)); # E is last "A"...
200
&add($T,&DWP(4,$tmp1));
201
&add($A,&DWP(8,$tmp1));
202
&add($B,&DWP(12,$tmp1));
203
&add($C,&DWP(16,$tmp1));
205
&mov(&DWP(0,$tmp1),$E); # update SHA_CTX
206
&add($D,64); # advance input pointer
207
&mov(&DWP(4,$tmp1),$T);
208
&cmp($D,&wparam(2)); # have we reached the end yet?
209
&mov(&DWP(8,$tmp1),$A);
210
&mov($E,$C); # C is last "E" which needs to be "pre-loaded"
211
&mov(&DWP(12,$tmp1),$B);
212
&mov($T,$D); # input pointer
213
&mov(&DWP(16,$tmp1),$C);
217
&function_end("sha1_block_data_order");