?login_element?

Subversion Repositories NedoOS

Rev

Rev 1861 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. CS_SYMLEN       equ     32 ;length of checksum in ascii: 32 for MD5
  3.  
  4.  
  5. CS_PREPARE:     ; precalculate tables
  6.  
  7.                 ;kills: everything
  8.  
  9.                 ret
  10.  
  11.  
  12.  
  13.  
  14. CS_START:       ;start/init calculation anew
  15.  
  16.                 ;kills: everything
  17.  
  18.                 xor     a
  19.                 ld      [phase],a
  20.  
  21.                 ld      hl,bitLEN
  22.                 ld      b,8
  23. .clrbitlen
  24.                 ld      [hl],a
  25.                 inc     hl
  26.                 djnz    .clrbitlen
  27.  
  28.                 ld      hl,initABCD
  29.                 ld      de,stA
  30.                 ld      bc,16
  31.                 ldir
  32.  
  33.                 ret
  34.  
  35.  
  36. CS_APPEND:      ;append chunk of data to calculation
  37.                 ;in: bc - size
  38.                 ;in: hl - ptr
  39.        
  40.                 ;kills: everything
  41.  
  42. .append_loop
  43.                 ld      a,b
  44.                 or      c
  45.                 ret     z
  46.  
  47.                 ld      a,[phase]
  48.                 cpl
  49.                 add     a,65    ;remaining place in msg buffer
  50.  
  51.                 inc     b
  52.                 dec     b
  53.                 jr      nz,.buf_size
  54.  
  55.                 ;bc = 00xx
  56.  
  57.                 cp      c
  58.                 jr      z,.buf_size
  59.                 jr      nc,.incoming_size
  60. .buf_size
  61.                 ;free size of msg buffer determines how many bytes to append
  62.  
  63.                 push    bc
  64.  
  65.                 ld      c,a
  66.                 ld      b,0
  67.                 ld      de,[phase]
  68.                 ld      d,msg/256
  69.  
  70.                 ldir
  71.  
  72.                 pop     bc
  73.  
  74.                 neg
  75.                 add     a,c
  76.                 ld      c,a
  77.                 ld      a,0xFF
  78.                 adc     a,b
  79.                 ld      b,a
  80.  
  81.                 push    hl
  82.                 push    bc
  83.  
  84.                 ld      hl,bitLEN+1
  85.                 ld      a,2     ;2*256=512=64*8
  86.                 add     a,[hl]
  87.                 ld      [hl],a
  88.                 jr      nc,.len_modified
  89. .propagate_carry
  90.                 inc     hl
  91.                 inc     [hl]
  92.                 jr      z,.propagate_carry
  93. .len_modified
  94.  
  95.                 call    MD5_COMPRESS
  96.  
  97.                 pop     bc
  98.                 pop     hl
  99.  
  100.                 xor     a
  101.                 ld      [phase],a
  102.  
  103.                 jr      .append_loop
  104.  
  105. .incoming_size
  106.                 ;size to append determined by BC(<64), guaranteed not to overflow buffer and not to leave it in full state
  107.  
  108.                 ld      a,[phase]
  109.                 ld      e,a
  110.                 add     a,c
  111.                 ld      [phase],a
  112.  
  113.                 ld      d,msg/256
  114.                 ldir
  115.  
  116.                 ret
  117.  
  118.  
  119. CS_FINALIZE:    ;finish calculation, generate asciiz string with checksum
  120.  
  121.                 ;in: HL - place of CS_SYMLEN+1 bytes to place asciiz string of checksum
  122.  
  123.                 ;kills: everything
  124.  
  125.                 push    hl
  126.  
  127.  
  128.                 ;update length
  129.                 ld      a,[phase]
  130.                 ld      b,0
  131.  
  132.                 add     a,a
  133.                 rl      b
  134.                 add     a,a
  135.                 rl      b
  136.                 add     a,a
  137.                 rl      b
  138.  
  139.                 ld      hl,bitLEN
  140.                 push    hl
  141.                 add     a,[hl]
  142.                 ld      [hl],a
  143.                 inc     hl
  144.                 ld      a,b
  145.                 adc     a,[hl]
  146.                 ld      [hl],a
  147.                 jr      nc,.len_updated
  148. .propagate_carry
  149.                 inc     hl
  150.                 inc     [hl]
  151.                 jr      z,.propagate_carry
  152. .len_updated
  153.  
  154.  
  155.  
  156.                 ld      h,msg/256
  157.                 ld      a,[phase]
  158.                 ld      l,a
  159.  
  160.                 ld      [hl],0x80
  161.                 inc     l
  162.  
  163.                 ld      a,64    ;must have at least 8 bytes after 0x01 appending to put length there
  164.                 sub     l
  165.                 sub     8
  166.                 jr      nc,.no_extra_block
  167.                 ;append extra block
  168.                 add     a,8
  169.                 jr      z,.no_append
  170. .append_zeros
  171.                 ld      [hl],0
  172.                 inc     l
  173.                 dec     a
  174.                 jr      nz,.append_zeros
  175. .no_append
  176.                 call    MD5_COMPRESS
  177.                 ld      hl,msg
  178.                 ld      a,64-8
  179.                 or      a
  180. .no_extra_block
  181.                 jr      z,.append_len
  182. .extra_zeros
  183.                 ld      [hl],0
  184.                 inc     l
  185.                 dec     a
  186.                 jr      nz,.extra_zeros
  187. .append_len
  188.                 pop     de      ;bitLEN
  189.                 exd
  190.                 ld      bc,8
  191.                 ldir
  192.  
  193.                 call    MD5_COMPRESS
  194.  
  195.  
  196.                 ;convert to HEX string
  197.                 pop     hl
  198.                 ld      de,stA
  199.  
  200.                 ld      b,16
  201. .convert
  202.                 call    hexconv
  203.                 djnz    .convert
  204.  
  205.                 ld      [hl],0
  206.  
  207.                 ret
  208.  
  209. hexconv
  210.         ld      a,[de]
  211.         rrca
  212.         rrca
  213.         rrca
  214.         rrca
  215.         call    .digit
  216.         ld      a,[de]
  217.         inc     de
  218. .digit
  219.         or      0xf0
  220.         daa
  221.         add     a,0xa0
  222.         adc     a,0x40
  223.         ld      [hl],a
  224.         inc     hl
  225.         ret
  226.  
  227.  
  228. initABCD:       dh      "01234567"
  229.                 dh      "89abcdef"
  230.                 dh      "fedcba98"
  231.                 dh      "76543210"
  232.  
  233.  
  234.  
  235. MD5_ROUND1      MACRO   A,B,C,D,key,const,shift
  236.  
  237.                 ;calc F = (B&C)|(~B&D) = D^((C^D)&B)
  238.  
  239.  
  240.                 ld      hl,[D]  ;16
  241.                 ld      de,[C]  ;20
  242.  
  243.                 ld      a,d
  244.                 xor     h
  245.                 ld      d,a
  246.                 ld      a,e
  247.                 xor     l
  248.                 ld      e,a
  249.                
  250.                 ld      hl,[D+2]        ;16
  251.                 ld      bc,[C+2]        ;20
  252.  
  253.                 ld      a,b
  254.                 xor     h
  255.                 ld      b,a
  256.                 ld      a,c
  257.                 xor     l
  258.                 ld      c,a
  259.  
  260.                 ;BCDE holds C^D
  261.  
  262.                 ld      hl,[B]  ;16
  263.  
  264.                 ld      a,d
  265.                 and     h
  266.                 ld      d,a
  267.                 ld      a,e
  268.                 and     l
  269.                 ld      e,a
  270.  
  271.                 ld      hl,[B+2]        ;16
  272.  
  273.                 ld      a,b
  274.                 and     h
  275.                 ld      b,a
  276.                 ld      a,c
  277.                 and     l
  278.                 ld      c,a
  279.  
  280.                 ;BCDE holds (C^D)&B
  281.  
  282.                 ld      hl,[D]  ;16
  283.  
  284.                 ld      a,d
  285.                 xor     h
  286.                 ld      d,a
  287.                 ld      a,e
  288.                 xor     l
  289.                 ld      e,a
  290.  
  291.                 ld      hl,[D+2]        ;16
  292.  
  293.                 ld      a,b
  294.                 xor     h
  295.                 ld      b,a
  296.                 ld      a,c
  297.                 xor     l
  298.                 ld      c,a
  299.  
  300.                 ;BCDE holds D^((C^D)&B) = result of F, 248tc
  301. ;       call    LOGBCDE
  302.  
  303.                 ; add key
  304.  
  305.                 ld      hl,[key]        ;16
  306.                 add     hl,de           ;11
  307.                 exd
  308.                 ld      hl,[key+2]      ;16
  309.                 adc     hl,bc           ;15
  310.  
  311.                 ;HLDE contains F + key[]
  312. ;       call    LOGHLDE
  313.  
  314.                 ; add constant
  315.  
  316.                 exd
  317.                 ld      bc,const&0xFFFF
  318.                 add     hl,bc   ;11
  319.                 exd
  320.                 ld      bc,const>>16
  321.                 adc     hl,bc   ;15
  322.  
  323.                 ;HLDE contains F + key[] + const
  324. ;       call    LOGHLDE
  325.  
  326.  
  327.                 ; add A
  328.  
  329.                 exd
  330.                 ld      bc,[A]  ;20
  331.                 add     hl,bc   ;11
  332.                 exd
  333.                 ld      bc,[A+2]        ;20
  334.                 adc     hl,bc           ;15
  335.  
  336.                 ;HLDE contains F + key[] + const + A, 190tc
  337. ;       call    LOGHLDE
  338.  
  339.  
  340.                  IF      shift==7
  341.                 ; ROL 7 = 8-1
  342.                 ld      a,e
  343.                 rra
  344.                 rr      h       ;8
  345.                 rr      l       ;8
  346.                 rr      d       ;8
  347.                 rr      e       ;8
  348.                 ld      a,h
  349.                 ld      h,l
  350.                 ld      l,d
  351.                 ld      d,e
  352.                 ld      e,a     ;60tc
  353.  
  354.                  ELSEIF  shift==12
  355.                 ; ROL 12 = 16-4
  356.                 exd     ;DEHL
  357.                 xor     a
  358.                 add     hl,hl
  359.                 rl      e
  360.                 rl      d
  361.                 rla
  362.                 add     hl,hl
  363.                 rl      e
  364.                 rl      d
  365.                 rla
  366.                 add     hl,hl
  367.                 rl      e
  368.                 rl      d
  369.                 rla
  370.                 add     hl,hl
  371.                 rl      e
  372.                 rl      d
  373.                 rla
  374.                 or      l
  375.                 ; ADEH -- ROR(!) 4, now rol/ror 16
  376.                 ; A->D, D->E, E->H, H->L
  377.                 ld      l,h
  378.                 ld      h,e
  379.                 ld      e,d
  380.                 ld      d,a
  381.  
  382.                  ELSEIF  shift==17
  383.                 ; ROL 17 = 16+1
  384.                 ld      a,h
  385.                 add     a,a
  386.                 rl      e
  387.                 rl      d
  388.                 adc     hl,hl
  389.                 exd
  390.  
  391.                  ELSEIF  shift==22
  392.                 ; ROL 22 = 24-2
  393.                 ld      a,e
  394.                 rra
  395.                 rr      h
  396.                 rr      l
  397.                 rr      d
  398.                 rr      e
  399.                 rra
  400.                 rr      h
  401.                 rr      l
  402.                 rr      d
  403.                 rr      e
  404.                 ;HLDE->EHLD
  405.                 ; E->H, H->L, L->D, D->E
  406.                 ld      a,e
  407.                 ld      e,d
  408.                 ld      d,l
  409.                 ld      l,h
  410.                 ld      h,a
  411.  
  412.                  ENDIF
  413.  
  414.                 ;HLDE is now properly rotated, now add B
  415. ;       call    LOGHLDE
  416.  
  417.                 exd     ;extra? ROL 17 also has EXD at the end
  418.                 ld      bc,[B]
  419.                 add     hl,bc
  420.                 ld      bc,[B+2]
  421.                 exd
  422.                 adc     hl,bc
  423.  
  424.                 ;HLDE is new A
  425. ;       call    LOGHLDE
  426.  
  427.                 ld      [A],de
  428.                 ld      [A+2],hl
  429.                
  430.                 ENDM
  431.  
  432. MD5_ROUND2      MACRO   A,B,C,D,key,const,shift
  433.  
  434.                 ;calc G = (D&B)|(~D&C) = C^((B^C)&D)
  435.  
  436.  
  437.                 ld      hl,[B]  ;16
  438.                 ld      de,[C]  ;20
  439.  
  440.                 ld      a,d
  441.                 xor     h
  442.                 ld      d,a
  443.                 ld      a,e
  444.                 xor     l
  445.                 ld      e,a
  446.                
  447.                 ld      hl,[B+2]        ;16
  448.                 ld      bc,[C+2]        ;20
  449.  
  450.                 ld      a,b
  451.                 xor     h
  452.                 ld      b,a
  453.                 ld      a,c
  454.                 xor     l
  455.                 ld      c,a
  456.  
  457.                 ;BCDE holds B^C
  458.  
  459.                 ld      hl,[D]  ;16
  460.  
  461.                 ld      a,d
  462.                 and     h
  463.                 ld      d,a
  464.                 ld      a,e
  465.                 and     l
  466.                 ld      e,a
  467.  
  468.                 ld      hl,[D+2]        ;16
  469.  
  470.                 ld      a,b
  471.                 and     h
  472.                 ld      b,a
  473.                 ld      a,c
  474.                 and     l
  475.                 ld      c,a
  476.  
  477.                 ;BCDE holds (B^C)&D
  478.  
  479.                 ld      hl,[C]  ;16
  480.  
  481.                 ld      a,d
  482.                 xor     h
  483.                 ld      d,a
  484.                 ld      a,e
  485.                 xor     l
  486.                 ld      e,a
  487.  
  488.                 ld      hl,[C+2]        ;16
  489.  
  490.                 ld      a,b
  491.                 xor     h
  492.                 ld      b,a
  493.                 ld      a,c
  494.                 xor     l
  495.                 ld      c,a
  496.  
  497.                 ;BCDE holds C^((B^C)&D) = result of F, 248tc
  498. ;       call    LOGBCDE
  499.  
  500.                 ; add key
  501.  
  502.                 ld      hl,[key]        ;16
  503.                 add     hl,de           ;11
  504.                 exd
  505.                 ld      hl,[key+2]      ;16
  506.                 adc     hl,bc           ;15
  507.  
  508.                 ;HLDE contains F + key[]
  509. ;       call    LOGHLDE
  510.  
  511.                 ; add constant
  512.  
  513.                 exd
  514.                 ld      bc,const&0xFFFF
  515.                 add     hl,bc   ;11
  516.                 exd
  517.                 ld      bc,const>>16
  518.                 adc     hl,bc   ;15
  519.  
  520.                 ;HLDE contains F + key[] + const
  521. ;       call    LOGHLDE
  522.  
  523.  
  524.                 ; add A
  525.  
  526.                 exd
  527.                 ld      bc,[A]  ;20
  528.                 add     hl,bc   ;11
  529.                 exd
  530.                 ld      bc,[A+2]        ;20
  531.                 adc     hl,bc           ;15
  532.  
  533.                 ;HLDE contains F + key[] + const + A, 190tc
  534. ;       call    LOGHLDE
  535.  
  536.  
  537.                  IF      shift==5
  538.                 ; ROL 5
  539.                 ld      a,h
  540.                  DUP     5
  541.                 add     a,a
  542.                 rl      e
  543.                 rl      d
  544.                 adc     hl,hl
  545.                  EDUP
  546.  
  547.                  ELSEIF  shift==9
  548.                 ; ROL 9 = 8+1
  549.                 ld      a,h
  550.                 add     a,a
  551.                 rl      e
  552.                 rl      d
  553.                 adc     hl,hl
  554.                 ld      a,h
  555.                 ld      h,l
  556.                 ld      l,d
  557.                 ld      d,e
  558.                 ld      e,a
  559.  
  560.                  ELSEIF  shift==14
  561.                 ; ROL 14 = 16-2
  562.                 ld      a,e
  563.                  DUP     2
  564.                 rra
  565.                 rr      h
  566.                 rr      l
  567.                 rr      d
  568.                 rr      e
  569.                  EDUP
  570.                 exd
  571.  
  572.                  ELSEIF  shift==20
  573.                 ; ROL 20 = 16+4
  574.                 ld      a,h
  575.                  DUP     4
  576.                 add     a,a
  577.                 rl      e
  578.                 rl      d
  579.                 adc     hl,hl
  580.                  EDUP
  581.                 exd
  582.  
  583.                  ENDIF
  584.  
  585.                 ;HLDE is now properly rotated, now add B
  586. ;       call    LOGHLDE
  587.  
  588.                 exd ; shift==20 has extra EXD ?
  589.                 ld      bc,[B]
  590.                 add     hl,bc
  591.                 ld      bc,[B+2]
  592.                 exd
  593.                 adc     hl,bc
  594.  
  595.                 ;HLDE is new A
  596. ;       call    LOGHLDE
  597.  
  598.                 ld      [A],de
  599.                 ld      [A+2],hl
  600.                
  601.                 ENDM
  602.  
  603. MD5_ROUND3      MACRO   A,B,C,D,key,const,shift
  604.  
  605.                 ;calc H = B^C^D
  606.  
  607.                 ld      de,[B]
  608.                 ld      bc,[C]
  609.                 ld      hl,[D]
  610.                 ld      a,d
  611.                 xor     b
  612.                 xor     h
  613.                 ld      d,a
  614.                 ld      a,e
  615.                 xor     c
  616.                 xor     l
  617.                 ld      e,a
  618.  
  619.                 ld      bc,[B+2]
  620.                 ld      hl,[C+2]
  621.                 ld      a,b
  622.                 xor     h
  623.                 ld      b,a
  624.                 ld      a,c
  625.                 xor     l
  626.                 ld      hl,[D+2]
  627.                 xor     l
  628.                 ld      c,a
  629.                 ld      a,b
  630.                 xor     h
  631.                 ld      b,a
  632.  
  633.                 ;BCDE holds B^C^D
  634. ;       call    LOGBCDE
  635.  
  636.                 ; add key
  637.  
  638.                 ld      hl,[key]        ;16
  639.                 add     hl,de           ;11
  640.                 exd
  641.                 ld      hl,[key+2]      ;16
  642.                 adc     hl,bc           ;15
  643.  
  644.                 ;HLDE contains F + key[]
  645. ;       call    LOGHLDE
  646.  
  647.                 ; add constant
  648.  
  649.                 exd
  650.                 ld      bc,const&0xFFFF
  651.                 add     hl,bc   ;11
  652.                 exd
  653.                 ld      bc,const>>16
  654.                 adc     hl,bc   ;15
  655.  
  656.                 ;HLDE contains F + key[] + const
  657. ;       call    LOGHLDE
  658.  
  659.  
  660.                 ; add A
  661.  
  662.                 exd
  663.                 ld      bc,[A]  ;20
  664.                 add     hl,bc   ;11
  665.                 exd
  666.                 ld      bc,[A+2]        ;20
  667.                 adc     hl,bc           ;15
  668.  
  669.                 ;HLDE contains F + key[] + const + A, 190tc
  670. ;       call    LOGHLDE
  671.  
  672.  
  673.                  IF      shift==4
  674.                 ; ROL 4
  675.                 ld      a,h
  676.                  DUP     4
  677.                 add     a,a
  678.                 rl      e
  679.                 rl      d
  680.                 adc     hl,hl
  681.                  EDUP
  682.  
  683.                  ELSEIF  shift==11
  684.                 ; ROL 11 = 3 + 8
  685.                 ld      a,h
  686.                  DUP     3
  687.                 add     a,a
  688.                 rl      e
  689.                 rl      d
  690.                 adc     hl,hl
  691.                  EDUP
  692.                 ld      a,h
  693.                 ld      h,l
  694.                 ld      l,d
  695.                 ld      d,e
  696.                 ld      e,a
  697.  
  698.                  ELSEIF  shift==16
  699.                 ; ROL 16
  700.                 exd
  701.  
  702.                  ELSEIF  shift==23
  703.                 ; ROL 23 = 24 - 1
  704.                 ld      a,e
  705.                 rra
  706.                 rr      h
  707.                 rr      l
  708.                 rr      d
  709.                 rr      e
  710.                 ld      a,e
  711.                 ld      e,d
  712.                 ld      d,l
  713.                 ld      l,h
  714.                 ld      h,a
  715.  
  716.                  ENDIF
  717.  
  718.                 ;HLDE is now properly rotated, now add B
  719. ;       call    LOGHLDE
  720.  
  721.                 exd ; shift==20 has extra EXD ?
  722.                 ld      bc,[B]
  723.                 add     hl,bc
  724.                 ld      bc,[B+2]
  725.                 exd
  726.                 adc     hl,bc
  727.  
  728.                 ;HLDE is new A
  729. ;       call    LOGHLDE
  730.  
  731.                 ld      [A],de
  732.                 ld      [A+2],hl
  733.                
  734.                 ENDM
  735.  
  736. MD5_ROUND4      MACRO   A,B,C,D,key,const,shift
  737.  
  738.                 ;calc I = C ^ (B | (~D))
  739.  
  740.                 ld      de,[C]
  741.                 ld      bc,[B]
  742.                 ld      hl,[D]
  743.                 ld      a,h
  744.                 cpl
  745.                 or      b
  746.                 xor     d
  747.                 ld      d,a
  748.                 ld      a,l
  749.                 cpl
  750.                 or      c
  751.                 xor     e
  752.                 ld      e,a
  753.  
  754.                 ld      bc,[B+2]
  755.                 ld      hl,[D+2]
  756.                 ld      a,h
  757.                 cpl
  758.                 or      b
  759.                 ld      b,a
  760.                 ld      a,l
  761.                 cpl
  762.                 or      c
  763.                 ld      hl,[C+2]
  764.                 xor     l
  765.                 ld      c,a
  766.                 ld      a,b
  767.                 xor     h
  768.                 ld      b,a
  769.  
  770.                 ;BCDE holds B^C^D
  771. ;       call    LOGBCDE
  772.  
  773.                 ; add key
  774.  
  775.                 ld      hl,[key]        ;16
  776.                 add     hl,de           ;11
  777.                 exd
  778.                 ld      hl,[key+2]      ;16
  779.                 adc     hl,bc           ;15
  780.  
  781.                 ;HLDE contains F + key[]
  782. ;       call    LOGHLDE
  783.  
  784.                 ; add constant
  785.  
  786.                 exd
  787.                 ld      bc,const&0xFFFF
  788.                 add     hl,bc   ;11
  789.                 exd
  790.                 ld      bc,const>>16
  791.                 adc     hl,bc   ;15
  792.  
  793.                 ;HLDE contains F + key[] + const
  794. ;       call    LOGHLDE
  795.  
  796.  
  797.                 ; add A
  798.  
  799.                 exd
  800.                 ld      bc,[A]  ;20
  801.                 add     hl,bc   ;11
  802.                 exd
  803.                 ld      bc,[A+2]        ;20
  804.                 adc     hl,bc           ;15
  805.  
  806.                 ;HLDE contains F + key[] + const + A, 190tc
  807. ;       call    LOGHLDE
  808.  
  809.  
  810.                  IF      shift==6
  811.                 ; ROL 6 = 8 - 2
  812.                 ld      a,e
  813.                 rra
  814.                 rr      h
  815.                 rr      l
  816.                 rr      d
  817.                 rr      e
  818.                 rra
  819.                 rr      h
  820.                 rr      l
  821.                 rr      d
  822.                 rr      e
  823.                 ld      a,h
  824.                 ld      h,l
  825.                 ld      l,d
  826.                 ld      d,e
  827.                 ld      e,a
  828.  
  829.                  ELSEIF  shift==10
  830.                 ; ROL 10 = 2 + 8
  831.                 ld      a,h
  832.                 add     a,a
  833.                 rl      e
  834.                 rl      d
  835.                 adc     hl,hl
  836.                 add     a,a
  837.                 rl      e
  838.                 rl      d
  839.                 adc     hl,hl
  840.                 ld      a,h
  841.                 ld      h,l
  842.                 ld      l,d
  843.                 ld      d,e
  844.                 ld      e,a
  845.  
  846.                  ELSEIF  shift==15
  847.                 ; ROL 15 = 16 - 1
  848.                 ld      a,e
  849.                 rra
  850.                 rr      h
  851.                 rr      l
  852.                 rr      d
  853.                 rr      e
  854.                 exd
  855.  
  856.                  ELSEIF  shift==21
  857.                 ; ROL 21 = 24 - 3
  858.                 ld      a,e
  859.                  DUP     3
  860.                 rra
  861.                 rr      h
  862.                 rr      l
  863.                 rr      d
  864.                 rr      e
  865.                  EDUP
  866.                 ld      a,e
  867.                 ld      e,d
  868.                 ld      d,l
  869.                 ld      l,h
  870.                 ld      h,a
  871.  
  872.                  ENDIF
  873.  
  874.                 ;HLDE is now properly rotated, now add B
  875. ;       call    LOGHLDE
  876.  
  877.                 exd ; shift==20 has extra EXD ?
  878.                 ld      bc,[B]
  879.                 add     hl,bc
  880.                 ld      bc,[B+2]
  881.                 exd
  882.                 adc     hl,bc
  883.  
  884.                 ;HLDE is new A
  885. ;       call    LOGHLDE
  886.  
  887.                 ld      [A],de
  888.                 ld      [A+2],hl
  889.                
  890.                 ENDM
  891.  
  892.  
  893.  
  894. MD5_COMPRESS    ;make transformations in tmp
  895.                 ld      hl,stA
  896.                 ld      de,tmpA
  897.                 ld      bc,16
  898.                 ldir
  899.  
  900.                 ; rounds...
  901. ;       call    LOGTMP
  902.                 MD5_ROUND1      tmpA,tmpB,tmpC,tmpD, msg+ 0*4, 0xd76aa478,  7
  903. ;       call    LOGTMP
  904.                 MD5_ROUND1      tmpD,tmpA,tmpB,tmpC, msg+ 1*4, 0xe8c7b756, 12
  905. ;       call    LOGTMP
  906.                 MD5_ROUND1      tmpC,tmpD,tmpA,tmpB, msg+ 2*4, 0x242070db, 17
  907. ;       call    LOGTMP
  908.                 MD5_ROUND1      tmpB,tmpC,tmpD,tmpA, msg+ 3*4, 0xc1bdceee, 22
  909. ;       call    LOGTMP
  910.                 MD5_ROUND1      tmpA,tmpB,tmpC,tmpD, msg+ 4*4, 0xf57c0faf,  7
  911. ;       call    LOGTMP
  912.                 MD5_ROUND1      tmpD,tmpA,tmpB,tmpC, msg+ 5*4, 0x4787c62a, 12
  913. ;       call    LOGTMP
  914.                 MD5_ROUND1      tmpC,tmpD,tmpA,tmpB, msg+ 6*4, 0xa8304613, 17
  915. ;       call    LOGTMP
  916.                 MD5_ROUND1      tmpB,tmpC,tmpD,tmpA, msg+ 7*4, 0xfd469501, 22
  917. ;       call    LOGTMP
  918.                 MD5_ROUND1      tmpA,tmpB,tmpC,tmpD, msg+ 8*4, 0x698098d8,  7
  919. ;       call    LOGTMP
  920.                 MD5_ROUND1      tmpD,tmpA,tmpB,tmpC, msg+ 9*4, 0x8b44f7af, 12
  921. ;       call    LOGTMP
  922.                 MD5_ROUND1      tmpC,tmpD,tmpA,tmpB, msg+10*4, 0xffff5bb1, 17
  923. ;       call    LOGTMP
  924.                 MD5_ROUND1      tmpB,tmpC,tmpD,tmpA, msg+11*4, 0x895cd7be, 22
  925. ;       call    LOGTMP
  926.                 MD5_ROUND1      tmpA,tmpB,tmpC,tmpD, msg+12*4, 0x6b901122,  7
  927. ;       call    LOGTMP
  928.                 MD5_ROUND1      tmpD,tmpA,tmpB,tmpC, msg+13*4, 0xfd987193, 12
  929. ;       call    LOGTMP
  930.                 MD5_ROUND1      tmpC,tmpD,tmpA,tmpB, msg+14*4, 0xa679438e, 17
  931. ;       call    LOGTMP
  932.                 MD5_ROUND1      tmpB,tmpC,tmpD,tmpA, msg+15*4, 0x49b40821, 22
  933. ;       call    LOGTMP
  934.  
  935. ;       call    LOGTMP
  936.                 MD5_ROUND2      tmpA,tmpB,tmpC,tmpD, msg+ 1*4, 0xf61e2562,  5
  937. ;       call    LOGTMP
  938.                 MD5_ROUND2      tmpD,tmpA,tmpB,tmpC, msg+ 6*4, 0xc040b340,  9
  939. ;       call    LOGTMP
  940.                 MD5_ROUND2      tmpC,tmpD,tmpA,tmpB, msg+11*4, 0x265e5a51, 14
  941. ;       call    LOGTMP
  942.                 MD5_ROUND2      tmpB,tmpC,tmpD,tmpA, msg+ 0*4, 0xe9b6c7aa, 20
  943. ;       call    LOGTMP
  944.                 MD5_ROUND2      tmpA,tmpB,tmpC,tmpD, msg+ 5*4, 0xd62f105d,  5
  945. ;       call    LOGTMP
  946.                 MD5_ROUND2      tmpD,tmpA,tmpB,tmpC, msg+10*4, 0x02441453,  9
  947. ;       call    LOGTMP
  948.                 MD5_ROUND2      tmpC,tmpD,tmpA,tmpB, msg+15*4, 0xd8a1e681, 14
  949. ;       call    LOGTMP
  950.                 MD5_ROUND2      tmpB,tmpC,tmpD,tmpA, msg+ 4*4, 0xe7d3fbc8, 20
  951. ;       call    LOGTMP
  952.                 MD5_ROUND2      tmpA,tmpB,tmpC,tmpD, msg+ 9*4, 0x21e1cde6,  5
  953. ;       call    LOGTMP
  954.                 MD5_ROUND2      tmpD,tmpA,tmpB,tmpC, msg+14*4, 0xc33707d6,  9
  955. ;       call    LOGTMP
  956.                 MD5_ROUND2      tmpC,tmpD,tmpA,tmpB, msg+ 3*4, 0xf4d50d87, 14
  957. ;       call    LOGTMP
  958.                 MD5_ROUND2      tmpB,tmpC,tmpD,tmpA, msg+ 8*4, 0x455a14ed, 20
  959. ;       call    LOGTMP
  960.                 MD5_ROUND2      tmpA,tmpB,tmpC,tmpD, msg+13*4, 0xa9e3e905,  5
  961. ;       call    LOGTMP
  962.                 MD5_ROUND2      tmpD,tmpA,tmpB,tmpC, msg+ 2*4, 0xfcefa3f8,  9
  963. ;       call    LOGTMP
  964.                 MD5_ROUND2      tmpC,tmpD,tmpA,tmpB, msg+ 7*4, 0x676f02d9, 14
  965. ;       call    LOGTMP
  966.                 MD5_ROUND2      tmpB,tmpC,tmpD,tmpA, msg+12*4, 0x8d2a4c8a, 20
  967. ;       call    LOGTMP
  968.  
  969. ;       call    LOGTMP
  970.                 MD5_ROUND3      tmpA,tmpB,tmpC,tmpD, msg+ 5*4, 0xfffa3942,  4
  971. ;       call    LOGTMP
  972.                 MD5_ROUND3      tmpD,tmpA,tmpB,tmpC, msg+ 8*4, 0x8771f681, 11
  973. ;       call    LOGTMP
  974.                 MD5_ROUND3      tmpC,tmpD,tmpA,tmpB, msg+11*4, 0x6d9d6122, 16
  975. ;       call    LOGTMP
  976.                 MD5_ROUND3      tmpB,tmpC,tmpD,tmpA, msg+14*4, 0xfde5380c, 23
  977. ;       call    LOGTMP
  978.                 MD5_ROUND3      tmpA,tmpB,tmpC,tmpD, msg+ 1*4, 0xa4beea44,  4
  979. ;       call    LOGTMP
  980.                 MD5_ROUND3      tmpD,tmpA,tmpB,tmpC, msg+ 4*4, 0x4bdecfa9, 11
  981. ;       call    LOGTMP
  982.                 MD5_ROUND3      tmpC,tmpD,tmpA,tmpB, msg+ 7*4, 0xf6bb4b60, 16
  983. ;       call    LOGTMP
  984.                 MD5_ROUND3      tmpB,tmpC,tmpD,tmpA, msg+10*4, 0xbebfbc70, 23
  985. ;       call    LOGTMP
  986.                 MD5_ROUND3      tmpA,tmpB,tmpC,tmpD, msg+13*4, 0x289b7ec6,  4
  987. ;       call    LOGTMP
  988.                 MD5_ROUND3      tmpD,tmpA,tmpB,tmpC, msg+ 0*4, 0xeaa127fa, 11
  989. ;       call    LOGTMP
  990.                 MD5_ROUND3      tmpC,tmpD,tmpA,tmpB, msg+ 3*4, 0xd4ef3085, 16
  991. ;       call    LOGTMP
  992.                 MD5_ROUND3      tmpB,tmpC,tmpD,tmpA, msg+ 6*4, 0x04881d05, 23
  993. ;       call    LOGTMP
  994.                 MD5_ROUND3      tmpA,tmpB,tmpC,tmpD, msg+ 9*4, 0xd9d4d039,  4
  995. ;       call    LOGTMP
  996.                 MD5_ROUND3      tmpD,tmpA,tmpB,tmpC, msg+12*4, 0xe6db99e5, 11
  997. ;       call    LOGTMP
  998.                 MD5_ROUND3      tmpC,tmpD,tmpA,tmpB, msg+15*4, 0x1fa27cf8, 16
  999. ;       call    LOGTMP
  1000.                 MD5_ROUND3      tmpB,tmpC,tmpD,tmpA, msg+ 2*4, 0xc4ac5665, 23
  1001. ;       call    LOGTMP
  1002.  
  1003. ;       call    LOGTMP
  1004.                 MD5_ROUND4      tmpA,tmpB,tmpC,tmpD, msg+ 0*4, 0xf4292244,  6
  1005. ;       call    LOGTMP
  1006.                 MD5_ROUND4      tmpD,tmpA,tmpB,tmpC, msg+ 7*4, 0x432aff97, 10
  1007. ;       call    LOGTMP
  1008.                 MD5_ROUND4      tmpC,tmpD,tmpA,tmpB, msg+14*4, 0xab9423a7, 15
  1009. ;       call    LOGTMP
  1010.                 MD5_ROUND4      tmpB,tmpC,tmpD,tmpA, msg+ 5*4, 0xfc93a039, 21
  1011. ;       call    LOGTMP
  1012.                 MD5_ROUND4      tmpA,tmpB,tmpC,tmpD, msg+12*4, 0x655b59c3,  6
  1013. ;       call    LOGTMP
  1014.                 MD5_ROUND4      tmpD,tmpA,tmpB,tmpC, msg+ 3*4, 0x8f0ccc92, 10
  1015. ;       call    LOGTMP
  1016.                 MD5_ROUND4      tmpC,tmpD,tmpA,tmpB, msg+10*4, 0xffeff47d, 15
  1017. ;       call    LOGTMP
  1018.                 MD5_ROUND4      tmpB,tmpC,tmpD,tmpA, msg+ 1*4, 0x85845dd1, 21
  1019. ;       call    LOGTMP
  1020.                 MD5_ROUND4      tmpA,tmpB,tmpC,tmpD, msg+ 8*4, 0x6fa87e4f,  6
  1021. ;       call    LOGTMP
  1022.                 MD5_ROUND4      tmpD,tmpA,tmpB,tmpC, msg+15*4, 0xfe2ce6e0, 10
  1023. ;       call    LOGTMP
  1024.                 MD5_ROUND4      tmpC,tmpD,tmpA,tmpB, msg+ 6*4, 0xa3014314, 15
  1025. ;       call    LOGTMP
  1026.                 MD5_ROUND4      tmpB,tmpC,tmpD,tmpA, msg+13*4, 0x4e0811a1, 21
  1027. ;       call    LOGTMP
  1028.                 MD5_ROUND4      tmpA,tmpB,tmpC,tmpD, msg+ 4*4, 0xf7537e82,  6
  1029. ;       call    LOGTMP
  1030.                 MD5_ROUND4      tmpD,tmpA,tmpB,tmpC, msg+11*4, 0xbd3af235, 10
  1031. ;       call    LOGTMP
  1032.                 MD5_ROUND4      tmpC,tmpD,tmpA,tmpB, msg+ 2*4, 0x2ad7d2bb, 15
  1033. ;       call    LOGTMP
  1034.                 MD5_ROUND4      tmpB,tmpC,tmpD,tmpA, msg+ 9*4, 0xeb86d391, 21
  1035. ;       call    LOGTMP
  1036.  
  1037.                 ; add transformed tmp to st
  1038.                 ld      hl,tmpA
  1039.                 ld      de,stA
  1040.                 ld      b,4
  1041. .add_result
  1042.                 ld      a,[de]
  1043.                 add     a,[hl]
  1044.                 ld      [de],a
  1045.                 inc     e
  1046.                 inc     l
  1047.                  REPT    3
  1048.                 ld      a,[de]
  1049.                 adc     a,[hl]
  1050.                 ld      [de],a
  1051.                 inc     e
  1052.                 inc     l
  1053.                  EDUP
  1054.                 djnz    .add_result
  1055.  
  1056. ;       call    LOGST
  1057.  
  1058.                 ret
  1059.  
  1060.  
  1061. LOGBCDE
  1062.                 push    bc
  1063.                 push    de
  1064.                 push    hl
  1065.  
  1066.                 ld      [tmparea],de
  1067.                 ld      [tmparea+2],bc
  1068.  
  1069.                 ld      de,tmparea
  1070.                 ld      hl,pri1
  1071.                 call    logtmp1
  1072.  
  1073.                 pop     hl
  1074.                 pop     de
  1075.                 pop     bc
  1076.                 ret
  1077. LOGHLDE
  1078.                 push    bc
  1079.                 push    de
  1080.                 push    hl
  1081.  
  1082.                 ld      [tmparea],de
  1083.                 ld      [tmparea+2],hl
  1084.  
  1085.                 ld      de,tmparea
  1086.                 ld      hl,pri1
  1087.                 call    logtmp1
  1088.  
  1089.                 pop     hl
  1090.                 pop     de
  1091.                 pop     bc
  1092.                 ret
  1093.  
  1094. LOGST
  1095.                 ld      de,stA
  1096.                 ld      hl,pri1
  1097.                 jr      LOGTMP4
  1098.  
  1099. LOGTMP
  1100.                 ld      de,tmpA
  1101.                 ld      hl,pri1
  1102. LOGTMP4
  1103.                 call    hexconv
  1104.                 call    hexconv
  1105.                 call    hexconv
  1106.                 call    hexconv
  1107.                 ld      [hl],' '
  1108.                 inc     hl
  1109.                 call    hexconv
  1110.                 call    hexconv
  1111.                 call    hexconv
  1112.                 call    hexconv
  1113.                 ld      [hl],' '
  1114.                 inc     hl
  1115. logtmp2
  1116.                 call    hexconv
  1117.                 call    hexconv
  1118.                 call    hexconv
  1119.                 call    hexconv
  1120.                 ld      [hl],' '
  1121.                 inc     hl
  1122. logtmp1
  1123.                 call    hexconv
  1124.                 call    hexconv
  1125.                 call    hexconv
  1126.                 call    hexconv
  1127.                 ld      [hl],13
  1128.                 inc     hl
  1129.                 ld      [hl],10
  1130.                 inc     hl
  1131.                 ld      [hl],0
  1132.  
  1133.                 ld      hl,pri1
  1134.                 jp      prtext
  1135.  
  1136. tmparea ds      4
  1137.  
  1138. pri1    ds      40
  1139.  
  1140.  
  1141.  
  1142.  
  1143.  
  1144.  
  1145. phase           ds      1       ;0..63
  1146.  
  1147. bitLEN          ds      8       ;length in BITs
  1148.  
  1149.                 org     ($+255)&0xFF00
  1150.  
  1151. msg             ds      64
  1152.  
  1153. stA             ds      4
  1154. stB             ds      4
  1155. stC             ds      4
  1156. stD             ds      4
  1157.  
  1158. tmpA            ds      4
  1159. tmpB            ds      4
  1160. tmpC            ds      4
  1161. tmpD            ds      4
  1162.  
  1163.