You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.5 KiB
48 lines
1.5 KiB
import debug from 'debug';
|
|
import { IEAPChallenge } from '../../../../../types/EAPChallenge';
|
|
|
|
const log = debug('radius:eap:papchallenge');
|
|
|
|
export class PAPChallenge implements IEAPChallenge {
|
|
// 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);
|
|
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");
|
|
}
|
|
// log('pwdStart+passwordDelimeter.length', pwdStart+passwordDelimeter.length);
|
|
// 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));
|
|
|
|
log('pwd', pwd, pwd.toString().trim().length, pwd.toString());
|
|
|
|
return {
|
|
username: user.toString(),
|
|
password: pwd.toString()
|
|
};
|
|
}
|
|
}
|