数据结构设计
设备结构体
struct aic_alg_accelerator {
struct crypto_engine *engine;
struct mutex alock;
DECLARE_KFIFO_PTR(req_fifo, void *);
};
struct aic_crypto_dev {
struct device *dev;
void __iomem *base;
struct clk *clk;
struct reset_control *reset;
struct mutex mlock;
struct aic_alg_accelerator sk_accel;
struct aic_alg_accelerator ak_accel;
struct aic_alg_accelerator hash_accel;
u64 ssram_bitmap;
u32 irq_status;
u32 err_status;
};
其中:
-
sk_accel
对称密钥算法加速器结构体,用于管理对称密钥算法所使用的 crypto_engine 实例,以及正在处理的请求 FIFO。
-
ak_accel
非对称密钥算法加速器结构体,用于管理非对称密钥算法所使用的 crypto_engine 实例,以及正在处理的请求 FIFO。
-
hash_accel
消息摘要算法加速器结构体,用于管理消息摘要算法所使用的 crypto_engine 实例,以及正在处理的请求 FIFO。
-
ssram_bitmap
安全 SRAM 空间的分配位图。安全 SRAM 按照 32 字节为单位进行分配管理,这里每一个比特对应一个 32 字节的安全 SRAM 空间。
-
irq_status
记录最新的 IRQ 状态寄存器的值。
-
err_status
记录最新的错误状态寄存器的值。
对称密钥算法
struct crypto_skcipher *
crypto_alloc_skcipher(const char *alg_name, u32 type, u32 mask);
struct aic_skcipher_tfm_ctx {
struct crypto_engine_ctx enginectx;
unsigned char *inkey;
int inkeylen;
struct aic_crypto_dev *ce;
};
其中:
-
enginectx
crypto_engine 的上下文,用于配置该算法的回调处理函数。
-
inkey
用于保存用户配置的密钥信息。此处保存的密钥不直接交给 CE 硬件。
struct aic_skcipher_reqctx {
struct task_desc *task;
dma_addr_t phy_task;
unsigned char *key;
dma_addr_t phy_key;
unsigned char *iv;
unsigned char *backup_ivs; /* Back up iv for CBC decrypt */
dma_addr_t phy_iv;
dma_addr_t ssram_addr;
dma_addr_t backup_phy_ivs;
dma_addr_t next_iv; /* Next IV address for CBC encrypt */
int tasklen;
int keylen;
int ivsize;
int blocksize;
int backup_iv_cnt;
unsigned long mode;
void *src_cpy_buf;
void *dst_cpy_buf;
dma_addr_t src_phy_buf;
dma_addr_t dst_phy_buf;
bool src_map_sg;
bool dst_map_sg;
};
aic_skcipher_reqctx 是每一个数据请求所对应的上下文,在每一个 struct skcipher_request 实例化时自动创建。
其中:
-
task
CE 任务描述符指针。任务描述符所使用的空间是动态分配的空间,需要相关指针信息保存,以便完成时释放。
-
phy_task
任务描述符的物理地址。
-
key
密钥缓冲区的指针。该缓冲区为动态分配,地址空间 DMA 可用。
-
phy_key
密钥缓冲区的物理地址。
-
iv
初始化向量缓冲区指针。该缓冲区动态分配,地址空间 DMA 可用。
该成员变量在不同的算法模式中,含义有所不同。CBC 模式中为初始化向量。CTR 模式中为初始计数值,同时也用于保存 CE 输出的下一个数据块的计数值。XTS 中为 TWEAK 值。
-
phy_iv
初始化向量缓冲区的物理地址。
-
backup_ivs
用于 CBC 算法模式的解密情景。解密时,需要保存不同数据段的最后一个密文块,作为下一个数据段的初始化向量。
-
backup_phy_ivs
对应的物理地址。
-
next_iv
用于 CBC 算法模式加密的场景。在 CBC 算法模式的加密处理时,如果一个请求中有多个数据块串行处理,使用 next_iv 指向当前数据块的最后一个密文块的地址,以作为下一个数据块的初始化向量输入。
-
ssram_addr
当需要使用安全 SRAM 时,用于保存申请到的安全 SRAM 地址。
-
mode
算法和模式标记变量,用于标记当前请求所使用的算法和模式等信息。
-
src_cpy_buf
输入数据的工作缓冲区。当前请求的输入数据缓冲区不满足 CE 硬件的使用要求时,需要分配物理连续的工作缓冲区。
-
src_phy_buf
输入数据的工作缓冲区物理地址。
-
dst_cpy_buf
输出数据的工作缓冲区。当前输出数据缓冲区不满足 CE 硬件的使用要求时,需要分配物理连续的工作缓冲区。
-
dst_phy_buf
输出数据缓冲区的物理地址。
-
src_map_sg
输入 sg list 是否执行了 map 的标记。
-
dst_map_sg
输出 sg list 是否执行了 map 的标记。
非对称密钥算法
struct aic_akcipher_tfm_ctx {
struct crypto_engine_ctx enginectx;
struct aic_crypto_dev *ce;
unsigned char *n;
unsigned char *e;
unsigned char *d;
unsigned int n_sz;
unsigned int e_sz;
unsigned int d_sz;
};
aic_akcipher_tfm_ctx 是非对称密钥算法实例所对应的上下文。
其中:
-
enginectx
crypto_engine 的上下文,用于配置该算法的回调处理函数。
-
n
RSA 密钥中的 modulus。
-
e
RSA 密钥中的公钥指数。
-
d
RSA 密钥中的私钥指数。
struct aic_akcipher_reqctx {
struct task_desc *task;
dma_addr_t phy_task;
unsigned char *wbuf;
dma_addr_t phy_wbuf;
dma_addr_t ssram_addr;
int tasklen;
unsigned int wbuf_size;
unsigned long flags;
};
aic_akcipher_reqctx 是每一个数据请求所对应的上下文,在每一个 struct akcipher_request
实例化时自动创建。其中:
-
task
CE 任务描述符指针。任务描述符所使用的空间是动态分配的空间,需要相关指针信息保存,以便完成时释放。
-
phy_task
任务描述符的物理地址。
-
wbuf
工作缓冲区。
-
phy_wbuf
工作缓冲区的物理地址。
-
ssram_addr
当需要使用安全 SRAM 时,用于保存申请到的安全 SRAM 地址。
-
flags
算法和模式标记变量,用于标记当前请求所使用的算法和模式等信息。
消息摘要算法
struct aic_hash_tfm_ctx {
struct crypto_engine_ctx enginectx;
struct aic_crypto_dev *ce;
bool hmac;
};
aic_hash_tfm_ctx 是消息摘要算法实例所对应的上下文。
其中:
-
enginectx
crypto_engine 的上下文,用于配置该算法的回调处理函数。
-
hmac
用于标记当前算法是否为 HMAC 类算法。
struct aic_hash_reqctx {
struct task_desc *task;
dma_addr_t phy_task;
unsigned char *ivbuf;
dma_addr_t phy_ivbuf;
unsigned char *total_bitlen;
dma_addr_t phy_total_bitlen;
void *src_cpy_buf;
dma_addr_t src_phy_buf;
int tasklen;
unsigned int digest_size;
unsigned long flags;
unsigned char digest[CE_MAX_DIGEST_SIZE];
bool src_map_sg;
};
aic_hash_reqctx 是每一个数据请求所对应的上下文,在每一个 struct ahash_request 实例化时自动创建。
其中:
-
task
CE 任务描述符指针。任务描述符所使用的空间是动态分配的空间,需要相关指针信息保存,以便完成时释放。
-
phy_task
任务描述符的物理地址。
-
total_bitlen
当前请求处理的数据总长度,单位 bit。
-
phy_total_bitlen
保存数据总长度的变量的物理地址。
-
src_cpy_buf
输入数据的工作缓冲区。当前请求的输入数据缓冲区不满足 CE 硬件的使用要求时,需要分配物理连续的工作缓冲区。
-
src_phy_buf
输入数据的工作缓冲区物理地址。
-
flags
算法和模式标记变量,用于标记当前请求所使用的算法和模式等信息。
-
digest
用于保存当前一笔请求数据的摘要结果。当有连续多个请求的数据需要处理时,同时作为下一个请求的初始化向量输入。
-
src_map_sg
输入 sg list 是否执行了 map 的标记。