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 @@ ...@@ -11,18 +11,45 @@
#include <uapi/linux/if_link.h> #include <uapi/linux/if_link.h>
#include <uapi/linux/if_macsec.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 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 * struct macsec_key - SA key
* @id: user-provided key identifier * @id: user-provided key identifier
* @tfm: crypto struct, key storage * @tfm: crypto struct, key storage
* @salt: salt used to generate IV in XPN cipher suites
*/ */
struct macsec_key { struct macsec_key {
u8 id[MACSEC_KEYID_LEN]; u8 id[MACSEC_KEYID_LEN];
struct crypto_aead *tfm; struct crypto_aead *tfm;
salt_t salt;
}; };
struct macsec_rx_sc_stats { struct macsec_rx_sc_stats {
...@@ -64,12 +91,17 @@ struct macsec_tx_sc_stats { ...@@ -64,12 +91,17 @@ struct macsec_tx_sc_stats {
* @next_pn: packet number expected for the next packet * @next_pn: packet number expected for the next packet
* @lock: protects next_pn manipulations * @lock: protects next_pn manipulations
* @key: key structure * @key: key structure
* @ssci: short secure channel identifier
* @stats: per-SA stats * @stats: per-SA stats
*/ */
struct macsec_rx_sa { struct macsec_rx_sa {
struct macsec_key key; struct macsec_key key;
ssci_t ssci;
spinlock_t lock; spinlock_t lock;
u32 next_pn; union {
pn_t next_pn_halves;
u64 next_pn;
};
refcount_t refcnt; refcount_t refcnt;
bool active; bool active;
struct macsec_rx_sa_stats __percpu *stats; struct macsec_rx_sa_stats __percpu *stats;
...@@ -110,12 +142,17 @@ struct macsec_rx_sc { ...@@ -110,12 +142,17 @@ struct macsec_rx_sc {
* @next_pn: packet number to use for the next packet * @next_pn: packet number to use for the next packet
* @lock: protects next_pn manipulations * @lock: protects next_pn manipulations
* @key: key structure * @key: key structure
* @ssci: short secure channel identifier
* @stats: per-SA stats * @stats: per-SA stats
*/ */
struct macsec_tx_sa { struct macsec_tx_sa {
struct macsec_key key; struct macsec_key key;
ssci_t ssci;
spinlock_t lock; spinlock_t lock;
u32 next_pn; union {
pn_t next_pn_halves;
u64 next_pn;
};
refcount_t refcnt; refcount_t refcnt;
bool active; bool active;
struct macsec_tx_sa_stats __percpu *stats; struct macsec_tx_sa_stats __percpu *stats;
...@@ -152,6 +189,7 @@ struct macsec_tx_sc { ...@@ -152,6 +189,7 @@ struct macsec_tx_sc {
* @key_len: length of keys used by the cipher suite * @key_len: length of keys used by the cipher suite
* @icv_len: length of ICV used by the cipher suite * @icv_len: length of ICV used by the cipher suite
* @validate_frames: validation mode * @validate_frames: validation mode
* @xpn: enable XPN for this SecY
* @operational: MAC_Operational flag * @operational: MAC_Operational flag
* @protect_frames: enable protection for this SecY * @protect_frames: enable protection for this SecY
* @replay_protect: enable packet number checks on receive * @replay_protect: enable packet number checks on receive
...@@ -166,6 +204,7 @@ struct macsec_secy { ...@@ -166,6 +204,7 @@ struct macsec_secy {
u16 key_len; u16 key_len;
u16 icv_len; u16 icv_len;
enum macsec_validation_type validate_frames; enum macsec_validation_type validate_frames;
bool xpn;
bool operational; bool operational;
bool protect_frames; bool protect_frames;
bool replay_protect; 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