Mercurial > prosody-hg
comparison util/x509.lua @ 11200:bf8f2da84007
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 05 Nov 2020 22:31:25 +0100 |
| parents | 69e55b03d5cf |
| children | c0cb8e86ad21 |
comparison
equal
deleted
inserted
replaced
| 11199:6c7c50a4de32 | 11200:bf8f2da84007 |
|---|---|
| 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"); |
| 26 local mt = require "util.multitable"; | |
| 25 local s_format = string.format; | 27 local s_format = string.format; |
| 28 local ipairs = ipairs; | |
| 26 | 29 |
| 27 local _ENV = nil; | 30 local _ENV = nil; |
| 28 -- luacheck: std none | 31 -- luacheck: std none |
| 29 | 32 |
| 30 local oid_commonname = "2.5.4.3"; -- [LDAP] 2.3 | 33 local oid_commonname = "2.5.4.3"; -- [LDAP] 2.3 |
| 214 | 217 |
| 215 -- If all else fails, well, why should we be any different? | 218 -- If all else fails, well, why should we be any different? |
| 216 return false | 219 return false |
| 217 end | 220 end |
| 218 | 221 |
| 222 -- TODO Support other SANs | |
| 223 local function get_identities(cert) --> map of names to sets of services | |
| 224 if cert.setencode then | |
| 225 cert:setencode("utf8"); | |
| 226 end | |
| 227 | |
| 228 local names = mt.new(); | |
| 229 | |
| 230 local ext = cert:extensions(); | |
| 231 local sans = ext[oid_subjectaltname]; | |
| 232 if sans then | |
| 233 if sans["dNSName"] then -- Valid for any service | |
| 234 for _, name in ipairs(sans["dNSName"]) do | |
| 235 name = idna_to_unicode(nameprep(name)); | |
| 236 if name then | |
| 237 names:set(name, "*", true); | |
| 238 end | |
| 239 end | |
| 240 end | |
| 241 if sans[oid_xmppaddr] then | |
| 242 for _, name in ipairs(sans[oid_xmppaddr]) do | |
| 243 name = nameprep(name); | |
| 244 if name then | |
| 245 names:set(name, "xmpp-client", true); | |
| 246 names:set(name, "xmpp-server", true); | |
| 247 end | |
| 248 end | |
| 249 end | |
| 250 if sans[oid_dnssrv] then | |
| 251 for _, srvname in ipairs(sans[oid_dnssrv]) do | |
| 252 local srv, name = srvname:match("^_([^.]+)%.(.*)"); | |
| 253 if srv then | |
| 254 name = nameprep(name); | |
| 255 if name then | |
| 256 names:set(name, srv, true); | |
| 257 end | |
| 258 end | |
| 259 end | |
| 260 end | |
| 261 end | |
| 262 | |
| 263 local subject = cert:subject(); | |
| 264 for i = 1, #subject do | |
| 265 local dn = subject[i]; | |
| 266 if dn.oid == oid_commonname then | |
| 267 local name = nameprep(dn.value); | |
| 268 if name and idna_to_ascii(name) then | |
| 269 names:set(name, "*", true); | |
| 270 end | |
| 271 end | |
| 272 end | |
| 273 return names.data; | |
| 274 end | |
| 275 | |
| 219 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n".. | 276 local pat = "%-%-%-%-%-BEGIN ([A-Z ]+)%-%-%-%-%-\r?\n".. |
| 220 "([0-9A-Za-z+/=\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-"; | 277 "([0-9A-Za-z+/=\r\n]*)\r?\n%-%-%-%-%-END %1%-%-%-%-%-"; |
| 221 | 278 |
| 222 local function pem2der(pem) | 279 local function pem2der(pem) |
| 223 local typ, data = pem:match(pat); | 280 local typ, data = pem:match(pat); |
| 235 return s_format(envelope, typ, data:gsub(wrap, '%0\n', (#data-1)/64), typ); | 292 return s_format(envelope, typ, data:gsub(wrap, '%0\n', (#data-1)/64), typ); |
| 236 end | 293 end |
| 237 | 294 |
| 238 return { | 295 return { |
| 239 verify_identity = verify_identity; | 296 verify_identity = verify_identity; |
| 297 get_identities = get_identities; | |
| 240 pem2der = pem2der; | 298 pem2der = pem2der; |
| 241 der2pem = der2pem; | 299 der2pem = der2pem; |
| 242 }; | 300 }; |
