225 lines
6.8 KiB
C
225 lines
6.8 KiB
C
|
|
/*
|
||
|
|
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#ifndef _SPACC_BODY_H_
|
||
|
|
#define _SPACC_BODY_H_
|
||
|
|
|
||
|
|
#define SPACC_LOGIC_MAX_CHN 8
|
||
|
|
#define CIPHER_PKG_1_CHN 0
|
||
|
|
#define SPACC_MAX_DEPTH 127
|
||
|
|
#define SPACC_MAX_HMAC_KEY_LEN 512
|
||
|
|
#define SPACC_PAGE_SIZE 4096
|
||
|
|
|
||
|
|
|
||
|
|
#define CIPHER_PKG_N_CHN_MIN 1
|
||
|
|
#define CIPHER_PKG_N_CHN_MAX 7
|
||
|
|
#define SPACC_CHN_MASK 0xFE
|
||
|
|
#define CIPHER_DMA_MINALIGN ARCH_DMA_MINALIGN
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SYMC_ALG_DES = 0,
|
||
|
|
SYMC_ALG_3DES,
|
||
|
|
SYMC_ALG_AES,
|
||
|
|
SYMC_ALG_SM4,
|
||
|
|
SYMC_ALG_SM1,
|
||
|
|
SYMC_ALG_NULL_CIPHER,
|
||
|
|
SYMC_ALG_COUNT,
|
||
|
|
} symc_alg_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SYMC_MODE_ECB = 0,
|
||
|
|
SYMC_MODE_CBC,
|
||
|
|
SYMC_MODE_CFB,
|
||
|
|
SYMC_MODE_OFB,
|
||
|
|
SYMC_MODE_CTR,
|
||
|
|
SYMC_MODE_CCM,
|
||
|
|
SYMC_MODE_GCM,
|
||
|
|
SYMC_MODE_COUNT,
|
||
|
|
} symc_mode_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SYMC_DAT_WIDTH_128 = 0,
|
||
|
|
SYMC_DAT_WIDTH_64 = 0,
|
||
|
|
SYMC_DAT_WIDTH_8,
|
||
|
|
SYMC_DAT_WIDTH_1,
|
||
|
|
SYMC_DAT_WIDTH_COUNT,
|
||
|
|
} symc_dat_width_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
DIGEST_MODE_HASH,
|
||
|
|
DIGEST_MODE_HMAC,
|
||
|
|
DIGEST_MODE_COUNT,
|
||
|
|
} digest_mode_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
DIGEST_ALG_SHA1,
|
||
|
|
DIGEST_ALG_SHA224,
|
||
|
|
DIGEST_ALG_SHA256,
|
||
|
|
DIGEST_ALG_SHA384,
|
||
|
|
DIGEST_ALG_SHA512,
|
||
|
|
DIGEST_ALG_SM3,
|
||
|
|
DIGEST_ALG_COUNT,
|
||
|
|
} digest_alg_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SPACC_ALLIED_SYMC = 0x00,
|
||
|
|
SPACC_ALLIED_DIGEST,
|
||
|
|
SPACC_ALLIED_SYMC_WITH_DIGEST,
|
||
|
|
SPACC_ALLIED_DIGEST_WITH_SYMC,
|
||
|
|
SPACC_ALLIED_COUNT,
|
||
|
|
} spacc_allied_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SPACC_BUF_TYPE_SYMC_IN,
|
||
|
|
SPACC_BUF_TYPE_SYMC_OUT,
|
||
|
|
SPACC_BUF_TYPE_DIGEST_IN,
|
||
|
|
SPACC_BUF_TYPE_COUNT,
|
||
|
|
} spacc_buf_type_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SPACC_CTRL_NONE = 0x00,
|
||
|
|
SPACC_CTRL_SYMC_IN_GCM_A = 0x00,
|
||
|
|
SPACC_CTRL_SYMC_IN_GCM_P = 0x08,
|
||
|
|
SPACC_CTRL_SYMC_IN_GCM_LEN = 0x10,
|
||
|
|
SPACC_CTRL_SYMC_IN_CCM_N = 0x00,
|
||
|
|
SPACC_CTRL_SYMC_IN_CCM_A = 0x08,
|
||
|
|
SPACC_CTRL_SYMC_IN_CCM_P = 0x10,
|
||
|
|
SPACC_CTRL_SYMC_IN_CBC_OUTPUT_DISABLE = 0x04,
|
||
|
|
SPACC_CTRL_SYMC_IN_FIRST = 0x01,
|
||
|
|
SPACC_CTRL_SYMC_IN_LAST = 0x02,
|
||
|
|
SPACC_CTRL_HASH_IN_PAD = 0x04,
|
||
|
|
SPACC_CTRL_HASH_IN_FIRST = 0x01,
|
||
|
|
SPACC_CTRL_HASH_IN_LAST = 0x02,
|
||
|
|
SPACC_CTRL_HASH_IN_AUTO_PADDING = 0x04,
|
||
|
|
SPACC_CTRL_HASH_IN_HMAC_END = 0x08,
|
||
|
|
SPACC_CTRL_SYMC_OUT_LAST = 0x02,
|
||
|
|
SPACC_CTRL_SYMC_CCM_LAST = 0x20,
|
||
|
|
SPACC_CTRL_SYMC_ODD_KEY = 0x40,
|
||
|
|
SPACC_CTRL_SYMC_EVEN_KEY = 0x00,
|
||
|
|
SPACC_CTRL_COUNT,
|
||
|
|
} spacc_ctrl_en;
|
||
|
|
|
||
|
|
typedef enum {
|
||
|
|
SPACC_DATA_SEAT_FIRST,
|
||
|
|
SPACC_DATA_SEAT_MIDDLE,
|
||
|
|
SPACC_DATA_SEAT_LAST,
|
||
|
|
SPACC_DATA_SEAT_COUNT,
|
||
|
|
} spacc_data_seat_en;
|
||
|
|
|
||
|
|
typedef struct {
|
||
|
|
symc_alg_en symc_alg;
|
||
|
|
symc_mode_en symc_mode;
|
||
|
|
symc_dat_width_en symc_width;
|
||
|
|
gk_u32 key_len;
|
||
|
|
} spacc_symc_config_s;
|
||
|
|
|
||
|
|
#define SPACC_OK 0x000
|
||
|
|
#define SPACC_DIGEST_DONE 0x001
|
||
|
|
#define SPACC_DIGEST_LEN_ERR 0x002
|
||
|
|
#define SPACC_SYMC_DONE 0x004
|
||
|
|
#define SPACC_AEAD_DONE 0x008
|
||
|
|
#define SPACC_SYMC_KEY_ERR 0x0100
|
||
|
|
#define SPACC_SYMC_LEN_ERR 0x0200
|
||
|
|
#define SPACC_SYMC_DFA_ATTACK 0x0400
|
||
|
|
|
||
|
|
#define SPACC_ERR_NULL_POINT 0x400
|
||
|
|
#define SPACC_ERR_INVALID_PARAM 0x401
|
||
|
|
#define SPACC_ERR_BUSY 0x402
|
||
|
|
#define SPACC_ERR_TIMEOUT 0x403
|
||
|
|
|
||
|
|
#define SPACC_CHN_SECURE_ENABLE 0x80000000
|
||
|
|
|
||
|
|
#define get_ulong_low(dw) (unsigned int)(dw)
|
||
|
|
#define get_ulong_high(dw) 0
|
||
|
|
#define make_ulong(low, high) (low)
|
||
|
|
#define make_size(low) (((unsigned long)(low##High) << 32) | (low))
|
||
|
|
|
||
|
|
#if (defined(CONFIG_TARGET_GK7205V200) || defined(CONFIG_TARGET_GK7205V300) || \
|
||
|
|
defined(CONFIG_TARGET_GK7202V300) || defined(CONFIG_TARGET_GK7605V100))
|
||
|
|
#define HASH_RESULT_MAX_SIZE_IN_WORD 8
|
||
|
|
#else
|
||
|
|
#define HASH_RESULT_MAX_SIZE_IN_WORD 16
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#define CACHE_LINE_VALUE CONFIG_SYS_CACHELINE_SIZE
|
||
|
|
#define cipher_align_down(addr) ((addr) & (~((CACHE_LINE_VALUE) - 1)))
|
||
|
|
#define cipher_align_size(addr, size) ALIGN((size) + ((addr) & (CACHE_LINE_VALUE - 1)), CIPHER_DMA_MINALIGN)
|
||
|
|
|
||
|
|
int spacc_init(gk_void *reg_base, unsigned int mmu_table_addr,
|
||
|
|
unsigned long entry_phy_addr, gk_void *entry_via_addr);
|
||
|
|
|
||
|
|
int spacc_deinit(void);
|
||
|
|
|
||
|
|
unsigned int spacc_get_node_list_size(void);
|
||
|
|
|
||
|
|
/**************************** SYMC API ********************************/
|
||
|
|
int spacc_symc_getiv(unsigned int chn_num, unsigned int *iv, unsigned int ivsize);
|
||
|
|
|
||
|
|
int spacc_symc_gettag(unsigned int chn_num, unsigned char *tag);
|
||
|
|
|
||
|
|
int spacc_symc_setkey(unsigned int chn_num,
|
||
|
|
unsigned int *even_key,
|
||
|
|
unsigned int *odd_key,
|
||
|
|
unsigned int klen);
|
||
|
|
|
||
|
|
int spacc_symc_setiv(unsigned int chn_num,
|
||
|
|
unsigned char *iv, unsigned int ivlen);
|
||
|
|
|
||
|
|
int spacc_symc_addbuf(unsigned int chn_num,
|
||
|
|
unsigned long buf_phy,
|
||
|
|
unsigned int buf_size,
|
||
|
|
spacc_buf_type_en type,
|
||
|
|
unsigned int ctrl);
|
||
|
|
|
||
|
|
int spacc_symc_addctrl(unsigned int chn_num, spacc_buf_type_en type, unsigned int ctrl);
|
||
|
|
|
||
|
|
int spacc_symc_config(unsigned int chn_num, spacc_symc_config_s *symc_cfg,
|
||
|
|
unsigned char sm1_round_num, unsigned char hard_key);
|
||
|
|
|
||
|
|
int spacc_symc_start(unsigned int chn_num, unsigned int decrypt, unsigned int iv_set_flag);
|
||
|
|
void spacc_symc_restart(unsigned int chn_num, unsigned int iv_set_flag);
|
||
|
|
|
||
|
|
unsigned int spacc_symc_get_free_nodes(unsigned int chn_num);
|
||
|
|
|
||
|
|
unsigned int spacc_symc_is_free(unsigned int chn_num);
|
||
|
|
|
||
|
|
unsigned int spacc_symc_done_notify(void);
|
||
|
|
|
||
|
|
unsigned int spacc_symc_done_try(unsigned int chn_num);
|
||
|
|
|
||
|
|
unsigned int spacc_symc_get_err_code(unsigned int chn_num, unsigned int *src_addr, unsigned int *dst_addr);
|
||
|
|
|
||
|
|
/**************************** DIGEST API ********************************/
|
||
|
|
int spacc_digest_config(unsigned int chn_num,
|
||
|
|
digest_alg_en digest_alg,
|
||
|
|
digest_mode_en digest_mode,
|
||
|
|
unsigned char hard_key);
|
||
|
|
|
||
|
|
void spacc_digest_get_init_val(digest_alg_en digest_alg, unsigned int state[16]); /* 16 */
|
||
|
|
|
||
|
|
int spacc_digest_addbuf(unsigned int chn_num,
|
||
|
|
unsigned long buf_phy,
|
||
|
|
unsigned int buf_size,
|
||
|
|
unsigned int ctrl);
|
||
|
|
|
||
|
|
int spacc_digest_addctrl(unsigned int chn_num, unsigned int ctrl);
|
||
|
|
|
||
|
|
int spacc_digest_start(unsigned int chn_num, spacc_ctrl_en enCtrl, unsigned int *state);
|
||
|
|
|
||
|
|
unsigned int spacc_digest_done_notify(void);
|
||
|
|
unsigned int spacc_digest_done_try(unsigned int chn_num);
|
||
|
|
|
||
|
|
int spacc_digest_get(unsigned int chn_num, unsigned int *digest);
|
||
|
|
|
||
|
|
unsigned int spacc_digest_get_err_code(unsigned int chn_num, unsigned int *src_addr);
|
||
|
|
|
||
|
|
/* proc function begin */
|
||
|
|
#ifndef DISABLE_DEBUG_INFO
|
||
|
|
gk_s32 spacc_symc_proc_status(cipher_chn_status_s *cipher_statue);
|
||
|
|
/* proc function end */
|
||
|
|
#endif
|
||
|
|
|
||
|
|
#endif
|
||
|
|
|