Skip to content

Commit f5b4f2a

Browse files
abdelali221DacoTaco
authored andcommitted
Use one function for both WPA and RSN IEs.
1 parent 49d2086 commit f5b4f2a

2 files changed

Lines changed: 27 additions & 80 deletions

File tree

gc/ogc/wd.h

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,20 @@ typedef struct IE_hdr
163163

164164
// Security :
165165

166+
#define WPA_ESSENTIALS 4
167+
#define RSN_ESSENTIALS 0
168+
166169
enum WD_SECURITY
167170
{
168171
WD_OPEN = 0x00,
169172
WD_WEP = 0x01,
170173
WD_WPA_TKIP = 0x02,
171-
WD_WPA2_AES = 0x03,
172-
WD_WPA_AES = 0x04,
173-
WD_WPA2_TKIP = 0x05,
174+
WD_WPA2_AES = 0x04,
175+
WD_WPA_AES = 0x08,
176+
WD_WPA2_TKIP = 0x10,
174177
};
175178

176-
typedef struct IE_RSN
179+
typedef struct IE_RSN_WPA
177180
{
178181
u16 Version;
179182

@@ -186,18 +189,7 @@ typedef struct IE_RSN
186189
u16 RSN_Capab;
187190

188191
u16 PMKID_Count;
189-
} IE_RSN;
190-
191-
typedef struct IE_WPA
192-
{
193-
u16 Version;
194-
195-
u32 GDCS; // Group Data Cipher Suite
196-
197-
u16 PCS_Count; // Pairwise Cipher Suite
198-
199-
u16 AKMS_Count; // AKM Suite
200-
} IE_WPA;
192+
} IE_RSN_WPA;
201193

202194
// General Purpose :
203195

libogc/wd.c

Lines changed: 19 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -322,13 +322,13 @@ int WD_GetVendorSpecificIELength(BSSDescriptor* Bss, u32 OUI) {
322322
return hdr->len;
323323
}
324324

325-
int WD_GetRSN_PCSList(BSSDescriptor *Bss, u8* destbuff, u16 buffsize) {
325+
int WD_GetPCSList(BSSDescriptor *Bss, u8* destbuff, u16 buffsize, u8 offset) {
326326
if(!Bss) return WD_INVALIDBUFF;
327327
if(!destbuff) return WD_INVALIDBUFF;
328328

329-
IE_RSN IE;
329+
IE_RSN_WPA IE;
330330

331-
int ret = WD_GetRSNEssentials(Bss, &IE);
331+
int ret = WD_GetRSN_WPAEssentials(Bss, &IE, offset);
332332

333333
if(ret < 0) return WD_INVALIDBUFF;
334334
if(IE.PCS_Count * 4 > buffsize) return WD_BUFFTOOSMALL;
@@ -339,33 +339,12 @@ int WD_GetRSN_PCSList(BSSDescriptor *Bss, u8* destbuff, u16 buffsize) {
339339
WD_GetIE(Bss, IEID_SECURITY_RSN, buff, IE_len);
340340

341341
memset(destbuff, 0, buffsize);
342-
memcpy(destbuff, &buff[8], IE.PCS_Count * 4);
342+
memcpy(destbuff, &buff[8 + offset], IE.PCS_Count * 4);
343343

344344
return WD_SUCCESS;
345345
}
346346

347-
int WD_GetWPA_PCSList(BSSDescriptor *Bss, u8* destbuff, u16 buffsize) {
348-
if(!Bss) return WD_INVALIDBUFF;
349-
if(!destbuff) return WD_INVALIDBUFF;
350-
351-
IE_WPA IE;
352-
353-
int ret = WD_GetWPAIEEssentials(Bss, &IE);
354-
355-
if(ret < 0) return WD_INVALIDBUFF;
356-
if(IE.PCS_Count * 4 > buffsize) return WD_BUFFTOOSMALL;
357-
358-
u8 IE_len = WD_GetIELength(Bss, IEID_SECURITY_RSN);
359-
u8 buff[IE_len];
360-
WD_GetIE(Bss, IEID_SECURITY_RSN, buff, IE_len);
361-
362-
memset(destbuff, 0, buffsize);
363-
memcpy(destbuff, &buff[8], IE.PCS_Count * 4);
364-
365-
return WD_SUCCESS;
366-
}
367-
368-
int WD_GetRSNEssentials(BSSDescriptor *Bss, IE_RSN *IE) {
347+
int WD_GetRSN_WPAEssentials(BSSDescriptor *Bss, IE_RSN_WPA *IE, u8 offset) {
369348
if(!Bss) return WD_INVALIDBUFF;
370349
if(!IE) return WD_INVALIDBUFF;
371350

@@ -376,31 +355,6 @@ int WD_GetRSNEssentials(BSSDescriptor *Bss, IE_RSN *IE) {
376355

377356
WD_GetIE(Bss, IEID_SECURITY_RSN, buff, IE_size);
378357

379-
u8 offset = 0;
380-
IE->Version = buff[0 + offset] | buff[1 + offset] << 8;
381-
offset += 2;
382-
IE->GDCS = buff[0 + offset] << 24 | buff[1 + offset] << 16 | buff[2 + offset] << 8 | buff[3 + offset];
383-
offset += 4;
384-
IE->PCS_Count = buff[0 + offset] | buff[1 + offset] << 8;
385-
offset += 2 + IE->PCS_Count * 4;
386-
IE->AKMS_Count = buff[0 + offset] | buff[1 + offset] << 8;
387-
offset += 2 + IE->AKMS_Count * 4;
388-
389-
return WD_SUCCESS;
390-
}
391-
392-
int WD_GetWPAIEEssentials(BSSDescriptor *Bss, IE_WPA *IE) {
393-
if(!Bss) return WD_INVALIDBUFF;
394-
if(!IE) return WD_INVALIDBUFF;
395-
396-
u8 IE_size = WD_GetVendorSpecificIELength(Bss, OUI_WPA);
397-
if(IE_size < 0) return WD_NOTFOUND;
398-
399-
u8 buff[IE_size];
400-
401-
WD_GetVendorSpecificIE(Bss, OUI_WPA, buff, IE_size);
402-
403-
u8 offset = 4;
404358
IE->Version = buff[0 + offset] | buff[1 + offset] << 8;
405359
offset += 2;
406360
IE->GDCS = buff[0 + offset] << 24 | buff[1 + offset] << 16 | buff[2 + offset] << 8 | buff[3 + offset];
@@ -418,45 +372,46 @@ u8 WD_GetSecurity(BSSDescriptor *Bss) {
418372
if(!(Bss->Capabilities & CAPAB_SECURED_FLAG)) return WD_OPEN;
419373

420374
int ie_len = WD_GetVendorSpecificIELength(Bss, OUI_WPA);
375+
u8 ret = 0;
421376

422377
if (ie_len != WD_NOTFOUND && ie_len > 0) { // WPA
423-
IE_WPA IE;
424-
WD_GetWPAIEEssentials(Bss, &IE);
378+
IE_RSN_WPA IE;
379+
WD_GetRSN_WPAEssentials(Bss, &IE, WPA_ESSENTIALS);
425380

426381
u8 buff[IE.PCS_Count * 4];
427382
WD_GetWPA_PCSList(Bss, buff, IE.PCS_Count * 4);
428383

429384
u8 offset = 0;
430385

431386
for (int i = 0; i < IE.PCS_Count; i++) {
432-
if (buff[offset + 3] == 0x02) return WD_WPA_TKIP;
433-
else if (buff[offset + 3] == 0x04) return WD_WPA_AES;
387+
if (buff[offset + 3] == 0x02) ret |= WD_WPA_TKIP;
388+
else if (buff[offset + 3] == 0x04) ret |= WD_WPA_AES;
434389
offset += 4;
435390
}
391+
return ret;
436392
}
437393

438394
ie_len = WD_GetIELength(Bss, IEID_SECURITY_RSN);
439395

440396
if(ie_len != WD_NOTFOUND && ie_len > 0) { // WPA2
441-
IE_RSN IE;
442-
WD_GetRSNEssentials(Bss, &IE);
443-
444-
u8 ret = 0;
397+
IE_RSN_WPA IE;
398+
WD_GetRSN_WPAEssentials(Bss, &IE);
445399

446400
u8 buff[IE.PCS_Count * 4];
447401
WD_GetRSN_PCSList(Bss, buff, IE.PCS_Count * 4);
448402

449403
u8 offset = 0;
450404

451405
for (int i = 0; i < IE.PCS_Count; i++) {
452-
if (buff[offset + 3] == 0x02) ret = WD_WPA2_TKIP;
453-
if (buff[offset + 3] == 0x04) ret = WD_WPA2_AES;
406+
if (buff[offset + 3] == 0x02) ret |= WD_WPA2_TKIP;
407+
if (buff[offset + 3] == 0x04) ret |= WD_WPA2_AES;
454408
offset += 4;
455409
}
456-
457-
return ret;
458410
}
459-
return WD_WEP;
411+
412+
if(!ret) return WD_WEP;
413+
414+
return ret;
460415
}
461416

462417
#endif

0 commit comments

Comments
 (0)