451 lines
15 KiB
C
Executable File
451 lines
15 KiB
C
Executable File
/****************************************************************************
|
|
|
|
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_CERT_TEST_H
|
|
#define PLC_CERT_TEST_H
|
|
|
|
/* os shim includes */
|
|
#include "os_types.h"
|
|
|
|
#include "iot_config.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 */
|
|
|
|
/* defining some characteristic parameters of the sg cert test command. */
|
|
#define CERT_TEST_PORT_NOR 0x11
|
|
#define CERT_TEST_PORT_EXT 0x12
|
|
#define CERT_TEST_ID_V 0x0006
|
|
#define CERT_TEST_HEADER_LEN 4
|
|
#define CERT_TEST_NID (0)
|
|
|
|
/* not received cert test command, used for g_mt_ctxt->g_mt_mode_sel status */
|
|
#define CERT_TEST_CMD_NOT_RX 0
|
|
|
|
/* cert test command enter app layer transparent transfer tx mode, in this
|
|
* mode, will send MSDU to uart.
|
|
*/
|
|
#define CERT_TEST_CMD_ENTER_APP_T_T 0x01
|
|
/* cert test command enter app layer transparent transfer rx mode, in this
|
|
* mode, will packing data received from the UART, sent to the PLC network
|
|
* as a MSDU.
|
|
*/
|
|
#define CERT_TEST_CMD_ENTER_APP_T_R 0x02
|
|
/* cert test command enter physical layer hplc transparent transfer mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_T 0x03
|
|
/* cert test command for enter physical layer hplc loopback mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_LP 0x04
|
|
/* cert test command for enter MAC layer transparent transfer mode */
|
|
#define CERT_TEST_CMD_ENTER_MAC_T 0x05
|
|
/* cert test command for set frequency band */
|
|
#define CERT_TEST_CMD_SET_FB 0x06
|
|
/* cert test command for set tonemask */
|
|
#define CERT_TEST_CMD_SET_TM 0x07
|
|
/* rf configuration, including option and channel */
|
|
#define CERT_TEST_CMD_SET_RF 0x08
|
|
/* cert test command enter physical layer rf loopback mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_RF_LP 0x09
|
|
/* cert test command enter physical layer rf transparent transfer mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_RF_T 0x0A
|
|
/* physical layer rf and hplc loopback mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP 0x0B
|
|
/* cert test command enter physical layer hplc to rf loopback mode */
|
|
#define CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP 0x0C
|
|
/* cert test command enter security test mode */
|
|
#define CERT_TEST_CMD_ENTER_SEC 0x0D
|
|
|
|
/* Define security mode test items */
|
|
/* SHA256 algorithm test */
|
|
#define CERT_TEST_SEC_MODE_SHA256 1
|
|
/* SM3 algorithm test */
|
|
#define CERT_TEST_SEC_MODE_SM3 2
|
|
/* elliptic encryption algorithm signature test */
|
|
#define CERT_TEST_SEC_MODE_ECC_SIG 3
|
|
/* elliptic encryption algorithm signature verification test */
|
|
#define CERT_TEST_SEC_MODE_ECC_SIG_VERIFY 4
|
|
/* SM2 signature test item */
|
|
#define CERT_TEST_SEC_MODE_SM2_SIG 5
|
|
/* SM2 signature verification test item */
|
|
#define CERT_TEST_SEC_MODE_SM2_SIG_VERIFY 6
|
|
/* AES-CBC encryption test */
|
|
#define CERT_TEST_SEC_MODE_AES_CBC_ENCRYPT 7
|
|
/* AES-CBC decyption test */
|
|
#define CERT_TEST_SEC_MODE_AES_CBC_DECRYPT 8
|
|
/* AES-GCM encryption test */
|
|
#define CERT_TEST_SEC_MODE_AES_GCM_ENCRYPT 9
|
|
/* AES-GCM decryption test */
|
|
#define CERT_TEST_SEC_MODE_AES_GCM_DECRYPT 10
|
|
/* SM4 encryption test */
|
|
#define CERT_TEST_SEC_MODE_SM4_CBC_ENCRYPT 11
|
|
/* SM4 decryption test */
|
|
#define CERT_TEST_SEC_MODE_SM4_CBC_DECRYPT 12
|
|
|
|
/* tonemask ID defined in cert tests */
|
|
#define CERT_TEST_TONEMASK_ID_0 0
|
|
#define CERT_TEST_TONEMASK_ID_1 1
|
|
#define CERT_TEST_TONEMASK_ID_2 2
|
|
#define CERT_TEST_TONEMASK_ID_3 3
|
|
/* every band has a tone mask */
|
|
#define CERT_TEST_TONEMASK_ID_MAX MAX_SG_BAND_ID
|
|
#define CERT_TEST_TONEMASK_ID_INVAL 0xFF
|
|
|
|
/* freq band ID defined in cert tests */
|
|
#define CERT_TEST_BAND_ID_0 0
|
|
#define CERT_TEST_BAND_ID_1 1
|
|
#define CERT_TEST_BAND_ID_2 2
|
|
#define CERT_TEST_BAND_ID_3 3
|
|
#define CERT_TEST_BAND_ID_MAX MAX_SG_BAND_ID
|
|
#define CERT_TEST_BAND_ID_INVAL 0xFF
|
|
|
|
/* cert test mode duration unit. the unit is 1ms. */
|
|
#define CERT_TEST_MODE_DUR_UNIT (60 * 1000)
|
|
|
|
/* listen for the certification test command till timer expired. this value
|
|
* defined the timer interval. once timer expired, local device won't handle
|
|
* certification test command anymore. the unit is 1ms.
|
|
* note that currently spec said this value should be 30 seconds, while for
|
|
* cert test case 3.3.1.8, test bed may send out cert test command a little
|
|
* bit layer. so extend this value a little bit.
|
|
*/
|
|
#define CERT_TEST_CMD_LISTEN_DUR (50 * 1000)
|
|
|
|
typedef struct _cert_test {
|
|
uint8_t port;
|
|
uint16_t id;
|
|
uint8_t control;
|
|
/* protocol version */
|
|
uint32_t ver :6,
|
|
/* header length */
|
|
header_len :6,
|
|
/* command type for cert_test, see CERT_TEST_CMD_XXXX */
|
|
cmd_type :4,
|
|
/* ignore */
|
|
resved :4,
|
|
/* command parameter, its meaning depends on the type of command */
|
|
cmd_param :12;
|
|
/* payload label */
|
|
uint8_t data[0];
|
|
} cert_test_t;
|
|
|
|
/* cert test command extended information structure*/
|
|
typedef struct _cert_test_ext {
|
|
/* security mode */
|
|
uint8_t sec_mode :4,
|
|
/* rf physical header MCS */
|
|
phr_mcs :4;
|
|
/* rf psdu MCS */
|
|
uint8_t psdu_mcs :4,
|
|
/* rf pb size */
|
|
pb_size :4;
|
|
} cert_test_ext_t;
|
|
|
|
typedef struct _cert_test_sec_key {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_key_t;
|
|
|
|
typedef struct _cert_test_sec_mactag {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_mactag_t;
|
|
|
|
typedef struct _cert_test_sec_hash {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_hash_t;
|
|
|
|
typedef struct _cert_test_sec_result {
|
|
/* data length, fixed is 1 */
|
|
uint8_t len;
|
|
/* result value, 0 - fail, 1 - success */
|
|
uint8_t value;
|
|
} cert_test_sec_result_t;
|
|
|
|
typedef struct _cert_test_sec_iv {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_iv_t;
|
|
|
|
typedef struct _cert_test_sec_public_key_x {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_public_key_x_t;
|
|
|
|
typedef struct _cert_test_sec_signature_r {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_signature_r_t;
|
|
|
|
typedef struct _cert_test_sec_signature_s {
|
|
/* data length */
|
|
uint8_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_signature_s_t;
|
|
|
|
typedef struct _cert_test_sec_random {
|
|
/* data length */
|
|
uint16_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_random_t;
|
|
|
|
typedef struct _cert_test_sec_plaintext {
|
|
/* data length */
|
|
uint16_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_plaintext_t;
|
|
|
|
typedef struct _cert_test_sec_ciphertext {
|
|
/* data length */
|
|
uint16_t len;
|
|
/* data buffer */
|
|
uint8_t data[0];
|
|
} cert_test_sec_ciphertext_t;
|
|
|
|
/**
|
|
* @brief cert_test_is_vaild_sec_mode_test_item() - check whether it is a valid
|
|
security mode test item.
|
|
* @param item: item code.
|
|
* @retval: 1 - valid, 0 - invalid.
|
|
*/
|
|
static inline uint8_t cert_test_is_vaild_sec_mode_test_item(uint8_t item)
|
|
{
|
|
|
|
if (item >= CERT_TEST_SEC_MODE_SHA256 &&
|
|
item <= CERT_TEST_SEC_MODE_SM4_CBC_DECRYPT) {
|
|
return 1;
|
|
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @brief cert_test_is_mode_enter_cmd() - check if need to enter certification
|
|
* test mode.
|
|
* @param ct: pointer to certification test message.
|
|
*/
|
|
#define cert_test_is_mode_enter_cmd(ct) \
|
|
((ct)->port == CERT_TEST_PORT_NOR \
|
|
&& (ct)->id == CERT_TEST_ID_V \
|
|
&& ((ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_MAC_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_FB \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_TM \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_RF \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_SEC))
|
|
|
|
/* listen for the certification test command till timer expired. this value
|
|
* defined the timer interval. once timer expired, local device won't handle
|
|
* certification test command anymore. the unit is 1ms.
|
|
*/
|
|
#define SPG_CERT_TEST_CMD_LISTEN_DUR (30 * 1000)
|
|
|
|
/* cert test mode duration, when this time expires, it will return from test
|
|
* mode to normal mode. uint is 1ms.
|
|
*/
|
|
#define SPG_CERT_TEST_MODE_DUR (10 * 60 * 1000)
|
|
|
|
|
|
/* define message port number for spg */
|
|
#define SPG_CERT_TEST_PORT_NOR 0x11 /* normal */
|
|
#define SPG_CERT_TEST_PORT_EXT 0x12 /* extend */
|
|
|
|
/* defining some characteristic parameters of the spg cert test command. */
|
|
#define SPG_CERT_TEST_ID_V 0x0101
|
|
#define SPG_CERT_TEST_FRAME_TYPE 2
|
|
#define SPG_CERT_TEST_WORK_ID_V 0xf0
|
|
|
|
/* cert test command ID for enter loopback mode */
|
|
#define SPG_CERT_TEST_ID_ENTER_LP 0
|
|
/* cert test command ID for enter transparent forwarding mode */
|
|
#define SPG_CERT_TEST_ID_ENTER_FWD 1
|
|
/* cert test command for set frequency band */
|
|
#define SPG_CERT_TEST_ID_SET_FB 2
|
|
/* cert test command for dual mode */
|
|
#define SPG_CERT_TEST_ID_DUAL_MODE 3
|
|
|
|
/* tonemask ID defined in cert tests for spg */
|
|
#define SPG_CERT_TEST_TONEMASK_ID_0 0
|
|
#define SPG_CERT_TEST_TONEMASK_ID_1 1
|
|
#define SPG_CERT_TEST_TONEMASK_ID_2 2
|
|
#define SPG_CERT_TEST_TONEMASK_ID_MAX SPG_CERT_TEST_TONEMASK_ID_2
|
|
#define SPG_CERT_TEST_TONEMASK_ID_INVAL 0xFF
|
|
|
|
/* freq band ID defined in cert tests for spg */
|
|
#define SPG_CERT_TEST_BAND_ID_0 0
|
|
#define SPG_CERT_TEST_BAND_ID_1 1
|
|
#define SPG_CERT_TEST_BAND_ID_2 2
|
|
#define SPG_CERT_TEST_BAND_ID_MAX SPG_CERT_TEST_BAND_ID_2
|
|
#define SPG_CERT_TEST_BAND_ID_INVAL 0xFF
|
|
|
|
/* cert test frame header structure for spg */
|
|
typedef struct _spg_cert_test_hdr {
|
|
/* message port, see SPG_CERT_TEST_PORT_XXX */
|
|
uint8_t port;
|
|
/* message id, it must be SPG_CERT_TEST_ID_V. */
|
|
uint16_t id;
|
|
/* reserved according to spec */
|
|
uint8_t rsvd1;
|
|
/* frame type, it must be SPG_CERT_TEST_FRAME_TYPE. */
|
|
uint16_t f_type :4,
|
|
/* reserved according to spec */
|
|
rsvd2 :8,
|
|
/* flag to mark if have business extension domain, not check */
|
|
ext :1,
|
|
/* flag to mark if need respond to this message, not check */
|
|
resp :1,
|
|
/* start flag, not check */
|
|
start :1,
|
|
/* direction identifier bit, not check */
|
|
dir :1;
|
|
/* business ID, it must be SPG_CERT_TEST_WORK_ID_V */
|
|
uint8_t work_id;
|
|
/* version num, the current standard is fixed at 1. */
|
|
uint8_t ver;
|
|
/* sequence number */
|
|
uint16_t sn;
|
|
/* payload len */
|
|
uint16_t len;
|
|
/* payload label */
|
|
uint8_t data[0];
|
|
} spg_cert_test_hdr_t;
|
|
|
|
/* cert test frame command structure for spg */
|
|
typedef struct _spg_cert_test_cmd {
|
|
/* test id, see SPG_CERT_TEST_ID_XXX */
|
|
uint8_t test_id;
|
|
/* reserved according to spec */
|
|
uint8_t rsvd;
|
|
/* payload len */
|
|
uint16_t len;
|
|
/* payload label */
|
|
uint8_t data[0];
|
|
} spg_cert_test_cmd_t;
|
|
|
|
/* test ID 0 and 1 data field layout */
|
|
typedef struct _spg_cert_test_cmd_01 {
|
|
/* band id */
|
|
uint8_t band_id :4,
|
|
/* reserved according to spec */
|
|
rsvd :4;
|
|
} spg_cert_test_cmd_01_t;
|
|
|
|
/* define dual mode cert test data structure for spg */
|
|
typedef struct _spg_cert_test_dm {
|
|
/* protocol version */
|
|
uint32_t ver :6,
|
|
/* header length */
|
|
header_len :6,
|
|
/* command type for spg cert test, which is the same as the state grid,
|
|
* see CERT_TEST_CMD_XXXX
|
|
*/
|
|
cmd_type :4,
|
|
/* reserved for future */
|
|
rsvd :4,
|
|
/* command parameter, its meaning depends on the type of command */
|
|
cmd_param :12;
|
|
/* payload label */
|
|
uint8_t data[0];
|
|
} spg_cert_test_dm_t;
|
|
|
|
/* dual mode cert test command extended information structure*/
|
|
typedef struct _spg_cert_test_dm_ext {
|
|
/* security mode */
|
|
uint8_t sec_mode :4,
|
|
/* rf physical header MCS */
|
|
phr_mcs :4;
|
|
/* rf psdu MCS */
|
|
uint8_t psdu_mcs :4,
|
|
/* rf pb size */
|
|
pb_size :4;
|
|
} spg_cert_test_dm_ext_t;
|
|
|
|
#pragma pack(pop) /* restore the pack status */
|
|
|
|
/**
|
|
* @brief mac_cert_test_band_cfg_ex() - converting cert test ID to cert mode
|
|
* code for spg.
|
|
* @param test_id: - test id, see SPG_CERT_TEST_ID_XXX
|
|
* @retval: - cert test mode code, see CERT_TEST_CMD_XXX.
|
|
*/
|
|
static inline uint8_t spg_cert_test_id_to_mode(uint8_t test_id)
|
|
{
|
|
uint8_t mode = 0;
|
|
if (test_id == SPG_CERT_TEST_ID_ENTER_LP) {
|
|
mode = CERT_TEST_CMD_ENTER_PHY_LP;
|
|
} else if (test_id == SPG_CERT_TEST_ID_ENTER_FWD) {
|
|
mode = CERT_TEST_CMD_ENTER_MAC_T;
|
|
}
|
|
return mode;
|
|
}
|
|
|
|
/**
|
|
* @brief cert_test_is_mode_enter_cmd_spg() - check if need to enter
|
|
* certification test mode.
|
|
* @param ct: point to the command ID of certification test.
|
|
*/
|
|
#define cert_test_is_mode_enter_cmd_spg(ct) \
|
|
((ct)->test_id == SPG_CERT_TEST_ID_ENTER_FWD \
|
|
|| (ct)->test_id == SPG_CERT_TEST_ID_ENTER_LP)
|
|
|
|
/**
|
|
* @brief cert_test_is_mode_enter_cmd_ext() - check if need to enter
|
|
* certification test mode.
|
|
* @param ct: pointer to certification test message.
|
|
*/
|
|
#define cert_test_is_mode_enter_cmd_ext_spg(ct) \
|
|
((ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_MAC_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_FB \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_TM \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_SET_RF \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_T \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_RF_AND_HPLC_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_PHY_HPLC2RF_LP \
|
|
|| (ct)->cmd_type == CERT_TEST_CMD_ENTER_SEC)
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* PLC_CERT_TEST_H */
|