176 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.1 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_AUTH_H
 | 
						|
#define PLC_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 */
 | 
						|
 | 
						|
/* length of authorize id info */
 | 
						|
#define AUTH_ID_CHIP_ID_LEN             24
 | 
						|
#define AUTH_ID_SM2_CURVE_LEN           1
 | 
						|
#define AUTH_ID_ECC_CURVE_LEN           1
 | 
						|
#define AUTH_ID_SM2_KEY_PUB_LEN         64
 | 
						|
#define AUTH_ID_ECC_KEY_PUB_LEN         64
 | 
						|
#define AUTH_ID_SM2_SIGN_LEN            64
 | 
						|
#define AUTH_ID_ECC_SIGN_LEN            64
 | 
						|
#define AUTH_ID_ECC_KEY_PRI_LEN         32
 | 
						|
#define AUTH_ID_SM2_KEY_PRI_LEN         32
 | 
						|
 | 
						|
/* authorize request result codes */
 | 
						|
#define AUTH_REQ_SUCC                   0
 | 
						|
#define AUTH_REQ_FAIL                   1
 | 
						|
 | 
						|
/* authorize request message */
 | 
						|
#define AUTH_MSG_REQ                    0
 | 
						|
/* authorize confirm message */
 | 
						|
#define AUTH_MSG_CNF                    1
 | 
						|
 | 
						|
/* authorize failure as white list */
 | 
						|
#define AUTH_REQ_FAIL_AS_WL             0
 | 
						|
/* authorize failure as identity information */
 | 
						|
#define AUTH_REQ_FAIL_AS_IDENT          1
 | 
						|
 | 
						|
/* length of identity information */
 | 
						|
#define AUTH_IDENTITY_INFO_LEN          153
 | 
						|
/* length of random numbers signature */
 | 
						|
#define AUTH_RANDOM_SIGN_LEN            64
 | 
						|
/* length of encrypted cmk */
 | 
						|
#define AUTH_ENCRYPT_CMK_LEN            16
 | 
						|
 | 
						|
/* define priority of each AUTH frames */
 | 
						|
#define AUTH_REQ_PRIO                   3
 | 
						|
#define AUTH_CNF_PRIO                   3
 | 
						|
 | 
						|
/* certificate authorization sm2 public id info */
 | 
						|
typedef struct _auth_id_sm2_pub {
 | 
						|
    /* chip id */
 | 
						|
    uint8_t chip_id[AUTH_ID_CHIP_ID_LEN];
 | 
						|
    /* sm2 curve type. always 0 */
 | 
						|
    uint8_t sm2_curve_type;
 | 
						|
    /* sm2 public key */
 | 
						|
    uint8_t sm2_key_pub[AUTH_ID_SM2_KEY_PUB_LEN];
 | 
						|
    /* sm2 signature */
 | 
						|
    uint8_t sm2_sign[AUTH_ID_SM2_SIGN_LEN];
 | 
						|
} auth_id_sm2_pub_t;
 | 
						|
 | 
						|
/* certificate authorization ecc public id info */
 | 
						|
typedef struct _auth_id_ecc_pub {
 | 
						|
    /* chip id */
 | 
						|
    uint8_t chip_id[AUTH_ID_CHIP_ID_LEN];
 | 
						|
    /* ecc elliptic curve type. 1 - brainpoolP256r1, others - reserved  */
 | 
						|
    uint8_t ecc_curve_type;
 | 
						|
    /* ecc public key */
 | 
						|
    uint8_t ecc_key_pub[AUTH_ID_ECC_KEY_PUB_LEN];
 | 
						|
    /* ecc signature */
 | 
						|
    uint8_t ecc_sign[AUTH_ID_ECC_SIGN_LEN];
 | 
						|
} auth_id_ecc_pub_t;
 | 
						|
 | 
						|
/* authorize header */
 | 
						|
typedef struct _auth_header {
 | 
						|
    /* station mac address */
 | 
						|
    uint8_t     mac[IOT_MAC_ADDR_LEN];
 | 
						|
    /* authorize message type, see AUTH_MSG_XXX */
 | 
						|
    uint8_t     auth_type       :3,
 | 
						|
    /* reserved for future */
 | 
						|
                rsvd            :5;
 | 
						|
} auth_header_t;
 | 
						|
 | 
						|
/* authorize request message */
 | 
						|
typedef struct _auth_req {
 | 
						|
    /* station mac address */
 | 
						|
    uint8_t     mac[IOT_MAC_ADDR_LEN];
 | 
						|
    /* authorize message type, it's always AUTH_MSG_REQ */
 | 
						|
    uint16_t    auth_type       :3,
 | 
						|
    /* temp proxy for authorize request */
 | 
						|
                tmp_proxy       :12,
 | 
						|
    /* temp link for authorize request, see PLC_LINK_TYPE_XXX */
 | 
						|
                tmp_link        :1;
 | 
						|
    /* device type, see PLC_DEV_TYPE_XXXX */
 | 
						|
    uint8_t     device_type;
 | 
						|
    /* mac address_type, see PLC_MAC_ADDR_TYPE_XXXX */
 | 
						|
    uint8_t     mac_addr_type;
 | 
						|
    /* identity information */
 | 
						|
    uint8_t     identity_info[AUTH_IDENTITY_INFO_LEN];
 | 
						|
    /* random numbers signature for authorization */
 | 
						|
    uint8_t     random_sign[AUTH_RANDOM_SIGN_LEN];
 | 
						|
} auth_req_t;
 | 
						|
 | 
						|
/* authorize confirm message */
 | 
						|
typedef struct _auth_cnf {
 | 
						|
    /* station mac address */
 | 
						|
    uint8_t     mac[IOT_MAC_ADDR_LEN];
 | 
						|
    union {
 | 
						|
        struct {
 | 
						|
            /* authorize message type, it's always AUTH_MSG_CNF */
 | 
						|
            uint8_t     auth_type           :3,
 | 
						|
            /* temp link for authorize request, see PLC_LINK_TYPE_XXX */
 | 
						|
                        tmp_link            :1,
 | 
						|
            /* authorize result, see AUTH_REQ_XXX */
 | 
						|
                        auth_ret            :1,
 | 
						|
            /* selected key suit include international or national encryption,
 | 
						|
             * see ECDHE_ECDSA_WITH_XXX
 | 
						|
             */
 | 
						|
                        selected_key_suit   :1,
 | 
						|
            /* selected curve, it is valid only when select international
 | 
						|
             * encryption algorithm. 0 stand for brainpoolP256r1, and other
 | 
						|
             * value is reserved
 | 
						|
             */
 | 
						|
                        selected_curve      :2;
 | 
						|
        };
 | 
						|
        struct {
 | 
						|
            /* this reserved field is the same as the first three fields
 | 
						|
             * defined above
 | 
						|
             */
 | 
						|
            uint8_t     used_rsvd           :5,
 | 
						|
            /* authorize failure reason, see AUTH_REQ_FAIL_AS_XXX */
 | 
						|
                        fail_reason         :1,
 | 
						|
            /* reserved for future */
 | 
						|
                        rsvd                :2;
 | 
						|
        };
 | 
						|
    };
 | 
						|
    /* following auth_encrypt_key_t if authorize result is successful */
 | 
						|
} auth_cnf_t;
 | 
						|
 | 
						|
/* encryption key structure comes from authorize confirm */
 | 
						|
typedef struct _auth_encrypt_key {
 | 
						|
    /* identity information, come from state grid measurement center */
 | 
						|
    uint8_t     identity_info[AUTH_IDENTITY_INFO_LEN];
 | 
						|
    /* random numbers signature for authorization */
 | 
						|
    uint8_t     random_sign[AUTH_RANDOM_SIGN_LEN];
 | 
						|
    /* cmk encrypted with STA public key */
 | 
						|
    uint8_t     encrypt_cmk[AUTH_ENCRYPT_CMK_LEN];
 | 
						|
} auth_encrypt_key_t;
 | 
						|
 | 
						|
#pragma pack(pop)  /* restore the pack status */
 | 
						|
 | 
						|
#ifdef __cplusplus
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* PLC_AUTH_H */
 |