comparison mod_s2s_auth_dane/mod_s2s_auth_dane.lua @ 1266:51e7a4bbd70b

mod_s2s_auth_dane: Style fixes
author Kim Alvefur <zash@zash.se>
date Sat, 04 Jan 2014 20:07:14 +0100
parents 020165014e56
children 69d42d2427f7
comparison
equal deleted inserted replaced
1265:020165014e56 1266:51e7a4bbd70b
9 local dns_lookup = require"net.adns".lookup; 9 local dns_lookup = require"net.adns".lookup;
10 local hashes = require"util.hashes"; 10 local hashes = require"util.hashes";
11 local base64 = require"util.encodings".base64; 11 local base64 = require"util.encodings".base64;
12 12
13 local s2sout = module:depends"s2s".route_to_new_session.s2sout; 13 local s2sout = module:depends"s2s".route_to_new_session.s2sout;
14 local _try_connect = s2sout.try_connect 14 local _try_connect = s2sout.try_connect;
15 15
16 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n".. 16 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n"..
17 "([0-9A-Za-z=+/\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-"; 17 "([0-9A-Za-z=+/\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-";
18 local function pem2der(pem) 18 local function pem2der(pem)
19 local typ, data = pem:match(pat); 19 local typ, data = pem:match(pat);
35 srv_hosts[srv_choice].dane = answer; 35 srv_hosts[srv_choice].dane = answer;
36 for i, tlsa in ipairs(answer) do 36 for i, tlsa in ipairs(answer) do
37 module:log("debug", "TLSA %s", tostring(tlsa)); 37 module:log("debug", "TLSA %s", tostring(tlsa));
38 end 38 end
39 end 39 end
40 end, ("_%d._tcp.%s"):format(connect_port, connect_host), "TLSA") 40 end, ("_%d._tcp.%s"):format(connect_port, connect_host), "TLSA");
41 end 41 end
42 return _try_connect(host_session, connect_host, connect_port, err) 42 return _try_connect(host_session, connect_host, connect_port, err);
43 end 43 end
44 44
45 module:hook("s2s-check-certificate", function(event) 45 module:hook("s2s-check-certificate", function(event)
46 local session, cert = event.session, event.cert; 46 local session, cert = event.session, event.cert;
47 local srv_hosts = session.srv_hosts; 47 local srv_hosts = session.srv_hosts;
48 local srv_choice = session.srv_choice; 48 local srv_choice = session.srv_choice;
49 local choosen = srv_hosts and srv_hosts[srv_choice]; 49 local choosen = srv_hosts and srv_hosts[srv_choice];
50 if choosen and choosen.dane then 50 if choosen and choosen.dane then
51 local use, select, match, tlsa, certdata, match_found 51 local use, select, match, tlsa, certdata, match_found;
52 for i, rr in ipairs(choosen.dane) do 52 for i, rr in ipairs(choosen.dane) do
53 tlsa = rr.tlsa 53 tlsa = rr.tlsa;
54 module:log("debug", "TLSA %s", tostring(tlsa)); 54 module:log("debug", "TLSA %s", tostring(tlsa));
55 use, select, match, certdata = tlsa.use, tlsa.select, tlsa.match; 55 use, select, match, certdata = tlsa.use, tlsa.select, tlsa.match;
56 56
57 if use == 1 or use == 3 then 57 if use == 1 or use == 3 then
58 58
67 certdata = hashes.sha256(certdata); 67 certdata = hashes.sha256(certdata);
68 elseif match == 2 then 68 elseif match == 2 then
69 certdata = hashes.sha512(certdata); 69 certdata = hashes.sha512(certdata);
70 elseif match ~= 0 then 70 elseif match ~= 0 then
71 module:log("warn", "DANE match rule %d is unsupported", match); 71 module:log("warn", "DANE match rule %d is unsupported", match);
72 certdata = nil 72 certdata = nil;
73 end 73 end
74 74
75 -- Should we check if the cert subject matches? 75 -- Should we check if the cert subject matches?
76 if certdata and certdata == tlsa.data then 76 if certdata and certdata == tlsa.data then
77 (session.log or module._log)("info", "DANE validation successful"); 77 (session.log or module._log)("info", "DANE validation successful");
78 session.cert_identity_status = "valid" 78 session.cert_identity_status = "valid";
79 if use == 3 then 79 if use == 3 then
80 session.cert_chain_status = "valid" 80 session.cert_chain_status = "valid";
81 -- for usage 1 the chain has to be valid already 81 -- for usage 1 the chain has to be valid already
82 end 82 end
83 match_found = true 83 match_found = true;
84 break; 84 break;
85 end 85 end
86 else 86 else
87 module:log("warn", "DANE %s is unsupported", tlsa:getUsage() or ("usage "..tostring(use))); 87 module:log("warn", "DANE %s is unsupported", tlsa:getUsage() or ("usage "..tostring(use)));
88 -- TODO Ca checks needs to loop over the chain and stuff 88 -- TODO Ca checks needs to loop over the chain and stuff