MFP
[UMAC]

Structures and Helper functions of the UMAC's MFP Module. More...

Collaboration diagram for MFP:

Defines

#define S(a, s)   sbox_t[(a >> s) & 0xff]
 Apply Substitution.
#define SX2(a, s)   x_time2_sbox_t[(a >> s) & 0xff]
 apply substitution square
#define SX3(a, s)   x_time3_sbox_t[(a >> s) & 0xff]
 apply substitution cube

Enumerations

enum  mfp_protection { MFP_NO_PROT, MFP_UNICAST_PROT, MFP_MULTICAST_PROT }
 

list of MFP protection

More...

Functions

static bool mfp_is_group_addressed_privacy (uint16_t frame_cntl, uint8_t action)
 Check if it is an action frame indicated as "Group Addressed Privacy".
static bool mfp_check_mmic_ie (uint32_t frame, uint16_t length, uint16_t machdr_len, struct vif_info_tag *vif, struct sta_info_tag *sta)
 Check validity of MGMT MIC IE.
bool mfp_is_robust_frame (uint16_t frame_cntl, uint8_t action)
 Check if it is a robust management frame.
bool mfp_ignore_mgmt_frame (struct rx_cntrl_rx_status *rx_status, uint32_t *frame, uint16_t frmlen, bool *upload)
 Check if the management frame must be ignored.
enum mfp_protection mfp_protect_mgmt_frame (struct txdesc *txdesc, uint16_t fctl, uint8_t action)
 Check if the management frame must be protected.
int mfp_add_mgmt_mic (struct txdesc *txdesc, uint32_t frame, int length, uint32_t mmic)
 Add the MGMT MIC IE at the end of the frame.
__INLINE uint32_t sched_core (uint32_t val, int r)
 Key schedule core function.
static void aes_expand_key (uint32_t *key, uint32_t *rk)
 expand AES key.
__INLINE void add_round_key (uint32_t *rk, uint32_t *data, int r)
 AddRoundKey step of AES encryption.
__INLINE void shift_sub (uint32_t *data)
 SubBytes and ShiftRows steps of AES encryption.
__INLINE void mix_shift_sub (uint32_t *data)
 SubBytes, ShiftRows and MixColumns steps of AES encryption.
static void aes_encrypt_block (uint32_t *rk, uint32_t *data)
 Encrypt a block of data inplace with AES.
static void aes_cmac_shift_sub_key (uint32_t *k)
 Left shift by 1 bit and XOR CMAC subkey.
__INLINE void xor_block (uint32_t *a, uint32_t *b)
 XOR two vectors of 16 bytes.
static uint64_t aes_cmac (uint32_t *key, int nb_elem, uint32_t addr[], int len[])
 Compute AES-CMAC on provided vectors.
uint64_t mfp_compute_bip (struct key_info_tag *key, uint32_t frame_addr, int frame_len, int machdr_len, uint32_t mmic_addr)
 Compute MIC for BIP (Broadcast Integrity Protocol).

Variables

static const uint8_t sbox_t [256]
 Substitution box.
static const uint8_t x_time2_sbox_t [256]
 Substitution box (square).
static const uint8_t x_time3_sbox_t [256]
 Substitution box (cube).
const uint32_t rcon_t []
 rcon: exponentiation of 2 to a user-specified value
uint16_t mfp_aad [10]
 Additional Authentication Data vector for MIC computation Must be in SHARED RAM when HSU is used.

Detailed Description

Structures and Helper functions of the UMAC's MFP Module.


Enumeration Type Documentation

list of MFP protection

Enumerator:
MFP_NO_PROT 

no protection needed

MFP_UNICAST_PROT 

need unicast protection

MFP_MULTICAST_PROT 

need multicast protection (i.e. MGMT MIC)

Definition at line 31 of file mfp.h.


Function Documentation

__INLINE void add_round_key ( uint32_t *  rk,
uint32_t *  data,
int  r 
)

AddRoundKey step of AES encryption.

Parameters:
[in] rk Expanded key
[in,out] data Block of data (16 bytes)
[in] r round index

Definition at line 158 of file mfp_bip.c.

Referenced by aes_encrypt_block().

static uint64_t aes_cmac ( uint32_t *  key,
int  nb_elem,
uint32_t  addr[],
int  len[] 
) [static]

Compute AES-CMAC on provided vectors.

Software implementation for AES-CMAC.

Parameters:
[in] key Key (16 bytes)
[in] nb_elem Number of element in addr and len tables.
[in] addr Table of input vector addresses (HW address)
[in] len Table of input vector length (in bytes)
Returns:
AES_CMAC value of all input vectors concatenated.

Definition at line 315 of file mfp_bip.c.

References aes_cmac_shift_sub_key(), aes_encrypt_block(), aes_expand_key(), co_read32p(), co_read8p(), co_write8p(), CPU2HW, and xor_block().

static void aes_cmac_shift_sub_key ( uint32_t *  k  )  [static]

Left shift by 1 bit and XOR CMAC subkey.

Parameters:
[in,out] k Subkey to shift (16 bytes)

Definition at line 261 of file mfp_bip.c.

Referenced by aes_cmac().

static void aes_encrypt_block ( uint32_t *  rk,
uint32_t *  data 
) [static]

Encrypt a block of data inplace with AES.

Parameters:
[in] rk Expanded key
[in,out] data Block of data to encrypt in place (16 bytes)

Definition at line 236 of file mfp_bip.c.

References add_round_key(), mix_shift_sub(), and shift_sub().

Referenced by aes_cmac().

static void aes_expand_key ( uint32_t *  key,
uint32_t *  rk 
) [static]

expand AES key.

Parameters:
[in] key Key to expand (16 bytes)
[out] rk Buffer to store expanded key (11 rounds: 11*16 bytes)

Definition at line 128 of file mfp_bip.c.

References sched_core().

Referenced by aes_cmac().

int mfp_add_mgmt_mic ( struct txdesc txdesc,
uint32_t  frame,
int  length,
uint32_t  mmic 
)

Add the MGMT MIC IE at the end of the frame.

Parameters:
[in] txdesc TX descriptor for the frame (need updated vif id)
[in] frame Address of frame must be an HW address
[in] length Size in bytes of the frame (Does NOT include MGMT MIC IE)
[in] mmic Address of the MGMT MIC element (HW address). Can be set to 0 if there is enough space in the buffer pointed by frame.
Returns:
Size of the MGMT MIC IE added

Referenced by txl_hwdesc_config_post().

static bool mfp_check_mmic_ie ( uint32_t  frame,
uint16_t  length,
uint16_t  machdr_len,
struct vif_info_tag vif,
struct sta_info_tag sta 
) [static]

Check validity of MGMT MIC IE.

Parameters:
[in] frame Pointer to the frame buffer
[in] length Size, in bytes, of the frames
[in] machdr_len Size, in bytes, of the mac header in the frame
[in] vif Poiner to VIF structure
[in] sta Pointer to STA structure (only if MESH is enabled)
Returns:
True if the frame contains a valid MGMT MIC IE, false otherwise.

Definition at line 58 of file mfp.c.

References co_read16p(), co_read64p(), co_write8p(), vif_info_tag::key_info, sta_mgmt_sec_info::key_mfp_mesh_info, MAC_DEFAULT_KEY_COUNT, mac_ie_mgmt_mic_find(), MAC_MGMT_MIC_IPN_OFT, MAC_MGMT_MIC_KEYID_OFT, MAC_MGMT_MIC_LEN, MAC_MGMT_MIC_MIC_LEN, MAC_MGMT_MIC_MIC_OFT, mfp_compute_bip(), key_info_tag::rx_pn, sta_info_tag::sta_sec_info, vif_info_tag::type, key_info_tag::valid, and VIF_MESH_POINT.

uint64_t mfp_compute_bip ( struct key_info_tag key,
uint32_t  frame_addr,
int  frame_len,
int  machdr_len,
uint32_t  mmic_addr 
)

Compute MIC for BIP (Broadcast Integrity Protocol).

The function takes a complete frame as parameter, with a MGMT MIC Element whose MIC field has been set to zero. If the MGMT MIC element is already located at the end of the frame then the parameter mmic_addr can be set to 0. It does not update MIC field in MGMT MIC Element.

Parameters:
[in] key Key for BIP (aka IGTK)
[in] frame_addr Address of frame (HW address)
[in] frame_len Size in bytes of the frame (excluding MGMT MIC elt)
[in] machdr_len Size in bytes on MAC header in the frame
[in] mmic_addr Optional address of the MGMT MIC element if not included in the frame buffer (HW address)
Returns:
MIC value for this frame

Referenced by mfp_check_mmic_ie().

bool mfp_ignore_mgmt_frame ( struct rx_cntrl_rx_status rx_status,
uint32_t *  frame,
uint16_t  frmlen,
bool *  upload 
)

Check if the management frame must be ignored.

To be called when a management frame is received. The function will ignore a robust management frame if:

  • It is is received from unknown STA
  • It is a unicast frame from a STA with MFP enabled and it is not protected
  • It is a multicast frame, MFP is enabled on the vif and it doesn't have a valid MGMT MIC IE
  • It is a "Group Adressed Privacy" Action frame not protected (whatever the MFP status of the VIF)

Even if a frame is ignored, it may be needed to report it to upper layer (e.g. to start SA query procedure). In this case, if a frame is ignored

Parameters:
upload is used to indicate if it must be reported to host.
Note:
In case of multicast frame with MGMT MIC IE, the function will clear the mic value.
Parameters:
[in] rx_status Information on received frame
[in] frame Address of frame (must be an HW address)
[in] frmlen Size in bytes of the frame (including MGMT MIC IE)
[out] upload Updated only if it returns true
Returns:
True is the frame must be discarded, false otherwise.

Referenced by rxu_mgt_frame_check().

static bool mfp_is_group_addressed_privacy ( uint16_t  frame_cntl,
uint8_t  action 
) [static]

Check if it is an action frame indicated as "Group Addressed Privacy".

"Group Addressed Privacy" action frame are sent encrypted using the group key. So far it is only used for MESH and MultiHop action frames.

Parameters:
[in] frame_cntl The Frame Control field of the Frame
[in] action Action field if the frame is an Action frame
Returns:
true for "group Addressed privacy" action frame and false otherwise.

Definition at line 37 of file mfp.c.

References MAC_FCTRL_ACTION_ST, MAC_FCTRL_MGT_T, MAC_FCTRL_SUBT_MASK, MAC_FCTRL_TYPE_MASK, MAC_MESH_ACTION_CATEGORY, and MAC_MULTIHOP_ACTION_CATEGORY.

bool mfp_is_robust_frame ( uint16_t  frame_cntl,
uint8_t  action 
)

Check if it is a robust management frame.

Parameters:
[in] frame_cntl The Frame Control field of the Frame
[in] action Action field if the frame is an Action frame
Returns:
true if it is a robust management frame, false otherwise.
enum mfp_protection mfp_protect_mgmt_frame ( struct txdesc txdesc,
uint16_t  fctl,
uint8_t  action 
)

Check if the management frame must be protected.

Return if the frame must be protected or not. A frame may need unicast protection (i.e. encrypted with pairwise key) or multicast protection (i.e. adding a MGMT MIC IE at the end). See txu_cntrl_protect_mgmt_frame and mfp_add_mgmt_mic for adding the protection to the frame.

Note:
Some management frames must sometimes be protected even if MFP is not enabled for the connection (e.g. "Group Addresses Privacy" action frame).
Parameters:
[in] txdesc TX descriptor for the frame (need updated vif and sta id)
[in] fctl Frame control field of the frame
[in] action First byte on the MPDU body (i.e. action category for Action frame)
Returns:
The type of protection to apply on the frame.

Referenced by txu_cntrl_umacdesc_mgmt_prep().

__INLINE void mix_shift_sub ( uint32_t *  data  ) 

SubBytes, ShiftRows and MixColumns steps of AES encryption.

Parameters:
[in,out] data Block of data (16 bytes)

Definition at line 194 of file mfp_bip.c.

References S, SX2, and SX3.

Referenced by aes_encrypt_block().

__INLINE uint32_t sched_core ( uint32_t  val,
int  r 
)

Key schedule core function.

Parameters:
[in] val Input value
[in] r round index
Returns:
val after rotate, rcon and sbox steps

Definition at line 112 of file mfp_bip.c.

References rcon_t, and S.

Referenced by aes_expand_key().

__INLINE void shift_sub ( uint32_t *  data  ) 

SubBytes and ShiftRows steps of AES encryption.

Parameters:
[in,out] data Block of data (16 bytes)

Definition at line 174 of file mfp_bip.c.

References S.

Referenced by aes_encrypt_block().

__INLINE void xor_block ( uint32_t *  a,
uint32_t *  b 
)

XOR two vectors of 16 bytes.

It is assumed that both vectors are aligned on 32bits

Parameters:
[in,out] a First input and output vector
[in] b Second input vector

Definition at line 292 of file mfp_bip.c.

Referenced by aes_cmac().


Variable Documentation

uint16_t mfp_aad[10]

Additional Authentication Data vector for MIC computation Must be in SHARED RAM when HSU is used.

Definition at line 412 of file mfp_bip.c.

const uint32_t rcon_t[]
Initial value:
 {
    0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36,
}

rcon: exponentiation of 2 to a user-specified value

Definition at line 98 of file mfp_bip.c.

Referenced by sched_core().

const uint8_t sbox_t[256] [static]
Initial value:
   {
    0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
    0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
    0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
    0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
    0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
    0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
    0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
    0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
    0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
    0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
    0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
    0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
    0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
    0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
    0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
    0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
}

Substitution box.

Definition at line 31 of file mfp_bip.c.

const uint8_t x_time2_sbox_t[256] [static]
Initial value:
 {
    0xc6, 0xf8, 0xee, 0xf6, 0xff, 0xd6, 0xde, 0x91, 0x60, 0x02, 0xce, 0x56, 0xe7, 0xb5, 0x4d, 0xec,
    0x8f, 0x1f, 0x89, 0xfa, 0xef, 0xb2, 0x8e, 0xfb, 0x41, 0xb3, 0x5f, 0x45, 0x23, 0x53, 0xe4, 0x9b,
    0x75, 0xe1, 0x3d, 0x4c, 0x6c, 0x7e, 0xf5, 0x83, 0x68, 0x51, 0xd1, 0xf9, 0xe2, 0xab, 0x62, 0x2a,
    0x08, 0x95, 0x46, 0x9d, 0x30, 0x37, 0x0a, 0x2f, 0x0e, 0x24, 0x1b, 0xdf, 0xcd, 0x4e, 0x7f, 0xea,
    0x12, 0x1d, 0x58, 0x34, 0x36, 0xdc, 0xb4, 0x5b, 0xa4, 0x76, 0xb7, 0x7d, 0x52, 0xdd, 0x5e, 0x13,
    0xa6, 0xb9, 0x00, 0xc1, 0x40, 0xe3, 0x79, 0xb6, 0xd4, 0x8d, 0x67, 0x72, 0x94, 0x98, 0xb0, 0x85,
    0xbb, 0xc5, 0x4f, 0xed, 0x86, 0x9a, 0x66, 0x11, 0x8a, 0xe9, 0x04, 0xfe, 0xa0, 0x78, 0x25, 0x4b,
    0xa2, 0x5d, 0x80, 0x05, 0x3f, 0x21, 0x70, 0xf1, 0x63, 0x77, 0xaf, 0x42, 0x20, 0xe5, 0xfd, 0xbf,
    0x81, 0x18, 0x26, 0xc3, 0xbe, 0x35, 0x88, 0x2e, 0x93, 0x55, 0xfc, 0x7a, 0xc8, 0xba, 0x32, 0xe6,
    0xc0, 0x19, 0x9e, 0xa3, 0x44, 0x54, 0x3b, 0x0b, 0x8c, 0xc7, 0x6b, 0x28, 0xa7, 0xbc, 0x16, 0xad,
    0xdb, 0x64, 0x74, 0x14, 0x92, 0x0c, 0x48, 0xb8, 0x9f, 0xbd, 0x43, 0xc4, 0x39, 0x31, 0xd3, 0xf2,
    0xd5, 0x8b, 0x6e, 0xda, 0x01, 0xb1, 0x9c, 0x49, 0xd8, 0xac, 0xf3, 0xcf, 0xca, 0xf4, 0x47, 0x10,
    0x6f, 0xf0, 0x4a, 0x5c, 0x38, 0x57, 0x73, 0x97, 0xcb, 0xa1, 0xe8, 0x3e, 0x96, 0x61, 0x0d, 0x0f,
    0xe0, 0x7c, 0x71, 0xcc, 0x90, 0x06, 0xf7, 0x1c, 0xc2, 0x6a, 0xae, 0x69, 0x17, 0x99, 0x3a, 0x27,
    0xd9, 0xeb, 0x2b, 0x22, 0xd2, 0xa9, 0x07, 0x33, 0x2d, 0x3c, 0x15, 0xc9, 0x87, 0xaa, 0x50, 0xa5,
    0x03, 0x59, 0x09, 0x1a, 0x65, 0xd7, 0x84, 0xd0, 0x82, 0x29, 0x5a, 0x1e, 0x7b, 0xa8, 0x6d, 0x2c
}

Substitution box (square).

Definition at line 54 of file mfp_bip.c.

const uint8_t x_time3_sbox_t[256] [static]
Initial value:
 {
    0xa5, 0x84, 0x99, 0x8d, 0x0d, 0xbd, 0xb1, 0x54, 0x50, 0x03, 0xa9, 0x7d, 0x19, 0x62, 0xe6, 0x9a,
    0x45, 0x9d, 0x40, 0x87, 0x15, 0xeb, 0xc9, 0x0b, 0xec, 0x67, 0xfd, 0xea, 0xbf, 0xf7, 0x96, 0x5b,
    0xc2, 0x1c, 0xae, 0x6a, 0x5a, 0x41, 0x02, 0x4f, 0x5c, 0xf4, 0x34, 0x08, 0x93, 0x73, 0x53, 0x3f,
    0x0c, 0x52, 0x65, 0x5e, 0x28, 0xa1, 0x0f, 0xb5, 0x09, 0x36, 0x9b, 0x3d, 0x26, 0x69, 0xcd, 0x9f,
    0x1b, 0x9e, 0x74, 0x2e, 0x2d, 0xb2, 0xee, 0xfb, 0xf6, 0x4d, 0x61, 0xce, 0x7b, 0x3e, 0x71, 0x97,
    0xf5, 0x68, 0x00, 0x2c, 0x60, 0x1f, 0xc8, 0xed, 0xbe, 0x46, 0xd9, 0x4b, 0xde, 0xd4, 0xe8, 0x4a,
    0x6b, 0x2a, 0xe5, 0x16, 0xc5, 0xd7, 0x55, 0x94, 0xcf, 0x10, 0x06, 0x81, 0xf0, 0x44, 0xba, 0xe3,
    0xf3, 0xfe, 0xc0, 0x8a, 0xad, 0xbc, 0x48, 0x04, 0xdf, 0xc1, 0x75, 0x63, 0x30, 0x1a, 0x0e, 0x6d,
    0x4c, 0x14, 0x35, 0x2f, 0xe1, 0xa2, 0xcc, 0x39, 0x57, 0xf2, 0x82, 0x47, 0xac, 0xe7, 0x2b, 0x95,
    0xa0, 0x98, 0xd1, 0x7f, 0x66, 0x7e, 0xab, 0x83, 0xca, 0x29, 0xd3, 0x3c, 0x79, 0xe2, 0x1d, 0x76,
    0x3b, 0x56, 0x4e, 0x1e, 0xdb, 0x0a, 0x6c, 0xe4, 0x5d, 0x6e, 0xef, 0xa6, 0xa8, 0xa4, 0x37, 0x8b,
    0x32, 0x43, 0x59, 0xb7, 0x8c, 0x64, 0xd2, 0xe0, 0xb4, 0xfa, 0x07, 0x25, 0xaf, 0x8e, 0xe9, 0x18,
    0xd5, 0x88, 0x6f, 0x72, 0x24, 0xf1, 0xc7, 0x51, 0x23, 0x7c, 0x9c, 0x21, 0xdd, 0xdc, 0x86, 0x85,
    0x90, 0x42, 0xc4, 0xaa, 0xd8, 0x05, 0x01, 0x12, 0xa3, 0x5f, 0xf9, 0xd0, 0x91, 0x58, 0x27, 0xb9,
    0x38, 0x13, 0xb3, 0x33, 0xbb, 0x70, 0x89, 0xa7, 0xb6, 0x22, 0x92, 0x20, 0x49, 0xff, 0x78, 0x7a,
    0x8f, 0xf8, 0x80, 0x17, 0xda, 0x31, 0xc6, 0xb8, 0xc3, 0xb0, 0x77, 0x11, 0xcb, 0xfc, 0xd6, 0x3a
}

Substitution box (cube).

Definition at line 76 of file mfp_bip.c.


Generated on 14 Jan 2020 for Ceva-RW WLAN FullMAC SW documentation by  doxygen 1.6.1