comparison mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 1396:cf4e39334ef7

mod_s2s_auth_dane: Add support for DANE-TA and PKIX-CA (requires LuaSec changes)
author Kim Alvefur <zash@zash.se>
date Sun, 27 Apr 2014 01:43:43 +0200
parents 33f132c3f4b7
children 151aa00559d1
comparison
equal deleted inserted replaced
1395:33f132c3f4b7 1396:cf4e39334ef7
34 end 34 end
35 35
36 local use_map = { ["DANE-EE"] = 3; ["DANE-TA"] = 2; ["PKIX-EE"] = 1; ["PKIX-CA"] = 0 } 36 local use_map = { ["DANE-EE"] = 3; ["DANE-TA"] = 2; ["PKIX-EE"] = 1; ["PKIX-CA"] = 0 }
37 37
38 local implemented_uses = set.new { "DANE-EE", "PKIX-EE" }; 38 local implemented_uses = set.new { "DANE-EE", "PKIX-EE" };
39 local configured_uses = module:get_option_set("dane_uses", { "DANE-EE" }); 39 if debug.getregistry()["SSL:Certificate"].__index.issued then
40 -- Need cert:issued() for these
41 implemented_uses:add("DANE-TA");
42 implemented_uses:add("PKIX-CA");
43 else
44 module:log("warn", "Unable to support DANE-TA and PKIX-CA");
45 end
46 local configured_uses = module:get_option_set("dane_uses", { "DANE-EE", "DANE-TA" });
40 local enabled_uses = set.intersection(implemented_uses, configured_uses) / function(use) return use_map[use] end; 47 local enabled_uses = set.intersection(implemented_uses, configured_uses) / function(use) return use_map[use] end;
41 48
42 local function dane_lookup(host_session, cb, a,b,c,e) 49 local function dane_lookup(host_session, cb, a,b,c,e)
43 if host_session.dane ~= nil then return end 50 if host_session.dane ~= nil then return end
44 if host_session.direction == "incoming" then 51 if host_session.direction == "incoming" then
157 164
158 module:hook("s2s-check-certificate", function(event) 165 module:hook("s2s-check-certificate", function(event)
159 local session, cert = event.session, event.cert; 166 local session, cert = event.session, event.cert;
160 local dane = session.dane; 167 local dane = session.dane;
161 if type(dane) == "table" then 168 if type(dane) == "table" then
162 local use, tlsa, match_found, supported_found, is_match; 169 local use, tlsa, match_found, supported_found, chain, leafcert, cacert, is_match;
163 for i = 1, #dane do 170 for i = 1, #dane do
164 tlsa = dane[i].tlsa; 171 tlsa = dane[i].tlsa;
165 module:log("debug", "TLSA %s %s %s %d bytes of data", tlsa:getUsage(), tlsa:getSelector(), tlsa:getMatchType(), #tlsa.data); 172 module:log("debug", "TLSA %s %s %s %d bytes of data", tlsa:getUsage(), tlsa:getSelector(), tlsa:getMatchType(), #tlsa.data);
166 use = tlsa.use; 173 use = tlsa.use;
167 174
181 -- for usage 1, PKIX-EE, the chain has to be valid already 188 -- for usage 1, PKIX-EE, the chain has to be valid already
182 end 189 end
183 match_found = true; 190 match_found = true;
184 break; 191 break;
185 end 192 end
193 elseif use == 0 or use == 2 then
194 supported_found = true;
195 if chain == nil then
196 chain = session.conn:socket():getpeerchain();
197 end
198 for i = 2, #chain do
199 cacert, leafcert = chain[i], chain[i-1];
200 is_match = one_dane_check(tlsa, cacert);
201 if is_match ~= nil then
202 supported_found = true;
203 end
204 if use == 2 and not cacert:issued(leafcert or cacert) then
205 module:log("debug", "Broken chain");
206 break;
207 end
208 if is_match then
209 (session.log or module._log)("info", "DANE validation successful");
210 if use == 2 then -- DANE-TA
211 session.cert_identity_status = "valid";
212 session.cert_chain_status = "valid";
213 -- for usage 0, PKIX-CA, identity and chain has to be valid already
214 end
215 match_found = true;
216 break;
217 end
218 end
219 if match_found then break end
186 end 220 end
187 end 221 end
188 end 222 end
189 if supported_found and not match_found or dane.bogus then 223 if supported_found and not match_found or dane.bogus then
190 -- No TLSA matched or response was bogus 224 -- No TLSA matched or response was bogus