数据结构设计
设备结构体
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 的标记。