Comparison

util/x509.lua @ 9907:54e36a8677bc

util.x509: Add function that extracts usable names from a certificate
author Kim Alvefur <zash@zash.se>
date Fri, 04 Jan 2019 10:20:51 +0100
parent 8555:4f0f5b49bb03
child 10255:8e8d3b3a55da
comparison
equal deleted inserted replaced
9906:d0b58bdd6c86 9907:54e36a8677bc
18 -- [LDAP] - http://tools.ietf.org/html/rfc4519 18 -- [LDAP] - http://tools.ietf.org/html/rfc4519
19 -- [PKIX] - http://tools.ietf.org/html/rfc5280 19 -- [PKIX] - http://tools.ietf.org/html/rfc5280
20 20
21 local nameprep = require "util.encodings".stringprep.nameprep; 21 local nameprep = require "util.encodings".stringprep.nameprep;
22 local idna_to_ascii = require "util.encodings".idna.to_ascii; 22 local idna_to_ascii = require "util.encodings".idna.to_ascii;
23 local idna_to_unicode = require "util.encodings".idna.to_unicode;
23 local base64 = require "util.encodings".base64; 24 local base64 = require "util.encodings".base64;
24 local log = require "util.logger".init("x509"); 25 local log = require "util.logger".init("x509");
25 local s_format = string.format; 26 local s_format = string.format;
26 27
27 local _ENV = nil; 28 local _ENV = nil;
214 215
215 -- If all else fails, well, why should we be any different? 216 -- If all else fails, well, why should we be any different?
216 return false 217 return false
217 end 218 end
218 219
220 -- TODO Support other SANs
221 local function get_identities(cert) --> set of names
222 if cert.setencode then
223 cert:setencode("utf8");
224 end
225
226 local names = {};
227
228 local ext = cert:extensions();
229 local sans = ext[oid_subjectaltname];
230 if sans and sans["dNSName"] then
231 for i = 1, #sans["dNSName"] do
232 names[ idna_to_unicode(sans["dNSName"][i]) ] = true;
233 end
234 end
235
236 local subject = cert:subject();
237 for i = 1, #subject do
238 local dn = subject[i];
239 if dn.oid == oid_commonname and nameprep(dn.value) then
240 names[dn.value] = true;
241 end
242 end
243 return names;
244 end
245
219 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n".. 246 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n"..
220 "([0-9A-Za-z+/=\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-"; 247 "([0-9A-Za-z+/=\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-";
221 248
222 local function pem2der(pem) 249 local function pem2der(pem)
223 local typ, data = pem:match(pat); 250 local typ, data = pem:match(pat);
235 return s_format(envelope, typ, data:gsub(wrap, '%0\n', (#data-1)/64), typ); 262 return s_format(envelope, typ, data:gsub(wrap, '%0\n', (#data-1)/64), typ);
236 end 263 end
237 264
238 return { 265 return {
239 verify_identity = verify_identity; 266 verify_identity = verify_identity;
267 get_identities = get_identities;
240 pem2der = pem2der; 268 pem2der = pem2der;
241 der2pem = der2pem; 269 der2pem = der2pem;
242 }; 270 };