Software /
code /
prosody
Comparison
util/sasl/scram.lua @ 3121:27f895bac9c0
Merge trunk/Tobias->trunk
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 24 May 2010 19:39:07 +0100 |
parent | 3119:c1ac08fa2533 |
parent | 3120:6f1b7260925c |
child | 3124:21e60658767d |
comparison
equal
deleted
inserted
replaced
3119:c1ac08fa2533 | 3121:27f895bac9c0 |
---|---|
30 --SASL SCRAM-SHA-1 according to draft-ietf-sasl-scram-10 | 30 --SASL SCRAM-SHA-1 according to draft-ietf-sasl-scram-10 |
31 | 31 |
32 --[[ | 32 --[[ |
33 Supported Authentication Backends | 33 Supported Authentication Backends |
34 | 34 |
35 scram-{MECH}: | 35 scram_{MECH}: |
36 -- MECH being a standard hash name (like those at IANA's hash registry) with '-' replaced with '_' | |
36 function(username, realm) | 37 function(username, realm) |
37 return salted_password, iteration_count, salt, state; | 38 return salted_password, iteration_count, salt, state; |
38 end | 39 end |
39 ]] | 40 ]] |
40 | 41 |
88 username = username:gsub("=3D", "="); | 89 username = username:gsub("=3D", "="); |
89 | 90 |
90 -- apply SASLprep | 91 -- apply SASLprep |
91 username = saslprep(username); | 92 username = saslprep(username); |
92 return username; | 93 return username; |
94 end | |
95 | |
96 local function hashprep( hashname ) | |
97 local hash = hashname:lower() | |
98 hash = hash:gsub("-", "_") | |
99 return hash | |
93 end | 100 end |
94 | 101 |
95 function saltedPasswordSHA1(password, salt, iteration_count) | 102 function saltedPasswordSHA1(password, salt, iteration_count) |
96 local salted_password | 103 local salted_password |
97 if type(password) ~= "string" or type(salt) ~= "string" or type(iteration_count) ~= "number" then | 104 if type(password) ~= "string" or type(salt) ~= "string" or type(iteration_count) ~= "number" then |
154 succ, self.state.salted_password = saltedPasswordSHA1(password, self.state.salt, default_i, self.state.iteration_count); | 161 succ, self.state.salted_password = saltedPasswordSHA1(password, self.state.salt, default_i, self.state.iteration_count); |
155 if not succ then | 162 if not succ then |
156 log("error", "Generating salted password failed. Reason: %s", self.state.salted_password); | 163 log("error", "Generating salted password failed. Reason: %s", self.state.salted_password); |
157 return "failure", "temporary-auth-failure"; | 164 return "failure", "temporary-auth-failure"; |
158 end | 165 end |
159 elseif self.profile["scram_"..hash_name] then | 166 elseif self.profile["scram_"..hashprep(hash_name)] then |
160 local salted_password, iteration_count, salt, state = self.profile["scram-"..hash_name](self.state.name, self.realm); | 167 local salted_password, iteration_count, salt, state = self.profile["scram-"..hash_name](self.state.name, self.realm); |
161 if state == nil then return "failure", "not-authorized" | 168 if state == nil then return "failure", "not-authorized" |
162 elseif state == false then return "failure", "account-disabled" end | 169 elseif state == false then return "failure", "account-disabled" end |
163 | 170 |
164 self.state.salted_password = salted_password; | 171 self.state.salted_password = salted_password; |
204 return scram_hash; | 211 return scram_hash; |
205 end | 212 end |
206 | 213 |
207 function init(registerMechanism) | 214 function init(registerMechanism) |
208 local function registerSCRAMMechanism(hash_name, hash, hmac_hash) | 215 local function registerSCRAMMechanism(hash_name, hash, hmac_hash) |
209 registerMechanism("SCRAM-"..hash_name, {"plain", "scram_"..(hash_name:lower())}, scram_gen(hash_name:lower(), hash, hmac_hash)); | 216 registerMechanism("SCRAM-"..hash_name, {"plain", "scram_"..(hashprep(hash_name))}, scram_gen(hash_name:lower(), hash, hmac_hash)); |
210 end | 217 end |
211 | 218 |
212 registerSCRAMMechanism("SHA-1", sha1, hmac_sha1); | 219 registerSCRAMMechanism("SHA-1", sha1, hmac_sha1); |
213 end | 220 end |
214 | 221 |