1. --Message
  2. --Digester
  3. --MD4
  4.  
  5. --( public:
  6. --(  <#string> CoMD4Digest (<#string>)
  7. --(
  8. --( abstract:
  9. --(   Fast lingo implementation of the MD4 algorithm.
  10. --(   Implementation by Joni Huhmarniemi (21/2/2004).
  11. --(   © 1991-2, RSA Data Security, Inc.
  12.  
  13. --( public )-- -- -- -- -- -- -- -- -- -- -- -- --//
  14.  
  15. --( Returns the hex representation of string's MD4.
  16. --( i:<#string>
  17. --( o: -
  18. --( r:<#string>
  19.  
  20. on CoMD4Digest(a_sInput)
  21.  
  22.   -- Convert string to list of little-endian words...
  23.  
  24.   t_iLen = length(a_sInput) * 8
  25.   t_iCnt = (t_iLen + 64) / 512 * 16 + 16
  26.  
  27.   -- Create list, fill with zeros...
  28.  
  29.   x = []
  30.   x.SetAt(t_iCnt, 0)
  31.  
  32.   t_fArr = [1, 256, 65536, 16777216]
  33.   i = 0
  34.   j = 0
  35.   repeat while i < t_iLen
  36.     j = j + 1
  37.     t_iNext = i / 32 + 1
  38.     t_iTemp = bitAnd(charToNum(char (i / 8 + 1) of a_sInput), 255) * t_fArr[j]
  39.     x[t_iNext] = bitOr(x[t_iNext], t_iTemp)
  40.     i = i + 8
  41.     j = j mod 4
  42.   end repeat
  43.  
  44.   -- Append padding...
  45.  
  46.   t_iNext = t_iLen / 32 + 1
  47.   x[t_iNext] = bitOr(x[t_iNext], 128 * t_fArr[j + 1])
  48.   x[(t_iLen + 64) / 512 * 16 + 15] = t_iLen
  49.  
  50.   -- Actual algorithm starts here...
  51.  
  52.   a =  1732584193
  53.   b = -271733879
  54.   c = -1732584194
  55.   d =  271733878
  56.   i = 1
  57.  
  58.   t_iWrap = the maxInteger + 1
  59.   t_iCount = x.count + 1
  60.  
  61.   repeat while i < t_iCount
  62.    
  63.     olda = a
  64.     oldb = b
  65.     oldc = c
  66.     oldd = d
  67.    
  68.     -- Round(1) --
  69.    
  70.     n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i]
  71.    
  72.     if(n < 0) then
  73.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  74.     else
  75.       a = bitOr(n * 8, n / 536870912)
  76.     end if
  77.    
  78.     n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 1]
  79.    
  80.     if(n < 0) then
  81.       d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
  82.     else
  83.       d = bitOr(n * 128, n / 33554432)
  84.     end if
  85.    
  86.     n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 2]
  87.    
  88.     if(n < 0) then
  89.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  90.     else
  91.       c = bitOr(n * 2048, n / 2097152)
  92.     end if
  93.    
  94.     n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 3]
  95.    
  96.     if(n < 0) then
  97.       b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
  98.     else
  99.       b = bitOr(n * 524288, n / 8192)
  100.     end if
  101.    
  102.     n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 4]
  103.    
  104.     if(n < 0) then
  105.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  106.     else
  107.       a = bitOr(n * 8, n / 536870912)
  108.     end if
  109.    
  110.     n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 5]
  111.    
  112.     if(n < 0) then
  113.       d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
  114.     else
  115.       d = bitOr(n * 128, n / 33554432)
  116.     end if
  117.    
  118.     n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 6]
  119.    
  120.     if(n < 0) then
  121.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  122.     else
  123.       c = bitOr(n * 2048, n / 2097152)
  124.     end if
  125.    
  126.     n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 7]
  127.    
  128.     if(n < 0) then
  129.       b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
  130.     else
  131.       b = bitOr(n * 524288, n / 8192)
  132.     end if
  133.    
  134.     n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 8]
  135.    
  136.     if(n < 0) then
  137.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  138.     else
  139.       a = bitOr(n * 8, n / 536870912)
  140.     end if
  141.    
  142.     n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 9]
  143.    
  144.     if(n < 0) then
  145.       d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
  146.     else
  147.       d = bitOr(n * 128, n / 33554432)
  148.     end if
  149.    
  150.     n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 10]
  151.    
  152.     if(n < 0) then
  153.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  154.     else
  155.       c = bitOr(n * 2048, n / 2097152)
  156.     end if
  157.    
  158.     n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 11]
  159.    
  160.     if(n < 0) then
  161.       b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
  162.     else
  163.       b = bitOr(n * 524288, n / 8192)
  164.     end if
  165.    
  166.     n = bitOr(bitAnd(b, c), bitAnd(bitNot(b), d)) + a + x[i + 12]
  167.    
  168.     if(n < 0) then
  169.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  170.     else
  171.       a = bitOr(n * 8, n / 536870912)
  172.     end if
  173.    
  174.     n = bitOr(bitAnd(a, b), bitAnd(bitNot(a), c)) + d + x[i + 13]
  175.    
  176.     if(n < 0) then
  177.       d = bitOr(n * 128, bitOr((n + t_iWrap) / 33554432, 64))
  178.     else
  179.       d = bitOr(n * 128, n / 33554432)
  180.     end if
  181.    
  182.     n = bitOr(bitAnd(d, a), bitAnd(bitNot(d), b)) + c + x[i + 14]
  183.    
  184.     if(n < 0) then
  185.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  186.     else
  187.       c = bitOr(n * 2048, n / 2097152)
  188.     end if
  189.    
  190.     n = bitOr(bitAnd(c, d), bitAnd(bitNot(c), a)) + b + x[i + 15]
  191.    
  192.     if(n < 0) then
  193.       b = bitOr(n * 524288, bitOr((n + t_iWrap) / 8192, 262144))
  194.     else
  195.       b = bitOr(n * 524288, n / 8192)
  196.     end if
  197.    
  198.     -- Round(2) --
  199.    
  200.     n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i] + 1518500249
  201.    
  202.     if(n < 0) then
  203.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  204.     else
  205.       a = bitOr(n * 8, n / 536870912)
  206.     end if
  207.    
  208.     n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 4] + 1518500249
  209.    
  210.     if(n < 0) then
  211.       d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
  212.     else
  213.       d = bitOr(n * 32, n / 134217728)
  214.     end if
  215.    
  216.     n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 8] + 1518500249
  217.    
  218.     if(n < 0) then
  219.       c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  220.     else
  221.       c = bitOr(n * 512, n / 8388608)
  222.     end if
  223.    
  224.     n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 12] + 1518500249
  225.    
  226.     if(n < 0) then
  227.       b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
  228.     else
  229.       b = bitOr(n * 8192, n / 524288)
  230.     end if
  231.    
  232.     n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 1] + 1518500249
  233.    
  234.     if(n < 0) then
  235.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  236.     else
  237.       a = bitOr(n * 8, n / 536870912)
  238.     end if
  239.    
  240.     n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 5] + 1518500249
  241.    
  242.     if(n < 0) then
  243.       d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
  244.     else
  245.       d = bitOr(n * 32, n / 134217728)
  246.     end if
  247.    
  248.     n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 9] + 1518500249
  249.    
  250.     if(n < 0) then
  251.       c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  252.     else
  253.       c = bitOr(n * 512, n / 8388608)
  254.     end if
  255.    
  256.     n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 13] + 1518500249
  257.    
  258.     if(n < 0) then
  259.       b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
  260.     else
  261.       b = bitOr(n * 8192, n / 524288)
  262.     end if
  263.    
  264.     n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 2] + 1518500249
  265.    
  266.     if(n < 0) then
  267.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  268.     else
  269.       a = bitOr(n * 8, n / 536870912)
  270.     end if
  271.    
  272.     n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 6] + 1518500249
  273.    
  274.     if(n < 0) then
  275.       d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
  276.     else
  277.       d = bitOr(n * 32, n / 134217728)
  278.     end if
  279.    
  280.     n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 10] + 1518500249
  281.    
  282.     if(n < 0) then
  283.       c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  284.     else
  285.       c = bitOr(n * 512, n / 8388608)
  286.     end if
  287.    
  288.     n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 14] + 1518500249
  289.    
  290.     if(n < 0) then
  291.       b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
  292.     else
  293.       b = bitOr(n * 8192, n / 524288)
  294.     end if
  295.    
  296.     n = bitOr(bitOr(bitAnd(b, c), bitAnd(b, d)), bitAnd(c, d)) + a + x[i + 3] + 1518500249
  297.    
  298.     if(n < 0) then
  299.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  300.     else
  301.       a = bitOr(n * 8, n / 536870912)
  302.     end if
  303.    
  304.     n = bitOr(bitOr(bitAnd(a, b), bitAnd(a, c)), bitAnd(b, c)) + d + x[i + 7] + 1518500249
  305.    
  306.     if(n < 0) then
  307.       d = bitOr(n * 32, bitOr((n + t_iWrap) / 134217728, 16))
  308.     else
  309.       d = bitOr(n * 32, n / 134217728)
  310.     end if
  311.    
  312.     n = bitOr(bitOr(bitAnd(d, a), bitAnd(d, b)), bitAnd(a, b)) + c + x[i + 11] + 1518500249
  313.    
  314.     if(n < 0) then
  315.       c = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  316.     else
  317.       c = bitOr(n * 512, n / 8388608)
  318.     end if
  319.    
  320.     n = bitOr(bitOr(bitAnd(c, d), bitAnd(c, a)), bitAnd(d, a)) + b + x[i + 15] + 1518500249
  321.    
  322.     if(n < 0) then
  323.       b = bitOr(n * 8192, bitOr((n + t_iWrap) / 524288, 4096))
  324.     else
  325.       b = bitOr(n * 8192, n / 524288)
  326.     end if
  327.    
  328.     -- Round(3) --
  329.    
  330.     n = bitXor(bitXor(b, c), d) + a + x[i] + 1859775393
  331.    
  332.     if(n < 0) then
  333.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  334.     else
  335.       a = bitOr(n * 8, n / 536870912)
  336.     end if
  337.    
  338.     n = bitXor(bitXor(a, b), c) + d + x[i + 8] + 1859775393
  339.    
  340.     if(n < 0) then
  341.       d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  342.     else
  343.       d = bitOr(n * 512, n / 8388608)
  344.     end if
  345.    
  346.     n = bitXor(bitXor(d, a), b) + c + x[i + 4] + 1859775393
  347.    
  348.     if(n < 0) then
  349.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  350.     else
  351.       c = bitOr(n * 2048, n / 2097152)
  352.     end if
  353.    
  354.     n = bitXor(bitXor(c, d), a) + b + x[i + 12] + 1859775393
  355.    
  356.     if(n < 0) then
  357.       b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
  358.     else
  359.       b = bitOr(n * 32768, n / 131072)
  360.     end if
  361.    
  362.     n = bitXor(bitXor(b, c), d) + a + x[i + 2] + 1859775393
  363.    
  364.     if(n < 0) then
  365.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  366.     else
  367.       a = bitOr(n * 8, n / 536870912)
  368.     end if
  369.    
  370.     n = bitXor(bitXor(a, b), c) + d + x[i + 10] + 1859775393
  371.    
  372.     if(n < 0) then
  373.       d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  374.     else
  375.       d = bitOr(n * 512, n / 8388608)
  376.     end if
  377.    
  378.     n = bitXor(bitXor(d, a), b) + c + x[i + 6] + 1859775393
  379.    
  380.     if(n < 0) then
  381.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  382.     else
  383.       c = bitOr(n * 2048, n / 2097152)
  384.     end if
  385.    
  386.     n = bitXor(bitXor(c, d), a) + b + x[i + 14] + 1859775393
  387.    
  388.     if(n < 0) then
  389.       b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
  390.     else
  391.       b = bitOr(n * 32768, n / 131072)
  392.     end if
  393.    
  394.     n = bitXor(bitXor(b, c), d) + a + x[i + 1] + 1859775393
  395.    
  396.     if(n < 0) then
  397.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  398.     else
  399.       a = bitOr(n * 8, n / 536870912)
  400.     end if
  401.    
  402.     n = bitXor(bitXor(a, b), c) + d + x[i + 9] + 1859775393
  403.    
  404.     if(n < 0) then
  405.       d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  406.     else
  407.       d = bitOr(n * 512, n / 8388608)
  408.     end if
  409.    
  410.     n = bitXor(bitXor(d, a), b) + c + x[i + 5] + 1859775393
  411.    
  412.     if(n < 0) then
  413.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  414.     else
  415.       c = bitOr(n * 2048, n / 2097152)
  416.     end if
  417.    
  418.     n = bitXor(bitXor(c, d), a) + b + x[i + 13] + 1859775393
  419.    
  420.     if(n < 0) then
  421.       b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
  422.     else
  423.       b = bitOr(n * 32768, n / 131072)
  424.     end if
  425.    
  426.     n = bitXor(bitXor(b, c), d) + a + x[i + 3] + 1859775393
  427.    
  428.     if(n < 0) then
  429.       a = bitOr(n * 8, bitOr((n + t_iWrap) / 536870912, 4))
  430.     else
  431.       a = bitOr(n * 8, n / 536870912)
  432.     end if
  433.    
  434.     n = bitXor(bitXor(a, b), c) + d + x[i + 11] + 1859775393
  435.    
  436.     if(n < 0) then
  437.       d = bitOr(n * 512, bitOr((n + t_iWrap) / 8388608, 256))
  438.     else
  439.       d = bitOr(n * 512, n / 8388608)
  440.     end if
  441.    
  442.     n = bitXor(bitXor(d, a), b) + c + x[i + 7] + 1859775393
  443.    
  444.     if(n < 0) then
  445.       c = bitOr(n * 2048, bitOr((n + t_iWrap) / 2097152, 1024))
  446.     else
  447.       c = bitOr(n * 2048, n / 2097152)
  448.     end if
  449.    
  450.     n = bitXor(bitXor(c, d), a) + b + x[i + 15] + 1859775393
  451.    
  452.     if(n < 0) then
  453.       b = bitOr(n * 32768, bitOr((n + t_iWrap) / 131072, 16384))
  454.     else
  455.       b = bitOr(n * 32768, n / 131072)
  456.     end if
  457.    
  458.     a = a + olda
  459.     b = b + oldb
  460.     c = c + oldc
  461.     d = d + oldd
  462.     i = i + 16
  463.    
  464.   end repeat
  465.  
  466.   -- Construct 32 byte 'little-endian' hex string...
  467.  
  468.   t_sHex = "0123456789abcdef"
  469.   t_iArr = [a, b, c, d]
  470.   t_sOut = EMPTY
  471.  
  472.   repeat with i in t_iArr
  473.     if(i > 0) then
  474.       repeat with n = 1 to 4
  475.         j = i mod 16
  476.         i = i / 16
  477.         k = i mod 16
  478.         i = i / 16
  479.         put char (k + 1) of t_sHex after t_sOut
  480.         put char (j + 1) of t_sHex after t_sOut
  481.       end repeat
  482.     else
  483.       i = bitNot(i)
  484.       repeat with n = 1 to 4
  485.         j = i mod 16
  486.         i = i / 16
  487.         k = i mod 16
  488.         i = i / 16
  489.         put char (16 - k) of t_sHex after t_sOut
  490.         put char (16 - j) of t_sHex after t_sOut
  491.       end repeat
  492.     end if
  493.   end repeat
  494.  
  495.   return(t_sOut)
  496.  
  497. end
  498.  
  499. --( end )-- -- -- -- -- -- -- -- -- -- -- -- -- --//
[raw code]