UNPKG

@juriskop/swish-node-digest-auth

Version:

A SWISH compatible digest auth. While digest auth is standardized this implementation is only tested against SWISH and only supports one specification case (qop = auth; MD5 hash)

80 lines 3.29 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateClientNonce = exports.generateResponse = exports.generateHA2 = exports.generateHA1 = exports.getRealmFromMessageString = exports.getNonceFromMessageString = void 0; const crypto = __importStar(require("crypto")); const getNonceFromMessageString = (message) => { const regexp = /nonce="(?<value>.+?)"/; const match = regexp.exec(message); if (!match || !match.groups) { throw new Error('Nonce value not found.'); } return match.groups.value; }; exports.getNonceFromMessageString = getNonceFromMessageString; const getRealmFromMessageString = (message) => { const regexp = /realm="(?<value>.+?)"/; const match = regexp.exec(message); if (!match || !match.groups) { throw new Error('Realm value not found.'); } return match.groups.value; }; exports.getRealmFromMessageString = getRealmFromMessageString; const md5Hex = (input) => { const md5Hasher = crypto.createHash('md5'); return md5Hasher.update(input).digest('hex'); }; const generateHA1 = (username, realm, password) => { return md5Hex(`${username}:${realm}:${password}`); }; exports.generateHA1 = generateHA1; const generateHA2 = (method, digestURI) => { return md5Hex(`${method}:${digestURI}`); }; exports.generateHA2 = generateHA2; const generateResponse = (ha1, ha2, nonce, nonceCount, cNonce, qop) => { const paddedCount = nonceCount.toString(10).padStart(8, '0'); return md5Hex(`${ha1}:${nonce}:${paddedCount}:${cNonce}:${qop}:${ha2}`); }; exports.generateResponse = generateResponse; const generateAlphaNum = () => { const category = crypto.randomInt(0, 2); switch (category) { // Numbers case 0: return String.fromCharCode(crypto.randomInt(48, 57)); case 1: return String.fromCharCode(crypto.randomInt(65, 90)); case 2: return String.fromCharCode(crypto.randomInt(97, 122)); } throw new Error('Unexpected state reached.'); }; const generateClientNonce = () => { return new Array(16).fill(null).map(() => generateAlphaNum()).join(''); }; exports.generateClientNonce = generateClientNonce; //# sourceMappingURL=digest-auth-computation.js.map