openssl3.2 - 官方demo学习 - digest - EVP_MD_xof.c

文章目录

    • openssl3.2 - 官方demo学习 - digest - EVP_MD_xof.c
    • 概述
    • 笔记
    • END

openssl3.2 - 官方demo学习 - digest - EVP_MD_xof.c

概述

使用支持XOF方式的摘要算法(e.g. SHAKE256), 对buffer进行摘要, 并和预留的摘要值进行比对

笔记

/*!
\file EVP_MD_xof.c
\note openssl3.2 - 官方demo学习 - digest - EVP_MD_xof.c
使用支持XOF方式的摘要算法(e.g. SHAKE256), 对buffer进行摘要, 并和预留的摘要值进行比对
*//*-* Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the Apache License 2.0 (the "License").  You may not use* this file except in compliance with the License.  You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#include <stdio.h>
#include <string.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/core_names.h>#include "my_openSSL_lib.h"/** Example of using an extendable-output hash function (XOF). A XOF is a hash* function with configurable output length and which can generate an* arbitrarily large output.** This example uses SHAKE256, an extendable output variant of SHA3 (Keccak).** To generate different output lengths, you can pass a single integer argument* on the command line, which is the output size in bytes. By default, a 20-byte* output is generated and (for this length only) a known answer test is* performed.*//* Our input to the XOF hash function. */
const char message[] = "This is a test message.";/* Expected output when an output length of 20 bytes is used. */
static const char known_answer[] = {0x52, 0x97, 0x93, 0x78, 0x27, 0x58, 0x7d, 0x62,0x8b, 0x00, 0x25, 0xb5, 0xec, 0x39, 0x5e, 0x2d,0x7f, 0x3e, 0xd4, 0x19
};/** A property query used for selecting the SHAKE256 implementation.*/
static const char *propq = NULL;int main(int argc, char **argv)
{int ret = EXIT_FAILURE;OSSL_LIB_CTX *_ossl_lib_ctx = NULL;EVP_MD *_evp_md = NULL;EVP_MD_CTX *_evp_md_ctx = NULL;unsigned int digest_len = 20;int digest_len_i;unsigned char *_psz_digest = NULL;/* Allow digest length to be changed for demonstration purposes. */if (argc > 1) {digest_len_i = atoi(argv[1]);if (digest_len_i <= 0) {fprintf(stderr, "Specify a non-negative digest length\n");goto end;}digest_len = (unsigned int)digest_len_i;}/** Retrieve desired algorithm. This must be a hash algorithm which supports* XOF.*/_evp_md = EVP_MD_fetch(_ossl_lib_ctx, "SHAKE256", propq);if (_evp_md == NULL) {fprintf(stderr, "Failed to retrieve SHAKE256 algorithm\n");goto end;}/* Create context. */_evp_md_ctx = EVP_MD_CTX_new();if (_evp_md_ctx == NULL) {fprintf(stderr, "Failed to create digest context\n");goto end;}/* Initialize digest context. */if (EVP_DigestInit(_evp_md_ctx, _evp_md) == 0) {fprintf(stderr, "Failed to initialize digest\n");goto end;}/** Feed our message into the digest function.* This may be called multiple times.*/if (EVP_DigestUpdate(_evp_md_ctx, message, sizeof(message)) == 0) {fprintf(stderr, "Failed to hash input message\n");goto end;}/* Allocate enough memory for our digest length. */_psz_digest = OPENSSL_malloc(digest_len);if (_psz_digest == NULL) {fprintf(stderr, "Failed to allocate memory for digest\n");goto end;}/* Get computed digest. The digest will be of whatever length we specify. */if (EVP_DigestFinalXOF(_evp_md_ctx, _psz_digest, digest_len) == 0) {fprintf(stderr, "Failed to finalize hash\n");goto end;}printf("Output digest:\n");BIO_dump_indent_fp(stdout, _psz_digest, digest_len, 2); /*!< 参数4是dump的宽度, 默认是16, 不用填写, 或者给0都行 *//* If digest length is 20 bytes, check it matches our known answer. */if (digest_len == 20) {/** Always use a constant-time function such as CRYPTO_memcmp* when comparing cryptographic values. Do not use memcmp(3).*/if (CRYPTO_memcmp(_psz_digest, known_answer, sizeof(known_answer)) != 0) {fprintf(stderr, "Output does not match expected result\n");goto end;}}ret = EXIT_SUCCESS;
end:OPENSSL_free(_psz_digest);EVP_MD_CTX_free(_evp_md_ctx);EVP_MD_free(_evp_md);OSSL_LIB_CTX_free(_ossl_lib_ctx);return ret;
}

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DHCP中继【新华三】

理论【DHCP服务器可以对其直连的网段中的pc&#xff0c;分配其IP地址等服务&#xff0c;但是&#xff0c;对于跨网段进行分配IP地址&#xff0c;需要中间有DHCP中继进行传达&#xff0c;由DHCP中继指定DHCP服务器的位置&#xff0c;可以很好的对其跨网段分配IP地址起到指引的作…

限时福利,Adobe InCopy2024下载安装指南

Adobe InCopy 下载链接 https://pan.baidu.com/s/16j5MiXqfGw6puQbgyQnJSQ?pwd0531 #2024版本 1.鼠标右击【InCopy2024(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 InCopy2024(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠…

Kubernetes 1.24正式发布,2022年首个大版本更新

介绍 早在 2020 年 12 月&#xff0c;Kubernetes 就宣布弃用 Dockershim。在 Kubernetes 中&#xff0c;dockershim 是一个软件 shim&#xff0c;它允许您将 Docker 引擎用作 Kubernetes 中的容器运行时。 这个版本包含 46 个增强功能&#xff1a;14 个增强功能已经升级到稳定…

【软件测试】学习笔记-设计GUI自动化测试策略

这篇文章从“实战”这个角度展开&#xff0c;探讨实际的大型全球化电商网站的GUI自动化测试如何开展。这场实战&#xff0c;从以下两个方面展开&#xff1a; 测试策略如何设计&#xff1f;这一点&#xff0c;我会根据亲身经历的实际项目&#xff0c;和你探讨GUI测试的分层测试…

Leetcode26——引出c++ vector中erase()的内部原理

erase是对数组中某个元素进行删除的操作&#xff0c;实际的时间复杂度为O(n) 预备知识 数组在内存中是连续存储的&#xff0c;删除某个位置的时候不能直接删除&#xff0c;只能用后序的元素覆盖 以nums数组为例&#xff0c;target为需要删除的目标数据 方法&#xff1a; ①…

codeforces (C++ Satisfying Constraints)

题目&#xff1a; 翻译&#xff1a; 思路&#xff1a; 1、找到最大的下限min 2、找到最小的上限max 3、则max-min1满足1、2约束条件的个数 4、max-min1减去约束条件3的个数&#xff0c;即为最终答案 5、如果min大于max&#xff0c;则结果为0&#xff0c;不存在满足约束条件的数…

【天龙怀旧服】攻略day7

关键字&#xff1a; 新星1.49、金针渡劫、10灵 1】新星&#xff08;苍山破煞&#xff09; 周三周六限定副本&#xff0c;19.00-24.00 通常刷1.49w&#xff0c;刷149点元佑碎金 boss选择通常为狂鬼难度&#xff0c;八风不动即放大不选&#xff0c;第二排第一个也不选&#xf…

RSIC-V“一芯”学习笔记(二)——Linux入门教程

文章目录 一、前言二、Busybox套件三、重要的追踪工具——strace四、Shell五、正则表达式六、重定向&#xff08;多次输入测试时&#xff09;七、一些组合命令八、自动化脚本九、学会查阅十、亲&#xff08;yuan&#xff09;近(li) bai du十一、不要逃避困难十二、重视小问题 一…

Grounding DINO:开放集目标检测,将基于Transformer的检测器DINO与真值预训练相结合

文章目录 背景知识补充CLIP (Contrastive Language-Image Pre-training)&#xff1a;打破文字和图像之间的壁垒DINO(Data-INterpolating Neural Network)&#xff1a;视觉 Transformer 的自监督学习Stable Diffusion&#xff1a;从文本描述中生成详细的图像Open-set Detector开…

分布式事务2PC、3PC

1、概念 分布式事务的二阶段提交&#xff08;Two-Phase Commit, 2PC&#xff09;和三阶段提交&#xff08;Three-Phase Commit, 3PC&#xff09;是用于处理分布式系统中事务一致性的两种不同的协议。这两种协议的主要区别在于其阶段数和容错性。 二阶段提交&#xff08;2PC&am…

Vue生成图片并下载

一、安装 html2canvas 在项目安装库 html2canvas npm i html2canvas 二、生成图片 在页面局部加载 html2canvas 库&#xff0c;调用方法生成 <template><div class"page-box"><div class"text-box">文本转图片</div></div>…

【教3妹学编程-算法题】最大频率元素计数

2哥 : 3妹&#xff0c;最近有个电视剧《繁花》非常火&#x1f525;&#xff0c;你听说了吗&#xff1f; 3妹&#xff1a;没有&#xff0c;最近一直在忙着找工作&#xff0c;哪有时间看电视啊 2哥 : 啊&#xff1f;大周末还不休息一下啊&#xff0c;这么辛苦。 3妹&#xff1a;当…

Video接口介绍

屏库 https://m.panelook.cn/index_cn.php Open LDI, open lvds display interface OpenLDI and LVDS是兼容的&#xff0c; 是一种电平 https://www.ti2k.com/178597.html MIPI DSI/Camera crosLink FPD-LINK(Flat panel display link)是National(TI) LVDS技术&#xff0c; …

如何在线生成App:将网页封装成APP

在数字化时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;对于众多企业和个人开发者来说&#xff0c;开发一个原生App既耗时又耗资&#xff0c;尤其当他们已经拥有一个功能完备的网站时。幸运的是&#xff0c;现在有一种方法可以将现有的网页封装成…

k8s node节点加入集群,token过期

1、master01节点执行 kubeadm token create --print-join-command 2、执行命令 kubeadm join 192.168.0.236:16443 --token qucd8q.hsfq4a1afluzaky3 --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195 3、查看node02…

银行家算法/Banker‘s Algorithm

银行家算法&#xff08;Bankers Algorithm&#xff09;是一个避免死锁&#xff08;Deadlock&#xff09;的著名算法&#xff0c;由艾兹格迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础&#xff0c;判断并保证系统的安全运行。…

【含完整代码】Java定时任务之xxl-job[超详细]

前言 个人博客&#xff1a;www.wdcdbd.com 在Java中使用定时任务是一件很常见的事情&#xff0c;比如使用定时任务在什么时间&#xff0c;什么时候&#xff0c;去发布一些信息&#xff0c;或者去查询一些日志等相关的代码。这时&#xff0c;我们就要开发定时任务这中功能来实现…

PyGWalker,一款超级强大的数据分析和数据可视化的工具库

PyGWalker可以有效简化Jupyter笔记本的数据分析和数据可视化工作流程&#xff0c;方法是将panda数据帧转换为Tableau风格的用户界面进行可视化探索。 PyGWalker被命名为“Graphic Walker的Python绑定”的缩写。它集成了Jupyter笔记本&#xff08;或其他基于Jupyter的笔记本&am…

LeetCode83. Remove Duplicates from Sorted List

文章目录 一、题目二、题解 一、题目 Given the head of a sorted linked list, delete all duplicates such that each element appears only once. Return the linked list sorted as well. Example 1: Input: head [1,1,2] Output: [1,2] Example 2: Input: head [1,1…

跳跃游戏【贪心】

Problem: 55. 跳跃游戏 文章目录 思路 & 解题方法复杂度Code 思路 & 解题方法 简单模拟一下就行。 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution:def canJump(self, nums: List[int]) -> bool:jump_max 1for i, num…