281 lines
9.7 KiB
C
281 lines
9.7 KiB
C
/****************************************************************************
|
|
|
|
Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
|
|
|
|
This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
|
|
be copied by any method or incorporated into another program without
|
|
the express written consent of Aerospace C.Power. This Information or any portion
|
|
thereof remains the property of Aerospace C.Power. The Information contained herein
|
|
is believed to be accurate and Aerospace C.Power assumes no responsibility or
|
|
liability for its use in any way and conveys no license or title under
|
|
any patent or copyright and makes no representation or warranty that this
|
|
Information is free from patent or copyright infringement.
|
|
|
|
****************************************************************************/
|
|
|
|
#ifndef PLC_MME_AUTH_H
|
|
#define PLC_MME_AUTH_H
|
|
|
|
/* os shim includes */
|
|
#include "os_types.h"
|
|
|
|
/* public api includes */
|
|
#include "iot_utils_api.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* pack for the structures in the whole file */
|
|
#pragma pack(push) /* save the pack status */
|
|
#pragma pack(1) /* 1 byte align */
|
|
|
|
/* authorize result codes */
|
|
#define MME_AUTH_SUCCESS 0X00
|
|
#define MME_AUTH_FAILURE 0X01
|
|
|
|
/* get key request result codes */
|
|
#define MME_KEY_REQ_SUCCESS 0X00
|
|
#define MME_KEY_REQ_REFUSED 0X01
|
|
#define MME_KEY_REQ_NOSUPP 0X02
|
|
|
|
/* set key request result codes */
|
|
#define MME_SET_KEY_REQ_SUCCESS 0X00
|
|
#define MME_SET_KEY_REQ_FAILURE 0X01
|
|
|
|
/* encrypted indication payload type */
|
|
#define MME_ENCRYPTED_PLD_MME 0X00
|
|
#define MME_ENCRYPTED_PLD_HLE 0X01
|
|
|
|
/* encrypted indication payload key type */
|
|
#define MME_ENCRYPTED_IND_DAK 0X00
|
|
#define MME_ENCRYPTED_IND_NMK 0X01
|
|
#define MME_ENCRYPTED_IND_PLAIN 0X0F
|
|
|
|
/* encrypted transport key type */
|
|
#define MME_ENCRYPTED_TRANS_DAK 0X00
|
|
#define MME_ENCRYPTED_TRANS_NMK 0X01
|
|
#define MME_ENCRYPTED_TRANS_NEK 0X02
|
|
|
|
/* length of encrypted iv vector for ieee1901 */
|
|
#define MME_ENCRYPT_IV_LEN_I1901 16
|
|
/* length of encrypted iv vector for state grid */
|
|
#define MME_ENCRYPT_IV_LEN 12
|
|
/* length of max encrypted iv */
|
|
#define MME_ENCRYPT_IV_MAX_LEN 16
|
|
/* length of encrypted nmk for ieee1901 */
|
|
#define MME_ENCRYPT_NMK_LEN 32
|
|
/* length of encrypted cmk */
|
|
#define MME_ENCRYPT_CMK_LEN 16
|
|
/* length of encrypted cek for state grid */
|
|
#define MME_ENCRYPT_CEK_LEN 16
|
|
|
|
/* result of communication encryption key request */
|
|
#define MME_CEK_REQ_OK 0
|
|
#define MME_CEK_REQ_FAIL 1
|
|
|
|
/* communication encryption key request MME */
|
|
typedef struct _mme_cek_req {
|
|
/* communication encryption key sequence requesting */
|
|
uint8_t cek_seq :2,
|
|
/* reserved for future */
|
|
rsvd :6;
|
|
} mme_cek_req_t;
|
|
|
|
/* communication encryption key confirm MME */
|
|
typedef struct _mme_cek_cnf {
|
|
/* cek request result, see MME_CEK_REQ_XXX */
|
|
uint8_t result;
|
|
/* communication encryption key sequence, reply requesting cek if
|
|
* request success, otherwise reply currrent using cek
|
|
*/
|
|
uint8_t cek_seq :2,
|
|
/* reserved for future */
|
|
rsvd :6;
|
|
/* countdown of using this cek, unit is 10s */
|
|
uint16_t cek_countdown;
|
|
/* this cek duration valid time, unit is 10s */
|
|
uint16_t cek_dur;
|
|
/* iv vector, it is randomly generated by CCO, and using for encrypting CEK
|
|
* with CMK
|
|
*/
|
|
uint8_t iv[MME_ENCRYPT_IV_LEN];
|
|
/* communication encryption key requested, and encrypted with cmk */
|
|
uint8_t cek[MME_ENCRYPT_CEK_LEN];
|
|
} mme_cek_cnf_t;
|
|
|
|
/* communication encryption key update MME */
|
|
typedef struct _mme_cek_update {
|
|
/* communication encryption key sequence updating */
|
|
uint8_t cek_seq :2,
|
|
/* reserved for future */
|
|
rsvd :6;
|
|
/* countdown of using this new cek, unit is 10s */
|
|
uint16_t cek_countdown;
|
|
/* this new cek duration valid time, unit is 10s */
|
|
uint16_t cek_dur;
|
|
/* iv vector, it is randomly generated by CCO, and using for encrypting CEK
|
|
* with CMK
|
|
*/
|
|
uint8_t iv[MME_ENCRYPT_IV_LEN];
|
|
/* communication encryption key updating, and encrypted with cmk */
|
|
uint8_t cek[MME_ENCRYPT_CEK_LEN];
|
|
} mme_cek_update_t;
|
|
|
|
/* ieee1901 authorize request MME */
|
|
typedef struct _i1901_mme_auth_req {
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* mac address of the station requesting the granted NMK */
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* reserved for future */
|
|
uint8_t rsvd[3];
|
|
} i1901_mme_auth_req_t;
|
|
|
|
/* authorize confirm MME */
|
|
typedef struct _i1901_mme_auth_cnf {
|
|
/* authorize result, see MME_AUTH_XXX */
|
|
uint8_t result;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* your nonce is the last nonce received from the recipient used by the
|
|
* recipient to verify this message
|
|
*/
|
|
uint32_t your_nonce;
|
|
/* mac address of the station requesting the granted NMK */
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* the current network management key of the network */
|
|
uint8_t nmk[MME_ENCRYPT_NMK_LEN];
|
|
/* reserved for future */
|
|
uint8_t rsvd[2];
|
|
} i1901_mme_auth_cnf_t;
|
|
|
|
/* get key request */
|
|
typedef struct _i1901_mme_get_key_req {
|
|
/* requested key type, see MME_ENCRYPTED_TRANS_XXX */
|
|
uint8_t key_type;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* MAC address of the STA with which the transmitter of this MME shares the
|
|
* requested key
|
|
*/
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* reserved for future */
|
|
uint8_t rsvd[2];
|
|
} i1901_mme_get_key_req_t;
|
|
|
|
/* get key confirm */
|
|
typedef struct _i1901_mme_get_key_cnf {
|
|
/* get key result, see MME_KEY_REQ_XXX */
|
|
uint8_t result;
|
|
/* requested key type, see MME_ENCRYPTED_TRANS_XXX */
|
|
uint8_t key_type;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* your nonce is the last nonce received from the recipient used by the
|
|
* recipient to verify this message
|
|
*/
|
|
uint32_t your_nonce;
|
|
/* reserved for future */
|
|
uint8_t rsvd[3];
|
|
} i1901_mme_get_key_cnf_t;
|
|
|
|
/* set key request */
|
|
typedef struct _i1901_mme_set_key_req {
|
|
/* the type of the key in new key field, see MME_ENCRYPTED_TRANS_XXX */
|
|
uint8_t key_type;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* your nonce is the last nonce received from the recipient used by the
|
|
* recipient to verify this message
|
|
*/
|
|
uint32_t your_nonce;
|
|
/* the new key field holds the new NMK or NEK that is being set */
|
|
uint8_t new_key[MME_ENCRYPT_NMK_LEN];
|
|
/* MAC address of the STA with which the recipient of this message
|
|
* shares the key
|
|
*/
|
|
uint8_t mac[IOT_MAC_ADDR_LEN];
|
|
/* reserved for future */
|
|
uint8_t rsvd[2];
|
|
} i1901_mme_set_key_req_t;
|
|
|
|
/* set key confirm */
|
|
typedef struct _i1901_mme_set_key_cnf {
|
|
/* set key result, see MME_SET_KEY_REQ_XXX */
|
|
uint8_t result;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* my nonce is a random number used to verify next message from other end */
|
|
uint32_t my_nonce;
|
|
/* your nonce is the last nonce received from the recipient used by the
|
|
* recipient to verify this message
|
|
*/
|
|
uint32_t your_nonce;
|
|
/* reserved for future */
|
|
uint8_t rsvd[4];
|
|
} i1901_mme_set_key_cnf_t;
|
|
|
|
/* encrypted payload indication structure*/
|
|
typedef struct _i1901_mme_encrypted_pld_ind {
|
|
/* payload type, see MME_ENCRYPTED_PLD_XXX*/
|
|
uint8_t pld_type;
|
|
/* payload encryption key select, see MME_ENCRYPTED_IND_XXX */
|
|
uint8_t peks;
|
|
/* protocol run sequence */
|
|
uint8_t run_sn;
|
|
/* protocol message sequence */
|
|
uint16_t msg_sn;
|
|
/* payload data */
|
|
uint8_t data[0];
|
|
} i1901_mme_encrypted_pld_ind_t;
|
|
|
|
/* encrypted payload structure */
|
|
typedef struct _i1901_mme_encrypted_pld {
|
|
/* payload length */
|
|
uint16_t length;
|
|
/* initialization vector */
|
|
uint8_t iv[MME_ENCRYPT_IV_LEN_I1901];
|
|
/* encrypted payload */
|
|
uint8_t payload[0];
|
|
} i1901_mme_encrypted_pld_t;
|
|
|
|
/* plain payload structure */
|
|
typedef struct _i1901_mme_plain_pld {
|
|
/* payload length */
|
|
uint16_t length;
|
|
/* unencrypted payload */
|
|
uint8_t payload[0];
|
|
} i1901_mme_plain_pld_t;
|
|
|
|
#pragma pack(pop) /* restore the pack status */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PLC_MME_AUTH_H */
|
|
|