密钥协商协议原语(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
指定秘密的长度,包括标头,该标头位于结构之后
密钥协商协议原语(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
返回
- 成功时分配的句柄;如果出现以下情况,则 IS_ERR() 为 true
错误,
PTR_ERR()
返回错误代码。
-
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 请求
-
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
指向输入散列表的指针
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
指向输出散列表的指针
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