Edit online

数据结构设计

31 Jan 2024
Read time: 5 minute(s)

设备结构体

CE 设备结构体用来保存 CE 基地址等相关信息,除此之外,还包含了三个不同类型的算法加速器结构体, 以及安全 SRAM 的分配管理信息等。
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

    记录最新的错误状态寄存器的值。

对称密钥算法

aic_skcipher_tfm_ctx 是一个对称密钥算法实例对应的上下文结构体,当用户使用 API 接口
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 的标记。