openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c

文章目录

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

openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c

概述

OPENSSL_hexstr2buf_ex 将16禁止字符串填充到16进制buffer
BIO_new_mem_buf 有用, 可以内存的内容转为bio, 不用非要落地为文件才能操作

将buffer中写的DSA param 载入到bio
从bio产生_evp_pkey_dsa

  1. 从 pkey产生 _evp_pkey_ctx1, 检查 _evp_pkey_ctx1的param
  2. 设置新的param, 和 _evp_pkey_dsa 一起, 产生新的_evp_pkey_ctx2, 检查 _evp_pkey_ctx2的param
  3. 再次设置一个新的param, 用OSSL_PARAM_merge合并_evp_pkey_ctx2的param, 作为新的param
  4. 用新的param产生新的ctx => _evp_pkey_ctx3, 检查 _evp_pkey_ctx3的参数
  5. 取 _evp_pkey_ctx3的EVP_PKEY, 并打印EVP_PKEY的公用参数和param

笔记

/*!
\file EVP_PKEY_DSA_paramvalidate.c
\note 
openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_paramvalidate.c
OPENSSL_hexstr2buf_ex 将16禁止字符串填充到16进制buffer
BIO_new_mem_buf 有用, 可以内存的内容转为bio, 不用非要落地为文件才能操作将buffer中写的DSA param 载入到bio
从bio产生_evp_pkey_dsa
1. 从 pkey产生 _evp_pkey_ctx1, 检查 _evp_pkey_ctx1的param
2. 设置新的param, 和 _evp_pkey_dsa 一起, 产生新的_evp_pkey_ctx2, 检查 _evp_pkey_ctx2的param
3. 再次设置一个新的param, 用OSSL_PARAM_merge合并_evp_pkey_ctx2的param, 作为新的param
4. 用新的param产生新的ctx => _evp_pkey_ctx3, 检查 _evp_pkey_ctx3的参数
5. 取 _evp_pkey_ctx3的EVP_PKEY, 并打印EVP_PKEY的公用参数和param
*//*-* 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*//** Example showing how to validate DSA parameters.** Proper FIPS 186-4 DSA (FFC) parameter validation requires that all* the parameters used during parameter generation are supplied* when doing the validation. Unfortunately saving DSA parameters as* a PEM or DER file does not write out all required fields. Because* of this the default provider normally only does a partial* validation. The FIPS provider will however try to do a full* validation. To force the default provider to use full* validation the 'seed' that is output during generation must be* added to the key. See doc/man7/EVP_PKEY-FFC for more information.*/#include <openssl/evp.h>
#include <openssl/core_names.h>
#include <openssl/pem.h>
#include "dsa.h"#include "my_openSSL_lib.h"/* The following values were output from the EVP_PKEY_DSA_paramgen demo */
static const char dsapem[] ="-----BEGIN DSA PARAMETERS-----\n""MIICLAKCAQEA1pobSR1FJ3+Tvi0J6Tk1PSV2owZey1Nuo847hGw/59VCS6RPQEqr\n""vp5fhbvBjupBeVGA/AMH6rI4i4h6jlhurrqH1CqUHVcDhJzxV668bMLiP3mIxg5o\n""9Yq8x6BnSOtH5Je0tpeE0/fEvvLjCwBUbwnwWxzjANcvDUEt9XYeRrtB2v52fr56\n""hVYz3wMMNog4CEDOLTvx7/84eVPuUeWDRQFH1EaHMdulP34KBcatEEpEZapkepng\n""nohm9sFSPQhq2utpkH7pNXdG0EILBtRDCvUpF5720a48LYofdggh2VEZfgElAGFk\n""dW/CkvyBDmGIzil5aTz4MMsdudaVYgzt6wIhAPsSGC42Qa+X0AFGvonb5nmfUVm/\n""8aC+tHk7Nb2AYLHXAoIBADx5C0H1+QHsmGKvuOaY+WKUt7aWUrEivD1zBMJAQ6bL\n""Wv9lbCq1CFHvVzojeOVpn872NqDEpkx4HTpvqhxWL5CkbN/HaGItsQzkD59AQg3v\n""4YsLlkesq9Jq6x/aWetJXWO36fszFv1gpD3NY3wliBvMYHx62jfc5suh9D3ZZvu7\n""PLGH4X4kcfzK/R2b0oVbEBjVTe5GMRYZRqnvfSW2f2fA7BzI1OL83UxDDe58cL2M\n""GcAoUYXOBAfZ37qLMm2juf+o5gCrT4CXfRPu6kbapt7V/YIc1nsNgeAOKKoFBHBQ\n""gc5u5G6G/j79FVoSDq9DYwTJcHPsU+eHj1uWHso1AjQ=\n""-----END DSA PARAMETERS-----\n";static const char hexseed[] ="cba30ccd905aa7675a0b81769704bf3c""ccf2ca1892b2eaf6b9e2b38d9bf6affc""42ada55986d8a1772b442770954d0b65";
const int gindex = 42;
const int pcounter = 363;
static const char digest[] = "SHA384";/** Create a new dsa param key that is the combination of an existing param key* plus extra parameters.*/
EVP_PKEY_CTX *create_merged_key(EVP_PKEY *dsaparams, const OSSL_PARAM *newparams,OSSL_LIB_CTX *libctx, const char *propq)
{EVP_PKEY_CTX *out = NULL;EVP_PKEY_CTX *ctx = NULL;EVP_PKEY *pkey = NULL;OSSL_PARAM *mergedparams = NULL;OSSL_PARAM *loadedparams = NULL;/* Specify EVP_PKEY_KEY_PUBLIC here if you have a public key */if (EVP_PKEY_todata(dsaparams, EVP_PKEY_KEY_PARAMETERS, &loadedparams) <= 0) {fprintf(stderr, "EVP_PKEY_todata() failed\n");goto cleanup;}mergedparams = OSSL_PARAM_merge(loadedparams, newparams);if (mergedparams == NULL) {fprintf(stderr, "OSSL_PARAM_merge() failed\n");goto cleanup;}ctx = EVP_PKEY_CTX_new_from_name(libctx, "DSA", propq);if (ctx == NULL) {fprintf(stderr, "EVP_PKEY_CTX_new_from_name() failed\n");goto cleanup;}if (EVP_PKEY_fromdata_init(ctx) <= 0|| EVP_PKEY_fromdata(ctx, &pkey,EVP_PKEY_KEY_PARAMETERS, mergedparams) <= 0) {fprintf(stderr, "EVP_PKEY_fromdata() failed\n");goto cleanup;}out = EVP_PKEY_CTX_new_from_pkey(libctx, pkey, propq);if (out == NULL) {fprintf(stderr, "EVP_PKEY_CTX_new_from_pkey() failed\n");goto cleanup;}cleanup:EVP_PKEY_free(pkey);OSSL_PARAM_free(loadedparams);OSSL_PARAM_free(mergedparams);EVP_PKEY_CTX_free(ctx);return out;
}int main(int argc, char **argv)
{int ret = EXIT_FAILURE;OSSL_LIB_CTX *_ossl_lib_ctx = NULL;const char *propq = NULL;EVP_PKEY *_evp_pkey_dsa = NULL;EVP_PKEY_CTX *_evp_pkey_ctx1 = NULL;EVP_PKEY_CTX *_evp_pkey_ctx2 = NULL;EVP_PKEY_CTX *_evp_pkey_ctx3 = NULL;BIO *bio_in = NULL;OSSL_PARAM params[6];unsigned char seed[64];size_t seedlen;/*! openssl有各种相关函数, 吃惊OPENSSL_hexstr2buf_ex 将16禁止字符串填充到16进制buffer*/if (!OPENSSL_hexstr2buf_ex(seed, sizeof(seed), &seedlen, hexseed, '\0'))goto cleanup;/** This example loads the PEM data from a memory buffer* Use BIO_new_fp() to load a PEM file instead*//*!BIO_new_mem_buf 有用, 可以内存的内容转为bio, 不用非要落地为文件才能操作*/bio_in = BIO_new_mem_buf(dsapem, (int)strlen(dsapem));if (bio_in == NULL) {fprintf(stderr, "BIO_new_mem_buf() failed\n");goto cleanup;}/* Load DSA params from pem data */_evp_pkey_dsa = PEM_read_bio_Parameters_ex(bio_in, NULL, _ossl_lib_ctx, propq);if (_evp_pkey_dsa == NULL) {fprintf(stderr, "Failed to load dsa params\n");goto cleanup;}_evp_pkey_ctx1 = EVP_PKEY_CTX_new_from_pkey(_ossl_lib_ctx, _evp_pkey_dsa, propq);if (_evp_pkey_ctx1 == NULL) {fprintf(stderr, "EVP_PKEY_CTX_new_from_pkey() failed\n");goto cleanup;}/** When using the default provider this only does a partial check to* make sure that the values of p, q and g are ok.* This will fail however if the FIPS provider is used since it does* a proper FIPS 186-4 key validation which requires extra parameters*/if (EVP_PKEY_param_check(_evp_pkey_ctx1) <= 0) {fprintf(stderr, "Simple EVP_PKEY_param_check() failed \n");goto cleanup;}/** Setup parameters that we want to add.* For illustration purposes it deliberately omits a required parameter.*/params[0] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE,"fips186_4", 0);/* Force it to do a proper validation by setting the seed */params[1] = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_FFC_SEED,(void *)seed, seedlen);params[2] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX, (int *)&gindex);params[3] = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, (int *)&pcounter);params[4] = OSSL_PARAM_construct_end();/* generate a new key that is the combination of the existing key and the new params */_evp_pkey_ctx2 = create_merged_key(_evp_pkey_dsa, params, _ossl_lib_ctx, propq);if (_evp_pkey_ctx2 == NULL)goto cleanup;/* This will fail since not all the parameters used for key generation are added */if (EVP_PKEY_param_check(_evp_pkey_ctx2) > 0) {fprintf(stderr, "EVP_PKEY_param_check() should fail\n");goto cleanup;}/** Add the missing parameters onto the end of the existing list of params* If the default was used for the generation then this parameter is not* needed*/params[4] = OSSL_PARAM_construct_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST,(char *)digest, 0);params[5] = OSSL_PARAM_construct_end();_evp_pkey_ctx3 = create_merged_key(_evp_pkey_dsa, params, _ossl_lib_ctx, propq);if (_evp_pkey_ctx3 == NULL)goto cleanup;if (EVP_PKEY_param_check(_evp_pkey_ctx3) <= 0) {fprintf(stderr, "EVP_PKEY_param_check() failed\n");goto cleanup;}if (!dsa_print_key(EVP_PKEY_CTX_get0_pkey(_evp_pkey_ctx3), 0, _ossl_lib_ctx, propq))goto cleanup;ret = EXIT_SUCCESS;
cleanup:EVP_PKEY_free(_evp_pkey_dsa);EVP_PKEY_CTX_free(_evp_pkey_ctx3);EVP_PKEY_CTX_free(_evp_pkey_ctx2);EVP_PKEY_CTX_free(_evp_pkey_ctx1);BIO_free(bio_in);return ret;
}

END

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

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

相关文章

如何安装“Nextcloud 客户端”win10系统?

1、 下载 Nextcloud的官网 Download and install Nextcloud 2、安装 3、 Nextcloud登录

组件v-model(.sync)记录使用(vue3)

示例&#xff08;演示地址&#xff09; 以下是Vue3中使用v-model实现组件的双向数据绑定的示例代码&#xff1a; 首先&#xff0c;让我们来了解一下Vue3中v-model的用法。在Vue3中&#xff0c;v-model 指令可以用于自定义组件上&#xff0c;用于实现组件的双向数据绑定。与Vue2…

python元类模型和class语句协议

1 python元类模型和class语句协议 学习python的类型模型和class语句协议。class语句末尾自动调用type()创建类对象并且赋值给类名称。 1.1 类是类型的实例 python3.x中&#xff0c;用户定义的类对象是名为type的对象的实例&#xff0c;type本身是一个类&#xff1b; python…

【温故而知新】HTML5存储localStorage/sessionStorage

文章目录 一、概念二、存储localStorage三、存储sessionStorage四、区别及优缺点1. 区别&#xff1a;2. 优缺点&#xff1a; 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xf…

Alinx ZYNQ 7020 LED调试--in RAM

设置拨码开关为JTAG方式 烧写LED bit stream a. 点击“Program device”烧录程序到FPGA中&#xff08;重新上电程序就丢失了&#xff09; b. /01_led/led.runs/impl_1/led.bit 程序烧录到Flash中 ZYNQ与以往的直接烧录Flash不同&#xff0c;首先必须PS&#xff0c;然后烧…

python实例100第23例:打印菱形图案

题目&#xff1a;打印出如下图案&#xff08;菱形&#xff09;: ********* ****************程序分析&#xff1a;先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列…

golang中make与new有什么区别?

前言 记录下go语言中函数new与make的使用和区别&#xff0c;关于go语言中new和make是内建的两个函数&#xff0c;主要用来创建分配类型内存。 目录 前言make介绍用法&#xff1a;1. 创建切片&#xff08;slice&#xff09;&#xff1a;2. 创建映射&#xff08;map&#xff09;…

AWS Secrets Manager 实战指南

AWS Secrets Manager 是一项强大的服务,用于安全地管理和存储敏感信息,如数据库凭证、API 密钥等。本实战指南将指导你如何在实际应用中使用 AWS Secrets Manager。 创建 Secret 首先,我们需要在 Secrets Manager 中创建一个新的 Secret 来存储敏感信息。 登录 AWS 控制台…

2744. 最大字符串配对数目

Problem: 2744. 最大字符串配对数目 文章目录 思路解题方法复杂度Code拓展官方解法拓展解释 思路 要求返回数组中的反转字符数目&#xff1b;数组中每个元素都是固定的2个长度的小写字符串&#xff0c;且不相同&#xff1b;由不相同可知如果是aa&#xff0c;bb这种类型的必定不…

spring-boot定时任务

org.springframework.boot jar包 内置定时任务注解 。生成定时任务有 * * * * * &#xff1f; 表示秒分时日月周。 日和周的位置 必须某个位置用&#xff1f;代替*号用于区别。 定时任务规则&#xff1a;0 * * * &#xff1f; * * 表示任意月的任意周的每天的每时的每分…

抖音矩阵云混剪系统源码(免授权版)多平台多账号一站式管理,附带系统搭建教程

搭建教程 MySQL 5.6 PHP 7.2 Apache 数据库名称 juzhen Nginx环境切换伪静态 1、解压安装包到项目根目录&#xff0c;找到application/database.php 更换自己的数据库密码 2、阿里云现有的配置不要动 其他按照文档进行添加 3、项目访问目录&#xff1a;public 4、域名…

SQL笔记 -- 查询优化

1. 关联查询优化 1.1 驱动表和被驱动表 对于内连接来说&#xff0c;优化器会根据用户的查询语句做优化&#xff0c;决定先查哪张表。先查询的那张表就是驱动表&#xff0c;反之就是被驱动表。而对于外连接来说&#xff0c;大多数情况用户指定的主表就是驱动表&#xff0c;但优…

Demo: 实现PDF加水印以及自定义水印样式

实现PDF加水印以及自定义水印样式 <template><div><button click"previewHandle">预览</button><button click"downFileHandle">下载</button><el-input v-model"watermarkText" /><el-input v-mo…

敏捷开发之Scrum

敏捷开发是什么 我们一般习惯用瀑布模型&#xff0c;它以文档为驱动&#xff0c;将软件生命周期划分为固定的六个基本活动&#xff0c;并且规定了它们自上而下、相互衔接的次序&#xff0c;如同瀑布流水&#xff0c;逐级下落。 那什么是敏捷开发呢&#xff1f; ​ 敏捷开发的核…

解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题

近期在工作中遇到一个问题&#xff0c;记录一下&#xff0c;在项目上线之后&#xff0c;遇到一个问题&#xff0c;即缩放到90%时&#xff0c;页面字体比默认的100%字体大&#xff0c;一开始毫无头绪&#xff0c;经过一番的Google...Google...Google....&#xff0c;终于找到了解…

代码随想录算法训练营第五天| 总结数组专题

数组&#xff1a;二分查找、双指针&#xff08;包括快慢指针&#xff09;、滑动窗口、模拟 链表&#xff1a;双指针、三指针、虚拟头指针、复杂指针操作画图明确每一步&#xff08;标好次序&#xff09; 数组 代码随想录总结的很好&#xff0c;如下图。我再结合自己的一些理解…

AI 的未来是开源的

想象一下&#xff0c;在未来&#xff0c;人工智能不会被锁在公司的金库里&#xff0c;而是由全球创新者社区一砖一瓦地在开放中构建的。协作&#xff0c;而不是竞争&#xff0c;推动进步&#xff0c;道德考虑与原始绩效同等重要。这不是科幻小说&#xff0c;而是人工智能发展核…

【PostgreSQL内核学习(二十四) —— (ALTER MATERIALIZED VIEW)】

ALTER MATERIALIZED VIEW 概述源码解析修改物化视图的属性和行为AlterTableStmt 结构体AlterTableMoveAllStmt 结构体 重命名RenameStmt 结构体 设置对象依赖于扩展AlterObjectDependsStmt 结构体 测试用例 声明&#xff1a;本文的部分内容参考了他人的文章。在编写过程中&…

C++I/O流——(4)格式化输入/输出(第二节)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 含泪播种的人一定能含笑收获&#xff…

73.网游逆向分析与插件开发-背包的获取-物品数据的初步数据分析

内容参考于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;72.网游逆向分析与插件开发-背包的获取-项目需求与需求拆解-CSDN博客 然后首先找切入点&#xff1a; 通过药物来当切入点&#xff0c;药物比较好使用&#xff0c;然后鼠标放到药物上它有名字、种类、…