1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
#include <stdio.h>
#include "libpacketdump.h"
#define POPBYTE(x) \
do { \
if (len<1) return; \
x=*(packet++); \
} while(0)
#define POPWORD(x) \
do { \
if (len<2) return; \
x=htons(*(uint16_t*)packet); \
packet+=2; \
} while(0)
static void decode_eap_request(const char *packet, unsigned len)
{
int v;
POPBYTE(v);
printf(" 802.1x: EAP: Identifier: %u\n",v);
POPWORD(v);
printf(" 802.1x: EAP: Length: %u\n",v);
POPBYTE(v);
printf(" 802.1x: EAP: Type: ");
switch(v) {
case 1: printf(" Identity (1)\n"); break;
case 2: printf(" Notification (2)\n"); break;
case 3: printf(" NAK (3)\n"); break;
case 4: printf(" MD5-Challenge (4)\n"); break;
case 5: printf(" One-Time Password (5)\n"); break;
case 6: printf(" Generic Token Card (6)\n"); break;
}
}
static void decode_eap(const char *packet, unsigned len)
{
int v;
POPWORD(v);
printf(" 802.1x: Length: %d\n",v);
POPBYTE(v);
printf(" 802.1x: EAP: ");
switch(v) {
case 1:
printf("Request (1)\n");
decode_eap_request(packet,len);
break;
case 2: printf("Response (2)\n"); break;
case 3: printf("Success (3)\n"); break;
case 4: printf("Failure (4)\n"); break;
default: printf("#0x%02x\n",v); break;
}
}
static void decode_eapol_start(const char *packet, unsigned len)
{
int v;
POPWORD(v);
printf(" 802.1x: Length: %d\n",v);
}
static void decode_eapol_logoff(const char *packet, unsigned len)
{
int v;
POPWORD(v);
printf(" 802.1x: Length: %d\n",v);
}
struct key_descriptor {
uint8_t descriptor_type;
uint16_t key_length;
uint64_t replay_counter;
uint8_t key_iv[27-12];
uint8_t kevy_index;
uint8_t key_signature[44-29];
};
static void decode_eapol_key(const char *packet, unsigned len)
{
int v;
POPWORD(v);
printf(" 802.1x: Length: %d\n",v);
}
static void decode_eapol_encapsulated_asf_alert(const char *packet, unsigned len)
{
int v;
POPWORD(v);
printf(" 802.1x: Length: %d\n",v);
}
DLLEXPORT void decode(int link_type UNUSED,const char *packet,unsigned len)
{
int v;
int type;
POPBYTE(v);
printf(" 802.1x: Version: %u\n",v);
POPBYTE(type);
printf(" 802.1x: Type: ");
switch (type) {
case 0:
printf(" EAP-Packet (0)\n");
decode_eap(packet,len);
break;
case 1: printf(" EAPOL-Start (1)\n");
decode_eapol_start(packet,len);
break;
case 2:
printf(" EAPOL-Logoff (2)\n");
decode_eapol_logoff(packet,len);
break;
case 3:
printf(" EAPOL-Key (3)\n");
decode_eapol_key(packet,len);
break;
case 4:
printf(" EAPOL-Encasulated-ASF-Alert (4)\n");
decode_eapol_encapsulated_asf_alert(packet,len);
break;
default:
printf(" Unknown #0x%02x\n",v);
decode_next(packet,len,"eapol",type);
break;
}
return;
}
|