iwinfo: add support for GCMP cipher
authorDaniel Golle <daniel@makrotopia.org>
Tue, 5 Jan 2021 14:21:14 +0000 (14:21 +0000)
committerDaniel Golle <daniel@makrotopia.org>
Tue, 5 Jan 2021 22:19:43 +0000 (22:19 +0000)
Extend support for WPA ciphers by GCMP which is required for 802.11ad.
Breaks ABI as ciphers now needs to be a field of 16 bits instead of 8.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
include/iwinfo.h
include/iwinfo/utils.h
iwinfo_cli.c
iwinfo_lua.c
iwinfo_nl80211.c
iwinfo_utils.c

index 680f384f603d7424b729faf503a61aa8ff3be928..5799c02be2c727cc7eccfa9f2fe8641c0302573c 100644 (file)
@@ -38,7 +38,8 @@
 #define IWINFO_CIPHER_WEP104 (1 << 5)
 #define IWINFO_CIPHER_AESOCB (1 << 6)
 #define IWINFO_CIPHER_CKIP   (1 << 7)
-#define IWINFO_CIPHER_COUNT  8
+#define IWINFO_CIPHER_GCMP   (1 << 8)
+#define IWINFO_CIPHER_COUNT  9
 
 #define IWINFO_KMGMT_NONE    (1 << 0)
 #define IWINFO_KMGMT_8021x   (1 << 1)
@@ -164,8 +165,8 @@ struct iwinfo_freqlist_entry {
 struct iwinfo_crypto_entry {
        uint8_t enabled;
        uint8_t wpa_version;
-       uint8_t group_ciphers;
-       uint8_t pair_ciphers;
+       uint16_t group_ciphers;
+       uint16_t pair_ciphers;
        uint8_t auth_suites;
        uint8_t auth_algs;
 };
index 98b9c890012ea80d1dd448238526a5366422b44b..1fa4f520f3a6427914c3f6a1debe99195919ccd1 100644 (file)
@@ -54,7 +54,7 @@ struct iwinfo_hardware_entry * iwinfo_hardware(struct iwinfo_hardware_id *id);
 int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id);
 
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
-                                         uint8_t defcipher, uint8_t defauth);
+                                         uint16_t defcipher, uint8_t defauth);
 
 struct uci_section *iwinfo_uci_get_radio(const char *name, const char *type);
 void iwinfo_uci_free(void);
index c052d630fced5089b509b9335d661cfe9d4be28f..4976790e835670337d4dbbe6814a6ead51e64df0 100644 (file)
@@ -158,6 +158,9 @@ static char * format_enc_ciphers(int ciphers)
        if (ciphers & IWINFO_CIPHER_CCMP)
                pos += sprintf(pos, "CCMP, ");
 
+       if (ciphers & IWINFO_CIPHER_GCMP)
+               pos += sprintf(pos, "GCMP, ");
+
        if (ciphers & IWINFO_CIPHER_WRAP)
                pos += sprintf(pos, "WRAP, ");
 
index 58a5537b638634a21298eeb706c3e080741e8e6e..abe848bc4c2a058448f57a3d82d4f17231286e7c 100644 (file)
@@ -61,6 +61,9 @@ static char * iwinfo_crypto_print_ciphers(int ciphers)
        if (ciphers & IWINFO_CIPHER_CCMP)
                pos += sprintf(pos, "CCMP, ");
 
+       if (ciphers & IWINFO_CIPHER_GCMP)
+               pos += sprintf(pos, "GCMP, ");
+
        if (ciphers & IWINFO_CIPHER_WRAP)
                pos += sprintf(pos, "WRAP, ");
 
index b067fc10bfcfd11a2c4a72f6343e5d3c3e8d2c06..5ca5c0374af508b81ba33bab5db3d4408a6df555 100644 (file)
@@ -1654,10 +1654,11 @@ static struct {
        { "WEP-40",  IWINFO_CIPHER_WEP40 },
        { "NONE",    IWINFO_CIPHER_NONE },
        { "TKIP",    IWINFO_CIPHER_TKIP },
-       { "CCMP",    IWINFO_CIPHER_CCMP }
+       { "CCMP",    IWINFO_CIPHER_CCMP },
+       { "GCMP",    IWINFO_CIPHER_GCMP }
 };
 
-static void parse_wpa_ciphers(const char *str, uint8_t *ciphers)
+static void parse_wpa_ciphers(const char *str, uint16_t *ciphers)
 {
        int i;
        size_t l;
index b4f98a903a721e4395e2fe734524b16e23d2c0fe..d071997b4bebd1d1139262988b5f449f24a6797e 100644 (file)
@@ -285,7 +285,7 @@ int iwinfo_hardware_id_from_mtd(struct iwinfo_hardware_id *id)
        return (id->vendor_id && id->device_id) ? 0 : -1;
 }
 
-static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
+static void iwinfo_parse_rsn_cipher(uint8_t idx, uint16_t *ciphers)
 {
        switch (idx)
        {
@@ -312,9 +312,12 @@ static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
                        *ciphers |= IWINFO_CIPHER_WEP104;
                        break;
 
+               case 8:
+                       *ciphers |= IWINFO_CIPHER_GCMP;
+                       break;
+
                case 6:  /* AES-128-CMAC */
                case 7:  /* No group addressed */
-               case 8:  /* GCMP */
                case 9:  /* GCMP-256 */
                case 10: /* CCMP-256 */
                case 11: /* BIP-GMAC-128 */
@@ -325,7 +328,7 @@ static void iwinfo_parse_rsn_cipher(uint8_t idx, uint8_t *ciphers)
 }
 
 void iwinfo_parse_rsn(struct iwinfo_crypto_entry *c, uint8_t *data, uint8_t len,
-                                         uint8_t defcipher, uint8_t defauth)
+                                         uint16_t defcipher, uint8_t defauth)
 {
        uint16_t i, count;
        uint8_t wpa_version = 0;