首页 > 其他分享 >如何利用openssl定义新的数据结构

如何利用openssl定义新的数据结构

时间:2025-01-23 12:03:23浏览次数:3  
标签:FUNCTIONS 定义新 SEQUENCE X509 SIGNERINFO openssl ASN1 SIMPLE 数据结构

        依赖openssl实现国密相关的结构时,虽然openssl中也有类似结构定义,但因为oid的差异、国密算法支持度不高等原因导致无法直接使用openssl接口,这时就需要自定义数据结构。

实战:依据GMT0033定义时间戳响应

// 定义数据结构
typedef struct SignerInfo_st {
  ASN1_INTEGER *version;
  PKCS7_ISSUER_AND_SERIAL *issuerAndSerialNumber;
  X509_ALGOR *digestAlgorithm;
  STACK_OF(X509_ATTRIBUTE) *authenticatedAttributes;
  X509_ALGOR *digestEncryptionAlgorithm;
  ASN1_OCTET_STRING *encryptedDigest;
  STACK_OF(X509_ATTRIBUTE) *unauthenticatedAttributes;
} SIGNERINFO;

typedef struct Data_st {
  ASN1_OBJECT *contentType;
  ASN1_OCTET_STRING *data;
} DATA;

typedef struct SignedData_st {
  ASN1_INTEGER *version;
  STACK_OF(X509_ALGOR) *digestAlgorithms;
  DATA *contentInfo;
  STACK_OF(X509) *certificates;
  STACK_OF(X509_CRL) *crls;
  STACK_OF(SIGNERINFO) *signerInfos;
} SIGNEDDATA;

typedef struct ContentInfo_st {
  ASN1_OBJECT *contentType;
  SIGNEDDATA *content;
} CONTENTINFO;

typedef struct PKIStatusInfo_st {
  ASN1_INTEGER *status;
  ASN1_UTF8STRING *statusString;
  ASN1_BIT_STRING *failInfo;
} PKISTATUSINFO;

typedef struct TSResp_st {
  PKISTATUSINFO *statusInfo;
  CONTENTINFO *tstoken;
} TSRESP;

// 声明四个基本函数,xx_new/xx_free/i2d_xx/d2i_xx
DECLARE_ASN1_FUNCTIONS(SIGNERINFO)
DECLARE_ASN1_FUNCTIONS(DATA)
DECLARE_ASN1_FUNCTIONS(SIGNEDDATA)
DECLARE_ASN1_FUNCTIONS(CONTENTINFO)
DECLARE_ASN1_FUNCTIONS(PKISTATUSINFO)
DECLARE_ASN1_FUNCTIONS(TSRESP)

DEFINE_STACK_OF(SIGNERINFO)

// 定义ASN1结构
ASN1_SEQUENCE(SIGNERINFO) = {
  // ASN1_SIMPLE 简单类型或者结构类型,且是必须项
  ASN1_SIMPLE(SIGNERINFO, version, ASN1_INTEGER),
  ASN1_SIMPLE(SIGNERINFO, issuerAndSerialNumber, PKCS7_ISSUER_AND_SERIAL),
  ASN1_SIMPLE(SIGNERINFO, digestAlgorithm, X509_ALGOR),
  // IMP 隐式标记;OPT 可选项;SEQUENCE_OF sequence序列
  ASN1_IMP_SEQUENCE_OF_OPT(SIGNERINFO, authenticatedAttributes, X509_ATTRIBUTE, 0),
  ASN1_SIMPLE(SIGNERINFO, digestEncryptionAlgorithm, X509_ALGOR),
  ASN1_SIMPLE(SIGNERINFO, encryptedDigest, ASN1_OCTET_STRING),
  ASN1_IMP_SET_OF_OPT(SIGNERINFO, unauthenticatedAttributes, X509_ATTRIBUTE, 1)
} ASN1_SEQUENCE_END(SIGNERINFO)
// 实现四个基本函数
IMPLEMENT_ASN1_FUNCTIONS(SIGNERINFO)

ASN1_SEQUENCE(DATA) = {
  ASN1_SIMPLE(DATA, contentType, ASN1_OBJECT),
  ASN1_EXP_OPT(DATA, data, ASN1_OCTET_STRING, 0)
} ASN1_SEQUENCE_END(DATA)
IMPLEMENT_ASN1_FUNCTIONS(DATA)

ASN1_SEQUENCE(SIGNEDDATA) = {
  ASN1_SIMPLE(SIGNEDDATA, version, ASN1_INTEGER),
  ASN1_SET_OF(SIGNEDDATA, digestAlgorithms, X509_ALGOR),
  ASN1_SIMPLE(SIGNEDDATA, contentInfo, GMT0010_DATA),
  ASN1_IMP_SEQUENCE_OF_OPT(SIGNEDDATA, certificates, X509, 0),
  ASN1_IMP_SET_OF_OPT(SIGNEDDATA, crls, X509_CRL, 1),
  ASN1_SET_OF(SIGNEDDATA, signerInfos, GMT0010_SIGNER_INFO),
} ASN1_SEQUENCE_END(SIGNEDDATA)
// 实现四个基本函数
IMPLEMENT_ASN1_FUNCTIONS(SIGNEDDATA)

ASN1_SEQUENCE(CONTENTINFO) = {
  ASN1_SIMPLE(CONTENTINFO, contentType, ASN1_OBJECT),
  ASN1_EXP_OPT(CONTENTINFO, content, GMT0010_SIGNED_DATA, 0)
} ASN1_SEQUENCE_END(CONTENTINFO)
// 实现四个基本函数
IMPLEMENT_ASN1_FUNCTIONS(CONTENTINFO)

ASN1_SEQUENCE(PKISTATUSINFO) = {
  ASN1_SIMPLE(PKISTATUSINFO, status, ASN1_INTEGER),
  ASN1_SEQUENCE_OF_OPT(PKISTATUSINFO, statusString, ASN1_UTF8STRING),
  ASN1_OPT(PKISTATUSINFO, failInfo, ASN1_BIT_STRING)
} ASN1_SEQUENCE_END(PKISTATUSINFO)
// 实现四个基本函数
IMPLEMENT_ASN1_FUNCTIONS(PKISTATUSINFO)

ASN1_SEQUENCE(TSRESP) = {
  ASN1_SIMPLE(TSRESP, statusInfo, GMT0033_PKI_STATUS_INFO),
  ASN1_OPT(TSRESP, tstoken, GMT0010_CONTENT_INFO)
} ASN1_SEQUENCE_END(TSRESP)
// 实现四个基本函数
IMPLEMENT_ASN1_FUNCTIONS(TSRESP)

标签:FUNCTIONS,定义新,SEQUENCE,X509,SIGNERINFO,openssl,ASN1,SIMPLE,数据结构
From: https://blog.csdn.net/summermeet/article/details/145279715

相关文章

  • HashMap的数据结构是怎样的?
    HashMap的数据结构在Java中,保存数据有两种比较简单的数据结构:数组和链表。数组的特点是:寻址容易,插入和删除困难;而链表的特点是:寻址困难,插入和删除容易。常用的哈希函数的冲突解决办法中有一种方法叫做链地址法,其实就是将数组和链表组合在一起,发挥了两者的优势,我们可......
  • 408数据结构笔记(Day 1)
    学习数据结构基础(c语言): 一、什么是分支(if/lese、switch),循环(for、while、dowhile)?程序的三种结构:顺序,分支,循环1、顺序:按照先后顺序执行比如:inta=2; ①doubleb=3.0;②先执行第①步,然后执行第②步。2、分支:可以使用 if、switch 实现分支结构if语句if(条件)......
  • 数据结构 单链表详解
    单链表的基本概念及特点定义:单链表是由一系列节点组成的线性序列,每个节点包含两个部分,一个是存储数据元素的数据域,另一个是指向下一个节点的指针域。最后一个节点的指针域为空(通常用NULL表示),表示链表的结束。特点:1、动态性:单链表的存储空间是在程序运行过程中动态分配......
  • 数据结构之链表(linked list)代码实现(小白轻松懂,C语言版)
    一、前言:链表的简单介绍链表(LinkedList)是一种重要的线性数据结构,它以节点(Node)的形式存储数据,每个节点通过指针(或引用)指向下一个节点,从而形成一个动态的数据链条。与数组不同,链表的内存分配并不连续,因此具有更灵活的插入和删除操作,但在随机访问元素时效率相对较低。链表通......
  • 数据结构-单向不带头不循环链表
    链表知识总结逻辑结构:线性结构(元素之间存在一对一关系)存储结构(物理结构):链式存储(存储顺序和逻辑顺序不在乎是否一致)1.链表的特点:擅长进行动态删除和增加操作,不擅长随机访问(需要遍历,因为链表不按顺序存放)2.链表分类:单双向链表单链表:元素节点有两部分组成(数据域-存储当前......
  • 数据结构-栈
    1、栈的基本概念1、栈是特殊的线性表:只允许在一端进行插入和删除操作2、栈的逻辑结构就是线性结构,栈的存储结构既可以是顺序存储,也可以是链式存储3、栈顶:允许进行插入和删除的一端(最上面的为栈顶元素)4、栈底:不允许进行插入和删除的一端(最下边的栈底元素)5、空栈:不含任何......
  • 数据结构-二叉树
     树的相关概念:1、节点的度:树中一个节点的孩子个数称为该节点的度,所有节点的度的最大值是树的度2、分支节点:度大于0的节点称为分支节点3、叶子结点:度为0的节点称为叶子结点4、节点的层次(深度):从上往下数,根节点为1层,依次往下加15、树的高度(深度):树中节点的最大层次6、树......
  • 《StringBuilder类的数据结构和扩容方式解读》
    StringBuilder类的简单用法、数据结构和扩容方式解读文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言在之前的文章中和大家讲过String字符串类具有不可变性,今天给大家介绍一个可变字符串类——StringBuilder类。提示:以下是本篇文章正文内......
  • 数据结构2——线性表的链式存储
    前言顺序存储结构的缺点:①插入、删除操作需要移动大量的元素。② 预先分配空间需按最大空间分配,利用不充分。③表容量扩充十分不方便(可能会产生效率问题)。而链式存储结构恰好弥补了顺序存储这些缺陷。1.认识线性表链式存储1.1线性表链式存储的构成①可用一组任意......
  • 【轻松掌握数据结构与算法】动态规划
    引言在本章中,我们将尝试解决那些使用其他技术(例如分治法和贪心法)未能得到最优解的问题。动态规划(DP)是一种简单的技术,但掌握起来可能比较困难。识别和解决DP问题的一个简单方法就是尽可能多地解决各种问题。“编程”一词与编码无关,而是源自文献,意思是填充表格,类似于线性规划。......