Compare commits

..

7 Commits

Author SHA1 Message Date
38985ea9e2 Remove debug-logging for now 2021-11-25 01:48:41 +01:00
1976838d8a Remove unecessary properties 2021-11-25 01:48:07 +01:00
a1ce7a848b Replaced MoreData and isRetry with flags 2021-11-25 01:37:35 +01:00
21e4ff1a66 Removing frameCheckSequence from packets 2021-11-25 01:10:49 +01:00
25297ed4d9 Fixed data-regex 2021-11-25 01:10:34 +01:00
68541b1191 Added check for NoData-Packet 2021-11-25 01:09:25 +01:00
7bc5a3530c Made keyInfo vars const 2021-11-25 00:21:25 +01:00
2 changed files with 33 additions and 16 deletions

View File

@ -3,7 +3,6 @@ const PacketType = {
ProbeRequest: 'ProbeRequest',
ProbeResponse: 'ProbeResponse',
Data: 'Data',
MoreData: 'MoreData',
RequestToSend: 'RequestToSend',
ClearToSend: 'ClearToSend',
Acknowledgment: 'Acknowledgment',
@ -17,9 +16,19 @@ const PacketType = {
Unknown: 'Unknown'
}
const FlagType = {
MoreFragments: "MoreFragments",
Retry: "Retry",
PwrMgt: "PwrMgt",
MoreData: "MoreData",
Protected: "Protected",
Order: "Order"
}
class Packet{
timestampMicros;
isRetry;
flags = {};
srcMac;
dstMac;
@ -80,6 +89,7 @@ class HandshakePacket extends Packet{
// Specify exports
module.exports = {
PacketType,
FlagType,
Packet,
PacketWithSSID,
BeaconPacket,

View File

@ -1,7 +1,7 @@
const logger = require.main.require("./helper/logger.js")("PacketStreamFactory");
const { Transform } = require('stream');
const { DateTime } = require("luxon");
const { PacketType, Packet, PacketWithSSID, BeaconPacket, ProbeRequestPacket, ProbeResponsePacket, AuthenticationPacket, AuthenticationType, AssociationResponsePacket, DisassociationPacket, HandshakePacket, HandshakeStage } = require.main.require('./dto/Packet.js');
const { PacketType, FlagType, Packet, PacketWithSSID, BeaconPacket, ProbeRequestPacket, ProbeResponsePacket, AuthenticationPacket, AuthenticationType, AssociationResponsePacket, DisassociationPacket, HandshakePacket, HandshakeStage } = require.main.require('./dto/Packet.js');
const hexConv = require.main.require("./helper/hexConverter.js");
const PACKET_TYPE_MAP = {
@ -9,7 +9,6 @@ const PACKET_TYPE_MAP = {
"Probe Request": PacketType.ProbeRequest,
"Probe Response": PacketType.ProbeResponse,
"Data": PacketType.Data,
"More Data": PacketType.MoreData,
"Request-To-Send": PacketType.RequestToSend,
"Clear-To-Send": PacketType.ClearToSend,
"Acknowledgment": PacketType.Acknowledgment,
@ -27,14 +26,18 @@ const AUTHENTICATION_TYPE_MAP = {
"(Open System)-2": AuthenticationType.OpenSystem_2,
}
const FLAG_TYPE_MAP = {
"Retry": FlagType.Retry,
"Pwr Mgmt": FlagType.PwrMgt,
"More Data": FlagType.MoreData,
"Protected": FlagType.Protected,
}
const FLAG_TYPE_MAPS_REGEX = Object.keys(FLAG_TYPE_MAP).join('|');
/**
* Read data from text-blocks and convert them to Packet
*/
class PacketStreamFactory extends Transform{
matcher;
withholdLastBlock;
matchAllOnFlush;
constructor(){
super({
readableObjectMode: true,
@ -50,8 +53,6 @@ class PacketStreamFactory extends Transform{
packet = this._handleHeader(packet, header);
packet = this._handlePayload(packet, lines);
logger.debug(packet);
next(null, packet); // Get next chunk
}
@ -59,7 +60,10 @@ class PacketStreamFactory extends Transform{
// Convert time to epoch-micros Unfortunately luxon doesnt use micros, but millis as smallest time-unit requiring some "hacks"
packet.timestampMicros = DateTime.fromISO(data.slice(0, 12)).toSeconds() + data.slice(12, 15)/1000000;
packet.isRetry = data.match(/(?<=^|\s)Retry(?=$|\s)/i)? true: false;
// Find flags
data.match(data.match(new RegExp('(?<=^|\\s)('+ FLAG_TYPE_MAPS_REGEX +')(?=$|\\s)', 'ig'))
?.forEach(match => packet.flags[FLAG_TYPE_MAP[match]] = true) // Set them to true in flags
);
packet.dataRate = Number(data.match(/(?<=^|\s)[0-9]+(\.[0-9]+)?(?=\sMb\/?s($|\s))/i)?.[0]) || null;
packet.frequency = Number(data.match(/(?<=^|\s)[0-9]{4}(?=\sMHz($|\s))/i)?.[0]) || null;
@ -69,7 +73,9 @@ class PacketStreamFactory extends Transform{
packet.signal = Number(data.match(/(?<=^|\s)-[0-9]{2,3}(?=dBm\sSignal($|\s))/i)?.[0]) || null;
let packetTypeStr = data.match(new RegExp('(?<=^|\\s)('+ PACKET_TYPES_REGEX +')(?=$|\\s)', 'i'))?.[0];
packet.packetType = packetTypeStr? PACKET_TYPE_MAP[packetTypeStr]: PacketType.Unknown;
packet.packetType = packetTypeStr? PACKET_TYPE_MAP[packetTypeStr]:
data.match(/(SA|TA|DA|RA|BSSID):.{17}\s*$/i)? PacketType.NoData:
PacketType.Unknown;
packet.srcMac = data.match(/(?<=(^|\s)(SA|TA):).{17}(?=$|\s)/i)?.[0] ?? null;
@ -112,7 +118,8 @@ class PacketStreamFactory extends Transform{
data = data.join('');
// Get payload-Hex-Data. If there is no data: empty
packet.payloadData = hexConv.hexToBytes(data.match(/(?<=\s)([A-F0-9]{1,4}(?!(\.|x)))/igm)?.join('') ?? '');
packet.payloadData = hexConv.hexToBytes(data.match(/(?<=\s)([A-F0-9]{1,4}(?=\s))/igm)?.join('') ?? '');
packet.payloadData.splice(packet.payloadData.length-4, 4); // Remove FrameCheck sequence
// Cover special cases with more data
let newPacket;
@ -121,8 +128,8 @@ class PacketStreamFactory extends Transform{
newPacket = new HandshakePacket();
// Read key-information
let keyInfoRaw = (packet.payloadData[0x5]<<0x8) + packet.payloadData[0x6];
let keyInfo = {
const keyInfoRaw = (packet.payloadData[0x5]<<0x8) + packet.payloadData[0x6];
const keyInfo = {
"KeyDescriptorVersion": keyInfoRaw>>0 & 0b111,
"KeyType": keyInfoRaw>>3 & 0b1,
"KeyIndex": keyInfoRaw>>4 & 0b11,