Commit a21ecf0e authored by Era Mayflower's avatar Era Mayflower Committed by David S. Miller

macsec: Support XPN frame handling - IEEE 802.1AEbw

Support extended packet number cipher suites (802.1AEbw) frames handling.
This does not include the needed netlink patches.

    * Added xpn boolean field to `struct macsec_secy`.
    * Added ssci field to `struct_macsec_tx_sa` (802.1AE figure 10-5).
    * Added ssci field to `struct_macsec_rx_sa` (802.1AE figure 10-5).
    * Added salt field to `struct macsec_key` (802.1AE 10.7 NOTE 1).
    * Created pn_t type for easy access to lower and upper halves.
    * Created salt_t type for easy access to the "ssci" and "pn" parts.
    * Created `macsec_fill_iv_xpn` function to create IV in XPN mode.
    * Support in PN recovery and preliminary replay check in XPN mode.

In addition, according to IEEE 802.1AEbw figure 10-5, the PN of incoming
frame can be 0 when XPN cipher suite is used, so fixed the function
`macsec_validate_skb` to fail on PN=0 only if XPN is off.
Signed-off-by: default avatarEra Mayflower <mayflowerera@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 65b7a2c8
This diff is collapsed.
......@@ -11,18 +11,45 @@
#include <uapi/linux/if_link.h>
#include <uapi/linux/if_macsec.h>
#define MACSEC_SALT_LEN 12
#define MACSEC_NUM_AN 4 /* 2 bits for the association number */
typedef u64 __bitwise sci_t;
typedef u32 __bitwise ssci_t;
#define MACSEC_NUM_AN 4 /* 2 bits for the association number */
typedef union salt {
struct {
u32 ssci;
u64 pn;
} __packed;
u8 bytes[MACSEC_SALT_LEN];
} __packed salt_t;
typedef union pn {
struct {
#if defined(__LITTLE_ENDIAN_BITFIELD)
u32 lower;
u32 upper;
#elif defined(__BIG_ENDIAN_BITFIELD)
u32 upper;
u32 lower;
#else
#error "Please fix <asm/byteorder.h>"
#endif
};
u64 full64;
} pn_t;
/**
* struct macsec_key - SA key
* @id: user-provided key identifier
* @tfm: crypto struct, key storage
* @salt: salt used to generate IV in XPN cipher suites
*/
struct macsec_key {
u8 id[MACSEC_KEYID_LEN];
struct crypto_aead *tfm;
salt_t salt;
};
struct macsec_rx_sc_stats {
......@@ -64,12 +91,17 @@ struct macsec_tx_sc_stats {
* @next_pn: packet number expected for the next packet
* @lock: protects next_pn manipulations
* @key: key structure
* @ssci: short secure channel identifier
* @stats: per-SA stats
*/
struct macsec_rx_sa {
struct macsec_key key;
ssci_t ssci;
spinlock_t lock;
u32 next_pn;
union {
pn_t next_pn_halves;
u64 next_pn;
};
refcount_t refcnt;
bool active;
struct macsec_rx_sa_stats __percpu *stats;
......@@ -110,12 +142,17 @@ struct macsec_rx_sc {
* @next_pn: packet number to use for the next packet
* @lock: protects next_pn manipulations
* @key: key structure
* @ssci: short secure channel identifier
* @stats: per-SA stats
*/
struct macsec_tx_sa {
struct macsec_key key;
ssci_t ssci;
spinlock_t lock;
u32 next_pn;
union {
pn_t next_pn_halves;
u64 next_pn;
};
refcount_t refcnt;
bool active;
struct macsec_tx_sa_stats __percpu *stats;
......@@ -152,6 +189,7 @@ struct macsec_tx_sc {
* @key_len: length of keys used by the cipher suite
* @icv_len: length of ICV used by the cipher suite
* @validate_frames: validation mode
* @xpn: enable XPN for this SecY
* @operational: MAC_Operational flag
* @protect_frames: enable protection for this SecY
* @replay_protect: enable packet number checks on receive
......@@ -166,6 +204,7 @@ struct macsec_secy {
u16 key_len;
u16 icv_len;
enum macsec_validation_type validate_frames;
bool xpn;
bool operational;
bool protect_frames;
bool replay_protect;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment