金鑰協商協議原語 (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

返回

成功時分配的控制代碼;如果發生錯誤,則 IS_ERR() 為 true,PTR_ERR() 返回錯誤程式碼。

如果發生錯誤,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

指向輸入散列表的 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 金鑰的大小

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