0
点赞
收藏
分享

微信扫一扫

《OpenSSL3.0学习之十一 提供程序-digest|CSDN创作打卡》

文章目录

🌵概要

 #include <openssl/core_dispatch.h>
 #include <openssl/core_names.h>
 
 /*
  * Digests support the following function signatures in OSSL_DISPATCH arrays.
  * (The function signatures are not actual functions).
  */
 
 /* Context management */
 void *OSSL_FUNC_digest_newctx(void *provctx);
 void OSSL_FUNC_digest_freectx(void *dctx);
 void *OSSL_FUNC_digest_dupctx(void *dctx);
 
 /* Digest generation */
 int OSSL_FUNC_digest_init(void *dctx, const OSSL_PARAM params[]);
 int OSSL_FUNC_digest_update(void *dctx, const unsigned char *in, size_t inl);
 int OSSL_FUNC_digest_final(void *dctx, unsigned char *out, size_t *outl,
                            size_t outsz);
 int OSSL_FUNC_digest_digest(void *provctx, const unsigned char *in, size_t inl,
                             unsigned char *out, size_t *outl, size_t outsz);
 
 /* Digest parameter descriptors */
 const OSSL_PARAM *OSSL_FUNC_digest_gettable_params(void *provctx);
 
 /* Digest operation parameter descriptors */
 const OSSL_PARAM *OSSL_FUNC_digest_gettable_ctx_params(void *dctx,
                                                        void *provctx);
 const OSSL_PARAM *OSSL_FUNC_digest_settable_ctx_params(void *dctx,
                                                        void *provctx);
 
 /* Digest parameters */
 int OSSL_FUNC_digest_get_params(OSSL_PARAM params[]);
 
 /* Digest operation parameters */
 int OSSL_FUNC_digest_set_ctx_params(void *dctx, const OSSL_PARAM params[]);
 int OSSL_FUNC_digest_get_ctx_params(void *dctx, OSSL_PARAM params[]);

🎄描述

DIGEST 操作使提供程序能够实现摘要算法,并通过 API 函数EVP_DigestInit_exEVP_DigestUpdateEVP_DigestFinal(以及其他相关函数)将其提供给应用程序。

这里提到的所有"函数"都作为函数指针在libcrypto和OSSL_DISPATCH数组中的提供者之间传递,通过由提供者的provider_query_operation()函数返回的OSSL_ALGORITHM数组。

所有这些"函数"都有一个名为 OSSL_FUNC_{name}_fn 的相应函数类型定义,以及一个帮助程序函数,用于从名为 OSSL_FUNC_{name}OSSL_DISPATCH元素中检索函数指针。例如,"函数"OSSL_FUNC_digest_newctx() 具有以下各项:

 typedef void *(OSSL_OSSL_FUNC_digest_newctx_fn)(void *provctx);
 static ossl_inline OSSL_OSSL_FUNC_digest_newctx_fn
     OSSL_FUNC_digest_newctx(const OSSL_DISPATCH *opf);

OSSL_DISPATCH数组由 openssl-core_dispatch.h中作为宏提供的数字编制索引,如下所示:

 OSSL_FUNC_digest_newctx               OSSL_FUNC_DIGEST_NEWCTX
 OSSL_FUNC_digest_freectx              OSSL_FUNC_DIGEST_FREECTX
 OSSL_FUNC_digest_dupctx               OSSL_FUNC_DIGEST_DUPCTX

 OSSL_FUNC_digest_init                 OSSL_FUNC_DIGEST_INIT
 OSSL_FUNC_digest_update               OSSL_FUNC_DIGEST_UPDATE
 OSSL_FUNC_digest_final                OSSL_FUNC_DIGEST_FINAL
 OSSL_FUNC_digest_digest               OSSL_FUNC_DIGEST_DIGEST

 OSSL_FUNC_digest_get_params           OSSL_FUNC_DIGEST_GET_PARAMS
 OSSL_FUNC_digest_get_ctx_params       OSSL_FUNC_DIGEST_GET_CTX_PARAMS
 OSSL_FUNC_digest_set_ctx_params       OSSL_FUNC_DIGEST_SET_CTX_PARAMS

 OSSL_FUNC_digest_gettable_params      OSSL_FUNC_DIGEST_GETTABLE_PARAMS
 OSSL_FUNC_digest_gettable_ctx_params  OSSL_FUNC_DIGEST_GETTABLE_CTX_PARAMS
 OSSL_FUNC_digest_settable_ctx_params  OSSL_FUNC_DIGEST_SETTABLE_CTX_PARAMS

摘要算法实现可能无法实现所有这些功能。为了全部可用或不使用OSSL_FUNC_digest_newctx,应实施OSSL_FUNC_digest_freectx,OSSL_FUNC_digest_init,OSSL_FUNC_digest_update和OSSL_FUNC_digest_final。所有其他功能都是可选的。

🌲上下文管理功能

OSSL_FUNC_digest_newctx() 应创建并返回指向提供程序端结构的指针,以便在摘要操作期间保存上下文信息。指向此上下文的指针将在许多其他摘要操作函数调用中传递回去。参数 provctx 是在提供程序初始化期间生成的提供程序上下文。

OSSL_FUNC_digest_freectx() 在 dctx 参数中传递指向提供程序端摘要上下文的指针。此函数应释放与该上下文关联的任何资源。

OSSL_FUNC_digest_dupctx() 应在 dctx 参数中复制提供程序端摘要上下文并返回重复的副本。

🌳摘要生成函数

OSSL_FUNC_digest_init() 在 dctx 参数中给定新创建的提供程序端摘要上下文,初始化摘要操作。参数(如果不是 NULL)应以类似于使用 OSSL_FUNC_digest_set_ctx_params() 的方式在上下文中设置。

调用 OSSL_FUNC_digest_update() 以提供要作为先前初始化的摘要操作的一部分进行消化的数据。dctx 参数包含指向以前初始化的提供程序端上下文的指针。OSSL_FUNC_digest_update() 应该在 in 所指向的位置消化 inl 字节的数据。对于单个摘要操作,可以多次调用 OSSL_FUNC_digest_update()。

OSSL_FUNC_digest_final() 生成通过以前的 OSSL_FUNC_digest_init() 和 OSSL_FUNC_digest_update() 调用启动的摘要。dctx 参数包含指向提供程序端上下文的指针。摘要应写为 *out,摘要的长度应写为 *outl。摘要不应超过 outsz 字节。

OSSL_FUNC_digest_digest() 是一个"oneshot"摘要函数。不使用提供程序端摘要上下文。相反,在提供程序初始化期间创建的提供程序上下文在 provctx 参数中传递。应消化 in 处的 in 字节,并将结果存储在 out 处。摘要的长度应存储在 *outl 中,不应超过 outsz 字节。

🌴摘要参数

有关这些函数使用的参数结构的更多详细信息,请参见 OSSL_PARAM

OSSL_FUNC_digest_get_params() 获取算法实现的详细信息,并将其存储在params中。

OSSL_FUNC_digest_set_ctx_params() 将提供程序端摘要上下文 dctx 的摘要操作参数设置为params。任何参数设置都是对以前设置的任何参数设置的附加设置。为params传递 NULL 应返回 true。

OSSL_FUNC_digest_get_ctx_params() 从给定的提供程序端摘要上下文 dctx 获取摘要操作详细信息,并将其存储在params中。为params传递 NULL 应返回 true。

OSSL_FUNC_digest_gettable_params() 返回一个常量OSSL_PARAM数组,其中包含 OSSL_FUNC_digest_get_params() 可以处理的参数的描述符。

OSSL_FUNC_digest_gettable_ctx_params() 和 OSSL_FUNC_digest_settable_ctx_params() 都返回常量OSSL_PARAM数组,作为OSSL_FUNC_digest_get_ctx_params() 和 OSSL_FUNC_digest_set_ctx_params() 可以分别处理的参数的描述符。如果 dctx 不为 NULL,则该数组基于提供程序端上下文的当前状态,否则基于提供程序端算法 provctx 的当前状态。

具有此功能的内置摘要当前识别的参数如下所示。并非所有参数都与所有摘要相关或被所有摘要理解:

  • “blocksize” (OSSL_DIGEST_PARAM_BLOCK_SIZE)
    摘要块大小。"块大小"参数的长度不应超过size_t的长度。

  • “size” (OSSL_DIGEST_PARAM_SIZE)
    摘要输出大小。"size"参数的长度不应超过size_t的长度。

  • “flags” (OSSL_DIGEST_PARAM_FLAGS)
    描述摘要特殊行为的各种标志:
    EVP_MD_FLAG_ONESHOT
    此摘要方法只能处理一个输入块。
    EVP_MD_FLAG_XOF
    此摘要方法是一个可扩展输出函数 (XOF),支持设置OSSL_DIGEST_PARAM_XOFLEN参数。
    EVP_MD_FLAG_DIGALGID_NULL
    设置 DigestAlgorithmIdentifier 时,默认情况下,此标志的参数将设置为 NULL。将此用于 PKCS#1。注意:如果与EVP_MD_FLAG_DIGALGID_ABSENT结合使用,后者将覆盖。
    EVP_MD_FLAG_DIGALGID_ABSENT
    设置 DigestAlgorithmIdentifier 时,默认情况下,此标志将缺少该参数。注意:如果与EVP_MD_FLAG_DIGALGID_NULL结合使用,后者将被覆盖。
    EVP_MD_FLAG_DIGALGID_CUSTOM
    自定义摘要算法通过 ctrl 进行识别器处理,默认EVP_MD_FLAG_DIGALGID_ABSENT。注意:如果与EVP_MD_FLAG_DIGALGID_NULL结合使用,后者将被覆盖。当前未使用。
    “flags” 参数的长度应等于无符号长整数的长度

🌱摘要上下文参数

OSSL_FUNC_digest_set_ctx_params() 将与给定提供程序端摘要上下文 dctx 关联的摘要参数设置为参数。任何参数设置都是对以前设置的任何参数设置的附加设置。有关参数结构的更多详细信息,请参见 OSSL_PARAM

OSSL_FUNC_digest_get_ctx_params() 获取与给定提供程序端摘要上下文 dctx 关联的当前设置参数值的详细信息,并将它们存储在参数中。有关参数结构的更多详细信息,请参见 OSSL_PARAM

🌿返回值

OSSL_FUNC_digest_newctx() 和 OSSL_FUNC_digest_dupctx() 应返回新创建的提供程序端摘要上下文,或在失败时返回 NULL。

OSSL_FUNC_digest_init()、OSSL_FUNC_digest_update()、OSSL_FUNC_digest_final()、OSSL_FUNC_digest_digest()、OSSL_FUNC_digest_set_params() 和OSSL_FUNC_digest_get_params()应返回 1 表示成功,或在错误时返回 0。

OSSL_FUNC_digest_size() 应返回摘要大小。

OSSL_FUNC_digest_block_size() 应返回基础摘要算法的块大小。

☘️错误

EVP_Q_digest()、EVP_Digest() 和 EVP_DigestFinal_ex() API 调用不希望摘要大小大于 EVP_MAX_MD_SIZE。任何生成较大摘要的算法都无法用于这些 API 调用。

举报

相关推荐

0 条评论