openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c
文章目录
- openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c
- 概述
- 笔记
- END
 
openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c
概述
ED25519 签名/验签算法, 现在是最好的.
 产生ED25519私钥/公钥
 用私钥对明文签名, 得到签名数据
 用公钥对明文和签名数据进行验签
笔记
/*!
\file EVP_ED_Signature_demo.c
\note
openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.cED25519 签名/验签算法, 现在是最好的.
产生ED25519私钥/公钥
用私钥对明文签名, 得到签名数据
用公钥对明文和签名数据进行验签
*//*-* Copyright 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*//** This demonstration will calculate and verify an ED25519 signature of* a message using  EVP_DigestSign() and EVP_DigestVerify().*/#include <string.h>
#include <stdio.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/core_names.h>#include "my_openSSL_lib.h"/* A test message to be signed (TBS) */
static const unsigned char hamlet[] ="To be, or not to be, that is the question,\n""Whether tis nobler in the minde to suffer\n""The slings and arrowes of outragious fortune,\n""Or to take Armes again in a sea of troubles,\n";static int demo_sign(EVP_PKEY *priv,const unsigned char *tbs, size_t tbs_len,OSSL_LIB_CTX *libctx,unsigned char **sig_out_value,size_t *sig_out_len)
{int ret = 0;size_t sig_len;unsigned char *sig_value = NULL;EVP_MD_CTX *sign_context = NULL;/* Create a signature context */sign_context = EVP_MD_CTX_new();if (sign_context == NULL) {fprintf(stderr, "EVP_MD_CTX_new failed.\n");goto cleanup;}/** Initialize the sign context using an ED25519 private key* Notice that the digest name must NOT be used.* In this demo we don't specify any additional parameters via* OSSL_PARAM, which means it will use default values.* For more information, refer to doc/man7/EVP_SIGNATURE-ED25519.pod* "ED25519 and ED448 Signature Parameters"*/if (!EVP_DigestSignInit_ex(sign_context, NULL, NULL, libctx, NULL, priv, NULL)) {fprintf(stderr, "EVP_DigestSignInit_ex failed.\n");goto cleanup;}/* Calculate the required size for the signature by passing a NULL buffer. */if (!EVP_DigestSign(sign_context, NULL, &sig_len, tbs, tbs_len)) {fprintf(stderr, "EVP_DigestSign using NULL buffer failed.\n");goto cleanup;}sig_value = OPENSSL_malloc(sig_len);if (sig_value == NULL) {fprintf(stderr, "OPENSSL_malloc failed.\n");goto cleanup;}fprintf(stdout, "Generating signature:\n");if (!EVP_DigestSign(sign_context, sig_value, &sig_len, tbs, tbs_len)) {fprintf(stderr, "EVP_DigestSign failed.\n");goto cleanup;}*sig_out_len = sig_len;*sig_out_value = sig_value;BIO_dump_indent_fp(stdout, sig_value, (int)sig_len, 2);fprintf(stdout, "\n");ret = 1;cleanup:if (!ret)OPENSSL_free(sig_value);EVP_MD_CTX_free(sign_context);return ret;
}static int demo_verify(EVP_PKEY *pub,const unsigned char *tbs, size_t tbs_len,const unsigned char *sig_value, size_t sig_len,OSSL_LIB_CTX *libctx)
{int ret = 0;EVP_MD_CTX *verify_context = NULL;/** Make a verify signature context to hold temporary state* during signature verification*/verify_context = EVP_MD_CTX_new();if (verify_context == NULL) {fprintf(stderr, "EVP_MD_CTX_new failed.\n");goto cleanup;}/* Initialize the verify context with a ED25519 public key */if (!EVP_DigestVerifyInit_ex(verify_context, NULL, NULL,libctx, NULL, pub, NULL)) {fprintf(stderr, "EVP_DigestVerifyInit_ex failed.\n");goto cleanup;}/** ED25519 only supports the one shot interface using EVP_DigestVerify()* The streaming EVP_DigestVerifyUpdate() API is not supported.*/if (!EVP_DigestVerify(verify_context, sig_value, sig_len,tbs, tbs_len)) {fprintf(stderr, "EVP_DigestVerify() failed.\n");goto cleanup;}fprintf(stdout, "Signature verified.\n");ret = 1;cleanup:EVP_MD_CTX_free(verify_context);return ret;
}static int create_key(OSSL_LIB_CTX *libctx,EVP_PKEY **privout, EVP_PKEY **pubout)
{int ret = 0;EVP_PKEY *priv = NULL, *pub = NULL;unsigned char pubdata[32];size_t pubdata_len = 0;/** In this demo we just create a keypair, and extract the* public key. We could also use EVP_PKEY_new_raw_private_key_ex()* to create a key from raw data.*/priv = EVP_PKEY_Q_keygen(libctx, NULL, "ED25519");if (priv == NULL) {fprintf(stderr, "EVP_PKEY_Q_keygen() failed\n");goto end;}if (!EVP_PKEY_get_octet_string_param(priv,OSSL_PKEY_PARAM_PUB_KEY,pubdata,sizeof(pubdata),&pubdata_len)) {fprintf(stderr, "EVP_PKEY_get_octet_string_param() failed\n");goto end;}pub = EVP_PKEY_new_raw_public_key_ex(libctx, "ED25519", NULL, pubdata, pubdata_len);if (pub == NULL) {fprintf(stderr, "EVP_PKEY_new_raw_public_key_ex() failed\n");goto end;}ret = 1;
end:if (ret) {*pubout = pub;*privout = priv;} else {EVP_PKEY_free(priv);}return ret;
}int main(void)
{OSSL_LIB_CTX *libctx = NULL;size_t sig_len = 0;unsigned char *sig_value = NULL;int ret = EXIT_FAILURE;EVP_PKEY *priv = NULL, *pub = NULL;libctx = OSSL_LIB_CTX_new();if (libctx == NULL) {fprintf(stderr, "OSSL_LIB_CTX_new() returned NULL\n");goto cleanup;}if (!create_key(libctx, &priv, &pub)) {fprintf(stderr, "Failed to create key.\n");goto cleanup;}if (!demo_sign(priv, hamlet, sizeof(hamlet), libctx,&sig_value, &sig_len)) {fprintf(stderr, "demo_sign failed.\n");goto cleanup;}if (!demo_verify(pub, hamlet, sizeof(hamlet),sig_value, sig_len, libctx)) {fprintf(stderr, "demo_verify failed.\n");goto cleanup;}ret = EXIT_SUCCESS;cleanup:if (ret != EXIT_SUCCESS)ERR_print_errors_fp(stderr);EVP_PKEY_free(pub);EVP_PKEY_free(priv);OSSL_LIB_CTX_free(libctx);OPENSSL_free(sig_value);return ret;
}END
相关文章:
openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c
文章目录 openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c概述笔记END openssl3.2 - 官方demo学习 - signature - EVP_ED_Signature_demo.c 概述 ED25519 签名/验签算法, 现在是最好的. 产生ED25519私钥/公钥 用私钥对明文签名, 得到签名数据 用公钥对明文…...
AI辅助编程工具—Github Copilot
一、概述 Copilot是一种基于Transformer模型的神经网络,具有12B个参数。是GitHub和OpenAPI共同开发的编程辅助工具。GitHubCopilot是一款由人工智能驱动的结对编程编辑器,旨在帮助开发人员更加高效地工作。它利用OpenAICodex技术,将开发…...
 
三大3D引擎对比,直观感受AMRT3D渲染能力
作为当前热门的内容呈现形式,3D已经成为了广大开发者、设计师工作里不可或缺的一部分。 用户对于3D的热衷,源于其带来的【沉浸式体验】和【超仿真视觉效果】。借此我们从用户重点关注的四个3D视觉呈现内容: 材质- 呈现多元化内容水效果- 展…...
 
k8s之对外服务ingress
一、service 1、service作用 ①集群内部:不断跟踪pod的变化,不断更新endpoint中的pod对象,基于pod的IP地址不断变化的一种服务发现机制(endpoint存储最终对外提供服务的IP地址和端口) ②集群外部:类似负…...
 
Ubuntu使用docker-compose安装mysql8或mysql5.7
ubuntu环境搭建专栏🔗点击跳转 Ubuntu系统环境搭建(十四)——使用docker-compose安装mysql8或mysql5.7 文章目录 Ubuntu系统环境搭建(十四)——使用docker-compose安装mysql8或mysql5.7MySQL81.新建文件夹2.创建docke…...
 
【办公类-21-02】20240118育婴员操作题word打印2.0
作品展示 把12页一套的操作题批量制作10份,便于打印 背景需求 将昨天整理的育婴师操作题共享, 因为题目里面有大量的红蓝颜色文字,中大班办公室都是黑白单面手动翻页打印。只有我待的教务室办公室有彩色打印机打印(可以自动双面…...
 
SpringMVC 文件上传和下载
文章目录 1、文件下载2、文件上传3. 应用 Spring MVC 提供了简单而强大的文件上传和下载功能。 下面是对两者的简要介绍: 文件上传: 在Spring MVC中进行文件上传的步骤如下: 在表单中设置 enctype“multipart/form-data”,这样…...
 
强缓存、协商缓存(浏览器的缓存机制)是么子?
文章目录 一.为什么要用强缓存和协商缓存?二.什么是强缓存?三.什么是协商缓存?四.总结 一.为什么要用强缓存和协商缓存? 为了减少资源请求次数,加快资源访问速度,浏览器会对资源文件如图片、css文件、js文…...
android 13.0 Camera2 去掉后置摄像头 仅支持前置摄像头功能
1.概述 在定制化13.0系统rom定制化开发中,当产品只有一个前置摄像头单摄像头,这时调用相机时就需要默认打开前置摄像头就需要来看调用摄像头这块的代码,屏蔽掉后置摄像头的调用api就可以了,接下来就来具体实现相关功能的开发 2.Camera2 去掉后置摄像头 仅支持前置摄像头功…...
 
【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析
立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题,对此展开了学习。 【本人非科班出身,以下对项目的学习仅在我的眼界范围内发表意见,如有错误,请指正。】 项目一 来源:第十四届蓝桥杯EDA赛模拟题一 - 嘉立…...
 
电影《潜行》中说的蜜罐是什么(网络安全知识)
近期刘德华、彭于晏主演的电影《潜行》在网上掀起了轩然大波,电影中有提到网络蜜罐,这引起了很多观众的疑问,蜜罐到底是什么? 从字面意思上来看,蜜罐就是为黑客设下的诱饵。这是一种具有牺牲性质的计算机系统ÿ…...
 
基于 UniAPP 社区论坛项目多端开发实战
社区论坛项目多端开发实战 基于 UniAPP 社区论坛项目多端开发实战一、项目准备1.1 ThinkSNS 简介及相关文档1.2 使用 UniAPP 构建项目1.3 构建项目文件结构1.4 配置页面 TabBar 导航1.5 使用 npm 引入 uView UI 插件库 二、首页功能实现2.1 首页 header 广告位轮播图功能实现2.…...
 
Ubuntu 22.04 安装MySql
MySQL是非常常用的关系型数据库,无论是大厂还是小厂,都有它的身影。最大的优点是免费,安装起来也比较简单。 MySQL的架构 画了个简图,描述了下MySQL的架构。 其中的比较有趣的点在于连接池和存储引擎。连接池缓存了数据库和客户端的TCP连接,以减少建立连接的开销。存储引…...
Centos常用命令整理,常用的比较全了
目 录 1、更改文件拥有者 2、修改权限 3、修改⽂件⽇期 4、链接⽂件 5、⽇期操作 6、显⽰⽇历 7、显⽰⽂件头部 8、显⽰⽂件尾部 9、显⽰⽤户标识 10、查看当前登录的⽤户 11、显⽰都谁登录到机器上 12、显⽰当前终端上的⽤户名 13、寻找⽂件…...
 
专业137总分439东南大学920专业基础综合考研经验电子信息与通信电路系统芯片
我本科是南京信息工程大学,今年报考东南大学信息学院,成功逆袭,专业137,政治69,英语86,数一147,总分439。以下总结了自己的复习心得和经验,希望对大家复习有一点帮助。啰嗦一句&…...
 
C++总结笔记
1. 简介 1、面向对象程序设计 面向对象的四大特性 1)封装 2)继承 3)多态 4)抽象 2、标准库 标准C由三个部分组成 1)核心语言:提供了所有的构件块 2)C标准库:提供了大量的函…...
数据库重点简答题
文章目录(持续更新) 数据库重点简答题📣一、SQL语言的作用?📣二、说一下你对ER图的认识?📣三、数据库中的三个模型?📣四、数据库基本表和视图的区别和联系?&a…...
 
Cmake(1)——Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目
Cmake的基本介绍和原理、Cmake的安装、如何使用Cmake构建项目 插播!插播!插播!亲爱的朋友们,我们的Cmake课程上线啦!感兴趣的小伙伴可以去下面的链接学习哦~ https://edu.csdn.net/course/detail/39261 1、Cmake的基…...
 
Spring Boot程序的打包与运行:构建高效部署流程
引言 在现代应用开发中,高效的打包和部署流程对于项目的开发、测试和上线至关重要。Spring Boot作为一种快速开发框架,提供了方便的打包工具和内嵌式的Web服务器,使得打包和运行变得更加简单。本文将研究在Spring Boot应用中如何进行打包&am…...
 
【Linux取经路】初探进程地址空间
文章目录 一、历史问题回顾二、语言层面的地址空间2.1 验证 三、虚拟地址的引入3.1 初步解释这种现象——引入地址空间的概念3.2 再来粗粒度理解上面的现象 四、细节解释4.1 地址空间究竟是什么?4.2为什么要有地址空间4.3 页表4.3.1 CR3寄存器4.3.2 页表是由页表项组…...
 
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
 
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
 
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
 
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
 
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
 
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
SpringBoot3中使用虚拟线程的详细过程
在 Spring Boot 3 中使用 Java 21 的虚拟线程(Virtual Threads)可以显著提升 I/O 密集型应用的并发能力。以下是详细实现步骤: 1. 环境准备 JDK 21:确保安装 JDK 21 或更高版本Spring Boot 3.2:最低要求(p…...
