UNPKG

tlsa-builder

Version:

Creation of TLSA-Records (RFC 6698)

112 lines (105 loc) 3.63 kB
var Promise, TlsaBuilder, crypto, https, pem; https = require('https'); crypto = require('crypto'); Promise = require('bluebird'); pem = require('pem'); TlsaBuilder = function(_domain, _port, _usage, _selector, _matchingType, _protocol) { var _kv, _record, builderPromise, createResult, getCertificate; if (_port == null) { _port = 443; } if (_usage == null) { _usage = 3; } if (_selector == null) { _selector = 0; } if (_matchingType == null) { _matchingType = 1; } if (_protocol == null) { _protocol = 'tcp'; } _kv = false; _record = false; createResult = function(dataField) { if (_record) { return '_' + _port + '._' + _protocol + '.' + _domain + '.' + ' IN ' + _usage + ' ' + _selector + ' ' + _matchingType + ' ' + dataField; } else { if (_kv) { return { 'key': '_' + _port + '._' + _protocol + '.' + _domain + '.', 'value': _usage + ' ' + _selector + ' ' + _matchingType + ' ' + dataField }; } else { return _usage + ' ' + _selector + ' ' + _matchingType + ' ' + dataField; } } }; getCertificate = function() { var httpPromise; httpPromise = function(resolve, reject) { var req; req = https.request({ hostname: _domain, port: _port }, function(res) { var cert, dataField, pubKey; dataField = void 0; if (res.connection.getPeerCertificate().raw instanceof Buffer) { cert = res.connection.getPeerCertificate().raw; if (_selector === 0) { if (_matchingType === 1) { dataField = crypto.createHash('sha256').update(cert).digest('hex'); } else if (_matchingType === 2) { dataField = crypto.createHash('sha512').update(cert).digest('hex'); } else { dataField = cert.toString('hex'); } return resolve(dataField); } else { pem.getPublicKey('-----BEGIN CERTIFICATE-----\n' + cert.toString('base64') + '\n-----END CERTIFICATE-----', function(err, result) {}); if (err) { reject(new Error('Could not receive public key from certificate')); } pubKey = new Buffer(result.publicKey.replace('-----BEGIN PUBLIC KEY-----\n', '').replace('\n-----END PUBLIC KEY-----', ''), 'base64'); if (_matchingType === 1) { dataField = crypto.createHash('sha256').update(pubKey).digest('hex'); } else if (_matchingType === 2) { dataField = crypto.createHash('sha512').update(pubKey).digest('hex'); } else { dataField = pubKey.toString('hex'); } return resolve(dataField); } } else { return reject(new Error('Could not receive certificate')); } }); req.end(); return req.on('error', function(e) { return reject(new Error('Could not connect to host')); }); }; return new Promise(httpPromise); }; builderPromise = function(resolve, reject) { if (_domain === null || _domain === void 0) { return reject(new Error('Domain need to be specified')); } else { return getCertificate().then(createResult).then(resolve)["catch"](reject); } }; this.generateKeyValue = function() { _kv = true; return new Promise(builderPromise); }; this.generateValue = function() { return new Promise(builderPromise); }; this.generateRecord = function() { _record = true; return new Promise(builderPromise); }; }; module.exports = TlsaBuilder;