?login_element?

Subversion Repositories NedoOS

Rev

Rev 1862 | Blame | Compare with Previous | Last modification | View Log | Download

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