Advertisement
Anonomit

hash

Dec 16th, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 31.24 KB | None | 0 0
  1. local filepath = "hashfile"
  2.  
  3. local tArgs = { ... }
  4.  
  5.  
  6. --[[NOTICE
  7.  
  8. This SHA1 algorithm was created by Jeffrey Friedl.
  9. Code can be found online at
  10. http://regex.info/code/sha1.lua
  11.  
  12. ]]--
  13.  
  14. --[[HOW TO USE
  15.  
  16. local hash_as_hex   = sha1(message)            -- returns a hex string
  17. local hash_as_data  = sha1_binary(message)     -- returns raw bytes
  18. --
  19. local hmac_as_hex   = hmac_sha1(key, message)        -- hex string
  20. local hmac_as_data  = hmac_sha1_binary(key, message) -- raw bytes
  21.  
  22. ]]--
  23.  
  24.  
  25.  
  26. --
  27. -- Return a W32 object for the number zero
  28. --
  29. local function ZERO()
  30.    return {
  31.       false, false, false, false,     false, false, false, false,
  32.       false, false, false, false,     false, false, false, false,
  33.       false, false, false, false,     false, false, false, false,
  34.       false, false, false, false,     false, false, false, false,
  35.    }
  36. end
  37.  
  38. local hex_to_bits = {
  39.    ["0"] = { false, false, false, false },
  40.    ["1"] = { false, false, false, true  },
  41.    ["2"] = { false, false, true,  false },
  42.    ["3"] = { false, false, true,  true  },
  43.  
  44.    ["4"] = { false, true,  false, false },
  45.    ["5"] = { false, true,  false, true  },
  46.    ["6"] = { false, true,  true,  false },
  47.    ["7"] = { false, true,  true,  true  },
  48.  
  49.    ["8"] = { true,  false, false, false },
  50.    ["9"] = { true,  false, false, true  },
  51.    ["A"] = { true,  false, true,  false },
  52.    ["B"] = { true,  false, true,  true  },
  53.  
  54.    ["C"] = { true,  true,  false, false },
  55.    ["D"] = { true,  true,  false, true  },
  56.    ["E"] = { true,  true,  true,  false },
  57.    ["F"] = { true,  true,  true,  true  },
  58.  
  59.    ["a"] = { true,  false, true,  false },
  60.    ["b"] = { true,  false, true,  true  },
  61.    ["c"] = { true,  true,  false, false },
  62.    ["d"] = { true,  true,  false, true  },
  63.    ["e"] = { true,  true,  true,  false },
  64.    ["f"] = { true,  true,  true,  true  },
  65. }
  66.  
  67. --
  68. -- Given a string of 8 hex digits, return a W32 object representing that number
  69. --
  70. local function from_hex(hex)
  71.  
  72.    assert(type(hex) == 'string')
  73.    assert(hex:match('^[0123456789abcdefABCDEF]+$'))
  74.    assert(#hex == 8)
  75.  
  76.    local W32 = { }
  77.  
  78.    for letter in hex:gmatch('.') do
  79.       local b = hex_to_bits[letter]
  80.       assert(b)
  81.       table.insert(W32, 1, b[1])
  82.       table.insert(W32, 1, b[2])
  83.       table.insert(W32, 1, b[3])
  84.       table.insert(W32, 1, b[4])
  85.    end
  86.  
  87.    return W32
  88. end
  89.  
  90. local function COPY(old)
  91.    local W32 = { }
  92.    for k,v in pairs(old) do
  93.       W32[k] = v
  94.    end
  95.  
  96.    return W32
  97. end
  98.  
  99. local function ADD(first, ...)
  100.  
  101.    local a = COPY(first)
  102.  
  103.    local C, b, sum
  104.  
  105.    for v = 1, select('#', ...) do
  106.       b = select(v, ...)
  107.       C = 0
  108.  
  109.       for i = 1, #a do
  110.          sum = (a[i] and 1 or 0)
  111.              + (b[i] and 1 or 0)
  112.              + C
  113.  
  114.          if sum == 0 then
  115.             a[i] = false
  116.             C    = 0
  117.          elseif sum == 1 then
  118.             a[i] = true
  119.             C    = 0
  120.          elseif sum == 2 then
  121.             a[i] = false
  122.             C    = 1
  123.          else
  124.             a[i] = true
  125.             C    = 1
  126.          end
  127.       end
  128.       -- we drop any ending carry
  129.  
  130.    end
  131.  
  132.    return a
  133. end
  134.  
  135. local function XOR(first, ...)
  136.  
  137.    local a = COPY(first)
  138.    local b
  139.    for v = 1, select('#', ...) do
  140.       b = select(v, ...)
  141.       for i = 1, #a do
  142.          a[i] = a[i] ~= b[i]
  143.       end
  144.    end
  145.  
  146.    return a
  147.  
  148. end
  149.  
  150. local function AND(a, b)
  151.  
  152.    local c = ZERO()
  153.  
  154.    for i = 1, #a do
  155.       -- only need to set true bits; other bits remain false
  156.       if  a[i] and b[i] then
  157.          c[i] = true
  158.       end
  159.    end
  160.  
  161.    return c
  162. end
  163.  
  164. local function OR(a, b)
  165.  
  166.    local c = ZERO()
  167.  
  168.    for i = 1, #a do
  169.       -- only need to set true bits; other bits remain false
  170.       if  a[i] or b[i] then
  171.          c[i] = true
  172.       end
  173.    end
  174.  
  175.    return c
  176. end
  177.  
  178. local function OR3(a, b, c)
  179.  
  180.    local d = ZERO()
  181.  
  182.    for i = 1, #a do
  183.       -- only need to set true bits; other bits remain false
  184.       if a[i] or b[i] or c[i] then
  185.          d[i] = true
  186.       end
  187.    end
  188.  
  189.    return d
  190. end
  191.  
  192. local function NOT(a)
  193.  
  194.    local b = ZERO()
  195.  
  196.    for i = 1, #a do
  197.       -- only need to set true bits; other bits remain false
  198.       if not a[i] then
  199.          b[i] = true
  200.       end
  201.    end
  202.  
  203.    return b
  204. end
  205.  
  206. local function ROTATE(bits, a)
  207.  
  208.    local b = COPY(a)
  209.  
  210.    while bits > 0 do
  211.       bits = bits - 1
  212.       table.insert(b, 1, table.remove(b))
  213.    end
  214.  
  215.    return b
  216.  
  217. end
  218.  
  219.  
  220. local binary_to_hex = {
  221.    ["0000"] = "0",
  222.    ["0001"] = "1",
  223.    ["0010"] = "2",
  224.    ["0011"] = "3",
  225.    ["0100"] = "4",
  226.    ["0101"] = "5",
  227.    ["0110"] = "6",
  228.    ["0111"] = "7",
  229.    ["1000"] = "8",
  230.    ["1001"] = "9",
  231.    ["1010"] = "a",
  232.    ["1011"] = "b",
  233.    ["1100"] = "c",
  234.    ["1101"] = "d",
  235.    ["1110"] = "e",
  236.    ["1111"] = "f",
  237. }
  238.  
  239. function asHEX(a)
  240.  
  241.    local hex = ""
  242.    local i = 1
  243.    while i < #a do
  244.       local binary = (a[i + 3] and '1' or '0')
  245.                      ..
  246.                      (a[i + 2] and '1' or '0')
  247.                      ..
  248.                      (a[i + 1] and '1' or '0')
  249.                      ..
  250.                      (a[i + 0] and '1' or '0')
  251.  
  252.       hex = binary_to_hex[binary] .. hex
  253.  
  254.       i = i + 4
  255.    end
  256.  
  257.    return hex
  258.  
  259. end
  260.  
  261. local x67452301 = from_hex("67452301")
  262. local xEFCDAB89 = from_hex("EFCDAB89")
  263. local x98BADCFE = from_hex("98BADCFE")
  264. local x10325476 = from_hex("10325476")
  265. local xC3D2E1F0 = from_hex("C3D2E1F0")
  266.  
  267. local x5A827999 = from_hex("5A827999")
  268. local x6ED9EBA1 = from_hex("6ED9EBA1")
  269. local x8F1BBCDC = from_hex("8F1BBCDC")
  270. local xCA62C1D6 = from_hex("CA62C1D6")
  271.  
  272.  
  273. function sha1(msg)
  274.  
  275.    assert(type(msg) == 'string')
  276.    assert(#msg < 0x7FFFFFFF) -- have no idea what would happen if it were large
  277.  
  278.    local H0 = x67452301
  279.    local H1 = xEFCDAB89
  280.    local H2 = x98BADCFE
  281.    local H3 = x10325476
  282.    local H4 = xC3D2E1F0
  283.  
  284.    local msg_len_in_bits = #msg * 8
  285.  
  286.    local first_append = string.char(0x80) -- append a '1' bit plus seven '0' bits
  287.  
  288.    local non_zero_message_bytes = #msg +1 +8 -- the +1 is the appended bit 1, the +8 are for the final appended length
  289.    local current_mod = non_zero_message_bytes % 64
  290.    local second_append = ""
  291.    if current_mod ~= 0 then
  292.       second_append = string.rep(string.char(0), 64 - current_mod)
  293.    end
  294.  
  295.    -- now to append the length as a 64-bit number.
  296.    local B1, R1 = math.modf(msg_len_in_bits  / 0x01000000)
  297.    local B2, R2 = math.modf( 0x01000000 * R1 / 0x00010000)
  298.    local B3, R3 = math.modf( 0x00010000 * R2 / 0x00000100)
  299.    local B4     =            0x00000100 * R3
  300.  
  301.    local L64 = string.char( 0) .. string.char( 0) .. string.char( 0) .. string.char( 0) -- high 32 bits
  302.             .. string.char(B1) .. string.char(B2) .. string.char(B3) .. string.char(B4) --  low 32 bits
  303.  
  304.  
  305.  
  306.    msg = msg .. first_append .. second_append .. L64        
  307.  
  308.    assert(#msg % 64 == 0)
  309.  
  310.    --local fd = io.open("/tmp/msg", "wb")
  311.    --fd:write(msg)
  312.    --fd:close()
  313.  
  314.    local chunks = #msg / 64
  315.  
  316.    local W = { }
  317.    local start, A, B, C, D, E, f, K, TEMP
  318.    local chunk = 0
  319.  
  320.    while chunk < chunks do
  321.       --
  322.       -- break chunk up into W[0] through W[15]
  323.       --
  324.       start = chunk * 64 + 1
  325.       chunk = chunk + 1
  326.  
  327.       for t = 0, 15 do
  328.          W[t] = from_hex(string.format("%02x%02x%02x%02x", msg:byte(start, start + 3)))
  329.          start = start + 4
  330.       end
  331.  
  332.       --
  333.       -- build W[16] through W[79]
  334.       --
  335.       for t = 16, 79 do
  336.          -- For t = 16 to 79 let Wt = S1(Wt-3 XOR Wt-8 XOR Wt-14 XOR Wt-16).
  337.          W[t] = ROTATE(1, XOR(W[t-3], W[t-8], W[t-14], W[t-16]))
  338.       end
  339.  
  340.       A = H0
  341.       B = H1
  342.       C = H2
  343.       D = H3
  344.       E = H4
  345.  
  346.       for t = 0, 79 do
  347.          if t <= 19 then
  348.             -- (B AND C) OR ((NOT B) AND D)
  349.             f = OR(AND(B, C), AND(NOT(B), D))
  350.             K = x5A827999
  351.          elseif t <= 39 then
  352.             -- B XOR C XOR D
  353.             f = XOR(B, C, D)
  354.             K = x6ED9EBA1
  355.          elseif t <= 59 then
  356.             -- (B AND C) OR (B AND D) OR (C AND D
  357.             f = OR3(AND(B, C), AND(B, D), AND(C, D))
  358.             K = x8F1BBCDC
  359.          else
  360.             -- B XOR C XOR D
  361.             f = XOR(B, C, D)
  362.             K = xCA62C1D6
  363.          end
  364.  
  365.          -- TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
  366.          TEMP = ADD(ROTATE(5, A), f, E, W[t], K)
  367.  
  368.          --E = D;   D = C;    C = S30(B);   B = A;   A = TEMP;
  369.          E = D
  370.          D = C
  371.          C = ROTATE(30, B)
  372.          B = A
  373.          A = TEMP
  374.  
  375.          --printf("t = %2d: %s  %s  %s  %s  %s", t, A:HEX(), B:HEX(), C:HEX(), D:HEX(), E:HEX())
  376.       end
  377.  
  378.       -- Let H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
  379.       H0 = ADD(H0, A)
  380.       H1 = ADD(H1, B)
  381.       H2 = ADD(H2, C)
  382.       H3 = ADD(H3, D)
  383.       H4 = ADD(H4, E)
  384.    end
  385.  
  386.    return asHEX(H0) .. asHEX(H1) .. asHEX(H2) .. asHEX(H3) .. asHEX(H4)
  387. end
  388.  
  389. local function hex_to_binary(hex)
  390.    return hex:gsub('..', function(hexval)
  391.                             return string.char(tonumber(hexval, 16))
  392.                          end)
  393. end
  394.  
  395. function sha1_binary(msg)
  396.    return hex_to_binary(sha1(msg))
  397. end
  398.  
  399. local xor_with_0x5c = {
  400.    [string.char(  0)] = string.char( 92),   [string.char(  1)] = string.char( 93),
  401.    [string.char(  2)] = string.char( 94),   [string.char(  3)] = string.char( 95),
  402.    [string.char(  4)] = string.char( 88),   [string.char(  5)] = string.char( 89),
  403.    [string.char(  6)] = string.char( 90),   [string.char(  7)] = string.char( 91),
  404.    [string.char(  8)] = string.char( 84),   [string.char(  9)] = string.char( 85),
  405.    [string.char( 10)] = string.char( 86),   [string.char( 11)] = string.char( 87),
  406.    [string.char( 12)] = string.char( 80),   [string.char( 13)] = string.char( 81),
  407.    [string.char( 14)] = string.char( 82),   [string.char( 15)] = string.char( 83),
  408.    [string.char( 16)] = string.char( 76),   [string.char( 17)] = string.char( 77),
  409.    [string.char( 18)] = string.char( 78),   [string.char( 19)] = string.char( 79),
  410.    [string.char( 20)] = string.char( 72),   [string.char( 21)] = string.char( 73),
  411.    [string.char( 22)] = string.char( 74),   [string.char( 23)] = string.char( 75),
  412.    [string.char( 24)] = string.char( 68),   [string.char( 25)] = string.char( 69),
  413.    [string.char( 26)] = string.char( 70),   [string.char( 27)] = string.char( 71),
  414.    [string.char( 28)] = string.char( 64),   [string.char( 29)] = string.char( 65),
  415.    [string.char( 30)] = string.char( 66),   [string.char( 31)] = string.char( 67),
  416.    [string.char( 32)] = string.char(124),   [string.char( 33)] = string.char(125),
  417.    [string.char( 34)] = string.char(126),   [string.char( 35)] = string.char(127),
  418.    [string.char( 36)] = string.char(120),   [string.char( 37)] = string.char(121),
  419.    [string.char( 38)] = string.char(122),   [string.char( 39)] = string.char(123),
  420.    [string.char( 40)] = string.char(116),   [string.char( 41)] = string.char(117),
  421.    [string.char( 42)] = string.char(118),   [string.char( 43)] = string.char(119),
  422.    [string.char( 44)] = string.char(112),   [string.char( 45)] = string.char(113),
  423.    [string.char( 46)] = string.char(114),   [string.char( 47)] = string.char(115),
  424.    [string.char( 48)] = string.char(108),   [string.char( 49)] = string.char(109),
  425.    [string.char( 50)] = string.char(110),   [string.char( 51)] = string.char(111),
  426.    [string.char( 52)] = string.char(104),   [string.char( 53)] = string.char(105),
  427.    [string.char( 54)] = string.char(106),   [string.char( 55)] = string.char(107),
  428.    [string.char( 56)] = string.char(100),   [string.char( 57)] = string.char(101),
  429.    [string.char( 58)] = string.char(102),   [string.char( 59)] = string.char(103),
  430.    [string.char( 60)] = string.char( 96),   [string.char( 61)] = string.char( 97),
  431.    [string.char( 62)] = string.char( 98),   [string.char( 63)] = string.char( 99),
  432.    [string.char( 64)] = string.char( 28),   [string.char( 65)] = string.char( 29),
  433.    [string.char( 66)] = string.char( 30),   [string.char( 67)] = string.char( 31),
  434.    [string.char( 68)] = string.char( 24),   [string.char( 69)] = string.char( 25),
  435.    [string.char( 70)] = string.char( 26),   [string.char( 71)] = string.char( 27),
  436.    [string.char( 72)] = string.char( 20),   [string.char( 73)] = string.char( 21),
  437.    [string.char( 74)] = string.char( 22),   [string.char( 75)] = string.char( 23),
  438.    [string.char( 76)] = string.char( 16),   [string.char( 77)] = string.char( 17),
  439.    [string.char( 78)] = string.char( 18),   [string.char( 79)] = string.char( 19),
  440.    [string.char( 80)] = string.char( 12),   [string.char( 81)] = string.char( 13),
  441.    [string.char( 82)] = string.char( 14),   [string.char( 83)] = string.char( 15),
  442.    [string.char( 84)] = string.char(  8),   [string.char( 85)] = string.char(  9),
  443.    [string.char( 86)] = string.char( 10),   [string.char( 87)] = string.char( 11),
  444.    [string.char( 88)] = string.char(  4),   [string.char( 89)] = string.char(  5),
  445.    [string.char( 90)] = string.char(  6),   [string.char( 91)] = string.char(  7),
  446.    [string.char( 92)] = string.char(  0),   [string.char( 93)] = string.char(  1),
  447.    [string.char( 94)] = string.char(  2),   [string.char( 95)] = string.char(  3),
  448.    [string.char( 96)] = string.char( 60),   [string.char( 97)] = string.char( 61),
  449.    [string.char( 98)] = string.char( 62),   [string.char( 99)] = string.char( 63),
  450.    [string.char(100)] = string.char( 56),   [string.char(101)] = string.char( 57),
  451.    [string.char(102)] = string.char( 58),   [string.char(103)] = string.char( 59),
  452.    [string.char(104)] = string.char( 52),   [string.char(105)] = string.char( 53),
  453.    [string.char(106)] = string.char( 54),   [string.char(107)] = string.char( 55),
  454.    [string.char(108)] = string.char( 48),   [string.char(109)] = string.char( 49),
  455.    [string.char(110)] = string.char( 50),   [string.char(111)] = string.char( 51),
  456.    [string.char(112)] = string.char( 44),   [string.char(113)] = string.char( 45),
  457.    [string.char(114)] = string.char( 46),   [string.char(115)] = string.char( 47),
  458.    [string.char(116)] = string.char( 40),   [string.char(117)] = string.char( 41),
  459.    [string.char(118)] = string.char( 42),   [string.char(119)] = string.char( 43),
  460.    [string.char(120)] = string.char( 36),   [string.char(121)] = string.char( 37),
  461.    [string.char(122)] = string.char( 38),   [string.char(123)] = string.char( 39),
  462.    [string.char(124)] = string.char( 32),   [string.char(125)] = string.char( 33),
  463.    [string.char(126)] = string.char( 34),   [string.char(127)] = string.char( 35),
  464.    [string.char(128)] = string.char(220),   [string.char(129)] = string.char(221),
  465.    [string.char(130)] = string.char(222),   [string.char(131)] = string.char(223),
  466.    [string.char(132)] = string.char(216),   [string.char(133)] = string.char(217),
  467.    [string.char(134)] = string.char(218),   [string.char(135)] = string.char(219),
  468.    [string.char(136)] = string.char(212),   [string.char(137)] = string.char(213),
  469.    [string.char(138)] = string.char(214),   [string.char(139)] = string.char(215),
  470.    [string.char(140)] = string.char(208),   [string.char(141)] = string.char(209),
  471.    [string.char(142)] = string.char(210),   [string.char(143)] = string.char(211),
  472.    [string.char(144)] = string.char(204),   [string.char(145)] = string.char(205),
  473.    [string.char(146)] = string.char(206),   [string.char(147)] = string.char(207),
  474.    [string.char(148)] = string.char(200),   [string.char(149)] = string.char(201),
  475.    [string.char(150)] = string.char(202),   [string.char(151)] = string.char(203),
  476.    [string.char(152)] = string.char(196),   [string.char(153)] = string.char(197),
  477.    [string.char(154)] = string.char(198),   [string.char(155)] = string.char(199),
  478.    [string.char(156)] = string.char(192),   [string.char(157)] = string.char(193),
  479.    [string.char(158)] = string.char(194),   [string.char(159)] = string.char(195),
  480.    [string.char(160)] = string.char(252),   [string.char(161)] = string.char(253),
  481.    [string.char(162)] = string.char(254),   [string.char(163)] = string.char(255),
  482.    [string.char(164)] = string.char(248),   [string.char(165)] = string.char(249),
  483.    [string.char(166)] = string.char(250),   [string.char(167)] = string.char(251),
  484.    [string.char(168)] = string.char(244),   [string.char(169)] = string.char(245),
  485.    [string.char(170)] = string.char(246),   [string.char(171)] = string.char(247),
  486.    [string.char(172)] = string.char(240),   [string.char(173)] = string.char(241),
  487.    [string.char(174)] = string.char(242),   [string.char(175)] = string.char(243),
  488.    [string.char(176)] = string.char(236),   [string.char(177)] = string.char(237),
  489.    [string.char(178)] = string.char(238),   [string.char(179)] = string.char(239),
  490.    [string.char(180)] = string.char(232),   [string.char(181)] = string.char(233),
  491.    [string.char(182)] = string.char(234),   [string.char(183)] = string.char(235),
  492.    [string.char(184)] = string.char(228),   [string.char(185)] = string.char(229),
  493.    [string.char(186)] = string.char(230),   [string.char(187)] = string.char(231),
  494.    [string.char(188)] = string.char(224),   [string.char(189)] = string.char(225),
  495.    [string.char(190)] = string.char(226),   [string.char(191)] = string.char(227),
  496.    [string.char(192)] = string.char(156),   [string.char(193)] = string.char(157),
  497.    [string.char(194)] = string.char(158),   [string.char(195)] = string.char(159),
  498.    [string.char(196)] = string.char(152),   [string.char(197)] = string.char(153),
  499.    [string.char(198)] = string.char(154),   [string.char(199)] = string.char(155),
  500.    [string.char(200)] = string.char(148),   [string.char(201)] = string.char(149),
  501.    [string.char(202)] = string.char(150),   [string.char(203)] = string.char(151),
  502.    [string.char(204)] = string.char(144),   [string.char(205)] = string.char(145),
  503.    [string.char(206)] = string.char(146),   [string.char(207)] = string.char(147),
  504.    [string.char(208)] = string.char(140),   [string.char(209)] = string.char(141),
  505.    [string.char(210)] = string.char(142),   [string.char(211)] = string.char(143),
  506.    [string.char(212)] = string.char(136),   [string.char(213)] = string.char(137),
  507.    [string.char(214)] = string.char(138),   [string.char(215)] = string.char(139),
  508.    [string.char(216)] = string.char(132),   [string.char(217)] = string.char(133),
  509.    [string.char(218)] = string.char(134),   [string.char(219)] = string.char(135),
  510.    [string.char(220)] = string.char(128),   [string.char(221)] = string.char(129),
  511.    [string.char(222)] = string.char(130),   [string.char(223)] = string.char(131),
  512.    [string.char(224)] = string.char(188),   [string.char(225)] = string.char(189),
  513.    [string.char(226)] = string.char(190),   [string.char(227)] = string.char(191),
  514.    [string.char(228)] = string.char(184),   [string.char(229)] = string.char(185),
  515.    [string.char(230)] = string.char(186),   [string.char(231)] = string.char(187),
  516.    [string.char(232)] = string.char(180),   [string.char(233)] = string.char(181),
  517.    [string.char(234)] = string.char(182),   [string.char(235)] = string.char(183),
  518.    [string.char(236)] = string.char(176),   [string.char(237)] = string.char(177),
  519.    [string.char(238)] = string.char(178),   [string.char(239)] = string.char(179),
  520.    [string.char(240)] = string.char(172),   [string.char(241)] = string.char(173),
  521.    [string.char(242)] = string.char(174),   [string.char(243)] = string.char(175),
  522.    [string.char(244)] = string.char(168),   [string.char(245)] = string.char(169),
  523.    [string.char(246)] = string.char(170),   [string.char(247)] = string.char(171),
  524.    [string.char(248)] = string.char(164),   [string.char(249)] = string.char(165),
  525.    [string.char(250)] = string.char(166),   [string.char(251)] = string.char(167),
  526.    [string.char(252)] = string.char(160),   [string.char(253)] = string.char(161),
  527.    [string.char(254)] = string.char(162),   [string.char(255)] = string.char(163),
  528. }
  529.  
  530. local xor_with_0x36 = {
  531.    [string.char(  0)] = string.char( 54),   [string.char(  1)] = string.char( 55),
  532.    [string.char(  2)] = string.char( 52),   [string.char(  3)] = string.char( 53),
  533.    [string.char(  4)] = string.char( 50),   [string.char(  5)] = string.char( 51),
  534.    [string.char(  6)] = string.char( 48),   [string.char(  7)] = string.char( 49),
  535.    [string.char(  8)] = string.char( 62),   [string.char(  9)] = string.char( 63),
  536.    [string.char( 10)] = string.char( 60),   [string.char( 11)] = string.char( 61),
  537.    [string.char( 12)] = string.char( 58),   [string.char( 13)] = string.char( 59),
  538.    [string.char( 14)] = string.char( 56),   [string.char( 15)] = string.char( 57),
  539.    [string.char( 16)] = string.char( 38),   [string.char( 17)] = string.char( 39),
  540.    [string.char( 18)] = string.char( 36),   [string.char( 19)] = string.char( 37),
  541.    [string.char( 20)] = string.char( 34),   [string.char( 21)] = string.char( 35),
  542.    [string.char( 22)] = string.char( 32),   [string.char( 23)] = string.char( 33),
  543.    [string.char( 24)] = string.char( 46),   [string.char( 25)] = string.char( 47),
  544.    [string.char( 26)] = string.char( 44),   [string.char( 27)] = string.char( 45),
  545.    [string.char( 28)] = string.char( 42),   [string.char( 29)] = string.char( 43),
  546.    [string.char( 30)] = string.char( 40),   [string.char( 31)] = string.char( 41),
  547.    [string.char( 32)] = string.char( 22),   [string.char( 33)] = string.char( 23),
  548.    [string.char( 34)] = string.char( 20),   [string.char( 35)] = string.char( 21),
  549.    [string.char( 36)] = string.char( 18),   [string.char( 37)] = string.char( 19),
  550.    [string.char( 38)] = string.char( 16),   [string.char( 39)] = string.char( 17),
  551.    [string.char( 40)] = string.char( 30),   [string.char( 41)] = string.char( 31),
  552.    [string.char( 42)] = string.char( 28),   [string.char( 43)] = string.char( 29),
  553.    [string.char( 44)] = string.char( 26),   [string.char( 45)] = string.char( 27),
  554.    [string.char( 46)] = string.char( 24),   [string.char( 47)] = string.char( 25),
  555.    [string.char( 48)] = string.char(  6),   [string.char( 49)] = string.char(  7),
  556.    [string.char( 50)] = string.char(  4),   [string.char( 51)] = string.char(  5),
  557.    [string.char( 52)] = string.char(  2),   [string.char( 53)] = string.char(  3),
  558.    [string.char( 54)] = string.char(  0),   [string.char( 55)] = string.char(  1),
  559.    [string.char( 56)] = string.char( 14),   [string.char( 57)] = string.char( 15),
  560.    [string.char( 58)] = string.char( 12),   [string.char( 59)] = string.char( 13),
  561.    [string.char( 60)] = string.char( 10),   [string.char( 61)] = string.char( 11),
  562.    [string.char( 62)] = string.char(  8),   [string.char( 63)] = string.char(  9),
  563.    [string.char( 64)] = string.char(118),   [string.char( 65)] = string.char(119),
  564.    [string.char( 66)] = string.char(116),   [string.char( 67)] = string.char(117),
  565.    [string.char( 68)] = string.char(114),   [string.char( 69)] = string.char(115),
  566.    [string.char( 70)] = string.char(112),   [string.char( 71)] = string.char(113),
  567.    [string.char( 72)] = string.char(126),   [string.char( 73)] = string.char(127),
  568.    [string.char( 74)] = string.char(124),   [string.char( 75)] = string.char(125),
  569.    [string.char( 76)] = string.char(122),   [string.char( 77)] = string.char(123),
  570.    [string.char( 78)] = string.char(120),   [string.char( 79)] = string.char(121),
  571.    [string.char( 80)] = string.char(102),   [string.char( 81)] = string.char(103),
  572.    [string.char( 82)] = string.char(100),   [string.char( 83)] = string.char(101),
  573.    [string.char( 84)] = string.char( 98),   [string.char( 85)] = string.char( 99),
  574.    [string.char( 86)] = string.char( 96),   [string.char( 87)] = string.char( 97),
  575.    [string.char( 88)] = string.char(110),   [string.char( 89)] = string.char(111),
  576.    [string.char( 90)] = string.char(108),   [string.char( 91)] = string.char(109),
  577.    [string.char( 92)] = string.char(106),   [string.char( 93)] = string.char(107),
  578.    [string.char( 94)] = string.char(104),   [string.char( 95)] = string.char(105),
  579.    [string.char( 96)] = string.char( 86),   [string.char( 97)] = string.char( 87),
  580.    [string.char( 98)] = string.char( 84),   [string.char( 99)] = string.char( 85),
  581.    [string.char(100)] = string.char( 82),   [string.char(101)] = string.char( 83),
  582.    [string.char(102)] = string.char( 80),   [string.char(103)] = string.char( 81),
  583.    [string.char(104)] = string.char( 94),   [string.char(105)] = string.char( 95),
  584.    [string.char(106)] = string.char( 92),   [string.char(107)] = string.char( 93),
  585.    [string.char(108)] = string.char( 90),   [string.char(109)] = string.char( 91),
  586.    [string.char(110)] = string.char( 88),   [string.char(111)] = string.char( 89),
  587.    [string.char(112)] = string.char( 70),   [string.char(113)] = string.char( 71),
  588.    [string.char(114)] = string.char( 68),   [string.char(115)] = string.char( 69),
  589.    [string.char(116)] = string.char( 66),   [string.char(117)] = string.char( 67),
  590.    [string.char(118)] = string.char( 64),   [string.char(119)] = string.char( 65),
  591.    [string.char(120)] = string.char( 78),   [string.char(121)] = string.char( 79),
  592.    [string.char(122)] = string.char( 76),   [string.char(123)] = string.char( 77),
  593.    [string.char(124)] = string.char( 74),   [string.char(125)] = string.char( 75),
  594.    [string.char(126)] = string.char( 72),   [string.char(127)] = string.char( 73),
  595.    [string.char(128)] = string.char(182),   [string.char(129)] = string.char(183),
  596.    [string.char(130)] = string.char(180),   [string.char(131)] = string.char(181),
  597.    [string.char(132)] = string.char(178),   [string.char(133)] = string.char(179),
  598.    [string.char(134)] = string.char(176),   [string.char(135)] = string.char(177),
  599.    [string.char(136)] = string.char(190),   [string.char(137)] = string.char(191),
  600.    [string.char(138)] = string.char(188),   [string.char(139)] = string.char(189),
  601.    [string.char(140)] = string.char(186),   [string.char(141)] = string.char(187),
  602.    [string.char(142)] = string.char(184),   [string.char(143)] = string.char(185),
  603.    [string.char(144)] = string.char(166),   [string.char(145)] = string.char(167),
  604.    [string.char(146)] = string.char(164),   [string.char(147)] = string.char(165),
  605.    [string.char(148)] = string.char(162),   [string.char(149)] = string.char(163),
  606.    [string.char(150)] = string.char(160),   [string.char(151)] = string.char(161),
  607.    [string.char(152)] = string.char(174),   [string.char(153)] = string.char(175),
  608.    [string.char(154)] = string.char(172),   [string.char(155)] = string.char(173),
  609.    [string.char(156)] = string.char(170),   [string.char(157)] = string.char(171),
  610.    [string.char(158)] = string.char(168),   [string.char(159)] = string.char(169),
  611.    [string.char(160)] = string.char(150),   [string.char(161)] = string.char(151),
  612.    [string.char(162)] = string.char(148),   [string.char(163)] = string.char(149),
  613.    [string.char(164)] = string.char(146),   [string.char(165)] = string.char(147),
  614.    [string.char(166)] = string.char(144),   [string.char(167)] = string.char(145),
  615.    [string.char(168)] = string.char(158),   [string.char(169)] = string.char(159),
  616.    [string.char(170)] = string.char(156),   [string.char(171)] = string.char(157),
  617.    [string.char(172)] = string.char(154),   [string.char(173)] = string.char(155),
  618.    [string.char(174)] = string.char(152),   [string.char(175)] = string.char(153),
  619.    [string.char(176)] = string.char(134),   [string.char(177)] = string.char(135),
  620.    [string.char(178)] = string.char(132),   [string.char(179)] = string.char(133),
  621.    [string.char(180)] = string.char(130),   [string.char(181)] = string.char(131),
  622.    [string.char(182)] = string.char(128),   [string.char(183)] = string.char(129),
  623.    [string.char(184)] = string.char(142),   [string.char(185)] = string.char(143),
  624.    [string.char(186)] = string.char(140),   [string.char(187)] = string.char(141),
  625.    [string.char(188)] = string.char(138),   [string.char(189)] = string.char(139),
  626.    [string.char(190)] = string.char(136),   [string.char(191)] = string.char(137),
  627.    [string.char(192)] = string.char(246),   [string.char(193)] = string.char(247),
  628.    [string.char(194)] = string.char(244),   [string.char(195)] = string.char(245),
  629.    [string.char(196)] = string.char(242),   [string.char(197)] = string.char(243),
  630.    [string.char(198)] = string.char(240),   [string.char(199)] = string.char(241),
  631.    [string.char(200)] = string.char(254),   [string.char(201)] = string.char(255),
  632.    [string.char(202)] = string.char(252),   [string.char(203)] = string.char(253),
  633.    [string.char(204)] = string.char(250),   [string.char(205)] = string.char(251),
  634.    [string.char(206)] = string.char(248),   [string.char(207)] = string.char(249),
  635.    [string.char(208)] = string.char(230),   [string.char(209)] = string.char(231),
  636.    [string.char(210)] = string.char(228),   [string.char(211)] = string.char(229),
  637.    [string.char(212)] = string.char(226),   [string.char(213)] = string.char(227),
  638.    [string.char(214)] = string.char(224),   [string.char(215)] = string.char(225),
  639.    [string.char(216)] = string.char(238),   [string.char(217)] = string.char(239),
  640.    [string.char(218)] = string.char(236),   [string.char(219)] = string.char(237),
  641.    [string.char(220)] = string.char(234),   [string.char(221)] = string.char(235),
  642.    [string.char(222)] = string.char(232),   [string.char(223)] = string.char(233),
  643.    [string.char(224)] = string.char(214),   [string.char(225)] = string.char(215),
  644.    [string.char(226)] = string.char(212),   [string.char(227)] = string.char(213),
  645.    [string.char(228)] = string.char(210),   [string.char(229)] = string.char(211),
  646.    [string.char(230)] = string.char(208),   [string.char(231)] = string.char(209),
  647.    [string.char(232)] = string.char(222),   [string.char(233)] = string.char(223),
  648.    [string.char(234)] = string.char(220),   [string.char(235)] = string.char(221),
  649.    [string.char(236)] = string.char(218),   [string.char(237)] = string.char(219),
  650.    [string.char(238)] = string.char(216),   [string.char(239)] = string.char(217),
  651.    [string.char(240)] = string.char(198),   [string.char(241)] = string.char(199),
  652.    [string.char(242)] = string.char(196),   [string.char(243)] = string.char(197),
  653.    [string.char(244)] = string.char(194),   [string.char(245)] = string.char(195),
  654.    [string.char(246)] = string.char(192),   [string.char(247)] = string.char(193),
  655.    [string.char(248)] = string.char(206),   [string.char(249)] = string.char(207),
  656.    [string.char(250)] = string.char(204),   [string.char(251)] = string.char(205),
  657.    [string.char(252)] = string.char(202),   [string.char(253)] = string.char(203),
  658.    [string.char(254)] = string.char(200),   [string.char(255)] = string.char(201),
  659. }
  660.  
  661.  
  662. local blocksize = 64 -- 512 bits
  663.  
  664. function hmac_sha1(key, text)
  665.    assert(type(key)  == 'string', "key passed to hmac_sha1 should be a string")
  666.    assert(type(text) == 'string', "text passed to hmac_sha1 should be a string")
  667.  
  668.    if #key > blocksize then
  669.       key = sha1_binary(key)
  670.    end
  671.  
  672.    local key_xord_with_0x36 = key:gsub('.', xor_with_0x36) .. string.rep(string.char(0x36), blocksize - #key)
  673.    local key_xord_with_0x5c = key:gsub('.', xor_with_0x5c) .. string.rep(string.char(0x5c), blocksize - #key)
  674.  
  675.    return sha1(key_xord_with_0x5c .. sha1_binary(key_xord_with_0x36 .. text))
  676. end
  677.  
  678. function hmac_sha1_binary(key, text)
  679.    return hex_to_binary(hmac_sha1(key, text))
  680. end
  681.  
  682.  
  683. if tArgs[1] and tArgs[2] then
  684.     if not fs.exists( filepath ) then
  685.         local file = fs.open( filepath, "w" )
  686.         local hash = hmac_sha1( tArgs[1], tArgs[2] )
  687.         file.writeLine( hash )
  688.         file.close()
  689.         print( "Saved hash " .. hash .. " to file " .. filepath )
  690.     else
  691.         print( "[ERROR]: File " .. filepath .. " Exists!" )
  692.     end
  693. else
  694.     print( "Usage:" )
  695. print( shell.getRunningProgram() .. " <key> <text>" )
  696. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement