openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.c

文章目录

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

openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.c

概述

DSA签名(摘要算法SHA256), DSA验签(摘要算法SHA256)
签名 : 用发送者的私钥进行签名.
验签 : 用发送者的公钥进行验签.

看下API调用顺序就行, 自己弄的时候, 跟着demo的流程弄就行.
对于openssl3.2, 越看越眼熟了.

笔记

/*!
\file EVP_DSA_Signature_demo.c
\note 
openssl3.2 - 官方demo学习 - signature - EVP_DSA_Signature_demo.cDSA签名(摘要算法SHA256), DSA验签(摘要算法SHA256)
签名 : 用发送者的私钥进行签名.
验签 : 用发送者的公钥进行验签.看下API调用顺序就行, 自己弄的时候, 跟着demo的流程弄就行.
对于openssl3.2, 越看越眼熟了.
*//*-* 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*//** An example that uses the EVP_PKEY*, EVP_DigestSign* and EVP_DigestVerify** methods to calculate public/private DSA keypair and to sign and verify* two static buffers.*/#include <string.h>
#include <stdio.h>
#include <openssl/err.h>
#include <openssl/evp.h>
#include <openssl/decoder.h>
#include <openssl/dsa.h>#include "my_openSSL_lib.h"/** This demonstration will calculate and verify a signature of data using* the soliloquy from Hamlet scene 1 act 3*/static const char *hamlet_1 ="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 const char *hamlet_2 ="And by opposing, end them, to die to sleep;\n""No more, and by a sleep, to say we end\n""The heart-ache, and the thousand natural shocks\n""That flesh is heir to? tis a consumation\n"
;static const char ALG[] = "DSA";
static const char DIGEST[] = "SHA256";
static const int NUMBITS = 2048;
static const char * const PROPQUERY = NULL;static int generate_dsa_params(OSSL_LIB_CTX *libctx,EVP_PKEY **p_params)
{int ret = 0;EVP_PKEY_CTX *pkey_ctx = NULL;EVP_PKEY *params = NULL;pkey_ctx = EVP_PKEY_CTX_new_from_name(libctx, ALG, PROPQUERY);if (pkey_ctx == NULL)goto end;if (EVP_PKEY_paramgen_init(pkey_ctx) <= 0)goto end;if (EVP_PKEY_CTX_set_dsa_paramgen_bits(pkey_ctx, NUMBITS) <= 0)goto end;if (EVP_PKEY_paramgen(pkey_ctx, &params) <= 0)goto end;if (params == NULL)goto end;ret = 1;
end:if(ret != 1) {EVP_PKEY_free(params);params = NULL;}EVP_PKEY_CTX_free(pkey_ctx);*p_params = params;fprintf(stdout, "Params:\n");EVP_PKEY_print_params_fp(stdout, params, 4, NULL);fprintf(stdout, "\n");return ret;
}static int generate_dsa_key(OSSL_LIB_CTX *libctx,EVP_PKEY *params,EVP_PKEY **p_pkey)
{int ret = 0;EVP_PKEY_CTX *ctx = NULL;EVP_PKEY *pkey = NULL;ctx = EVP_PKEY_CTX_new_from_pkey(libctx, params,NULL);if (ctx == NULL)goto end;if (EVP_PKEY_keygen_init(ctx) <= 0)goto end;if (EVP_PKEY_keygen(ctx, &pkey) <= 0)goto end;if (pkey == NULL)goto end;ret = 1;
end:if(ret != 1) {EVP_PKEY_free(pkey);pkey = NULL;}EVP_PKEY_CTX_free(ctx);*p_pkey = pkey;fprintf(stdout, "Generating public/private key pair:\n");EVP_PKEY_print_public_fp(stdout, pkey, 4, NULL);fprintf(stdout, "\n");EVP_PKEY_print_private_fp(stdout, pkey, 4, NULL);fprintf(stdout, "\n");EVP_PKEY_print_params_fp(stdout, pkey, 4, NULL);fprintf(stdout, "\n");return ret;
}static int extract_public_key(const EVP_PKEY *pkey,OSSL_PARAM **p_public_key)
{int ret = 0;OSSL_PARAM *public_key = NULL;if (EVP_PKEY_todata(pkey, EVP_PKEY_PUBLIC_KEY, &public_key) != 1)goto end;ret = 1;
end:if (ret != 1) {OSSL_PARAM_free(public_key);public_key = NULL;}*p_public_key = public_key;return ret;
}static int extract_keypair(const EVP_PKEY *pkey,OSSL_PARAM **p_keypair)
{int ret = 0;OSSL_PARAM *keypair = NULL;if (EVP_PKEY_todata(pkey, EVP_PKEY_KEYPAIR, &keypair) != 1)goto end;ret = 1;
end:if (ret != 1) {OSSL_PARAM_free(keypair);keypair = NULL;}*p_keypair = keypair;return ret;
}static int demo_sign(OSSL_LIB_CTX *libctx,size_t *p_sig_len, unsigned char **p_sig_value,OSSL_PARAM keypair[])
{int ret = 0;size_t sig_len = 0;unsigned char *sig_value = NULL;EVP_MD_CTX *ctx = NULL;EVP_PKEY_CTX *pkey_ctx = NULL;EVP_PKEY *pkey = NULL;pkey_ctx = EVP_PKEY_CTX_new_from_name(libctx, ALG, PROPQUERY);if (pkey_ctx == NULL)goto end;if (EVP_PKEY_fromdata_init(pkey_ctx) != 1)goto end;if (EVP_PKEY_fromdata(pkey_ctx, &pkey, EVP_PKEY_KEYPAIR, keypair) != 1)goto end;ctx = EVP_MD_CTX_create();if (ctx == NULL)goto end;if (EVP_DigestSignInit_ex(ctx, NULL, DIGEST, libctx, NULL, pkey, NULL) != 1)goto end;if (EVP_DigestSignUpdate(ctx, hamlet_1, sizeof(hamlet_1)) != 1)goto end;if (EVP_DigestSignUpdate(ctx, hamlet_2, sizeof(hamlet_2)) != 1)goto end;/* Calculate the signature size */if (EVP_DigestSignFinal(ctx, NULL, &sig_len) != 1)goto end;if (sig_len == 0)goto end;sig_value = OPENSSL_malloc(sig_len);if (sig_value == NULL)goto end;/* Calculate the signature */if (EVP_DigestSignFinal(ctx, sig_value, &sig_len) != 1)goto end;ret = 1;
end:EVP_MD_CTX_free(ctx);if (ret != 1) {OPENSSL_free(sig_value);sig_len = 0;sig_value = NULL;}*p_sig_len = sig_len;*p_sig_value = sig_value;EVP_PKEY_free(pkey);EVP_PKEY_CTX_free(pkey_ctx);fprintf(stdout, "Generating signature:\n");BIO_dump_indent_fp(stdout, sig_value, (int)sig_len, 2);fprintf(stdout, "\n");return ret;
}static int demo_verify(OSSL_LIB_CTX *libctx,size_t sig_len, unsigned char *sig_value,OSSL_PARAM public_key[])
{int ret = 0;EVP_MD_CTX *ctx = NULL;EVP_PKEY_CTX *pkey_ctx = NULL;EVP_PKEY *pkey = NULL;pkey_ctx = EVP_PKEY_CTX_new_from_name(libctx, ALG, PROPQUERY);if (pkey_ctx == NULL)goto end;if (EVP_PKEY_fromdata_init(pkey_ctx) != 1)goto end;if (EVP_PKEY_fromdata(pkey_ctx, &pkey, EVP_PKEY_PUBLIC_KEY, public_key) != 1)goto end;ctx = EVP_MD_CTX_create();if(ctx == NULL)goto end;if (EVP_DigestVerifyInit_ex(ctx, NULL, DIGEST, libctx, NULL, pkey, NULL) != 1)goto end;if (EVP_DigestVerifyUpdate(ctx, hamlet_1, sizeof(hamlet_1)) != 1)goto end;if (EVP_DigestVerifyUpdate(ctx, hamlet_2, sizeof(hamlet_2)) != 1)goto end;if (EVP_DigestVerifyFinal(ctx, sig_value, sig_len) != 1)goto end;ret = 1;
end:EVP_PKEY_free(pkey);EVP_PKEY_CTX_free(pkey_ctx);EVP_MD_CTX_free(ctx);return ret;
}int main(void)
{int ret = EXIT_FAILURE;OSSL_LIB_CTX *libctx = NULL;EVP_PKEY *params = NULL;EVP_PKEY *pkey = NULL;OSSL_PARAM *public_key = NULL;OSSL_PARAM *keypair = NULL;size_t sig_len = 0;unsigned char *sig_value = NULL;libctx = OSSL_LIB_CTX_new();if (libctx == NULL)goto end;if (generate_dsa_params(libctx, &params) != 1)goto end;if (generate_dsa_key(libctx, params, &pkey) != 1)goto end;if (extract_public_key(pkey, &public_key) != 1)goto end;if (extract_keypair(pkey, &keypair) != 1)goto end;/* The signer signs with his private key, and distributes his public key */if (demo_sign(libctx, &sig_len, &sig_value, keypair) != 1)goto end;/* A verifier uses the signers public key to verify the signature */if (demo_verify(libctx, sig_len, sig_value, public_key) != 1)goto end;ret = EXIT_SUCCESS;
end:if (ret != EXIT_SUCCESS)ERR_print_errors_fp(stderr);OPENSSL_free(sig_value);EVP_PKEY_free(params);EVP_PKEY_free(pkey);OSSL_PARAM_free(public_key);OSSL_PARAM_free(keypair);OSSL_LIB_CTX_free(libctx);return ret;
}

END

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

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

相关文章

基于SSM的图书馆管理系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆管理系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

win系统环境搭建(十四)——Windows系统下使用docker安装mysql8和mysql5.7

windows环境搭建专栏&#x1f517;点击跳转 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7 文章目录 win系统环境搭建&#xff08;十四&#xff09;——Windows系统下使用docker安装mysql8和mysql5.7MySQL81.新建文件夹2.创建…

windows开机默认启动某个程序

在Windows操作系统中&#xff0c;你可以通过将程序添加到“启动”文件夹或使用任务计划程序来实现开机自动启动某个程序。以下是两种常见的方法&#xff1a; 方法 1&#xff1a;使用“启动”文件夹 找到启动文件夹 按 Win R 打开运行对话框。输入 shell:startup&#xff0c;然…

Webpack5入门到原理1:前言

为什么需要打包工具&#xff1f; 开发时&#xff0c;我们会使用框架&#xff08;React、Vue&#xff09;&#xff0c;ES6 模块化语法&#xff0c;Less/Sass 等 css 预处理器等语法进行开发。 这样的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、Css 等语法&#xf…

Golang 中的反射,并用来获取数据类型

Go语言提供了一种机制在运行中获取某个变量的类型&#xff0c;获取或修改变量的值&#xff0c;调用变量的方法。 示例代码如下 1. 使用 x.(type)获取变量类型 package mainimport "strconv" //StrPrint 将几种已知数据类型转化为 string func StrPrint(x interfac…

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程016 - three.js通过OrbitControls对立方体实现旋转和缩放</title><script src"ThreeJS/three.js"></script><…

CentOS 7 安装Jdk 配置环境变量

在CentOS 7操作系统中&#xff0c;安装JDK并配置环境变量的具体步骤如下&#xff1a; 第一步、需要检查系统是否自带JDK&#xff0c;并删除已有的JDK。 第二步、下载JDK8或其它版本的安装包&#xff0c;并解压到一个新建的Java目录中。 第三步、配置环境变量。将JAVA_HOME变量设…

EasyRecovery2024免费电脑数据恢复软件下载

easyrecovery是一款功能强大、易于使用的硬盘数据恢复软件。这款软件可以帮助用户非常方便地恢复丢失的数据。软件非常容易使用和高效的数据恢复。感兴趣的朋友们赶快来下载吧。 无论是因为意外删除、格式化、病毒感染、系统崩溃还是其他原因&#xff0c;该软件可以帮助您恢复…

你还在找PDF转Word的工具?一个好软件推荐,赶紧查收!

前言 前段时间朋友跟小白吐槽&#xff1a;为啥PDF文件转Word文档的工具都要收费&#xff1f; 因为他们都收费啊。 小白之前找了很多类似有这种功能的工具&#xff0c;都发现&#xff1a;不但收费&#xff0c;可能还附带全家桶&#xff0c;而且还有……广告&#xff01; 在一次…

Pytest插件“pytest-selenium” - 让自动化测试更简洁

在现代Web应用的开发中,自动化测试成为确保网站质量的重要手段之一。而Pytest插件 pytest-selenium 则为开发者提供了简单而强大的工具,以便于使用Python进行Web应用的自动化测试。本文将深入介绍 pytest-selenium 插件的基本用法和实际案例,助你轻松进入无忧的Web应用测试之…

中文词向量训练-案例分析

1 数据预处理&#xff0c;解析XML文件并分词 #!/usr/bin/env python # -*- coding: utf-8 -*- # process_wiki_data.py 用于解析XML&#xff0c;将XML的wiki数据转换为text格式 import logging import os.path import sys from gensim.corpora import WikiCorpus import jieba…

phpStorm 设置终端为git bash

环境&#xff1a; windows , PhpStorm 2022 为自己的终端配置git样式的使用&#xff0c; 默认终端样式 一、打开设置&#xff0c;选择git bin 二、重新打开终端 不加--login -i 的终端 加了--login -i 的终端 最重要的一点是什么&#xff0c;他可以像mac一样支持 ctrlv 复…

【Vue3+Ts项目】硅谷甄选 — 菜单权限+按钮权限

一、菜单权限 1.1 路由拆分 将项目路由拆分为&#xff1a; 静态路由&#xff1a;login、404、home、screen异步路由&#xff1a;权限管理&#xff08;包含三个子路由&#xff09;、商品管理&#xff08;包含四个子路由&#xff09;任意路由&#xff1a;任意路由 src/router/r…

「优选算法刷题」:有效三角形的个数

一、题目 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3示例 2: 输入: nums [4,2,3,4] 输出: 4二、思路解析 这道…

扎克伯格宣布将购买35万个GPU

Meta公司马克.扎克伯格1月18日在Instagram上发表文章称&#xff0c;该公司正在加强人工智能研究团队的力量&#xff0c;并在充实AI基础设施“弹药库“&#xff0c;计划在今年年底前向芯片设计商英伟达购买35万个H100 GPU芯片&#xff0c;从而使该公司的GPU总量达到约60万个&…

迪菲赫尔曼密钥交换详细介绍

由于这个问题涉及到一个“原根”的概念&#xff0c;首先先简单介绍一下原根是什么&#xff1a; 原根是数论中的一个概念&#xff0c;它在模运算中具有特殊性质。假设有一个正整数m和另一个整数a&#xff0c;如果a与m互质&#xff08;即它们的最大公约数为1&#xff09;&#x…

利用预训练模型SKEP进行情感分析

项目地址&#xff1a;文本情感分析 - 飞桨AI Studio星河社区 (baidu.com) baidu/Senta: Baidus open-source Sentiment Analysis System. (github.com) 本项目将详细全面介绍情感分析任务的两种子任务&#xff0c;句子级情感分析和目标级情感分析。 同时演示如何使用情感分析…

线性规划案例分享

今天想写一个最优传输的简单实现&#xff0c;结果学歪了&#xff0c;学到线性规划去了&#xff0c;这里我发现了一个宝藏网站 虽然是讲计量经济的&#xff0c;但是里面提供的公式和代码我很喜欢&#xff0c;有时间可以好好读一下 https://python.quantecon.org/lp_intro.html …

【Guava笔记01】Guava Cache本地缓存的常用操作方法

这篇文章,主要介绍Guava Cache本地缓存的常用操作方法。 目录 一、Guava Cache本地缓存 1.1、引入guava依赖 1.2、CacheBuilder类 1.3、Guava-Cache使用案例