開啟SSL

密碼學和 SSL/TLS 工具組

provider-kem

名稱

provider-kem - kem 函式庫 <-> 提供者函式

語法

#include <openssl/core_dispatch.h>
#include <openssl/core_names.h>

/*
 * None of these are actual functions, but are displayed like this for
 * the function signatures for functions that are offered as function
 * pointers in OSSL_DISPATCH arrays.
 */

/* Context management */
void *OSSL_FUNC_kem_newctx(void *provctx);
void OSSL_FUNC_kem_freectx(void *ctx);
void *OSSL_FUNC_kem_dupctx(void *ctx);

/* Encapsulation */
int OSSL_FUNC_kem_encapsulate_init(void *ctx, void *provkey,
                                   const OSSL_PARAM params[]);
int OSSL_FUNC_kem_auth_encapsulate_init(void *ctx, void *provkey,
                                        void *provauthkey,
                                        const OSSL_PARAM params[]);
int OSSL_FUNC_kem_encapsulate(void *ctx, unsigned char *out, size_t *outlen,
                              unsigned char *secret, size_t *secretlen);

/* Decapsulation */
int OSSL_FUNC_kem_decapsulate_init(void *ctx, void *provkey);
int OSSL_FUNC_kem_auth_decapsulate_init(void *ctx, void *provkey,
                                        void *provauthkey,
                                        const OSSL_PARAM params[]);
int OSSL_FUNC_kem_decapsulate(void *ctx, unsigned char *out, size_t *outlen,
                              const unsigned char *in, size_t inlen);

/* KEM parameters */
int OSSL_FUNC_kem_get_ctx_params(void *ctx, OSSL_PARAM params[]);
const OSSL_PARAM *OSSL_FUNC_kem_gettable_ctx_params(void *ctx, void *provctx);
int OSSL_FUNC_kem_set_ctx_params(void *ctx, const OSSL_PARAM params[]);
const OSSL_PARAM *OSSL_FUNC_kem_settable_ctx_params(void *ctx, void *provctx);

說明

本文件主要針對提供者作者。如需進一步資訊,請參閱 provider(7)

不對稱 kem (OSSL_OP_KEM) 作業讓提供者能夠實作不對稱 kem 演算法,並透過 API 函式 EVP_PKEY_encapsulate(3)EVP_PKEY_decapsulate(3) 和其他相關函式讓應用程式使用。

這裡提到的所有「函式」都以函式指標的形式在 OSSL_DISPATCH(3) 陣列中傳遞給 libcrypto 和提供者,並透過 OSSL_ALGORITHM(3) 陣列傳回,而後者是由提供者的 provider_query_operation() 函式傳回的 (請參閱 provider-base(7) 中的「提供者函式」)。

所有這些「函式」都有對應的函式類型定義,稱為 OSSL_FUNC_{name}_fn,以及一個輔助函式,用於從 OSSL_DISPATCH(3) 元素擷取函式指標,稱為 OSSL_FUNC_{name}。例如,「函式」OSSL_FUNC_kem_newctx() 有這些

typedef void *(OSSL_FUNC_kem_newctx_fn)(void *provctx);
static ossl_inline OSSL_FUNC_kem_newctx_fn
    OSSL_FUNC_kem_newctx(const OSSL_DISPATCH *opf);

OSSL_DISPATCH(3) 陣列會根據 openssl-core_dispatch.h(7) 中提供為巨集的數字編製索引,如下所示

OSSL_FUNC_kem_newctx                OSSL_FUNC_KEM_NEWCTX
OSSL_FUNC_kem_freectx               OSSL_FUNC_KEM_FREECTX
OSSL_FUNC_kem_dupctx                OSSL_FUNC_KEM_DUPCTX

OSSL_FUNC_kem_encapsulate_init      OSSL_FUNC_KEM_ENCAPSULATE_INIT
OSSL_FUNC_kem_auth_encapsulate_init OSSL_FUNC_KEM_AUTH_ENCAPSULATE_INIT
OSSL_FUNC_kem_encapsulate           OSSL_FUNC_KEM_ENCAPSULATE

OSSL_FUNC_kem_decapsulate_init      OSSL_FUNC_KEM_DECAPSULATE_INIT
OSSL_FUNC_kem_auth_decapsulate_init OSSL_FUNC_KEM_AUTH_DECAPSULATE_INIT
OSSL_FUNC_kem_decapsulate           OSSL_FUNC_KEM_DECAPSULATE

OSSL_FUNC_kem_get_ctx_params        OSSL_FUNC_KEM_GET_CTX_PARAMS
OSSL_FUNC_kem_gettable_ctx_params   OSSL_FUNC_KEM_GETTABLE_CTX_PARAMS
OSSL_FUNC_kem_set_ctx_params        OSSL_FUNC_KEM_SET_CTX_PARAMS
OSSL_FUNC_kem_settable_ctx_params   OSSL_FUNC_KEM_SETTABLE_CTX_PARAMS

不對稱 kem 演算法實作可能不會實作所有這些函式。為了成為一組一致的函式,提供者必須實作 OSSL_FUNC_kem_newctx 和 OSSL_FUNC_kem_freectx。它還必須同時實作 OSSL_FUNC_kem_encapsulate_init 和 OSSL_FUNC_kem_encapsulate,或同時實作 OSSL_FUNC_kem_decapsulate_init 和 OSSL_FUNC_kem_decapsulate。OSSL_FUNC_kem_auth_encapsulate_init 是選用的,但如果存在,則 OSSL_FUNC_kem_auth_decapsulate_init 也必須存在。OSSL_FUNC_kem_get_ctx_params 是選用的,但如果存在,則 OSSL_FUNC_kem_gettable_ctx_params 也必須存在。同樣地,OSSL_FUNC_kem_set_ctx_params 是選用的,但如果存在,則 OSSL_FUNC_kem_settable_ctx_params 也必須存在。

不對稱 kem 演算法還必須實作一些機制,透過金鑰管理 (OSSL_OP_KEYMGMT) 作業來產生、載入或匯入金鑰。如需進一步詳細資訊,請參閱 provider-keymgmt(7)

內容管理函式

OSSL_FUNC_kem_newctx() 應建立並傳回一個指向提供者端結構的指標,用於在非對稱 kem 作業期間保存內容資訊。此內容的指標會在其他非對稱 kem 作業函式呼叫中傳回。參數 provctx 是在提供者初始化期間產生的提供者內容(請參閱 provider(7))。

OSSL_FUNC_kem_freectx() 會傳遞一個指向提供者端非對稱 kem 內容的指標,作為 ctx 參數。此函式應釋放與該內容相關的所有資源。

OSSL_FUNC_kem_dupctx() 應複製 ctx 參數中的提供者端非對稱 kem 內容,並傳回複製副本。

非對稱金鑰封裝函式

OSSL_FUNC_kem_encapsulate_init() 會初始化非對稱封裝的內容,並在 ctx 參數中提供提供者端非對稱 kem 內容,在 provkey 參數中提供指向提供者金鑰物件的指標,以及演算法的 name。如果 params 不為 NULL,應使用類似於 OSSL_FUNC_kem_set_ctx_params() 的方式在內容中設定。金鑰物件應事先使用金鑰管理 (OSSL_OP_KEYMGMT) 作業產生、載入或匯入提供者(請參閱 provider-keymgmt(7)>)。

OSSL_FUNC_kem_auth_encapsulate_init() 類似於 OSSL_FUNC_kem_encapsulate_init(),但也會傳遞額外的驗證金鑰 provauthkey,且不能為 NULL。

OSSL_FUNC_kem_encapsulate() 會執行實際封裝。先前初始化的非對稱 kem 內容會傳遞在 ctx 參數中。除非 out 為 NULL,否則會在內部產生要封裝的資料,並傳回 secret 參數所指的緩衝區,且封裝資料也應寫入 out 參數所指的位置。封裝資料的長度應寫入 *outlen,而產生機密的長度應寫入 *secretlen

如果 out 為 NULL,則應將封裝資料的最大長度寫入 *outlen,而產生機密的最大長度應寫入 *secretlen

解封裝函式

OSSL_FUNC_kem_decapsulate_init() 會初始化非對稱解封裝的內容,並在 ctx 參數中提供提供者端非對稱 kem 內容,在 provkey 參數中提供指向提供者金鑰物件的指標,以及演算法的 name。金鑰物件應事先使用金鑰管理 (OSSL_OP_KEYMGMT) 作業產生、載入或匯入提供者(請參閱 provider-keymgmt(7)>)。

OSSL_FUNC_kem_auth_decapsulate_init() 類似於 OSSL_FUNC_kem_decapsulate_init(),但也會傳遞額外的驗證金鑰 provauthkey,且不能為 NULL。

OSSL_FUNC_kem_decapsulate() 本身執行實際的解密封裝。先前初始化的非對稱 kem 背景會傳遞至 ctx 參數中。要解密封裝的資料由 in 參數指向,其長度為 inlen 位元組。除非 out 為 NULL,否則解密封裝的資料應寫入由 out 參數指向的位置。解密封裝資料的長度應寫入 *outlen。如果 out 為 NULL,則應將解密封裝資料的最大長度寫入 *outlen

非對稱金鑰封裝參數

請參閱 OSSL_PARAM(3) 以進一步瞭解 OSSL_FUNC_kem_get_ctx_params() 和 OSSL_FUNC_kem_set_ctx_params() 函式所使用的參數結構。

OSSL_FUNC_kem_get_ctx_params() 會取得與指定提供者端非對稱 kem 背景 ctx 相關的非對稱 kem 參數,並將其儲存在 params 中。將 NULL 傳遞給 params 應傳回 true。

OSSL_FUNC_kem_set_ctx_params() 會將與指定提供者端非對稱 kem 背景 ctx 相關的非對稱 kem 參數設定為 params。任何參數設定都會新增至先前設定的任何設定。將 NULL 傳遞給 params 應傳回 true。

內建非對稱 kem 演算法目前不識別任何參數。

OSSL_FUNC_kem_gettable_ctx_params() 和 OSSL_FUNC_kem_settable_ctx_params() 會取得一個常數 OSSL_PARAM(3) 陣列,用於描述可取得和可設定參數,亦即分別可與 OSSL_FUNC_kem_get_ctx_params() 和 OSSL_FUNC_kem_set_ctx_params() 搭配使用的參數。

傳回值

OSSL_FUNC_kem_newctx() 和 OSSL_FUNC_kem_dupctx() 應傳回新建立的提供者端非對稱 kem 背景,或在失敗時傳回 NULL。

所有其他函式應在成功時傳回 1,或在發生錯誤時傳回 0。

另請參閱

provider(7)

歷程記錄

提供者 KEM 介面於 OpenSSL 3.0 中引入。

OSSL_FUNC_kem_auth_encapsulate_init() 和 OSSL_FUNC_kem_auth_decapsulate_init() 於 OpenSSL 3.2 中新增。

Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.

根據 Apache License 2.0(「授權」)授權。您不得在不遵守授權的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得副本,或至 https://www.openssl.org/source/license.html 取得。