aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/macsec.c72
-rw-r--r--include/uapi/linux/if_macsec.h11
2 files changed, 67 insertions, 16 deletions
diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c
index 1d025ab9568f..f522715c6595 100644
--- a/drivers/net/macsec.c
+++ b/drivers/net/macsec.c
@@ -393,7 +393,12 @@ static struct macsec_cb *macsec_skb_cb(struct sk_buff *skb)
393#define MACSEC_PORT_SCB (0x0000) 393#define MACSEC_PORT_SCB (0x0000)
394#define MACSEC_UNDEF_SCI ((__force sci_t)0xffffffffffffffffULL) 394#define MACSEC_UNDEF_SCI ((__force sci_t)0xffffffffffffffffULL)
395 395
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
397#define DEFAULT_SEND_SCI true 402#define DEFAULT_SEND_SCI true
398#define DEFAULT_ENCRYPT false 403#define DEFAULT_ENCRYPT false
399#define DEFAULT_ENCODING_SA 0 404#define DEFAULT_ENCODING_SA 0
@@ -1600,7 +1605,7 @@ static const struct nla_policy macsec_genl_sa_policy[NUM_MACSEC_SA_ATTR] = {
1600 [MACSEC_SA_ATTR_KEYID] = { .type = NLA_BINARY, 1605 [MACSEC_SA_ATTR_KEYID] = { .type = NLA_BINARY,
1601 .len = MACSEC_KEYID_LEN, }, 1606 .len = MACSEC_KEYID_LEN, },
1602 [MACSEC_SA_ATTR_KEY] = { .type = NLA_BINARY, 1607 [MACSEC_SA_ATTR_KEY] = { .type = NLA_BINARY,
1603 .len = MACSEC_MAX_KEY_LEN, }, 1608 .len = MAX_SAK_LEN, },
1604}; 1609};
1605 1610
1606static int parse_sa_config(struct nlattr **attrs, struct nlattr **tb_sa) 1611static 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)
2362{ 2367{
2363 struct macsec_tx_sc *tx_sc = &secy->tx_sc; 2368 struct macsec_tx_sc *tx_sc = &secy->tx_sc;
2364 struct nlattr *secy_nest = nla_nest_start(skb, MACSEC_ATTR_SECY); 2369 struct nlattr *secy_nest = nla_nest_start(skb, MACSEC_ATTR_SECY);
2370 u64 csid;
2365 2371
2366 if (!secy_nest) 2372 if (!secy_nest)
2367 return 1; 2373 return 1;
2368 2374
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
2369 if (nla_put_sci(skb, MACSEC_SECY_ATTR_SCI, secy->sci, 2386 if (nla_put_sci(skb, MACSEC_SECY_ATTR_SCI, secy->sci,
2370 MACSEC_SECY_ATTR_PAD) || 2387 MACSEC_SECY_ATTR_PAD) ||
2371 nla_put_u64_64bit(skb, MACSEC_SECY_ATTR_CIPHER_SUITE, 2388 nla_put_u64_64bit(skb, MACSEC_SECY_ATTR_CIPHER_SUITE,
2372 MACSEC_DEFAULT_CIPHER_ID, 2389 csid, MACSEC_SECY_ATTR_PAD) ||
2373 MACSEC_SECY_ATTR_PAD) ||
2374 nla_put_u8(skb, MACSEC_SECY_ATTR_ICV_LEN, secy->icv_len) || 2390 nla_put_u8(skb, MACSEC_SECY_ATTR_ICV_LEN, secy->icv_len) ||
2375 nla_put_u8(skb, MACSEC_SECY_ATTR_OPER, secy->operational) || 2391 nla_put_u8(skb, MACSEC_SECY_ATTR_OPER, secy->operational) ||
2376 nla_put_u8(skb, MACSEC_SECY_ATTR_PROTECT, secy->protect_frames) || 2392 nla_put_u8(skb, MACSEC_SECY_ATTR_PROTECT, secy->protect_frames) ||
@@ -3015,8 +3031,8 @@ static void macsec_setup(struct net_device *dev)
3015 eth_zero_addr(dev->broadcast); 3031 eth_zero_addr(dev->broadcast);
3016} 3032}
3017 3033
3018static void macsec_changelink_common(struct net_device *dev, 3034static int macsec_changelink_common(struct net_device *dev,
3019 struct nlattr *data[]) 3035 struct nlattr *data[])
3020{ 3036{
3021 struct macsec_secy *secy; 3037 struct macsec_secy *secy;
3022 struct macsec_tx_sc *tx_sc; 3038 struct macsec_tx_sc *tx_sc;
@@ -3056,6 +3072,22 @@ static void macsec_changelink_common(struct net_device *dev,
3056 3072
3057 if (data[IFLA_MACSEC_VALIDATION]) 3073 if (data[IFLA_MACSEC_VALIDATION])
3058 secy->validate_frames = nla_get_u8(data[IFLA_MACSEC_VALIDATION]); 3074 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;
3059} 3091}
3060 3092
3061static int macsec_changelink(struct net_device *dev, struct nlattr *tb[], 3093static 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[],
3071 data[IFLA_MACSEC_PORT]) 3103 data[IFLA_MACSEC_PORT])
3072 return -EINVAL; 3104 return -EINVAL;
3073 3105
3074 macsec_changelink_common(dev, data); 3106 return macsec_changelink_common(dev, data);
3075
3076 return 0;
3077} 3107}
3078 3108
3079static void macsec_del_dev(struct macsec_dev *macsec) 3109static void macsec_del_dev(struct macsec_dev *macsec)
@@ -3270,8 +3300,11 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
3270 if (err) 3300 if (err)
3271 goto unlink; 3301 goto unlink;
3272 3302
3273 if (data) 3303 if (data) {
3274 macsec_changelink_common(dev, data); 3304 err = macsec_changelink_common(dev, data);
3305 if (err)
3306 goto del_dev;
3307 }
3275 3308
3276 err = register_macsec_dev(real_dev, dev); 3309 err = register_macsec_dev(real_dev, dev);
3277 if (err < 0) 3310 if (err < 0)
@@ -3320,7 +3353,8 @@ static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[],
3320 } 3353 }
3321 3354
3322 switch (csid) { 3355 switch (csid) {
3323 case MACSEC_DEFAULT_CIPHER_ID: 3356 case MACSEC_CIPHER_ID_GCM_AES_128:
3357 case MACSEC_CIPHER_ID_GCM_AES_256:
3324 case MACSEC_DEFAULT_CIPHER_ALT: 3358 case MACSEC_DEFAULT_CIPHER_ALT:
3325 if (icv_len < MACSEC_MIN_ICV_LEN || 3359 if (icv_len < MACSEC_MIN_ICV_LEN ||
3326 icv_len > MACSEC_STD_ICV_LEN) 3360 icv_len > MACSEC_STD_ICV_LEN)
@@ -3390,12 +3424,24 @@ static int macsec_fill_info(struct sk_buff *skb,
3390{ 3424{
3391 struct macsec_secy *secy = &macsec_priv(dev)->secy; 3425 struct macsec_secy *secy = &macsec_priv(dev)->secy;
3392 struct macsec_tx_sc *tx_sc = &secy->tx_sc; 3426 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 }
3393 3439
3394 if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci, 3440 if (nla_put_sci(skb, IFLA_MACSEC_SCI, secy->sci,
3395 IFLA_MACSEC_PAD) || 3441 IFLA_MACSEC_PAD) ||
3396 nla_put_u8(skb, IFLA_MACSEC_ICV_LEN, secy->icv_len) || 3442 nla_put_u8(skb, IFLA_MACSEC_ICV_LEN, secy->icv_len) ||
3397 nla_put_u64_64bit(skb, IFLA_MACSEC_CIPHER_SUITE, 3443 nla_put_u64_64bit(skb, IFLA_MACSEC_CIPHER_SUITE,
3398 MACSEC_DEFAULT_CIPHER_ID, IFLA_MACSEC_PAD) || 3444 csid, IFLA_MACSEC_PAD) ||
3399 nla_put_u8(skb, IFLA_MACSEC_ENCODING_SA, tx_sc->encoding_sa) || 3445 nla_put_u8(skb, IFLA_MACSEC_ENCODING_SA, tx_sc->encoding_sa) ||
3400 nla_put_u8(skb, IFLA_MACSEC_ENCRYPT, tx_sc->encrypt) || 3446 nla_put_u8(skb, IFLA_MACSEC_ENCRYPT, tx_sc->encrypt) ||
3401 nla_put_u8(skb, IFLA_MACSEC_PROTECT, secy->protect_frames) || 3447 nla_put_u8(skb, IFLA_MACSEC_PROTECT, secy->protect_frames) ||
diff --git a/include/uapi/linux/if_macsec.h b/include/uapi/linux/if_macsec.h
index 719d243471f4..2e522835a4af 100644
--- a/include/uapi/linux/if_macsec.h
+++ b/include/uapi/linux/if_macsec.h
@@ -18,12 +18,17 @@
18#define MACSEC_GENL_NAME "macsec" 18#define MACSEC_GENL_NAME "macsec"
19#define MACSEC_GENL_VERSION 1 19#define MACSEC_GENL_VERSION 1
20 20
21#define MACSEC_MAX_KEY_LEN 128 21#define MACSEC_MAX_KEY_LEN 256
22 22
23#define MACSEC_KEYID_LEN 16 23#define MACSEC_KEYID_LEN 16
24 24
25#define MACSEC_DEFAULT_CIPHER_ID 0x0080020001000001ULL 25/* cipher IDs as per IEEE802.1AEbn-2011 */
26#define MACSEC_DEFAULT_CIPHER_ALT 0x0080C20001000001ULL 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
27 32
28#define MACSEC_MIN_ICV_LEN 8 33#define MACSEC_MIN_ICV_LEN 8
29#define MACSEC_MAX_ICV_LEN 32 34#define MACSEC_MAX_ICV_LEN 32