X.509v3 ASN.1 到 C 数据结构

2024-01-11

我正在尝试创建代理证书的 X509 请求(ProxyCertInfo 扩展RFC3820 http://www.ietf.org/rfc/rfc3820.txt)在 C (OpenSSL)中,但我无法弄清楚应该如何定义 ProxyCertInfo 的数据结构。 RFC 对 ASN.1 语言的定义如下:

PKIXproxy88 { iso(1) identified-organization(3) dod(6)
   internet(1) security(5) mechanisms(5) pkix(7) id-mod(0)
   proxy-cert-extns(25) }

DEFINITIONS EXPLICIT TAGS ::=

BEGIN

-- EXPORTS ALL --

-- IMPORTS NONE --

-- PKIX specific OIDs

id-pkix OBJECT IDENTIFIER ::=
       { iso(1) identified-organization(3)
            dod(6) internet(1) security(5) mechanisms(5) pkix(7) }

-- private certificate extensions
id-pe   OBJECT IDENTIFIER ::= { id-pkix 1 }

-- Locally defined OIDs

-- The proxy certificate extension
id-pe-proxyCertInfo    OBJECT IDENTIFIER ::= { id-pe 14 }

-- Proxy certificate policy languages
id-ppl  OBJECT IDENTIFIER ::= { id-pkix 21 }

-- Proxy certificate policies languages defined in
id-ppl-anyLanguage     OBJECT IDENTIFIER ::= { id-ppl 0 }
id-ppl-inheritAll      OBJECT IDENTIFIER ::= { id-ppl 1 }
id-ppl-independent     OBJECT IDENTIFIER ::= { id-ppl 2 }

-- The ProxyCertInfo Extension
ProxyCertInfoExtension  ::= SEQUENCE {
     pCPathLenConstraint     ProxyCertPathLengthConstraint OPTIONAL,
     proxyPolicy             ProxyPolicy
}

ProxyCertPathLengthConstraint  ::= INTEGER
ProxyPolicy  ::= SEQUENCE {
     policyLanguage          OBJECT IDENTIFIER,
     policy                  OCTET STRING OPTIONAL
}

END

我查看了非常有限的 OpenSSL 文档,但无法找到如何将其解析为 C 数据结构。我也读过http://www.openssl.org/docs/apps/asn1parse.html# http://www.openssl.org/docs/apps/asn1parse.html#因为它解释了如何使用命令行工具的解析器,但没有解释如何将其包含在您自己的源代码中。

我已经设法将其他扩展包含到 X509 请求中,因此我相对确定我唯一的问题是此特定扩展的数据结构的格式。


我认为您的问题是“如何将数据格式化为 ProxyCertInfoExtension?”如果这不正确,请告诉我。

如果你想了解一些理论,我找到的最好的参考是ASN.1、BER 和 DER 子集的外行指南 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.6.6585.

您问题中的代码部分描述了 ProxyCertInfoExtension 的数据如何编码。将编码描述视为可以由解析器生成器处理的语法,就像 yacc 将语法作为输入并输出 C 代码一样。事实上至少存在一个 ASN.1 解析器生成器ASN1C http://sourceforge.net/projects/asn1c/

ASN.1 编码的大小可能是可变的。数据以最外层或顶级 ASN.1 编码开始。每个 ASN.1 编码在其内部可能包含一个或多个 ASN.1 编码。这样ASN.1就是递归的。

ASN.1 编码由标头、长度、可选内容和可选结尾组成。

ASN.1 encoding { Header length [content] [end] }

标头由类类型、原始/构造位和标记号组成。如果标记号大于 63,则标记号将跨越多个字节。这意味着标头可能是一个字节长或多个字节长,具体取决于标记号的值。标头是字节对齐的,这意味着它总是有一定数量的字节长。

ASN.1 header { ClassType Primitive/Constructed Tag-number }

长度也可以是一个字节到多个字节长,具体取决于长度的值。同样,长度是字节对齐的。

类类型和标签号告诉您内容中编码的内容。

最外面的编码通常是序列或集合,它们是复合基本类型。在您的编码中,最外面的编码是 ProxyCertInfoExtension,它是可选 ProxyCertPathLengthConstraint 和 ProxyPolicy 的序列。您的编码如下所示:

ProxyCertInfoExtension { [ProxyCertPathLengthConstraint] ProxyPolicy }

回顾一下编码规则,ProxyCertPathLengthConstraint 只是一个整数,所以你的编码实际上是:

ProxyCertInfoExtension { [Integer] ProxyPolicy }

编码规则将 ProxyPolicy 定义为策略语言和可选策略的序列。因此我们可以将编码表示更新为如下所示:

ProxyCertInfoExtension { [Integer] { policyLanguage [policy] } }

编码规则将策略指定为八位字节字符串(只是一些字节数)。因此进一步简化可以得到:

ProxyCertInfoExtension { [Integer] { policyLanguage [Octet String] } }

根据对象标识符,编码是以下之一:

ProxyCertInfoExtension { [Integer] { id-ppl-anyLanguage [Octet String] } }
ProxyCertInfoExtension { [Integer] { id-ppl-inheritAll  [Octet String] } }
ProxyCertInfoExtension { [Integer] { id-ppl-independent [Octet String] } }

我会尝试一个untested例子 ProxyCertPathLengthConstraint=64 策略语言=id-ppl-anyLanguage 政策=“测试” 我将从保单长度为 04 开始彻底研究 这是一个可打印的字符串,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x13 头字节是0x13 length=4,所以长度字节为0x04 ascii 中的“测试”为 0x74 0x65 0x73 0x74 策略的编码是 0x13 0x04 0x74 0x65 0x73 0x74

id-ppl-anyLanguage 是一个对象标识符,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x06 标头字节为 0x06 id-ppl-anyLanguage 的值为“1.3.6.1.5.5.7.21.0” length=18,所以长度字节为0x12 “1.3.6.1.5.5.7.21.0” = 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 策略语言的编码是 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10

proxyPolicy 是一个序列,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x10 标头字节为 0x10 长度= lengthof(policyLanguage) + lengthof(policy) = (lengthof(policyLanguage 标头) + lengthof (policyLanguage 内容)) + (lengthof(policyheaders) + lengthof (策略内容)) = (2 + 4) + (2 + 18) = 6 + 20 = 26 length=26,所以长度字节为0x1A 内容是policyLanguage,后跟policy = 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0 x73 0x74 proxyPolicy 的编码是 0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0 x74 0x65 0x73 0x74

ProxyCertPathLengthConstraint 是一个整数,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x02 标头字节为 0x02 长度=0x01 内容=0x40 编码为 0x02 0x01 0x40

ProxyCertInfoExtension 是一个序列,因此 class=00(universal)primitive/constructed=0(primitive) 和 tag-number=0x10 标头字节为 0x10 长度 = lengthof(pCPathLenConstraint) + lengthof(proxyPolicy) = lengthof(pCPathLenConstraint 标头) + lengthof (pCPathLenConstraint 内容)) + (lengthof(proxyPolicy 标头) + lengthof(proxyPolicy 内容)) = (2 + 1) + (2 + 26) = 3 + 28 = 31 = 0x1F 内容= pCPathLenConstraint 后跟 proxyPolicy = 0x02 0x01 0x40 0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x12 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0x73 0x74 编码为 0x10 0x1F 0x02 0x01 0x40 0x10 0x1A 0x06 0x12 0x11 0x0E 0x03 0x0E 0x16 0x0E 0x11 0x0E 0x15 0x0E 0x15 0x0E 0x17 0x0E 0x1 2 0x11 0x0E 0x10 0x13 0x04 0x74 0x65 0x73 0x74

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

X.509v3 ASN.1 到 C 数据结构 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • Linq to Entities 删除

    是否有内置方法可以使用主键通过 Linq to Entities 进行删除 目前的解决方法是创建一个名为DeleteTable的存储过程 表是表名 然后在 C LINQ To Entities 中我只需执行 context DeleteTa
  • 如何在 Appveyor 构建之前运行 VCUpgrade?

    我们分发了一组 Visual Studio 2010 项目文件 用户应该根据自己的口味进行升级 我们的 appveyor yml file http github com weidai11 cryptopp blob master appv
  • R Shiny with Leaflet - 单击后更改标记的颜色

    我正在开发一个闪亮的应用程序 它显示带有标记的传单地图 标记是可点击的 我收集被点击标记的 ID 但我还想更改单击标记的颜色 当标记为蓝色时 它应更改为红色标记 反之亦然 到目前为止 我已经有了跟踪单击的标记的代码 并且可以将 ID 存储在
  • 什么会导致 %5B0%5D 添加到 url

    我试图找出为什么删除过滤器的链接在我的网站上不起作用 似乎是因为链接已更改为包含 5B0 5D 和其他各种字母和数字 并添加了 据我所知 这是序列化函数导致的 还有其他什么可能导致这种情况 或者它绝对是序列化函数吗 它被称为百分比编码 ht
  • 在 netbeans 中运行 Web 应用程序

    我正在使用 netbeans 和 apache tomcat 来运行 Web 应用程序 我不断收到此错误 In place deployment at C WorkingDirectory Projects GreenWheelsProje
  • 从 iTunes Connect 中删除新的应用程序版本

    我在 iTunes Connect 中使用错误的版本号创建了应用程序的新版本 我想删除处于 准备上传 状态的新版本 我该怎么做呢 关于此还有其他问题 但他们没有提供任何答案 适用于已上传二进制文件的版本 或者已过时 我就此向 Apple 提
  • 在 C++ 中提供指针恒定视图的更好方法

    我有一个类必须返回一个constant一些指向软件上层的指针的视图 在内部 指针必须是非常量 因为类需要在内部操作对象 我没有看到任何选项可以在不复制所有指针的情况下向更高级别的客户端提供指针的常量视图 这看起来很浪费 如果我管理数百万个对
  • 如何连接到 TT X_TRADER API 以使用 python 创建自动交易系统?

    我已经在内部开发论坛中多次看到这个问题 因此想提供一个快速示例 说明如何立即在 python 中实现这一点 首先 请注意 我们所做的只是连接到相关的 X TRADER com 对象 因此以下所有内容仍然适用 https www tradin
  • 如何将复选框与文本对齐到屏幕右侧?

    我里面有一个复选框TableRow 我想将复选框和文本对齐到屏幕的右侧 但是当我使用android gravity right 它仅将文本与屏幕右侧对齐 但不与正方形 复选框本身 对齐 它们似乎是单独对齐的 复选框位于屏幕的左侧 文本位于屏
  • 具有不同函数原型的函数查找表

    除了一系列之外 根据用户输入调用指定函数的最佳方法是什么 if and strcmp 例如 p 2 2 gt call func p 2 2 a 8 gt call func a 7 m gt call func m void 我知道制作一
  • 使用 javascript 或 jQuery 隐藏所有带有与数字“0”或自定义值匹配的文本或innerHTML的“a”元素

    我需要隐藏全部 a 带有文本或的元素innerHTML匹配数字 foo 或使用 javascript 或 jQuery 的自定义值 li a href class dir foo a li 我努力了 jQuery document read
  • 为什么Python列表排序后速度变慢?

    在下面的代码中 我创建了两个具有相同值的列表 一个列表未排序 s not 另一个列表已排序 s yes 这些值由 randint 创建 我为每个列表运行一些循环并计时 import random import time for x in r
  • Rails 5 渲染部分并传递数据

    我无法了解数据传递和提供给部分数据的一般方式 例如 我有一个控制器将实例变量传递给呈现部分的模板 static pages controller rb def home feed items current user feed end ho
  • Cobra + Viper Golang 如何测试子命令?

    我正在使用 Go 开发一个网络应用程序 到目前为止一切顺利 但现在我将 Wercker 集成为 CI 工具并开始关心测试 但我的应用程序严重依赖 Cobra Viper 配置 标志 环境变量方案 并且我不知道如何在运行测试套件之前正确初始化
  • Mathematica 中稀疏数组的 Outer 有效替代方案?

    假设我有两个非常大的列表 a1 a2 和 b1 b2 其中所有 ai 和 bj 都是大型稀疏数组 为了提高内存效率 我将每个列表存储为一个综合稀疏数组 现在我想在所有可能的 ai 和 bj 对上计算某个函数 f 其中每个结果 f ai bj
  • 是否可以通过css在不使用position属性的情况下实现绝对位置功能?

    我正在创建 Outlook 电子邮件 我创建了一个电子邮件系统 我已经签入了 Gmail yahoo 等所有电子邮件巨头 它工作得很好 但突然当我在 Outlook 中看到相同的电子邮件时 令人震惊的是 Outlook 不支持位置属性 现在
  • 准备部署时如何清理 node_modules 文件夹

    我该如何清洁节点模块准备部署代码时的文件夹 我正在使用制作一个应用程序节点 webkit并且在捆绑应用程序的最终版本时希望包含尽可能少的文件 因为解压缩过程需要一些时间 我看过npm dedupe并使用npm install product
  • Window.open 在 IE8 中不起作用?

    这是我当前使用的 JavaScript window open modules mod oneononechat chatwindow php key key color blue x winName x location 0 status
  • Spring security - 更改/登录默认路径

    我们想为我们的 Spring Boot 应用程序添加 spring 安全性 问题是我们已经 login路径已使用 所以目前我们无法加载重定向到的 Spring Security 默认登录页面 login path 我们想要保留 spring
  • X.509v3 ASN.1 到 C 数据结构

    我正在尝试创建代理证书的 X509 请求 ProxyCertInfo 扩展RFC3820 http www ietf org rfc rfc3820 txt 在 C OpenSSL 中 但我无法弄清楚应该如何定义 ProxyCertInfo