Merge with Waqas.
authorTobias Markmann <tm@ayena.de>
Thu, 3 Dec 2009 20:53:36 +0000 (21:53 +0100)
committerTobias Markmann <tm@ayena.de>
Thu, 3 Dec 2009 20:53:36 +0000 (21:53 +0100)
1  2 
util/hmac.lua
util/sasl/plain.lua
util/sasl/scram.lua

diff --cc util/hmac.lua
index ffd69d91e9444625b5919961ad69e6cd7bbe29bb,ffd69d91e9444625b5919961ad69e6cd7bbe29bb..18c559b220d17fe0afbeaf0eaebd51e8dc3a621d
@@@ -7,20 -7,20 +7,27 @@@
  --
  
  local hashes = require "util.hashes"
--local xor = require "bit".bxor
  
--local t_insert, t_concat = table.insert, table.concat;
  local s_char = string.char;
++local s_gsub = string.gsub;
++local s_rep = string.rep;
  
  module "hmac"
  
--local function arraystr(array)
--      local t = {}
--      for i = 1,#array do
--              t_insert(t, s_char(array[i]))
--      end
--
--      return t_concat(t)
++local xor_map = {0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;1;0;3;2;5;4;7;6;9;8;11;10;13;12;15;14;2;3;0;1;6;7;4;5;10;11;8;9;14;15;12;13;3;2;1;0;7;6;5;4;11;10;9;8;15;14;13;12;4;5;6;7;0;1;2;3;12;13;14;15;8;9;10;11;5;4;7;6;1;0;3;2;13;12;15;14;9;8;11;10;6;7;4;5;2;3;0;1;14;15;12;13;10;11;8;9;7;6;5;4;3;2;1;0;15;14;13;12;11;10;9;8;8;9;10;11;12;13;14;15;0;1;2;3;4;5;6;7;9;8;11;10;13;12;15;14;1;0;3;2;5;4;7;6;10;11;8;9;14;15;12;13;2;3;0;1;6;7;4;5;11;10;9;8;15;14;13;12;3;2;1;0;7;6;5;4;12;13;14;15;8;9;10;11;4;5;6;7;0;1;2;3;13;12;15;14;9;8;11;10;5;4;7;6;1;0;3;2;14;15;12;13;10;11;8;9;6;7;4;5;2;3;0;1;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1;0;};
++local function xor(x, y)
++      local lowx, lowy = x % 16, y % 16;
++      local hix, hiy = (x - lowx) / 16, (y - lowy) / 16;
++      local lowr, hir = xor_map[lowx * 16 + lowy + 1], xor_map[hix * 16 + hiy + 1];
++      local r = hir * 16 + lowr;
++      return r;
++end
++local opadc, ipadc = s_char(0x5c), s_char(0x36);
++local ipad_map = {};
++local opad_map = {};
++for i=0,255 do
++      ipad_map[s_char(i)] = s_char(xor(0x36, i));
++      opad_map[s_char(i)] = s_char(xor(0x5c, i));
  end
  
  --[[
@@@ -36,31 -36,31 +43,15 @@@ he
    return raw hash or hexadecimal string
  --]]
  function hmac(key, message, hash, blocksize, hex)
--      local opad = {}
--      local ipad = {}
--      
--      for i = 1,blocksize do
--              opad[i] = 0x5c
--              ipad[i] = 0x36
--      end
--
        if #key > blocksize then
                key = hash(key)
        end
  
--      for i = 1,#key do
--              ipad[i] = xor(ipad[i],key:sub(i,i):byte())
--              opad[i] = xor(opad[i],key:sub(i,i):byte())
--      end
--
--      opad = arraystr(opad)
--      ipad = arraystr(ipad)
++      local padding = blocksize - #key;
++      local ipad = s_gsub(key, ".", ipad_map)..s_rep(ipadc, padding);
++      local opad = s_gsub(key, ".", opad_map)..s_rep(opadc, padding);
  
--      if hex then
--              return hash(opad..hash(ipad..message), true)
--      else
--              return hash(opad..hash(ipad..message))
--      end
++      return hash(opad..hash(ipad..message), hex)
  end
  
  function md5(key, message, hex)
index a4c8765da7a523c858f629d31a75ea1e3898060b,a4c8765da7a523c858f629d31a75ea1e3898060b..ae5c777a77423f466ecd5977f696e0f9bec7e313
@@@ -24,7 -24,7 +24,7 @@@ local function plain(self, message
                return "failure", "malformed-request";
        end
  
--      local authorization, authentication, password = s_match(message, "^([^%z]+)%z([^%z]+)%z([^%z]+)");
++      local authorization, authentication, password = s_match(message, "^([^%z]*)%z([^%z]+)%z([^%z]+)");
  
        if not authorization then
                return "failure", "malformed-request";
index be82c60e0f8adcd4e4e2af456f2a2b5914cf2c90,be82c60e0f8adcd4e4e2af456f2a2b5914cf2c90..4f80052908cd7148b8d123edfaa5e61f36d02a48
@@@ -21,6 -21,6 +21,9 @@@ local sha1 = require "util.hashes".sha1
  local generate_uuid = require "util.uuid".generate;
  local saslprep = require "util.encodings".stringprep.saslprep;
  local log = require "util.logger".init("sasl");
++local t_concat = table.concat;
++local char = string.char;
++local byte = string.byte;
  
  module "scram"
  
@@@ -36,17 -36,17 +39,19 @@@ local function bp( b 
        return result
  end
  
++local xor_map = {0;1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;1;0;3;2;5;4;7;6;9;8;11;10;13;12;15;14;2;3;0;1;6;7;4;5;10;11;8;9;14;15;12;13;3;2;1;0;7;6;5;4;11;10;9;8;15;14;13;12;4;5;6;7;0;1;2;3;12;13;14;15;8;9;10;11;5;4;7;6;1;0;3;2;13;12;15;14;9;8;11;10;6;7;4;5;2;3;0;1;14;15;12;13;10;11;8;9;7;6;5;4;3;2;1;0;15;14;13;12;11;10;9;8;8;9;10;11;12;13;14;15;0;1;2;3;4;5;6;7;9;8;11;10;13;12;15;14;1;0;3;2;5;4;7;6;10;11;8;9;14;15;12;13;2;3;0;1;6;7;4;5;11;10;9;8;15;14;13;12;3;2;1;0;7;6;5;4;12;13;14;15;8;9;10;11;4;5;6;7;0;1;2;3;13;12;15;14;9;8;11;10;5;4;7;6;1;0;3;2;14;15;12;13;10;11;8;9;6;7;4;5;2;3;0;1;15;14;13;12;11;10;9;8;7;6;5;4;3;2;1;0;};
++
++local result = {};
  local function binaryXOR( a, b )
--      if a:len() > b:len() then
--              b = string.rep("\0", a:len() - b:len())..b
--      elseif string.len(a) < string.len(b) then
--              a = string.rep("\0", b:len() - a:len())..a
--      end
--      local result = ""
--      for i=1, a:len() do
--              result = result..string.char(xor(a:byte(i), b:byte(i)))
++      for i=1, #a do
++              local x, y = byte(a, i), byte(b, i);
++              local lowx, lowy = x % 16, y % 16;
++              local hix, hiy = (x - lowx) / 16, (y - lowy) / 16;
++              local lowr, hir = xor_map[lowx * 16 + lowy + 1], xor_map[hix * 16 + hiy + 1];
++              local r = hir * 16 + lowr;
++              result[i] = char(r)
        end
--      return result
++      return t_concat(result);
  end
  
  -- hash algorithm independent Hi(PBKDF2) implementation
@@@ -116,9 -116,9 +121,9 @@@ local function scram_sha_1(self, messag
                        return "failure", "malformed-request", "Missing an attribute(p, r or c) in SASL message.";
                end
                
--              local password;
++              local password, state;
                if self.profile.plain then
--                      local password, state = self.profile.plain(self.state.name, self.realm)
++                      password, state = self.profile.plain(self.state.name, self.realm)
                        if state == nil then return "failure", "not-authorized"
                        elseif state == false then return "failure", "account-disabled" end
                        password = saslprep(password);