|
|
|
import { IPacketHandlerResult, PacketResponseCode } from '../../../types/PacketHandler';
|
|
|
|
|
|
|
|
export function buildEAP(identifier: number, msgType: number, data?: Buffer) {
|
|
|
|
/** build a package according to this:
|
|
|
|
0 1 2 3
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
| Code | Identifier | Length |
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
| Type | Type-Data ...
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|
|
|
|
*/
|
|
|
|
const buffer = Buffer.from([
|
|
|
|
1, // request
|
|
|
|
identifier,
|
|
|
|
0, // length (1/2)
|
|
|
|
0, // length (2/2)
|
|
|
|
msgType, // 1 = identity, 21 = EAP-TTLS, 2 = notificaiton, 4 = md5-challenge, 3 = NAK
|
|
|
|
]);
|
|
|
|
|
|
|
|
const resBuffer = data ? Buffer.concat([buffer, data]) : buffer;
|
|
|
|
|
|
|
|
// set EAP length header
|
|
|
|
resBuffer.writeUInt16BE(resBuffer.byteLength, 2);
|
|
|
|
|
|
|
|
return resBuffer;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* @param data
|
|
|
|
* @param msgType 1 = identity, 21 = EAP-TTLS, 2 = notification, 4 = md5-challenge, 3 = NAK
|
|
|
|
*/
|
|
|
|
export function buildEAPResponse(
|
|
|
|
identifier: number,
|
|
|
|
msgType: number,
|
|
|
|
data?: Buffer
|
|
|
|
): IPacketHandlerResult {
|
|
|
|
return {
|
|
|
|
code: PacketResponseCode.AccessChallenge,
|
|
|
|
attributes: [['EAP-Message', buildEAP(identifier, msgType, data)]],
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
export function decodeEAPHeader(msg: Buffer) {
|
|
|
|
/**
|
|
|
|
* parse msg according to this:
|
|
|
|
0 1 2 3
|
|
|
|
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
| Code | Identifier | Length |
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
|
|
| Type | Type-Data ...
|
|
|
|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
code:
|
|
|
|
1 Request
|
|
|
|
2 Response
|
|
|
|
3 Success
|
|
|
|
4 Failure
|
|
|
|
*/
|
|
|
|
const code = msg.slice(0, 1).readUInt8(0);
|
|
|
|
/* identifier is a number */
|
|
|
|
const identifier = msg.slice(1, 2).readUInt8(0);
|
|
|
|
const length = msg.slice(2, 4).readUInt16BE(0);
|
|
|
|
/* EAP type */
|
|
|
|
const type = msg.slice(4, 5).readUInt8(0);
|
|
|
|
const data = msg.slice(5);
|
|
|
|
|
|
|
|
return {
|
|
|
|
code,
|
|
|
|
identifier,
|
|
|
|
length,
|
|
|
|
type,
|
|
|
|
data,
|
|
|
|
};
|
|
|
|
}
|