import { IAuthChallenge } from '../../types/AuthChallenge'; export class PAPChallenge implements IAuthChallenge { // i couldn't find any documentation about it, therefore best guess how this is processed... // http://www.networksorcery.com/enp/rfc/rfc1334.txt ? decode(data: Buffer) { const usrNameLength = data.slice(7, 8).readUInt8(0); const user = data.slice(8, usrNameLength); console.log('user', user, user.toString().trim()); let pwdStart = usrNameLength; // data.slice(usrNameLength); const passwordDelimeter = Buffer.from([0x02, 0x40, 0x00, 0x00]); let found = false; let pwd: Buffer; do { const possibleDelimieter = data.slice(pwdStart, pwdStart + passwordDelimeter.length); if (possibleDelimieter.equals(passwordDelimeter)) { found = true; } if (!found) { pwdStart++; } } while (!found && pwdStart < data.length); if (!found) { throw new Error("couldn't extract password"); } // console.log('pwdStart+passwordDelimeter.length', pwdStart+passwordDelimeter.length); // console.log('length', pwdStart + data.readUInt8(pwdStart+passwordDelimeter.length)); // first byte is a length property.. we ignore for now pwd = data.slice(pwdStart + passwordDelimeter.length + 1); // , pwdStart+ data.readUInt8(pwdStart+passwordDelimeter.length)); // trim pwd pwd = pwd.slice(0, pwd.indexOf(0x00)); console.log('pwd', pwd, pwd.toString().trim().length, pwd.toString()); return { username: user.toString(), password: pwd.toString() }; } }