Skip to content

Commit ccfdec9

Browse files
Felix Walterdavem330
authored andcommitted
macsec: Add support for GCM-AES-256 cipher suite
This adds support for the GCM-AES-256 cipher suite as specified in IEEE 802.1AEbn-2011. The prepared cipher suite selection mechanism is used, with GCM-AES-128 being the default cipher suite as defined in the standard. Signed-off-by: Felix Walter <[email protected]> Cc: Sabrina Dubroca <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent e8b18af commit ccfdec9

File tree

2 files changed

+67
-16
lines changed

2 files changed

+67
-16
lines changed

drivers/net/macsec.c

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,12 @@ static struct macsec_cb *macsec_skb_cb(struct sk_buff *skb)
393393
#define MACSEC_PORT_SCB (0x0000)
394394
#define MACSEC_UNDEF_SCI ((__force sci_t)0xffffffffffffffffULL)
395395

396-
#define DEFAULT_SAK_LEN 16
396+
#define MACSEC_GCM_AES_128_SAK_LEN 16
397+
#define MACSEC_GCM_AES_256_SAK_LEN 32
398+
399+
#define MAX_SAK_LEN MACSEC_GCM_AES_256_SAK_LEN
400+
401+
#define DEFAULT_SAK_LEN MACSEC_GCM_AES_128_SAK_LEN
397402
#define DEFAULT_SEND_SCI true
398403
#define DEFAULT_ENCRYPT false
399404
#define DEFAULT_ENCODING_SA 0
@@ -1600,7 +1605,7 @@ static const struct nla_policy macsec_genl_sa_policy[NUM_MACSEC_SA_ATTR] = {
16001605
[MACSEC_SA_ATTR_KEYID] = { .type = NLA_BINARY,
16011606
.len = MACSEC_KEYID_LEN, },
16021607
[MACSEC_SA_ATTR_KEY] = { .type = NLA_BINARY,
1603-
.len = MACSEC_MAX_KEY_LEN, },
1608+
.len = MAX_SAK_LEN, },
16041609
};
16051610

16061611
static int parse_sa_config(struct nlattr **attrs, struct nlattr **tb_sa)
@@ -2362,15 +2367,26 @@ static int nla_put_secy(struct macsec_secy *secy, struct sk_buff *skb)
23622367
{
23632368
struct macsec_tx_sc *tx_sc = &secy->tx_sc;
23642369
struct nlattr *secy_nest = nla_nest_start(skb, MACSEC_ATTR_SECY);
2370+
u64 csid;
23652371

23662372
if (!secy_nest)
23672373
return 1;
23682374

2375+
switch (secy->key_len) {
2376+
case MACSEC_GCM_AES_128_SAK_LEN:
2377+
csid = MACSEC_CIPHER_ID_GCM_AES_128;
2378+
break;
2379+
case MACSEC_GCM_AES_256_SAK_LEN:
2380+
csid = MACSEC_CIPHER_ID_GCM_AES_256;
2381+
break;
2382+
default:
2383+
goto cancel;
2384+
}
2385+
23692386
if (nla_put_sci(skb, MACSEC_SECY_ATTR_SCI, secy->sci,
23702387
MACSEC_SECY_ATTR_PAD) ||
23712388
nla_put_u64_64bit(skb, MACSEC_SECY_ATTR_CIPHER_SUITE,
2372-
MACSEC_DEFAULT_CIPHER_ID,
2373-
MACSEC_SECY_ATTR_PAD) ||
2389+
csid, MACSEC_SECY_ATTR_PAD) ||
23742390
nla_put_u8(skb, MACSEC_SECY_ATTR_ICV_LEN, secy->icv_len) ||
23752391
nla_put_u8(skb, MACSEC_SECY_ATTR_OPER, secy->operational) ||
23762392
nla_put_u8(skb, MACSEC_SECY_ATTR_PROTECT, secy->protect_frames) ||
@@ -3015,8 +3031,8 @@ static void macsec_setup(struct net_device *dev)
30153031
eth_zero_addr(dev->broadcast);
30163032
}
30173033

3018-
static void macsec_changelink_common(struct net_device *dev,
3019-
struct nlattr *data[])
3034+
static int macsec_changelink_common(struct net_device *dev,
3035+
struct nlattr *data[])
30203036
{
30213037
struct macsec_secy *secy;
30223038
struct macsec_tx_sc *tx_sc;
@@ -3056,6 +3072,22 @@ static void macsec_changelink_common(struct net_device *dev,
30563072

30573073
if (data[IFLA_MACSEC_VALIDATION])
30583074
secy->validate_frames = nla_get_u8(data[IFLA_MACSEC_VALIDATION]);
3075+
3076+
if (data[IFLA_MACSEC_CIPHER_SUITE]) {
3077+
switch (nla_get_u64(data[IFLA_MACSEC_CIPHER_SUITE])) {
3078+
case MACSEC_CIPHER_ID_GCM_AES_128:
3079+
case MACSEC_DEFAULT_CIPHER_ALT:
3080+
secy->key_len = MACSEC_GCM_AES_128_SAK_LEN;
3081+
break;
3082+
case MACSEC_CIPHER_ID_GCM_AES_256:
3083+
secy->key_len = MACSEC_GCM_AES_256_SAK_LEN;
3084+
break;
3085+
default:
3086+
return -EINVAL;
3087+
}
3088+
}
3089+
3090+
return 0;
30593091
}
30603092

30613093
static int macsec_changelink(struct net_device *dev, struct nlattr *tb[],
@@ -3071,9 +3103,7 @@ static int macsec_changelink(struct net_device *dev, struct nlattr *tb[],
30713103
data[IFLA_MACSEC_PORT])
30723104
return -EINVAL;
30733105

3074-
macsec_changelink_common(dev, data);
3075-
3076-
return 0;
3106+
return macsec_changelink_common(dev, data);
30773107
}
30783108

30793109
static void macsec_del_dev(struct macsec_dev *macsec)
@@ -3270,8 +3300,11 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
32703300
if (err)
32713301
goto unlink;
32723302

3273-
if (data)
3274-
macsec_changelink_common(dev, data);
3303+
if (data) {
3304+
err = macsec_changelink_common(dev, data);
3305+
if (err)
3306+
goto del_dev;
3307+
}
32753308

32763309
err = register_macsec_dev(real_dev, dev);
32773310
if (err < 0)
@@ -3320,7 +3353,8 @@ static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[],
33203353
}
33213354

33223355
switch (csid) {
3323-
case MACSEC_DEFAULT_CIPHER_ID:
3356+
case MACSEC_CIPHER_ID_GCM_AES_128:
3357+
case MACSEC_CIPHER_ID_GCM_AES_256:
33243358
case MACSEC_DEFAULT_CIPHER_ALT:
33253359
if (icv_len < MACSEC_MIN_ICV_LEN ||
33263360
icv_len > MACSEC_STD_ICV_LEN)
@@ -3390,12 +3424,24 @@ static int macsec_fill_info(struct sk_buff *skb,
33903424
{
33913425
struct macsec_secy *secy = &macsec_priv(dev)->secy;
33923426
struct macsec_tx_sc *tx_sc = &secy->tx_sc;
3427+
u64 csid;
3428+
3429+
switch (secy->key_len) {
3430+
case MACSEC_GCM_AES_128_SAK_LEN:
3431+
csid = MACSEC_CIPHER_ID_GCM_AES_128;
3432+
break;
3433+
case MACSEC_GCM_AES_256_SAK_LEN:
3434+
csid = MACSEC_CIPHER_ID_GCM_AES_256;
3435+
break;
3436+
default:
3437+
goto nla_put_failure;
3438+
}
33933439

33943440
if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci,
33953441
IFLA_MACSEC_PAD) ||
33963442
nla_put_u8(skb, IFLA_MACSEC_ICV_LEN, secy->icv_len) ||
33973443
nla_put_u64_64bit(skb, IFLA_MACSEC_CIPHER_SUITE,
3398-
MACSEC_DEFAULT_CIPHER_ID, IFLA_MACSEC_PAD) ||
3444+
csid, IFLA_MACSEC_PAD) ||
33993445
nla_put_u8(skb, IFLA_MACSEC_ENCODING_SA, tx_sc->encoding_sa) ||
34003446
nla_put_u8(skb, IFLA_MACSEC_ENCRYPT, tx_sc->encrypt) ||
34013447
nla_put_u8(skb, IFLA_MACSEC_PROTECT, secy->protect_frames) ||

include/uapi/linux/if_macsec.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,17 @@
1818
#define MACSEC_GENL_NAME "macsec"
1919
#define MACSEC_GENL_VERSION 1
2020

21-
#define MACSEC_MAX_KEY_LEN 128
21+
#define MACSEC_MAX_KEY_LEN 256
2222

2323
#define MACSEC_KEYID_LEN 16
2424

25-
#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL
26-
#define MACSEC_DEFAULT_CIPHER_ALT 0x0080C20001000001ULL
25+
/* cipher IDs as per IEEE802.1AEbn-2011 */
26+
#define MACSEC_CIPHER_ID_GCM_AES_128 0x0080C20001000001ULL
27+
#define MACSEC_CIPHER_ID_GCM_AES_256 0x0080C20001000002ULL
28+
29+
#define MACSEC_DEFAULT_CIPHER_ID MACSEC_CIPHER_ID_GCM_AES_128
30+
/* deprecated cipher ID for GCM-AES-128 */
31+
#define MACSEC_DEFAULT_CIPHER_ALT 0x0080020001000001ULL
2732

2833
#define MACSEC_MIN_ICV_LEN 8
2934
#define MACSEC_MAX_ICV_LEN 32

0 commit comments

Comments
 (0)