@@ -393,7 +393,12 @@ static struct macsec_cb *macsec_skb_cb(struct sk_buff *skb)
393
393
#define MACSEC_PORT_SCB (0x0000)
394
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
402
#define DEFAULT_SEND_SCI true
398
403
#define DEFAULT_ENCRYPT false
399
404
#define DEFAULT_ENCODING_SA 0
@@ -1600,7 +1605,7 @@ static const struct nla_policy macsec_genl_sa_policy[NUM_MACSEC_SA_ATTR] = {
1600
1605
[MACSEC_SA_ATTR_KEYID ] = { .type = NLA_BINARY ,
1601
1606
.len = MACSEC_KEYID_LEN , },
1602
1607
[MACSEC_SA_ATTR_KEY ] = { .type = NLA_BINARY ,
1603
- .len = MACSEC_MAX_KEY_LEN , },
1608
+ .len = MAX_SAK_LEN , },
1604
1609
};
1605
1610
1606
1611
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)
2362
2367
{
2363
2368
struct macsec_tx_sc * tx_sc = & secy -> tx_sc ;
2364
2369
struct nlattr * secy_nest = nla_nest_start (skb , MACSEC_ATTR_SECY );
2370
+ u64 csid ;
2365
2371
2366
2372
if (!secy_nest )
2367
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
2386
if (nla_put_sci (skb , MACSEC_SECY_ATTR_SCI , secy -> sci ,
2370
2387
MACSEC_SECY_ATTR_PAD ) ||
2371
2388
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 ) ||
2374
2390
nla_put_u8 (skb , MACSEC_SECY_ATTR_ICV_LEN , secy -> icv_len ) ||
2375
2391
nla_put_u8 (skb , MACSEC_SECY_ATTR_OPER , secy -> operational ) ||
2376
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
3031
eth_zero_addr (dev -> broadcast );
3016
3032
}
3017
3033
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 [])
3020
3036
{
3021
3037
struct macsec_secy * secy ;
3022
3038
struct macsec_tx_sc * tx_sc ;
@@ -3056,6 +3072,22 @@ static void macsec_changelink_common(struct net_device *dev,
3056
3072
3057
3073
if (data [IFLA_MACSEC_VALIDATION ])
3058
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
3061
3093
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[],
3071
3103
data [IFLA_MACSEC_PORT ])
3072
3104
return - EINVAL ;
3073
3105
3074
- macsec_changelink_common (dev , data );
3075
-
3076
- return 0 ;
3106
+ return macsec_changelink_common (dev , data );
3077
3107
}
3078
3108
3079
3109
static void macsec_del_dev (struct macsec_dev * macsec )
@@ -3270,8 +3300,11 @@ static int macsec_newlink(struct net *net, struct net_device *dev,
3270
3300
if (err )
3271
3301
goto unlink ;
3272
3302
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
+ }
3275
3308
3276
3309
err = register_macsec_dev (real_dev , dev );
3277
3310
if (err < 0 )
@@ -3320,7 +3353,8 @@ static int macsec_validate_attr(struct nlattr *tb[], struct nlattr *data[],
3320
3353
}
3321
3354
3322
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
3358
case MACSEC_DEFAULT_CIPHER_ALT :
3325
3359
if (icv_len < MACSEC_MIN_ICV_LEN ||
3326
3360
icv_len > MACSEC_STD_ICV_LEN )
@@ -3390,12 +3424,24 @@ static int macsec_fill_info(struct sk_buff *skb,
3390
3424
{
3391
3425
struct macsec_secy * secy = & macsec_priv (dev )-> secy ;
3392
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
3440
if (nla_put_sci (skb , IFLA_MACSEC_SCI , secy -> sci ,
3395
3441
IFLA_MACSEC_PAD ) ||
3396
3442
nla_put_u8 (skb , IFLA_MACSEC_ICV_LEN , secy -> icv_len ) ||
3397
3443
nla_put_u64_64bit (skb , IFLA_MACSEC_CIPHER_SUITE ,
3398
- MACSEC_DEFAULT_CIPHER_ID , IFLA_MACSEC_PAD ) ||
3444
+ csid , IFLA_MACSEC_PAD ) ||
3399
3445
nla_put_u8 (skb , IFLA_MACSEC_ENCODING_SA , tx_sc -> encoding_sa ) ||
3400
3446
nla_put_u8 (skb , IFLA_MACSEC_ENCRYPT , tx_sc -> encrypt ) ||
3401
3447
nla_put_u8 (skb , IFLA_MACSEC_PROTECT , secy -> protect_frames ) ||
0 commit comments