密钥协商协议原语 (KPP) 密码算法定义¶
- 
struct kpp_request¶
定义:
struct kpp_request {
    struct crypto_async_request base;
    struct scatterlist *src;
    struct scatterlist *dst;
    unsigned int src_len;
    unsigned int dst_len;
    void *__ctx[] ;
};
成员
- base
- 异步密码请求的公共属性 
- src
- 源数据 
- dst
- 目标数据 
- src_len
- 输入缓冲区的大小 
- dst_len
- 输出缓冲区的大小。它需要至少与预期的结果一样大,具体取决于操作。操作后,它将更新为结果的实际大小。如果发生错误,dst sgl 大小不足,它将更新为操作所需的大小。 
- __ctx
- 私有上下文数据的开始 
- 
struct crypto_kpp¶
- 用户实例化的对象,封装了算法和核心处理逻辑 
定义:
struct crypto_kpp {
    unsigned int reqsize;
    struct crypto_tfm base;
};
成员
- reqsize
- 算法实现所需的请求上下文大小 
- base
- 通用密码 API 算法数据结构 
- 
struct kpp_alg¶
- 通用密钥协商协议原语 
定义:
struct kpp_alg {
    int (*set_secret)(struct crypto_kpp *tfm, const void *buffer, unsigned int len);
    int (*generate_public_key)(struct kpp_request *req);
    int (*compute_shared_secret)(struct kpp_request *req);
    unsigned int (*max_size)(struct crypto_kpp *tfm);
    int (*init)(struct crypto_kpp *tfm);
    void (*exit)(struct crypto_kpp *tfm);
    struct crypto_alg base;
};
成员
- set_secret
- 函数调用协议特定的函数来存储密钥以及参数。该实现知道如何解码缓冲区 
- generate_public_key
- 函数生成要发送给对方的公钥。如果发生错误,输出不够大,req->dst_len 将更新为所需的大小 
- compute_shared_secret
- 函数计算算法定义的共享密钥。结果将返回给用户。如果发生错误,输出不够大,req->dst_len 将更新为所需的大小 
- max_size
- 函数返回输出缓冲区的大小 
- init
- 初始化对象。这仅在实例化时调用一次。以防需要初始化密码硬件。软件回退应该放在这里。 
- exit
- 撤消 init 所做的一切。 
- base
- 通用密码 API 算法数据结构 
- 
struct kpp_secret¶
- 用于打包密钥缓冲区的小标头 
定义:
struct kpp_secret {
    unsigned short type;
    unsigned short len;
};
成员
- type
- 定义密钥的类型。每个 kpp 类型都将定义自己的类型 
- len
- 指定密钥的长度,包括标头,该标头位于 struct 之后 
密钥协商协议原语 (KPP) 密码 API¶
KPP API 与算法类型 CRYPTO_ALG_TYPE_KPP 一起使用(在 /proc/crypto 中列为类型“kpp”)
- 
struct crypto_kpp *crypto_alloc_kpp(const char *alg_name, u32 type, u32 mask)¶
- 分配 KPP tfm 句柄 
参数
- const char *alg_name
- 是 kpp 算法的名称(例如“dh”、“ecdh”) 
- u32 type
- 指定算法的类型 
- u32 mask
- 指定算法的掩码 
描述
为 kpp 算法分配一个句柄。任何后续 API 调用都需要返回的 struct crypto_kpp
返回
- 
void crypto_free_kpp(struct crypto_kpp *tfm)¶
- 释放 KPP tfm 句柄 
- 
int crypto_kpp_set_secret(struct crypto_kpp *tfm, const void *buffer, unsigned int len)¶
- 调用 kpp 操作 
参数
- struct crypto_kpp *tfm
- tfm 句柄 
- const void *buffer
- 包含私钥数据包表示形式的缓冲区。数据包密钥的结构取决于特定的 KPP 实现。为 ECDH 和 DH 提供了打包和解包助手(请参阅这些实现的相应头文件)。 
- unsigned int len
- 数据包私钥缓冲区的长度。 
描述
函数调用给定算法的特定 kpp 操作。
返回
成功时为零;如果发生错误,则为错误代码
- 
int crypto_kpp_generate_public_key(struct kpp_request *req)¶
- 调用 kpp 操作 
参数
- struct kpp_request *req
- kpp 密钥请求 
描述
函数调用特定的 kpp 操作,为给定的 kpp 算法生成公共部分。
要生成私钥,调用者应使用随机数生成器。请求长度的输出充当私钥。
返回
成功时为零;如果发生错误,则为错误代码
- 调用 kpp 操作 
参数
- struct kpp_request *req
- kpp 密钥请求 
描述
函数调用特定的 kpp 操作,为给定的 kpp 算法计算共享密钥。
返回
成功时为零;如果发生错误,则为错误代码
- 
unsigned int crypto_kpp_maxsize(struct crypto_kpp *tfm)¶
- 获取输出缓冲区的长度 
参数
- struct crypto_kpp *tfm
- 使用 - crypto_alloc_kpp()分配的 KPP tfm 句柄
描述
函数返回给定密钥所需的输出缓冲区大小。函数假定密钥已在转换中设置。如果在未设置密钥或设置密钥失败的情况下调用此函数,您将最终遇到 NULL 解引用。
密钥协商协议原语 (KPP) 密码请求句柄¶
- 
struct kpp_request *kpp_request_alloc(struct crypto_kpp *tfm, gfp_t gfp)¶
- 分配 kpp 请求 
参数
- struct crypto_kpp *tfm
- 使用 - crypto_alloc_kpp()分配的 KPP tfm 句柄
- gfp_t gfp
- 分配标志 
返回
成功时分配的句柄,如果发生错误,则为 NULL。
- 
void kpp_request_free(struct kpp_request *req)¶
- 归零并释放 kpp 请求 
参数
- struct kpp_request *req
- 要释放的请求 
- 
void kpp_request_set_callback(struct kpp_request *req, u32 flgs, crypto_completion_t cmpl, void *data)¶
- 设置异步回调。 
参数
- struct kpp_request *req
- 将为其设置回调的请求 
- u32 flgs
- 指定例如操作是否可能积压 
- crypto_completion_t cmpl
- 将被调用的回调 
- void *data
- 调用者使用的私有数据 
描述
当给定请求上的异步操作完成时,将调用回调。
- 
void kpp_request_set_input(struct kpp_request *req, struct scatterlist *input, unsigned int input_len)¶
- 设置输入缓冲区 
参数
- struct kpp_request *req
- kpp 请求 
- struct scatterlist *input
- 指向输入散列表的 ptr 
- unsigned int input_len
- 输入散列表的大小 
描述
设置 generate_public_key 所需的参数
- 
void kpp_request_set_output(struct kpp_request *req, struct scatterlist *output, unsigned int output_len)¶
- 设置输出缓冲区 
参数
- struct kpp_request *req
- kpp 请求 
- struct scatterlist *output
- 指向输出散列表的 ptr 
- unsigned int output_len
- 输出散列表的大小 
描述
设置 kpp 操作所需的参数
ECDH 助手函数¶
要将 ECDH 与 KPP 密码 API 一起使用,应使用以下数据结构和函数。
ECDH 实现已知的 ECC 曲线在此头文件中指定。
要将 ECDH 与 KPP 一起使用,应使用以下函数来操作 ECDH 私钥。可以使用 crypto_kpp_set_secret 的 KPP API 函数调用设置数据包私钥。
- 
struct ecdh¶
- 定义 ECDH 私钥 
定义:
struct ecdh {
    char *key;
    unsigned short key_size;
};
成员
- key
- 私有 ECDH 密钥 
- key_size
- 私有 ECDH 密钥的大小 
参数
- const struct ecdh *params
- 私有 ECDH 密钥 
描述
此函数返回数据包 ECDH 密钥大小。调用者可以使用它以及提供的 ECDH 私钥引用来获取保存数据包密钥所需的内存大小。
返回
密钥大小(以字节为单位)
参数
- char *buf
- 由调用者分配的用于保存数据包 ECDH 私钥的缓冲区。缓冲区的大小应至少为 crypto_ecdh_key_len 字节。 
- unsigned int len
- 数据包私钥缓冲区的长度 
- const struct ecdh *p
- 带有调用者指定的私钥的缓冲区 
描述
ECDH 实现对私钥的数据包表示形式进行操作。
返回
如果缓冲区大小不足,则返回 -EINVAL,成功时返回 0
参数
- const char *buf
- 包含应解码的数据包密钥的缓冲区 
- unsigned int len
- 数据包私钥缓冲区的长度 
- struct ecdh *p
- 由调用者分配的缓冲区,其中填充了解包的 ECDH 私钥。 
描述
解包通过将 p 指向 buf 中的正确位置来获取私钥。因此,两个指针都指向同一块内存。
返回
如果缓冲区大小不足,则返回 -EINVAL,成功时返回 0
DH 助手函数¶
要将 DH 与 KPP 密码 API 一起使用,应使用以下数据结构和函数。
要将 DH 与 KPP 一起使用,应使用以下函数来操作 DH 私钥。可以使用 crypto_kpp_set_secret 的 KPP API 函数调用设置数据包私钥。
- 
struct dh¶
- 定义 DH 私钥 
定义:
struct dh {
    const void *key;
    const void *p;
    const void *g;
    unsigned int key_size;
    unsigned int p_size;
    unsigned int g_size;
};
成员
- key
- 私有 DH 密钥 
- p
- Diffie-Hellman 参数 P 
- g
- Diffie-Hellman 生成器 G 
- key_size
- 私有 DH 密钥的大小 
- p_size
- DH 参数 P 的大小 
- g_size
- DH 生成器 G 的大小 
参数
- const struct dh *params
- 私有 DH 密钥 
描述
此函数返回数据包 DH 密钥大小。调用者可以使用它以及提供的 DH 私钥引用来获取保存数据包密钥所需的内存大小。
返回
密钥大小(以字节为单位)
参数
- char *buf
- 由调用者分配的用于保存数据包 DH 私钥的缓冲区。缓冲区的大小应至少为 crypto_dh_key_len 字节。 
- unsigned int len
- 数据包私钥缓冲区的长度 
- const struct dh *params
- 带有调用者指定的私钥的缓冲区 
描述
DH 实现对私钥的数据包表示形式进行操作。
返回
如果缓冲区大小不足,则返回 -EINVAL,成功时返回 0
参数
- const char *buf
- 包含应解码的数据包密钥的缓冲区 
- unsigned int len
- 数据包私钥缓冲区的长度 
- struct dh *params
- 由调用者分配的缓冲区,其中填充了解包的 DH 私钥。 
描述
解包通过将 p 指向 buf 中的正确位置来获取私钥。因此,两个指针都指向同一块内存。
返回
如果缓冲区大小不足,则返回 -EINVAL,成功时返回 0