金鑰協商協議原語 (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 *tfmtfm 控制代碼
const void *buffer包含私鑰資料包表示形式的緩衝區。資料包金鑰的結構取決於特定的 KPP 實現。為 ECDH 和 DH 提供了打包和解包助手(請參閱這些實現的相應標頭檔案)。
unsigned int len資料包私鑰緩衝區的長度。
描述
函式呼叫給定演算法的特定 kpp 操作。
返回
成功時為零;如果發生錯誤,則為錯誤程式碼
-
int crypto_kpp_generate_public_key(struct kpp_request *req)¶
呼叫 kpp 操作
引數
struct kpp_request *reqkpp 金鑰請求
描述
函式呼叫特定的 kpp 操作,為給定的 kpp 演算法生成公共部分。
要生成私鑰,呼叫者應使用隨機數生成器。請求長度的輸出充當私鑰。
返回
成功時為零;如果發生錯誤,則為錯誤程式碼
呼叫 kpp 操作
引數
struct kpp_request *reqkpp 金鑰請求
描述
函式呼叫特定的 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 *reqkpp 請求
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 *reqkpp 請求
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 金鑰
pDiffie-Hellman 引數 P
gDiffie-Hellman 生成器 G
key_size私有 DH 金鑰的大小
p_sizeDH 引數 P 的大小
g_sizeDH 生成器 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