home *** CD-ROM | disk | FTP | other *** search
/ RISC DISC 2 / RISC_DISC_2.iso / pd_share / utilities / cli / pgp2 / src / s / md5ARM < prev   
Encoding:
Text File  |  1995-06-06  |  12.0 KB  |  656 lines

  1. ; ARM assembler for MD5 algorithm.
  2. ; Well, more precisely for MD5Transform.
  3.  
  4.     AREA |A$$Code|, CODE, READONLY
  5.     EXPORT MD5Transform
  6.  
  7. ; The magic numbers MD5 uses:
  8. table    ; First block.
  9.     DCD &d76aa478, &e8c7b756, &242070db, &c1bdceee
  10.     DCD &f57c0faf, &4787c62a, &a8304613, &fd469501
  11.     DCD &698098d8, &8b44f7af, &ffff5bb1, &895cd7be
  12.     DCD &6b901122, &fd987193, &a679438e, &49b40821
  13.     ; Second block.
  14.     DCD &f61e2562, &c040b340, &265e5a51, &e9b6c7aa
  15.     DCD &d62f105d, &02441453, &d8a1e681, &e7d3fbc8
  16.     DCD &21e1cde6, &c33707d6, &f4d50d87, &455a14ed
  17.     DCD &a9e3e905, &fcefa3f8, &676f02d9, &8d2a4c8a
  18.     ; Third block.
  19.     DCD &fffa3942, &8771f681, &6d9d6122, &fde5380c
  20.     DCD &a4beea44, &4bdecfa9, &f6bb4b60, &bebfbc70
  21.     DCD &289b7ec6, &eaa127fa, &d4ef3085, &04881d05
  22.     DCD &d9d4d039, &e6db99e5, &1fa27cf8, &c4ac5665
  23.     ; Fourth block.
  24.     DCD &f4292244, &432aff97, &ab9423a7, &fc93a039
  25.     DCD &655b59c3, &8f0ccc92, &ffeff47d, &85845dd1
  26.     DCD &6fa87e4f, &fe2ce6e0, &a3014314, &4e0811a1
  27.     DCD &f7537e82, &bd3af235, &2ad7d2bb, &eb86d391
  28.  
  29. buf RN 0
  30. in RN 1
  31. a RN 2
  32. b RN 3
  33. c RN 4
  34. d RN 5
  35. ta1 RN 6
  36. ta2 RN 7
  37. ta3 RN 8
  38. ta4 RN 9
  39. tbl RN 10
  40. xx RN 12
  41. yy RN 14
  42. sp RN 13
  43. lr RN 14
  44. pc RN 15
  45.  
  46. ; Here's the magic routine.
  47. ; r0 -> 4-word buf
  48. ; r1 -> 16-word in
  49. MD5Transform
  50.     STMFD sp!,{c-tbl,lr}
  51.     LDMIA buf,{a,b,c,d}
  52.     ADR tbl,table
  53.  
  54.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  55.     ; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
  56.     EOR xx,c,d
  57.     AND xx,b,xx
  58.     EOR xx,d,xx
  59.     LDR yy,[in,#0]
  60.     ADD xx,xx,yy
  61.     ADD xx,xx,ta1
  62.     ADD a,a,xx
  63.     ADD a,b,a,ROR#25
  64.     ; MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
  65.     EOR xx,b,c
  66.     AND xx,a,xx
  67.     EOR xx,c,xx
  68.     LDR yy,[in,#4]
  69.     ADD xx,xx,yy
  70.     ADD xx,xx,ta2
  71.     ADD d,d,xx
  72.     ADD d,a,d,ROR#20
  73.     ; MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
  74.     EOR xx,a,b
  75.     AND xx,d,xx
  76.     EOR xx,b,xx
  77.     LDR yy,[in,#8]
  78.     ADD xx,xx,yy
  79.     ADD xx,xx,ta3
  80.     ADD c,c,xx
  81.     ADD c,d,c,ROR#15
  82.     ; MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
  83.     EOR xx,d,a
  84.     AND xx,c,xx
  85.     EOR xx,a,xx
  86.     LDR yy,[in,#12]
  87.     ADD xx,xx,yy
  88.     ADD xx,xx,ta4
  89.     ADD b,b,xx
  90.     ADD b,c,b,ROR#10
  91.  
  92.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  93.     ; MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
  94.     EOR xx,c,d
  95.     AND xx,b,xx
  96.     EOR xx,d,xx
  97.     LDR yy,[in,#16]
  98.     ADD xx,xx,yy
  99.     ADD xx,xx,ta1
  100.     ADD a,a,xx
  101.     ADD a,b,a,ROR#25
  102.     ; MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
  103.     EOR xx,b,c
  104.     AND xx,a,xx
  105.     EOR xx,c,xx
  106.     LDR yy,[in,#20]
  107.     ADD xx,xx,yy
  108.     ADD xx,xx,ta2
  109.     ADD d,d,xx
  110.     ADD d,a,d,ROR#20
  111.     ; MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
  112.     EOR xx,a,b
  113.     AND xx,d,xx
  114.     EOR xx,b,xx
  115.     LDR yy,[in,#24]
  116.     ADD xx,xx,yy
  117.     ADD xx,xx,ta3
  118.     ADD c,c,xx
  119.     ADD c,d,c,ROR#15
  120.     ; MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
  121.     EOR xx,d,a
  122.     AND xx,c,xx
  123.     EOR xx,a,xx
  124.     LDR yy,[in,#28]
  125.     ADD xx,xx,yy
  126.     ADD xx,xx,ta4
  127.     ADD b,b,xx
  128.     ADD b,c,b,ROR#10
  129.  
  130.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  131.     ; MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
  132.     EOR xx,c,d
  133.     AND xx,b,xx
  134.     EOR xx,d,xx
  135.     LDR yy,[in,#32]
  136.     ADD xx,xx,yy
  137.     ADD xx,xx,ta1
  138.     ADD a,a,xx
  139.     ADD a,b,a,ROR#25
  140.     ; MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
  141.     EOR xx,b,c
  142.     AND xx,a,xx
  143.     EOR xx,c,xx
  144.     LDR yy,[in,#36]
  145.     ADD xx,xx,yy
  146.     ADD xx,xx,ta2
  147.     ADD d,d,xx
  148.     ADD d,a,d,ROR#20
  149.     ; MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
  150.     EOR xx,a,b
  151.     AND xx,d,xx
  152.     EOR xx,b,xx
  153.     LDR yy,[in,#40]
  154.     ADD xx,xx,yy
  155.     ADD xx,xx,ta3
  156.     ADD c,c,xx
  157.     ADD c,d,c,ROR#15
  158.     ; MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
  159.     EOR xx,d,a
  160.     AND xx,c,xx
  161.     EOR xx,a,xx
  162.     LDR yy,[in,#44]
  163.     ADD xx,xx,yy
  164.     ADD xx,xx,ta4
  165.     ADD b,b,xx
  166.     ADD b,c,b,ROR#10
  167.  
  168.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  169.     ; MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
  170.     EOR xx,c,d
  171.     AND xx,b,xx
  172.     EOR xx,d,xx
  173.     LDR yy,[in,#48]
  174.     ADD xx,xx,yy
  175.     ADD xx,xx,ta1
  176.     ADD a,a,xx
  177.     ADD a,b,a,ROR#25
  178.     ; MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
  179.     EOR xx,b,c
  180.     AND xx,a,xx
  181.     EOR xx,c,xx
  182.     LDR yy,[in,#52]
  183.     ADD xx,xx,yy
  184.     ADD xx,xx,ta2
  185.     ADD d,d,xx
  186.     ADD d,a,d,ROR#20
  187.     ; MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
  188.     EOR xx,a,b
  189.     AND xx,d,xx
  190.     EOR xx,b,xx
  191.     LDR yy,[in,#56]
  192.     ADD xx,xx,yy
  193.     ADD xx,xx,ta3
  194.     ADD c,c,xx
  195.     ADD c,d,c,ROR#15
  196.     ; MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
  197.     EOR xx,d,a
  198.     AND xx,c,xx
  199.     EOR xx,a,xx
  200.     LDR yy,[in,#60]
  201.     ADD xx,xx,yy
  202.     ADD xx,xx,ta4
  203.     ADD b,b,xx
  204.     ADD b,c,b,ROR#10
  205.  
  206.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  207.     ; MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
  208.     EOR xx,b,c
  209.     AND xx,d,xx
  210.     EOR xx,c,xx
  211.     LDR yy,[in,#4]
  212.     ADD xx,xx,yy
  213.     ADD xx,xx,ta1
  214.     ADD a,a,xx
  215.     ADD a,b,a,ROR#27
  216.     ; MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
  217.     EOR xx,a,b
  218.     AND xx,c,xx
  219.     EOR xx,b,xx
  220.     LDR yy,[in,#24]
  221.     ADD xx,xx,yy
  222.     ADD xx,xx,ta2
  223.     ADD d,d,xx
  224.     ADD d,a,d,ROR#23
  225.     ; MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
  226.     EOR xx,d,a
  227.     AND xx,b,xx
  228.     EOR xx,a,xx
  229.     LDR yy,[in,#44]
  230.     ADD xx,xx,yy
  231.     ADD xx,xx,ta3
  232.     ADD c,c,xx
  233.     ADD c,d,c,ROR#18
  234.     ; MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
  235.     EOR xx,c,d
  236.     AND xx,a,xx
  237.     EOR xx,d,xx
  238.     LDR yy,[in,#0]
  239.     ADD xx,xx,yy
  240.     ADD xx,xx,ta4
  241.     ADD b,b,xx
  242.     ADD b,c,b,ROR#12
  243.  
  244.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  245.     ; MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
  246.     EOR xx,b,c
  247.     AND xx,d,xx
  248.     EOR xx,c,xx
  249.     LDR yy,[in,#20]
  250.     ADD xx,xx,yy
  251.     ADD xx,xx,ta1
  252.     ADD a,a,xx
  253.     ADD a,b,a,ROR#27
  254.     ; MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
  255.     EOR xx,a,b
  256.     AND xx,c,xx
  257.     EOR xx,b,xx
  258.     LDR yy,[in,#40]
  259.     ADD xx,xx,yy
  260.     ADD xx,xx,ta2
  261.     ADD d,d,xx
  262.     ADD d,a,d,ROR#23
  263.     ; MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
  264.     EOR xx,d,a
  265.     AND xx,b,xx
  266.     EOR xx,a,xx
  267.     LDR yy,[in,#60]
  268.     ADD xx,xx,yy
  269.     ADD xx,xx,ta3
  270.     ADD c,c,xx
  271.     ADD c,d,c,ROR#18
  272.     ; MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
  273.     EOR xx,c,d
  274.     AND xx,a,xx
  275.     EOR xx,d,xx
  276.     LDR yy,[in,#16]
  277.     ADD xx,xx,yy
  278.     ADD xx,xx,ta4
  279.     ADD b,b,xx
  280.     ADD b,c,b,ROR#12
  281.  
  282.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  283.     ; MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
  284.     EOR xx,b,c
  285.     AND xx,d,xx
  286.     EOR xx,c,xx
  287.     LDR yy,[in,#36]
  288.     ADD xx,xx,yy
  289.     ADD xx,xx,ta1
  290.     ADD a,a,xx
  291.     ADD a,b,a,ROR#27
  292.     ; MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
  293.     EOR xx,a,b
  294.     AND xx,c,xx
  295.     EOR xx,b,xx
  296.     LDR yy,[in,#56]
  297.     ADD xx,xx,yy
  298.     ADD xx,xx,ta2
  299.     ADD d,d,xx
  300.     ADD d,a,d,ROR#23
  301.     ; MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
  302.     EOR xx,d,a
  303.     AND xx,b,xx
  304.     EOR xx,a,xx
  305.     LDR yy,[in,#12]
  306.     ADD xx,xx,yy
  307.     ADD xx,xx,ta3
  308.     ADD c,c,xx
  309.     ADD c,d,c,ROR#18
  310.     ; MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
  311.     EOR xx,c,d
  312.     AND xx,a,xx
  313.     EOR xx,d,xx
  314.     LDR yy,[in,#32]
  315.     ADD xx,xx,yy
  316.     ADD xx,xx,ta4
  317.     ADD b,b,xx
  318.     ADD b,c,b,ROR#12
  319.  
  320.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  321.     ; MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
  322.     EOR xx,b,c
  323.     AND xx,d,xx
  324.     EOR xx,c,xx
  325.     LDR yy,[in,#52]
  326.     ADD xx,xx,yy
  327.     ADD xx,xx,ta1
  328.     ADD a,a,xx
  329.     ADD a,b,a,ROR#27
  330.     ; MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
  331.     EOR xx,a,b
  332.     AND xx,c,xx
  333.     EOR xx,b,xx
  334.     LDR yy,[in,#8]
  335.     ADD xx,xx,yy
  336.     ADD xx,xx,ta2
  337.     ADD d,d,xx
  338.     ADD d,a,d,ROR#23
  339.     ; MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
  340.     EOR xx,d,a
  341.     AND xx,b,xx
  342.     EOR xx,a,xx
  343.     LDR yy,[in,#28]
  344.     ADD xx,xx,yy
  345.     ADD xx,xx,ta3
  346.     ADD c,c,xx
  347.     ADD c,d,c,ROR#18
  348.     ; MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
  349.     EOR xx,c,d
  350.     AND xx,a,xx
  351.     EOR xx,d,xx
  352.     LDR yy,[in,#48]
  353.     ADD xx,xx,yy
  354.     ADD xx,xx,ta4
  355.     ADD b,b,xx
  356.     ADD b,c,b,ROR#12
  357.  
  358.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  359.     ; MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
  360.     EOR xx,b,c
  361.     EOR xx,xx,d
  362.     LDR yy,[in,#20]
  363.     ADD xx,xx,yy
  364.     ADD xx,xx,ta1
  365.     ADD a,a,xx
  366.     ADD a,b,a,ROR#28
  367.     ; MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
  368.     EOR xx,a,b
  369.     EOR xx,xx,c
  370.     LDR yy,[in,#32]
  371.     ADD xx,xx,yy
  372.     ADD xx,xx,ta2
  373.     ADD d,d,xx
  374.     ADD d,a,d,ROR#21
  375.     ; MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
  376.     EOR xx,d,a
  377.     EOR xx,xx,b
  378.     LDR yy,[in,#44]
  379.     ADD xx,xx,yy
  380.     ADD xx,xx,ta3
  381.     ADD c,c,xx
  382.     ADD c,d,c,ROR#16
  383.     ; MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
  384.     EOR xx,c,d
  385.     EOR xx,xx,a
  386.     LDR yy,[in,#56]
  387.     ADD xx,xx,yy
  388.     ADD xx,xx,ta4
  389.     ADD b,b,xx
  390.     ADD b,c,b,ROR#9
  391.  
  392.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  393.     ; MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
  394.     EOR xx,b,c
  395.     EOR xx,xx,d
  396.     LDR yy,[in,#4]
  397.     ADD xx,xx,yy
  398.     ADD xx,xx,ta1
  399.     ADD a,a,xx
  400.     ADD a,b,a,ROR#28
  401.     ; MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
  402.     EOR xx,a,b
  403.     EOR xx,xx,c
  404.     LDR yy,[in,#16]
  405.     ADD xx,xx,yy
  406.     ADD xx,xx,ta2
  407.     ADD d,d,xx
  408.     ADD d,a,d,ROR#21
  409.     ; MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
  410.     EOR xx,d,a
  411.     EOR xx,xx,b
  412.     LDR yy,[in,#28]
  413.     ADD xx,xx,yy
  414.     ADD xx,xx,ta3
  415.     ADD c,c,xx
  416.     ADD c,d,c,ROR#16
  417.     ; MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
  418.     EOR xx,c,d
  419.     EOR xx,xx,a
  420.     LDR yy,[in,#40]
  421.     ADD xx,xx,yy
  422.     ADD xx,xx,ta4
  423.     ADD b,b,xx
  424.     ADD b,c,b,ROR#9
  425.  
  426.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  427.     ; MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
  428.     EOR xx,b,c
  429.     EOR xx,xx,d
  430.     LDR yy,[in,#52]
  431.     ADD xx,xx,yy
  432.     ADD xx,xx,ta1
  433.     ADD a,a,xx
  434.     ADD a,b,a,ROR#28
  435.     ; MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
  436.     EOR xx,a,b
  437.     EOR xx,xx,c
  438.     LDR yy,[in,#0]
  439.     ADD xx,xx,yy
  440.     ADD xx,xx,ta2
  441.     ADD d,d,xx
  442.     ADD d,a,d,ROR#21
  443.     ; MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
  444.     EOR xx,d,a
  445.     EOR xx,xx,b
  446.     LDR yy,[in,#12]
  447.     ADD xx,xx,yy
  448.     ADD xx,xx,ta3
  449.     ADD c,c,xx
  450.     ADD c,d,c,ROR#16
  451.     ; MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
  452.     EOR xx,c,d
  453.     EOR xx,xx,a
  454.     LDR yy,[in,#24]
  455.     ADD xx,xx,yy
  456.     ADD xx,xx,ta4
  457.     ADD b,b,xx
  458.     ADD b,c,b,ROR#9
  459.  
  460.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  461.     ; MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
  462.     EOR xx,b,c
  463.     EOR xx,xx,d
  464.     LDR yy,[in,#36]
  465.     ADD xx,xx,yy
  466.     ADD xx,xx,ta1
  467.     ADD a,a,xx
  468.     ADD a,b,a,ROR#28
  469.     ; MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
  470.     EOR xx,a,b
  471.     EOR xx,xx,c
  472.     LDR yy,[in,#48]
  473.     ADD xx,xx,yy
  474.     ADD xx,xx,ta2
  475.     ADD d,d,xx
  476.     ADD d,a,d,ROR#21
  477.     ; MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
  478.     EOR xx,d,a
  479.     EOR xx,xx,b
  480.     LDR yy,[in,#60]
  481.     ADD xx,xx,yy
  482.     ADD xx,xx,ta3
  483.     ADD c,c,xx
  484.     ADD c,d,c,ROR#16
  485.     ; MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
  486.     EOR xx,c,d
  487.     EOR xx,xx,a
  488.     LDR yy,[in,#8]
  489.     ADD xx,xx,yy
  490.     ADD xx,xx,ta4
  491.     ADD b,b,xx
  492.     ADD b,c,b,ROR#9
  493.  
  494.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  495.     ; MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
  496.     MVN xx,d
  497.     ORR xx,xx,b
  498.     EOR xx,xx,c
  499.     LDR yy,[in,#0]
  500.     ADD xx,xx,yy
  501.     ADD xx,xx,ta1
  502.     ADD a,a,xx
  503.     ADD a,b,a,ROR#26
  504.     ; MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
  505.     MVN xx,c
  506.     ORR xx,xx,a
  507.     EOR xx,xx,b
  508.     LDR yy,[in,#28]
  509.     ADD xx,xx,yy
  510.     ADD xx,xx,ta2
  511.     ADD d,d,xx
  512.     ADD d,a,d,ROR#22
  513.     ; MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
  514.     MVN xx,b
  515.     ORR xx,xx,d
  516.     EOR xx,xx,a
  517.     LDR yy,[in,#56]
  518.     ADD xx,xx,yy
  519.     ADD xx,xx,ta3
  520.     ADD c,c,xx
  521.     ADD c,d,c,ROR#17
  522.     ; MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
  523.     MVN xx,a
  524.     ORR xx,xx,c
  525.     EOR xx,xx,d
  526.     LDR yy,[in,#20]
  527.     ADD xx,xx,yy
  528.     ADD xx,xx,ta4
  529.     ADD b,b,xx
  530.     ADD b,c,b,ROR#11
  531.  
  532.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  533.     ; MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
  534.     MVN xx,d
  535.     ORR xx,xx,b
  536.     EOR xx,xx,c
  537.     LDR yy,[in,#48]
  538.     ADD xx,xx,yy
  539.     ADD xx,xx,ta1
  540.     ADD a,a,xx
  541.     ADD a,b,a,ROR#26
  542.     ; MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
  543.     MVN xx,c
  544.     ORR xx,xx,a
  545.     EOR xx,xx,b
  546.     LDR yy,[in,#12]
  547.     ADD xx,xx,yy
  548.     ADD xx,xx,ta2
  549.     ADD d,d,xx
  550.     ADD d,a,d,ROR#22
  551.     ; MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
  552.     MVN xx,b
  553.     ORR xx,xx,d
  554.     EOR xx,xx,a
  555.     LDR yy,[in,#40]
  556.     ADD xx,xx,yy
  557.     ADD xx,xx,ta3
  558.     ADD c,c,xx
  559.     ADD c,d,c,ROR#17
  560.     ; MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
  561.     MVN xx,a
  562.     ORR xx,xx,c
  563.     EOR xx,xx,d
  564.     LDR yy,[in,#4]
  565.     ADD xx,xx,yy
  566.     ADD xx,xx,ta4
  567.     ADD b,b,xx
  568.     ADD b,c,b,ROR#11
  569.  
  570.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  571.     ; MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
  572.     MVN xx,d
  573.     ORR xx,xx,b
  574.     EOR xx,xx,c
  575.     LDR yy,[in,#32]
  576.     ADD xx,xx,yy
  577.     ADD xx,xx,ta1
  578.     ADD a,a,xx
  579.     ADD a,b,a,ROR#26
  580.     ; MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
  581.     MVN xx,c
  582.     ORR xx,xx,a
  583.     EOR xx,xx,b
  584.     LDR yy,[in,#60]
  585.     ADD xx,xx,yy
  586.     ADD xx,xx,ta2
  587.     ADD d,d,xx
  588.     ADD d,a,d,ROR#22
  589.     ; MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
  590.     MVN xx,b
  591.     ORR xx,xx,d
  592.     EOR xx,xx,a
  593.     LDR yy,[in,#24]
  594.     ADD xx,xx,yy
  595.     ADD xx,xx,ta3
  596.     ADD c,c,xx
  597.     ADD c,d,c,ROR#17
  598.     ; MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
  599.     MVN xx,a
  600.     ORR xx,xx,c
  601.     EOR xx,xx,d
  602.     LDR yy,[in,#52]
  603.     ADD xx,xx,yy
  604.     ADD xx,xx,ta4
  605.     ADD b,b,xx
  606.     ADD b,c,b,ROR#11
  607.  
  608.     LDMIA tbl!,{ta1,ta2,ta3,ta4}
  609.     ; MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
  610.     MVN xx,d
  611.     ORR xx,xx,b
  612.     EOR xx,xx,c
  613.     LDR yy,[in,#16]
  614.     ADD xx,xx,yy
  615.     ADD xx,xx,ta1
  616.     ADD a,a,xx
  617.     ADD a,b,a,ROR#26
  618.     ; MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
  619.     MVN xx,c
  620.     ORR xx,xx,a
  621.     EOR xx,xx,b
  622.     LDR yy,[in,#44]
  623.     ADD xx,xx,yy
  624.     ADD xx,xx,ta2
  625.     ADD d,d,xx
  626.     ADD d,a,d,ROR#22
  627.     ; MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
  628.     MVN xx,b
  629.     ORR xx,xx,d
  630.     EOR xx,xx,a
  631.     LDR yy,[in,#8]
  632.     ADD xx,xx,yy
  633.     ADD xx,xx,ta3
  634.     ADD c,c,xx
  635.     ADD c,d,c,ROR#17
  636.     ; MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
  637.     MVN xx,a
  638.     ORR xx,xx,c
  639.     EOR xx,xx,d
  640.     LDR yy,[in,#36]
  641.     ADD xx,xx,yy
  642.     ADD xx,xx,ta4
  643.     ADD b,b,xx
  644.     ADD b,c,b,ROR#11
  645.  
  646.     LDMIA buf,{ta1,ta2,ta3,ta4}
  647.     ADD a,a,ta1
  648.     ADD b,b,ta2
  649.     ADD c,c,ta3
  650.     ADD d,d,ta4
  651.     STMIA buf,{a,b,c,d}
  652.  
  653.     LDMIA sp!,{c-tbl,pc}^
  654.  
  655.     END
  656.