密钥协商协议原语(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 句柄

参数

struct crypto_kpp *tfm

使用 crypto_alloc_kpp() 分配的 KPP tfm 句柄

描述

如果 tfm 是 NULL 或错误指针,则此函数不执行任何操作。

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 算法生成公共部分。

要生成私钥,调用者应使用随机数生成器。所请求长度的输出充当私钥。

返回

成功时为零;如果出现错误,则为错误代码

int crypto_kpp_compute_shared_secret(struct kpp_request *req)

调用 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

指向输入散列表的指针

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 密钥的大小

unsigned int crypto_ecdh_key_len(const struct ecdh *params)

获取私有 ECDH 密钥的大小

参数

const struct ecdh *params

私有 ECDH 密钥

描述

此函数返回数据包 ECDH 密钥大小。调用者可以使用提供的 ECDH 私钥引用来获取保存数据包密钥所需的内存大小。

返回

密钥的字节大小

int crypto_ecdh_encode_key(char *buf, unsigned int len, const struct ecdh *p)

编码私钥

参数

char *buf

调用者分配的缓冲区,用于保存数据包 ECDH 私钥。缓冲区的大小应至少为 crypto_ecdh_key_len 字节。

unsigned int len

数据包私钥缓冲区的长度

const struct ecdh *p

带有调用者指定的私钥的缓冲区

描述

ECDH 实现操作私钥的数据包表示形式。

返回

-EINVAL,如果缓冲区大小不足,成功则为 0

int crypto_ecdh_decode_key(const char *buf, unsigned int len, struct ecdh *p)

解码私钥

参数

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 的大小

unsigned int crypto_dh_key_len(const struct dh *params)

获取私有 DH 密钥的大小

参数

const struct dh *params

私有 DH 密钥

描述

此函数返回数据包 DH 密钥大小。调用者可以使用提供的 DH 私钥引用来获取保存数据包密钥所需的内存大小。

返回

密钥的字节大小

int crypto_dh_encode_key(char *buf, unsigned int len, const struct dh *params)

编码私钥

参数

char *buf

由调用者分配的缓冲区,用于保存数据包DH私钥。缓冲区大小应至少为 crypto_dh_key_len 字节。

unsigned int len

数据包私钥缓冲区的长度

const struct dh *params

带有调用者指定的私钥的缓冲区

描述

DH 实现对私钥的数据包表示形式进行操作。

返回

-EINVAL,如果缓冲区大小不足,成功则为 0

int crypto_dh_decode_key(const char *buf, unsigned int len, struct dh *params)

解码私钥

参数

const char *buf

保存应解码的数据包密钥的缓冲区

unsigned int len

数据包私钥缓冲区的长度

struct dh *params

由调用者分配的缓冲区,用于填充解包的 DH 私钥。

描述

解包通过将 p 指向 buf 中的正确位置来获取私钥。因此,两个指针都指向相同的内存。

返回

-EINVAL,如果缓冲区大小不足,成功则为 0