模块契约X.509 解析

错误

X.509 错误使用 xrt.x509 域和 X509_ERROR_* 稳定代码。底层 DER、时间转换或扩展正文失败会尽可能通过 xrtErrorCause 保留原始原因;错误数据在适用时包含 offset=<字节偏移>。所有解析器和游标只在成功时发布输出。

裁剪与依赖

模块只依赖严格 DER 和 UTC 日历时间,不依赖加密、PEM、文件或网络。解析有效证书时不分配内存;输入必须在所有证书及其子视图使用完之前保持有效。

证书视图

xx509cert 保留:

  • 完整证书和 TBSCertificate;
  • 自然编号的 v1、v2、v3 版本和规范 DER INTEGER 的完整序列号内容;
  • TBS 与外层 AlgorithmIdentifier;
  • Issuer、Subject 与 SubjectPublicKeyInfo 的完整 DER;
  • 转换为 xtime 的 NotBefore 和 NotAfter;
  • 可选唯一标识、扩展序列和不含 unused-bit 字节的签名。

解析器要求输入恰好是一张完整规范 DER 证书。它检查字段数量和顺序、显式默认版本、序列号 INTEGER 的规范编码、Issuer 非空、时间编码与真实日历、NotAfter 顺序、SPKI 结构、可选字段版本约束、扩展正文 DER、重复扩展 OID、TBS/外层签名算法一致和签名 BIT STRING。空 Subject 只允许与非空且 critical 的 SAN 同时出现。

Serial 借用 INTEGER 的完整内容八位组,不去掉正数符号补零,也不把负数转换为无符号幅值。RFC 5280 要求符合规范的 CA 使用正数且不超过 20 个内容八位组,但同时要求证书使用方妥善处理负数或零;现实系统根库中也存在零序列号信任锚。因此消费侧解析器接受所有规范 DER INTEGER,包括零、负数和历史超长值,并使证书与 AKI 能按相同字节语义精确匹配。签发器或合规检查器应单独执行 CA 侧约束。

有效期使用闭区间。参数合法时,过期或尚未生效只是 false,不伪装成运行错误。

AlgorithmIdentifier

Oid 是 OBJECT IDENTIFIER 的内容八位组;Parameters 在存在时保存完整参数 TLV,因而未知算法和未来参数不会丢失。结构层接受未知算法,实际验签层再决定支持范围和策略。

RFC 5280 时间也有独立入口,供证书、CRL、OCSP 和用户协议复用:

入口只接受恰好一项规范 DER UTCTime 或 GeneralizedTime,要求秒和结尾 Z,拒绝时区偏移、分数秒、无效日历以及 2050 年之前的 GeneralizedTime。失败时输出保持不变。

Name

Name 游标按 DER 顺序展平 RDN 中的 AttributeTypeAndValue,但保留 Rdn 编号、值标签和原始内容。模块不擅自把 DirectoryString 转成 UTF-8,也不丢弃未知属性。xrtX509NameFind 提供精确 OID 的常用查找路径。

x509_name 是独立可裁剪的规范比较层:

两个入口都返回 X509_VALUE、X509_DONE 或 X509_ERROR,不会把无效编码误报为普通不匹配。比较遵循 RFC 5280 7.1 和 RFC 4518:支持 UTF8String、PrintableString、ASCII TeletexString、BMPString 与 UniversalString,使用 Unicode 3.2 case-fold、NFKC 和 insignificant-space 规则;空格后的 Unicode Mn、Mc、Me 标记按 RFC 4518 保持该空格的显著性;同一 RDN 内的属性按无序集合处理,RDN 序列保持有序。domainComponent 与 emailAddress 使用 caseIgnoreIA5Match,并分别检查 RFC 4519 单标签语法与 1..63、1..255 八位组边界。非 ASCII TeletexString 的字符映射由规范留给本地实现,xrt 明确返回 XERR_UNSUPPORTED,不进行不可靠猜测。

常见值在 64 个 Unicode 标量、常见名称在 16 个属性以内时不分配堆内存;异常长输入按需扩展。Unicode 表和 194 组 oracle 向量都由 tools/gen_x509_name_data.py 基于固定 Unicode 3.2 数据生成并可重复检查。

Extension

扩展游标保留 OID、critical 和正文。critical DEFAULT FALSE 被显式编码为 false、空扩展序列、重复 OID、非 OCTET STRING 或正文不是一项完整 DER 都会在对象入口被拒绝。未知扩展仍公开给调用方;后续策略层负责拒绝未处理的未知 critical 扩展。

xrtX509ExtensionFind 是精确 OID 便捷入口。没有扩展时,初始化成功并由第一次读取返回 X509_DONE。

CRL、CRL 条目和其他 X.509 协议对象不需要伪造证书即可复用同一实现:

空视图统一表示没有扩展;非空视图必须是一项非空、无重复 OID 的完整 Extensions DER。证书便捷入口只是这一通用层之上的薄封装。

NameConstraints

x509_name_constraints 是 profile 与 Name 比较之上的独立可裁剪层,公开协议解析、子树遍历、单名称匹配和整张证书检查四级入口:

xrtX509NameConstraintsParse 可直接解析一项独立 DER,供离线 PKI、信任锚元数据和自定义协议复用;xrtX509NameConstraints 是证书便利入口,并强制扩展为 critical。解析拒绝空 permitted/excluded 集合、重复或乱序字段、非规范非负 BaseDistance、显式编码的默认 minimum=0、错误 GeneralName 形式和非法 DNS/email/URI 约束。全部结果和游标都借用输入 DER,失败或游标结束不修改输出。

xrtX509GeneralNameWithin 支持 RFC 5280 要求的 directoryName、dNSName、rfc822Name、URI 与 IP:DNS 比较大小写不敏感,并允许向左增加标签;邮箱按 SMTP Mailbox 校验 Dot-string 或 Quoted-string,local-part 精确且大小写敏感,host 大小写不敏感;邮箱和 URI 的前导点表示仅下级域,URI 只比较绝对 URI authority 中的 DNS host;IP 使用地址与掩码逐位比较;目录名称复用 xrtX509NameWithin。其他 GeneralName 类型不会被猜测,相关名称出现时返回 XERR_UNSUPPORTED。

xrtX509NameConstraintsCheck 同时检查非空 Subject、全部 SAN,以及没有 SAN 时历史 Subject emailAddress。excluded 子树优先拒绝,同类型 permitted 子树按并集匹配,不同 CA 的约束由路径层形成交集。RFC profile 不使用非默认 minimum 且不使用 maximum;解析层为诊断保留这些任意精度值,匹配层只在证书实际出现相同名称类型时返回 XERR_UNSUPPORTED,不会静默忽略。

CRL 结构层

x509_crl 是独立可裁剪的 RFC 5280 CRL 协议层:

它不依赖摘要、密码算法、路径、文件、网络或 TLS。解析和遍历成功路径零分配,全部视图借用调用方 DER。

解析器同时支持省略 version 的 v1 和值为 1 的 v2 CRL,并严格检查:

  • 顶层 CertificateList 恰好包含 TBSCertList、签名算法和签名;
  • TBS 与外层 AlgorithmIdentifier 完整 DER 一致;
  • Issuer 是非空 Name,时间是严格 RFC 5280 时间,nextUpdate 不早于 thisUpdate;
  • 编码存在的 revokedCertificates 非空,每项恰好包含序列号、撤销时间和可选扩展;
  • CRL 与条目扩展只允许出现在 v2,并复用通用扩展层拒绝空列表和重复 OID;
  • 签名是非空、八位组对齐的 BIT STRING,未知签名算法仍完整保留给后续扩展。

xx509crlentry.Serial 和证书 Serial 使用相同语义:保留规范 DER INTEGER 的完整有符号内容,包括正数符号补零、零、负数和历史超长值。xrtX509CrlFind 做精确内容匹配,命中返回 X509_VALUE,未命中返回 X509_DONE,结构错误返回 X509_ERROR;xrtX509CrlRevokes 是直接接受证书的常用入口。

时间窗口使用闭区间。没有 nextUpdate 时,结构层只检查时间不早于 thisUpdate,不会擅自制定最大寿命;要求 nextUpdate、限制 CRL 年龄或处理离线缓存属于调用方策略。解析器不会因未知 critical 扩展直接丢失 CRL,因为扩展处理能力取决于上层。

CRL 分发点

x509_distribution 是证书 profile 之上的独立零分配层,统一实现证书 CRLDistributionPoints、证书 FreshestCRL 与 CRL profile 共用的 DistributionPointName 和 ReasonFlags:

xrtX509DistributionPointParse 解析一项独立 DistributionPoint;xrtX509DistributionInit 和 xrtX509DistributionRead 处理完整的 SEQUENCE OF。这些底层入口不要求输入来自证书,OCSP、缓存、诊断工具和用户协议可以直接复用。xrtX509CrlPoints 与 xrtX509FreshestCrl 是常见证书路径的便利入口,扩展不存在返回 X509_DONE。

xx509distributionpoint 明确区分可选名称、原因掩码和 cRLIssuer。fullName 直接提供 GeneralNames 游标;nameRelativeToCRLIssuer 保留上下文 TLV 与单个 RDN 内容。解析层拒绝空列表、空点、reasons-only、重复或乱序字段、非规范 named-bit 和畸形相对名称,同时不擅自把 cRLIssuer 限死为某一种 GeneralName;严格的发行者名称和作用域对应关系由 CRL policy 判断。

RFC 5280 只建议证书 CRLDistributionPoints 为 non-critical,因此便利入口能处理 critical 形式,最终是否接受由调用方路径策略决定。证书和 CRL 的 FreshestCRL 则必须 non-critical。CRL 内的 FreshestCRL 还有更窄的 profile:不能出现在 delta CRL 中,且每个点只能出现 distributionPoint 名称;xrtX509CrlFreshest 会执行这些约束。

CRL Profile

x509_crl_profile 在结构层之上实现 RFC 5280 标准扩展的零分配类型化读取,并保持 CRL 结构、证书 profile 与策略验证可分别裁剪:

CRL 级入口包括 xrtX509CrlNumber、xrtX509CrlDeltaBase、xrtX509CrlAuthorityKeyId、xrtX509CrlIssuingPoint 和 xrtX509CrlFreshest;条目级入口包括 xrtX509CrlEntryReason、xrtX509CrlEntryInvalidityDate 和 xrtX509CrlEntryIssuer。扩展不存在返回 X509_DONE,成功返回 X509_VALUE,critical 口径或正文错误返回 X509_ERROR,失败和缺省都不修改输出。

CRLNumber 与 BaseCRLNumber 是 INTEGER (0..MAX)。xrtX509CrlNumberParse 返回去除可选正数符号零后的任意精度大端视图,不把协议范围错误缩成 64 位。CRL Number 与 AKI 必须 non-critical;Delta CRL Indicator 与 Issuing Distribution Point 必须 critical;Certificate Issuer 必须 critical。Reason Code 和 Invalidity Date 按 profile 约束读取为 non-critical。

xx509issuingpoint 明确区分所有 DEFAULT 和 OPTIONAL 字段。完整分发点名称直接提供 GeneralNames 游标,相对名称保留完整上下文 TLV 与 RDN 内容,调用方仍可使用 ASN.1 底层继续解释。三个证书类别作用域不能同时出现;ReasonFlags 使用独立位枚举,不能与不连续的 CRLReason 数值混用。

xrtX509CrlInvalidityDateParse 严格要求 GeneralizedTime。这个字段不使用证书有效期的“2050 年前 UTCTime、以后 GeneralizedTime”选择规则,因此 2026 年的合法 InvalidityDate 仍必须使用四位年份。xrtX509CrlReasonParse 接受规范定义的 0 到 6、8、9、10,并拒绝未分配值 7;removeFromCRL 是否只出现在 delta CRL 由策略层判断。

profile 层不会验证签名、CRL Issuer、签发者 cRLSign、AKI/SKI 对应、时间新鲜度、分发点匹配、unknown critical 扩展或间接 CRL 的发行者继承,也不会合并 complete/delta CRL。它只把原始扩展可靠地转换为公开协议模型,后续 x509_crl_policy 可以复用这些模型,而 OCSP、离线检查器和自定义 PKI 仍可直接选择低层入口。

同理,x509_crl 不验证密码签名,不比较 CRL Issuer 与签发者 Subject,不检查签发者 cRLSign,也不把“出现在列表中”直接解释成最终证书状态。独立的 x509_crl_verify 层只负责密码签名:

两个入口解析 CRL 的公开 AlgorithmIdentifier,并把 TBSCertList、签名和公钥直接交给 xrtX509SignatureVerify。基础层不强制拉入密码后端;RSA、ECDSA、Ed25519 仍按现有 XRT_FEATURE_X509_VERIFY_* 宏独立启用,未知算法或缺少后端返回明确的 XERR_UNSUPPORTED。Issuer、作用域、cRLSign、removeFromCRL、delta/indirect 合并和软/硬失败策略属于更高层。这样 TLS 可以按需组合,而 OCSP、离线检查器和用户自定义 PKI 不会被 TLS 私有策略限制。

CRL 策略

x509_crl_policy 把 CRL 结构、profile、签名和名称比较组合为可独立裁剪的 RFC 5280 策略层。它验证 CRL Issuer、签名、时间窗口、签发证书 cRLSign、AKI、CRL Number、unknown critical 扩展、Issuing Distribution Point、间接 CRL 条目和证书分发点作用域,但不负责建立或验证 CRL 签发者的证书路径。调用方必须先在同一信任上下文中验证 pIssuer。

xrtX509CrlConfigInit 使用当前墙上时钟和严格默认项:要求 nextUpdate、CRL Number、Authority Key Identifier、AKI keyIdentifier 和签发者 KeyUsage。需要可复现测试、缓存快照或外部可信时间时,调用方可以显式设置 Time 和 Skew;传入 NULL config 等同于当前时间严格策略。未知 critical CRL 或条目扩展默认拒绝,Critical 回调只有返回 X509_VALUE 才表示调用方已经完整处理该扩展。

xrtX509CrlValidate 成功后发布 xx509crlvalid 借用视图。视图、内部 profile 子视图和后续查询结果都不拥有 DER;原 CRL 与签发证书必须保持存活且内容不变。这个类型应只由验证入口产生,xrtX509CrlCheck 与 xrtX509CrlSetInit 依赖其验证不变量。常见一次性路径可用 xrtX509CrlStatus,复用同一 CRL 查询多张证书时应先验证一次再反复检查。

查询返回值具有明确作用域:X509_ERROR 表示输入或协议错误,X509_DONE 表示这份 CRL 不适用于证书或 delta CRL 没有该证书的新记录,X509_VALUE 才发布 xx509revocation。X509_REVOCATION_GOOD 只证明 CoveredReasons 中的原因未撤销,不能把一份原因分段 CRL 的 GOOD 当成全局 GOOD。多份分段 CRL 应依次交给 xrtX509RevocationUpdate;只有原因全集覆盖或任一分片确认撤销时,xrtX509RevocationResult 才返回最终 X509_VALUE。

complete/delta 组合使用 xrtX509CrlSetInit 和 xrtX509CrlSetCheck。两份已验证 CRL 必须具有相同标准化 Issuer、实际公钥、AKI、Issuing Distribution Point 与作用域;complete CRL Number 必须不小于 delta 的 BaseCRLNumber,并严格小于 delta CRL Number。查询先处理 delta 更新,再回退 complete CRL;removeFromCRL 只有经过这条组合路径才会变成 GOOD,未组合的移除记录不能直接进入多 CRL 聚合器。

该层全程零分配,失败和 X509_DONE 不修改输出。相对分发点名称在缺少足够可比较上下文时保守返回 X509_DONE,不会猜测适用性。网络获取、缓存、FreshestCRL 下载、软失败/硬失败和 OCSP 组合属于更高层,策略 API 保留明确结果,使 TLS、离线检查器和用户 PKI 可以选择自己的获取与失败规则。

旧版 lib/nettls.h 中的 CRL 私有结构、解析、签名与线性查找,以及 test_tls_anchor_verify.h 的签发者、撤销、空列表和过期真实 RSA 向量均作为资产保留。新实现复用真实 DER,并实际验证三份历史 CRL 的原始 RSA 签名,同时重新建立严格字段、失败原子性、零分配、v1/v2、扩展、损坏签名原因链、单头文件、32 位 TinyCC 和全字节变异证据;旧 TLS 测试不会被冒充为新协议层的覆盖。

公钥

公钥视图识别 RSA、RSA-PSS、EC P-256/P-384/P-521、Ed25519、Ed448、X25519 和 X448。RSA 额外公开去除符号零的模数与指数;EC 保留点编码;RFC 8410 公钥要求省略参数并使用固定长度。未知算法返回 X509_KEY_UNKNOWN,但 AlgorithmIdentifier 和原始 key bits 保持可用,为用户扩展和未来算法留出路径。

签名算法

x509_signature 把证书签名 AlgorithmIdentifier 转换为独立、零分配的协议数据模型。它只解释算法与参数,不拉入任何密码学验证后端,因此可以单独用于证书检查、策略过滤和上层自定义实现。

X509_VALUE 表示已知且参数合法,X509_DONE 表示结构合法但 OID 未知,X509_ERROR 表示已知算法使用了错误参数。后两种结果都不修改输出。调用方可在 X509_DONE 时直接使用 xx509algorithm 的 OID 和完整参数 TLV 接入自定义算法。

支持的协议标识包括 RSA PKCS#1 v1.5、RSA-PSS、ECDSA 的 SHA-1/SHA-224/SHA-256/SHA-384/SHA-512 形式以及 Ed25519、Ed448。摘要枚举只表达证书协议,不承诺当前裁剪构建包含对应验签实现。

RSA PKCS#1 按 RFC 4055 同时接受 NULL 和缺省参数。RSA-PSS 要求参数序列存在,完整公开主摘要、MGF1 摘要、盐长和 trailer;默认值是 SHA-1、MGF1-SHA-1、20 字节盐和 trailer 1。解析器接受 RFC 4055 要求兼容的显式默认值,同时拒绝重复、乱序、未知上下文字段、非 MGF1、溢出盐长和非 1 trailer。ECDSA、Ed25519 与 Ed448 参数必须缺省。

签名验证

签名验证按协议分派、摘要和密码后端分层裁剪。基础 x509_verify 不强制拉入任何密码算法;需要哪类证书就启用对应后端:

底层入口接受公开协议模型,可用于证书、CRL、OCSP 或调用方自己的签名对象:

xrtX509CertificateVerify(certificate, issuer) 是常见路径的便利入口:它解析证书签名方案与签发者 SPKI,再复用同一底层分派。xrtX509CertificateVerifyKey(certificate, public_key) 接受已经提取或由信任配置直接提供的公钥,避免为了验证独立信任锚而伪造证书对象。这两个函数只验证 TBSCertificate 的密码签名,不比较 issuer/subject Name,也不检查时间、BasicConstraints、KeyUsage、未知 critical 扩展、撤销或信任锚;这些职责属于路径验证层。

RSA 后端支持 PKCS#1 v1.5 与 PSS 的 SHA-1/SHA-224/SHA-256/SHA-384/SHA-512。id-RSASSA-PSS 公钥只能验证 PSS;公钥参数存在时,主摘要、MGF1 摘要和 trailer 必须与签名参数一致,签名盐长必须不小于公钥声明的下限。参数缺省的 PSS 公钥不附加参数限制。该规则补齐了旧版只记录 PSS 密钥类型、未执行 RFC 4055 公钥限制的缺口。

ECDSA 后端严格解码 DER r,s,根据 SPKI 命名曲线选择 P-256 或 P-384,并允许协议 OID 指定的任意受支持摘要组合。摘要按 ECDSA bits2int 规则进入曲线底座,不再错误地把 P-256 固定为 SHA-256、P-384 固定为 SHA-384。已解析但当前没有后端的 P-521 和 Ed448 返回 XERR_UNSUPPORTED,不会伪装成签名不匹配。

所有失败都返回 false 并设置 xrt.x509 / X509_ERROR_SIGNATURE 或参数错误;密码验证失败通过 xrtErrorCause 保留 xrt.crypto 原因。有效路径使用栈摘要和借用视图,不分配堆内存。调用方可以直接启用 x509_verify 做协议分派,并自行接管未启用或未来算法。

服务身份

x509_identity 按 RFC 9525 匹配 TLS 服务身份。它依赖 x509_profile 和网络地址基础层,但不执行签名或证书路径验证。匹配只检查 SubjectAltName 中的 DNS-ID 与 IP-ID,不读取 Common Name。

返回 X509_VALUE 表示匹配并可选发布实际 SAN,X509_DONE 表示引用身份有效但没有匹配,X509_ERROR 表示引用身份或 SAN 结构无效。TLS 层应把 X509_DONE 转换为握手身份错误,而协议工具可以继续自行决定策略。

DNS 比较使用大小写不敏感 ASCII 标签。引用身份必须是 ASCII preferred-name/A-label 形式;U-label 应由 URL/IDNA 层先转换。证书通配符只能是唯一且完整的最左标签,并且只匹配一个标签;无效的 presented DNS-ID 会被忽略。一个结尾根点在比较时被规范化。公共后缀策略不属于证书匹配层,因而 *.com 的语法有效性不会依赖内置后缀表。

IPv4 和 IPv6 引用身份复用 xrtNetAddrParse 的严格文本解析,并与 iPAddress SAN 做 4 或 16 字节精确比较。高层入口接受裸 IPv6 和 URL 常见的方括号 IPv6;Scope ID 被拒绝。只由 DNS 解析得到的连接地址仍应使用原 DNS-ID,而不是间接改用 IP-ID。

Profile 扩展

x509_profile 在通用 Extension 视图之上提供常用证书 profile 的严格类型化读取。它依赖 x509_parse,不依赖签名算法、信任库、文件或网络,并保持有效路径零分配。未出现的扩展返回 X509_DONE,畸形扩展返回 X509_ERROR,成功结果返回 X509_VALUE。

SubjectAltName 和 IssuerAltName 分别通过 xrtX509SubjectAltName 与 xrtX509IssuerAltName 返回同一种借用游标,公开所有九种 GeneralName。DNS、邮件和 URI 保留 IA5 内容;IP 地址严格限制为 4 或 16 字节;directoryName 继续由 Name 游标解释。profile 层只验证结构和基本内容,主机名语法、通配符与服务身份匹配由独立身份层负责。

xrtX509KeyUsage 返回 X509_USAGE_* 位值,并拒绝空值、非最小 named-bit 编码以及缺少 keyAgreement 的 encipherOnly/decipherOnly。xrtX509BasicConstraints 区分 CA、pathLenConstraint 不存在和数值为零,拒绝显式默认 false 以及非 CA 的路径限制。

ExtendedKeyUsage 使用公开 OID 序列游标,保留未知用途并拒绝空序列和重复 OID。SubjectKeyIdentifier 返回非空 OCTET STRING 的借用内容。xrtX509GeneralNameInit 与 xrtX509OidInit 也可脱离证书直接解析协议层 DER,避免上层再次实现相同游标。通用 OID 游标使用 X509_ERROR_OID_LIST;EKU 入口使用 X509_ERROR_EXTENDED_KEY_USAGE 并把前者保留为 cause。

xrtX509SubjectKeyIdParse 和 xrtX509AuthorityKeyIdParse 可以直接解析扩展正文,证书便利入口则负责查找扩展并执行 profile 约束。AKI 公开 keyIdentifier、authorityCertIssuer 游标和规范 DER INTEGER 的完整序列号内容;issuer 与 serial 必须同时出现或同时缺省。SKI、AKI 在证书中必须是 non-critical,所有结果都借用输入 DER,并且只在成功时发布。

认证路径

x509_path 验证调用方已经按“目标证书在前、中间 CA 依次靠近信任锚”排列的路径。信任锚是验证输入,不属于候选认证路径;xrtX509Anchor 从受信任证书提取 Subject、公钥、证书身份和可选 NameConstraints,路径中再次出现同一锚证书会被拒绝。调用方也可以直接构造裸锚,此时 Certificate 留空,并可通过 HasNameConstraints 和 NameConstraints 提供独立的锚约束元数据。

验证在调用方给定的精确时间检查每张路径证书,并拒绝重复证书、发行者链断裂、签名失败和未处理的 critical 扩展。中间 CA 必须具有 nonempty Subject 和 critical BasicConstraints(cA=TRUE);存在 KeyUsage 时必须允许 keyCertSign,出现 pathLenConstraint 时则必须显式具有该 KeyUsage。路径长度只计算当前 CA 下方的非 self-issued 中间 CA,不计算目标证书。中间 CA 的 ExtendedKeyUsage 若存在,也必须允许请求的应用用途或 anyExtendedKeyUsage,不能只约束目标证书。

每张 CA 证书和信任锚的 NameConstraints 都应用到目标及其下方全部非 self-issued 中间证书;self-issued 中间证书按 RFC 5280 跳过,但目标即使 self-issued 也必须检查。多个约束层自然形成交集,目标证书自身携带 NameConstraints 会被拒绝。路径错误使用 X509_ERROR_NAME_CONSTRAINTS 包装底层具体名称失败,并保留原因链。

X509_PATH_REQUIRE_KEY_USAGE 和 X509_PATH_REQUIRE_PURPOSE 可要求目标证书显式包含指定 KeyUsage 与 ExtendedKeyUsage;自定义 critical 扩展可由 xx509criticalproc 明确接管。xx509pathconfig 不保存系统当前时间,调用方必须显式提供验证时间,使测试、缓存和重放检查具有确定语义。

xrtX509IssuerMatch 是路径构建器可复用的候选筛选层:先比较 Issuer/Subject,再使用可用的 AKI/SKI 或 authority issuer/serial 排除确定不匹配的候选,最终签名仍由路径验证器决定。它不会因为候选缺少 SKI 就误判为不匹配。

x509_path_build 在已解析的候选发行者和独立信任锚中自动搜索。每一层先尝试直接终止到调用方顺序中的信任锚,再按候选顺序执行 Issuer/Subject、AKI/SKI 筛选和确定性深度优先回溯;完整候选路径始终交给同一个 xrtX509PathValidate 验证,不另设宽松验证路径。调用方可以通过候选和锚顺序表达稳定偏好,返回路径永远不包含信任锚证书。

ppPath 是调用方提供的搜索与输出缓冲,容量同时限制最大路径深度;它不得与 source.Issuers 数组重叠。失败时 ppPath 可包含搜索暂存值,但 xx509pathresult 保持原值;成功时发布目标在前的完整路径长度和命中的借用锚。容量不够返回 XERR_RANGE,没有路径返回 XERR_NOT_FOUND,完整分支的首个验证错误保留在 X509_ERROR_PATH_BUILD 原因链中。容量不超过 16 时搜索帧不使用堆内存,更深路径只为搜索帧分配一次内存。证书对象、候选数组、锚和所有 DER 必须在调用期间保持有效。

信任库

x509_store 是拥有式信任锚集合。xrtX509StoreAdd 复制并严格解析一张 DER 证书,成功返回 X509_VALUE,字节完全相同的重复证书返回 X509_DONE;调用方可在返回后立即释放或复用原缓冲。每项只保存一份 DER,已解析证书和独立锚都借用这份副本。

xrtX509StoreAddPem 遍历说明文本中的全部 PEM 块,只导入标签精确为 CERTIFICATE 的块,并忽略其他合法标签。整个调用是事务:任何边界、Base64、DER、证书或内存失败都会释放本次已经加入的证书,保持调用前数量,并且不修改 pAdded;成功时可选的 pAdded 只计算新增锚,重复块计为零。没有任何证书块返回 XERR_NOT_FOUND。底层 PEM 或证书错误保留在 X509_ERROR_TRUST_STORE 原因链中。

独立裁剪的 x509_store_file 提供 xrtX509StoreAddFile,整文件读取后自动识别一张 DER 证书或包含多张证书的 PEM 文本。有效 DER 以顶层 SEQUENCE 为优先,其他内容按行首 BEGIN 边界识别 PEM;空文件和不合法内容明确失败。导入仍保持事务性,可选的 pAdded 只在成功时发布。文件、PEM 与证书错误由 X509_ERROR_TRUST_STORE_FILE 包装,并保留原始原因链;若 OOM 已使错误对象也无法分配,则按统一错误模型退化为静态 XERR_MEMORY。读入缓冲在返回前释放,信任库继续只拥有每张证书的一份 DER。

x509_store_system 提供 xrtX509StoreAddSystem 和拥有式便捷入口 xrtX509StoreSystem。前者把当前系统锚事务式追加到既有库,可选的 pAdded 只统计去重后的新增项;后者返回一份可继续修改、最终由 xrtX509StoreFree 释放的独立快照,不使用全局缓存,也不会修改平台信任设置。Windows 动态枚举当前用户和本机的 ROOT 逻辑库,不增加 Crypt32 静态链接;macOS 动态读取 Security.framework 为调用方提供的默认锚;其他 Unix 首先使用 SSL_CERT_FILE 和冒号分隔的 SSL_CERT_DIR,未设置时读取主流系统 bundle 与 OpenSSL 哈希目录。Unix 环境变量分别覆盖同类默认位置,证书目录项必须采用 xxxxxxxx.n 哈希名称,空路径片段被忽略。

系统装载不会静默接受部分结果:平台枚举、显式环境路径、文件解析或内存失败都会回滚本次全部新增项。X509_ERROR_TRUST_STORE_SYSTEM 保存平台错误码或底层文件/证书原因链;完全 OOM 时仍允许退化为静态 XERR_MEMORY。系统信任快照只表达锚集合,不复制 Windows/macOS 原生验证器的吊销、策略、企业限制或按用途动态决策;这些策略仍由 XRT 路径层显式执行。

xrtX509StoreCertificate 与 xrtX509StoreAnchor 公开按索引借用的底层视图,xrtX509StoreSource 则把外部中间证书指针和库内连续锚数组组合成建链源。向信任库继续写入可能移动证书和锚结构,因此会使既有结构指针和 xx509pathsource 失效;DER 内容只在对应项仍存在时有效。完成构建后可从多个线程并发只读,任何写入或释放都不得与读取并发。信任库不替调用方判断某张证书是否应受信任,显式加入即表示调用方授予信任锚地位。

建链器本身不会读取文件、系统信任库、网络或 AIA,也不替调用方无限扩张候选集合;处理不可信证书集合时应限制候选数量和路径容量。文件与系统信任装载分别由可选的 x509_store_file 和 x509_store_system 提供;NameConstraints 已由路径层处理,证书策略、CRL 与 OCSP 仍作为后续独立可裁剪层补充。未知 critical 扩展一律拒绝,不能静默绕过。常见有效验证与建链路径不分配堆内存,签名算法后端继续按 RSA、ECDSA、Ed25519 独立裁剪。

示例与测试

  • examples/x509/inspect/main.c
  • examples/x509/name/main.c
  • examples/x509/name_constraints/main.c
  • examples/x509/path/main.c
  • examples/x509/path_build/main.c
  • examples/x509/store/main.c
  • examples/x509/store_file/main.c
  • examples/x509/store_system/main.c
  • examples/x509/crl/main.c
  • examples/x509/distribution/main.c
  • examples/x509/crl_profile/main.c
  • examples/x509/crl_policy/main.c
  • tests/x509/test_x509_parse.c
  • tests/x509/test_x509_parse_oom.c
  • tests/x509/test_x509_profile.c
  • tests/x509/test_x509_profile_oom.c
  • tests/x509/test_x509_profile_mutation.c
  • tests/x509/test_x509_crl.c
  • tests/x509/test_x509_crl_oom.c
  • tests/x509/test_x509_crl_mutation.c
  • tests/x509/test_x509_distribution.c
  • tests/x509/test_x509_distribution_oom.c
  • tests/x509/test_x509_distribution_mutation.c
  • tests/x509/test_x509_crl_profile.c
  • tests/x509/test_x509_crl_profile_oom.c
  • tests/x509/test_x509_crl_profile_mutation.c
  • tests/x509/test_x509_crl_verify.c
  • tests/x509/test_x509_crl_verify_rsa.c
  • tests/x509/test_x509_crl_verify_rsa_oom.c
  • tests/x509/test_x509_crl_policy_rsa.c
  • tests/x509/test_x509_crl_policy_rsa_oom.c
  • tests/x509/test_x509_name.c
  • tests/x509/test_x509_name_oom.c
  • tests/x509/test_x509_name_mutation.c
  • tests/x509/test_x509_name_constraints.c
  • tests/x509/test_x509_name_constraints_oom.c
  • tests/x509/test_x509_name_constraints_mutation.c
  • tests/x509/test_x509_identity.c
  • tests/x509/test_x509_identity_oom.c
  • tests/x509/test_x509_identity_mutation.c
  • tests/x509/test_x509_signature.c
  • tests/x509/test_x509_signature_oom.c
  • tests/x509/test_x509_signature_mutation.c
  • tests/x509/test_x509_verify.c
  • tests/x509/test_x509_verify_oom.c
  • tests/x509/test_x509_verify_rsa.c
  • tests/x509/test_x509_verify_rsa_oom.c
  • tests/x509/test_x509_verify_ecdsa.c
  • tests/x509/test_x509_verify_ed25519.c
  • tests/x509/test_x509_path.c
  • tests/x509/test_x509_path_oom.c
  • tests/x509/test_x509_path_build.c
  • tests/x509/test_x509_path_build_oom.c
  • tests/x509/test_x509_path_rsa.c
  • tests/x509/test_x509_path_rsa_oom.c
  • tests/x509/test_x509_path_build_rsa.c
  • tests/x509/test_x509_path_build_rsa_oom.c
  • tests/x509/test_x509_store.c
  • tests/x509/test_x509_store_oom.c
  • tests/x509/test_x509_store_rsa.c
  • tests/x509/test_x509_store_file.c
  • tests/x509/test_x509_store_file_oom.c
  • tests/x509/test_x509_store_system.c
  • tests/x509/test_x509_store_system_oom.c
  • tests/single/test_single_x509_parse.c
  • tests/single/test_single_x509_profile.c
  • tests/single/test_single_x509_crl.c
  • tests/single/test_single_x509_distribution.c
  • tests/single/test_single_x509_crl_profile.c
  • tests/single/test_single_x509_crl_verify.c
  • tests/single/test_single_x509_crl_verify_rsa.c
  • tests/single/test_single_x509_crl_policy_rsa.c
  • tests/single/test_single_x509_name_constraints.c
  • tests/single/test_single_x509_identity.c
  • tests/single/test_single_x509_signature.c
  • tests/single/test_single_x509_verify.c
  • tests/single/test_single_x509_verify_rsa.c
  • tests/single/test_single_x509_verify_ecdsa.c
  • tests/single/test_single_x509_verify_ed25519.c
  • tests/single/test_single_x509_path.c
  • tests/single/test_single_x509_path_build.c
  • tests/single/test_single_x509_path_build_rsa.c
  • tests/single/test_single_x509_store.c
  • tests/single/test_single_x509_store_rsa.c
  • tests/single/test_single_x509_store_file.c
  • tests/single/test_single_x509_store_system.c
  • tests/fixtures/x509_vectors.h
  • tests/fixtures/x509_profile_vectors.h
  • tests/fixtures/x509_crl_vectors.h
  • tests/fixtures/x509_distribution_vectors.h
  • tests/fixtures/x509_crl_profile_vectors.h
  • tests/fixtures/x509_legacy_cert.h
  • tests/fixtures/x509_signature_vectors.h
  • tests/fixtures/x509_verify_vectors.h
  • tests/fixtures/x509_path_legacy.h
  • tests/fixtures/x509_name_constraints_vectors.h
  • examples/x509/profile/main.c
  • examples/x509/identity/main.c
  • examples/x509/signature/main.c
  • examples/x509/verify/main.c

测试把旧版真实 TLS 证书互操作与独立小型 DER 边界向量分开:前者验证生态兼容,后者精确覆盖版本、时间、算法、重复扩展、critical 默认值、空 Subject、未知公钥、失败原子性和错误原因链。

xx509version类型

X.509 版本使用规范文档中的自然编号。

值语义
X509_VERSION_1v1
X509_VERSION_2v2
X509_VERSION_3v3
typedef enum xx509version { X509_VERSION_1 = 1, X509_VERSION_2, X509_VERSION_3 } xx509version;

xx509result类型

X.509 游标把正常结束和结构错误分开表达。

值语义
X509_ERROR失败
X509_DONE完成
X509_VALUE已产出值
typedef enum xx509result { X509_ERROR = -1, X509_DONE = 0, X509_VALUE = 1 } xx509result;

xx509keytype类型

X.509 公钥类型独立于当前加密后端支持范围。

值语义
X509_KEY_UNKNOWN未知
X509_KEY_RSARSA
X509_KEY_RSA_PSSRSA-PSS
X509_KEY_ECECDSA
X509_KEY_ED25519Ed25519
X509_KEY_ED448ED448
X509_KEY_X25519X25519
X509_KEY_X448X448
typedef enum xx509keytype { X509_KEY_UNKNOWN = 0, X509_KEY_RSA, X509_KEY_RSA_PSS, X509_KEY_EC, X509_KEY_ED25519, X509_KEY_ED448, X509_KEY_X25519, X509_KEY_X448 } xx509keytype;

xx509curve类型

已知命名曲线;未知曲线仍通过 Algorithm 和 Key 原始视图暴露。

值语义
X509_CURVE_UNKNOWN未知
X509_CURVE_P256P256
X509_CURVE_P384P384
X509_CURVE_P521P-521 曲线
typedef enum xx509curve { X509_CURVE_UNKNOWN = 0, X509_CURVE_P256, X509_CURVE_P384, X509_CURVE_P521 } xx509curve;

xx509error类型

X.509 模块稳定错误码。

值语义
X509_ERROR_DER失败
X509_ERROR_CERTIFICATE失败
X509_ERROR_VERSION失败
X509_ERROR_SERIAL失败
X509_ERROR_ALGORITHM失败
X509_ERROR_NAME名称
X509_ERROR_TIME时间
X509_ERROR_PUBLIC_KEY失败
X509_ERROR_EXTENSION失败
X509_ERROR_DUPLICATE_EXTENSION失败
X509_ERROR_SIGNATURE失败
X509_ERROR_NOT_FOUND未找到
X509_ERROR_GENERAL_NAMEGENERAL名称
X509_ERROR_OID_LIST失败
X509_ERROR_KEY_USAGE失败
X509_ERROR_BASIC_CONSTRAINTS失败
X509_ERROR_EXTENDED_KEY_USAGE失败
X509_ERROR_KEY_IDENTIFIER失败
X509_ERROR_DNS_NAMEDNS名称
X509_ERROR_IDENTITY失败
X509_ERROR_SIGNATURE_ALGORITHM失败
X509_ERROR_TRUST_ANCHOR失败
X509_ERROR_ISSUER失败
X509_ERROR_PATH失败
X509_ERROR_PATH_CONSTRAINT失败
X509_ERROR_CRITICAL_EXTENSION失败
X509_ERROR_PURPOSE失败
X509_ERROR_PATH_BUILD失败
X509_ERROR_TRUST_STORE失败
X509_ERROR_TRUST_STORE_FILE失败
X509_ERROR_TRUST_STORE_SYSTEM失败
X509_ERROR_CRL失败
X509_ERROR_CRL_ENTRY失败
X509_ERROR_CRL_NUMBER失败
X509_ERROR_CRL_ISSUING_POINT失败
X509_ERROR_CRL_REASON失败
X509_ERROR_CRL_INVALIDITY_DATE失败
X509_ERROR_CRL_CERTIFICATE_ISSUER失败
X509_ERROR_DISTRIBUTION_POINT失败
X509_ERROR_CRL_POLICY失败
X509_ERROR_CRL_SCOPE失败
X509_ERROR_CRL_DELTA失败
X509_ERROR_REVOCATION失败
X509_ERROR_NAME_CONSTRAINTS名称约束解析失败
typedef enum xx509error { X509_ERROR_DER = 1, X509_ERROR_CERTIFICATE, X509_ERROR_VERSION, X509_ERROR_SERIAL, X509_ERROR_ALGORITHM, X509_ERROR_NAME, X509_ERROR_TIME, X509_ERROR_PUBLIC_KEY, X509_ERROR_EXTENSION, X509_ERROR_DUPLICATE_EXTENSION, X509_ERROR_SIGNATURE, X509_ERROR_NOT_FOUND, X509_ERROR_GENERAL_NAME, X509_ERROR_OID_LIST, X509_ERROR_KEY_USAGE, X509_ERROR_BASIC_CONSTRAINTS, X509_ERROR_EXTENDED_KEY_USAGE, X509_ERROR_KEY_IDENTIFIER, X509_ERROR_DNS_NAME, X509_ERROR_IDENTITY, X509_ERROR_SIGNATURE_ALGORITHM, X509_ERROR_TRUST_ANCHOR, X509_ERROR_ISSUER, X509_ERROR_PATH, X509_ERROR_PATH_CONSTRAINT, X509_ERROR_CRITICAL_EXTENSION, X509_ERROR_PURPOSE, X509_ERROR_PATH_BUILD, X509_ERROR_TRUST_STORE, X509_ERROR_TRUST_STORE_FILE, X509_ERROR_TRUST_STORE_SYSTEM, X509_ERROR_CRL, X509_ERROR_CRL_ENTRY, X509_ERROR_CRL_NUMBER, X509_ERROR_CRL_ISSUING_POINT, X509_ERROR_CRL_REASON, X509_ERROR_CRL_INVALIDITY_DATE, X509_ERROR_CRL_CERTIFICATE_ISSUER, X509_ERROR_DISTRIBUTION_POINT, X509_ERROR_CRL_POLICY, X509_ERROR_CRL_SCOPE, X509_ERROR_CRL_DELTA, X509_ERROR_REVOCATION, X509_ERROR_NAME_CONSTRAINTS } xx509error;

xx509algorithm类型

AlgorithmIdentifier 的全部视图都借用原 DER;Parameters 保存完整 TLV。

字段类型语义
RawxbytesviewRaw
OidxbytesviewOid
ParametersxbytesviewParameters
HasParametersboolHasParameters
typedef struct xx509algorithm { xbytesview Raw; xbytesview Oid; xbytesview Parameters; bool HasParameters; } xx509algorithm;

xx509cert类型

证书视图零分配地借用调用方 DER;Serial 保留规范 INTEGER 的完整内容。

字段类型语义
RawxbytesviewRaw
TbsxbytesviewTbs
Versionxx509version结构版本
SerialxbytesviewSerial
TbsSignaturexx509algorithmTbsSignature
IssuerxbytesviewIssuer
NotBeforextimeNotBefore
NotAfterxtimeNotAfter
SubjectxbytesviewSubject
SubjectPublicKeyInfoxbytesviewSubjectPublicKeyInfo
IssuerUniqueIdxbytesviewIssuerUniqueId
IssuerUniqueIdUnusedBitsuint8IssuerUniqueIdUnusedBits
SubjectUniqueIdxbytesviewSubjectUniqueId
SubjectUniqueIdUnusedBitsuint8SubjectUniqueIdUnusedBits
ExtensionsxbytesviewExtensions
SignatureAlgorithmxx509algorithmSignatureAlgorithm
SignaturexbytesviewSignature
typedef struct xx509cert { xbytesview Raw; xbytesview Tbs; xx509version Version; xbytesview Serial; xx509algorithm TbsSignature; xbytesview Issuer; xtime NotBefore; xtime NotAfter; xbytesview Subject; xbytesview SubjectPublicKeyInfo; xbytesview IssuerUniqueId; uint8 IssuerUniqueIdUnusedBits; xbytesview SubjectUniqueId; uint8 SubjectUniqueIdUnusedBits; xbytesview Extensions; xx509algorithm SignatureAlgorithm; xbytesview Signature; } xx509cert;

xx509namecursor类型

Name 游标逐个返回 AttributeTypeAndValue,并保留所属 RDN 编号。

字段类型语义
RdnsxdercursorRdns
AttributesxdercursorAttributes
Rdnsize_tRdn
ActiveboolActive
typedef struct xx509namecursor { xdercursor Rdns; xdercursor Attributes; size_t Rdn; bool Active; } xx509namecursor;

xx509nameattr类型

Name 属性保留值的 ASN.1 标签和借用内容,不强制转换字符集。

字段类型语义
RawxbytesviewRaw
OidxbytesviewOid
ValueTagxasn1tagValueTag
Valuexbytesview值
Rdnsize_tRdn
typedef struct xx509nameattr { xbytesview Raw; xbytesview Oid; xasn1tag ValueTag; xbytesview Value; size_t Rdn; } xx509nameattr;

xx509extcursor类型

Extension 游标遍历证书、CRL 或其他协议对象中的扩展 SEQUENCE。

字段类型语义
Itemsxdercursor元素数组
typedef struct xx509extcursor { xdercursor Items; } xx509extcursor;

xx509ext类型

Extension.Value 是 extnValue OCTET STRING 内借用的 DER 内容。

字段类型语义
RawxbytesviewRaw
OidxbytesviewOid
CriticalboolCritical
Valuexbytesview值
typedef struct xx509ext { xbytesview Raw; xbytesview Oid; bool Critical; xbytesview Value; } xx509ext;

xx509pubkey类型

公钥视图统一保留算法和 BIT STRING 内容,RSA 额外公开模数与指数。

字段类型语义
Typexx509keytype类型
Curvexx509curveCurve
Algorithmxx509algorithmAlgorithm
Keyxbytesview键
ModulusxbytesviewModulus
Exponentxbytesview指数
typedef struct xx509pubkey { xx509keytype Type; xx509curve Curve; xx509algorithm Algorithm; xbytesview Key; xbytesview Modulus; xbytesview Exponent; } xx509pubkey;

xx509crlversion类型

CRL 版本使用规范文档中的自然编号;省略 version 表示 v1。

值语义
X509_CRL_VERSION_1X509CRLVERSION1
X509_CRL_VERSION_2CRL v2
typedef enum xx509crlversion { X509_CRL_VERSION_1 = 1, X509_CRL_VERSION_2 } xx509crlversion;

xx509crl类型

CRL 视图零分配地借用调用方 DER,并保留全部可扩展协议字段。

字段类型语义
RawxbytesviewRaw
TbsxbytesviewTbs
Versionxx509crlversion结构版本
TbsSignaturexx509algorithmTbsSignature
IssuerxbytesviewIssuer
ThisUpdatextimeThisUpdate
HasNextUpdateboolHasNextUpdate
NextUpdatextimeNextUpdate
RevokedxbytesviewRevoked
ExtensionsxbytesviewExtensions
SignatureAlgorithmxx509algorithmSignatureAlgorithm
SignaturexbytesviewSignature
typedef struct xx509crl { xbytesview Raw; xbytesview Tbs; xx509crlversion Version; xx509algorithm TbsSignature; xbytesview Issuer; xtime ThisUpdate; bool HasNextUpdate; xtime NextUpdate; xbytesview Revoked; xbytesview Extensions; xx509algorithm SignatureAlgorithm; xbytesview Signature; } xx509crl;

xx509crlcursor类型

CRL 条目游标保留列表版本,以正确解释 v2 条目扩展。

字段类型语义
Itemsxdercursor元素数组
Versionxx509crlversion结构版本
typedef struct xx509crlcursor { xdercursor Items; xx509crlversion Version; } xx509crlcursor;

xx509crlentry类型

CRL 条目保留完整序列号、撤销时间和可选扩展列表。

字段类型语义
RawxbytesviewRaw
SerialxbytesviewSerial
RevokedAtxtimeRevokedAt
ExtensionsxbytesviewExtensions
typedef struct xx509crlentry { xbytesview Raw; xbytesview Serial; xtime RevokedAt; xbytesview Extensions; } xx509crlentry;

xx509hash类型

签名摘要是协议标识,不表示当前构建一定包含对应密码后端。

值语义
X509_HASH_NONE无
X509_HASH_SHA1SHA1
X509_HASH_SHA224SHA224
X509_HASH_SHA256SHA256
X509_HASH_SHA384SHA384
X509_HASH_SHA512SHA-512
typedef enum xx509hash { X509_HASH_NONE = 0, X509_HASH_SHA1, X509_HASH_SHA224, X509_HASH_SHA256, X509_HASH_SHA384, X509_HASH_SHA512 } xx509hash;

xx509signaturetype类型

签名方案与公钥类型分离,ECDSA 的曲线由签名者公钥决定。

值语义
X509_SIGNATURE_RSA_PKCS1RSAPKCS1
X509_SIGNATURE_RSA_PSSRSAPSS
X509_SIGNATURE_ECDSAECDSA
X509_SIGNATURE_ED25519ED25519
X509_SIGNATURE_ED448Ed448
typedef enum xx509signaturetype { X509_SIGNATURE_RSA_PKCS1 = 1, X509_SIGNATURE_RSA_PSS, X509_SIGNATURE_ECDSA, X509_SIGNATURE_ED25519, X509_SIGNATURE_ED448 } xx509signaturetype;

xx509signature类型

RSA-PSS 额外公开 MGF1 摘要、盐长和尾字段,其余方案保留默认零值。

字段类型语义
Typexx509signaturetype类型
Hashxx509hashHash
MaskHashxx509hashMaskHash
SaltSizesize_tSaltSize
Traileruint32尾部
typedef struct xx509signature { xx509signaturetype Type; xx509hash Hash; xx509hash MaskHash; size_t SaltSize; uint32 Trailer; } xx509signature;

xx509gennametype类型

GeneralName 使用 RFC 5280 CHOICE 的上下文标签编号。

值语义
X509_NAME_OTHEROTHER
X509_NAME_EMAILEMAIL
X509_NAME_DNSDNS
X509_NAME_X400X400
X509_NAME_DIRECTORYDIRECTORY
X509_NAME_EDIEDI
X509_NAME_URIURI
X509_NAME_IPIP
X509_NAME_REGISTERED_IDregisteredID 属性
typedef enum xx509gennametype { X509_NAME_OTHER = 0, X509_NAME_EMAIL = 1, X509_NAME_DNS = 2, X509_NAME_X400 = 3, X509_NAME_DIRECTORY = 4, X509_NAME_EDI = 5, X509_NAME_URI = 6, X509_NAME_IP = 7, X509_NAME_REGISTERED_ID = 8 } xx509gennametype;

xx509keyusage类型

KeyUsage 位值与 RFC 5280 位编号一一对应。

值语义
X509_USAGE_DIGITAL_SIGNATUREDIGITALSIGNATURE
X509_USAGE_CONTENT_COMMITMENTCONTENTCOMMITMENT
X509_USAGE_KEY_ENCIPHERMENTKEYENCIPHERMENT
X509_USAGE_DATA_ENCIPHERMENT数据损坏ENCIPHERMENT
X509_USAGE_KEY_AGREEMENTKEYAGREEMENT
X509_USAGE_CERT_SIGNCERTSIGN
X509_USAGE_CRL_SIGNCRLSIGN
X509_USAGE_ENCIPHER_ONLYENCIPHERONLY
X509_USAGE_DECIPHER_ONLY仅解密(CRL 用)
typedef enum xx509keyusage { X509_USAGE_DIGITAL_SIGNATURE = UINT16_C(0x0001), X509_USAGE_CONTENT_COMMITMENT = UINT16_C(0x0002), X509_USAGE_KEY_ENCIPHERMENT = UINT16_C(0x0004), X509_USAGE_DATA_ENCIPHERMENT = UINT16_C(0x0008), X509_USAGE_KEY_AGREEMENT = UINT16_C(0x0010), X509_USAGE_CERT_SIGN = UINT16_C(0x0020), X509_USAGE_CRL_SIGN = UINT16_C(0x0040), X509_USAGE_ENCIPHER_ONLY = UINT16_C(0x0080), X509_USAGE_DECIPHER_ONLY = UINT16_C(0x0100)

xx509gencursor类型

GeneralNames 游标借用一项完整 DER SEQUENCE。

字段类型语义
Itemsxdercursor元素数组
typedef struct xx509gencursor { xdercursor Items; } xx509gencursor;

xx509genname类型

GeneralName.Value 借用上下文标签内容,Raw 保留完整 TLV。

字段类型语义
Typexx509gennametype类型
RawxbytesviewRaw
Valuexbytesview值
typedef struct xx509genname { xx509gennametype Type; xbytesview Raw; xbytesview Value; } xx509genname;

xx509oidcursor类型

OID 序列游标用于 EKU 和其他 SEQUENCE OF OBJECT IDENTIFIER。

字段类型语义
Itemsxdercursor元素数组
typedef struct xx509oidcursor { xdercursor Items; } xx509oidcursor;

xx509basicconstraints类型

BasicConstraints 同时区分 pathLenConstraint 不存在和数值为零。

字段类型语义
CAboolCA
HasPathLimitboolHasPathLimit
PathLimituint32PathLimit
typedef struct xx509basicconstraints { bool CA; bool HasPathLimit; uint32 PathLimit; } xx509basicconstraints;

xx509authoritykeyid类型

AuthorityKeyIdentifier 保留借用的 keyIdentifier、发行者游标和完整序列号。

字段类型语义
HasKeyIdboolHasKeyId
KeyIdxbytesviewKeyId
HasIssuerboolHasIssuer
Issuerxx509gencursorIssuer
HasSerialboolHasSerial
SerialxbytesviewSerial
typedef struct xx509authoritykeyid { bool HasKeyId; xbytesview KeyId; bool HasIssuer; xx509gencursor Issuer; bool HasSerial; xbytesview Serial; } xx509authoritykeyid;

xx509crlreasonflag类型

ReasonFlags 位值按 BIT STRING 位编号表达,与 CRLReason 枚举数值相互独立。

值语义
X509_CRL_REASON_FLAG_UNUSED位未使用
X509_CRL_REASON_FLAG_KEY_COMPROMISEKEYCOMPROMISE
X509_CRL_REASON_FLAG_CA_COMPROMISECACOMPROMISE
X509_CRL_REASON_FLAG_AFFILIATION_CHANGEDAFFILIATIONCHANGED
X509_CRL_REASON_FLAG_SUPERSEDEDSUPERSEDED
X509_CRL_REASON_FLAG_CESSATIONCESSATION
X509_CRL_REASON_FLAG_CERTIFICATE_HOLDCERTIFICATEHOLD
X509_CRL_REASON_FLAG_PRIVILEGE_WITHDRAWNPRIVILEGEWITHDRAWN
X509_CRL_REASON_FLAG_AA_COMPROMISEAACOMPROMISE
X509_CRL_REASON_FLAG_ALL全部
typedef enum xx509crlreasonflag { X509_CRL_REASON_FLAG_UNUSED = UINT16_C(0x0001), X509_CRL_REASON_FLAG_KEY_COMPROMISE = UINT16_C(0x0002), X509_CRL_REASON_FLAG_CA_COMPROMISE = UINT16_C(0x0004), X509_CRL_REASON_FLAG_AFFILIATION_CHANGED = UINT16_C(0x0008), X509_CRL_REASON_FLAG_SUPERSEDED = UINT16_C(0x0010), X509_CRL_REASON_FLAG_CESSATION = UINT16_C(0x0020), X509_CRL_REASON_FLAG_CERTIFICATE_HOLD = UINT16_C(0x0040), X509_CRL_REASON_FLAG_PRIVILEGE_WITHDRAWN = UINT16_C(0x0080), X509_CRL_REASON_FLAG_AA_COMPROMISE = UINT16_C(0x0100), X509_CRL_REASON_FLAG_ALL = UINT16_C(0x01FE)

xx509distributionnametype类型

DistributionPointName 区分完整 GeneralNames 和相对 CRL 发行者的单个 RDN。

值语义
X509_DISTRIBUTION_FULL_NAMEX509DISTRIBUTION已满名称
X509_DISTRIBUTION_RELATIVE_NAMErelativeTo distinguishedName 形式
typedef enum xx509distributionnametype { X509_DISTRIBUTION_FULL_NAME = 0, X509_DISTRIBUTION_RELATIVE_NAME = 1 } xx509distributionnametype;

xx509distributionname类型

分发点名称保留完整上下文 TLV;FullNames 仅在完整名称模式下有效。

字段类型语义
Typexx509distributionnametype类型
RawxbytesviewRaw
Valuexbytesview值
FullNamesxx509gencursorFullNames
typedef struct xx509distributionname { xx509distributionnametype Type; xbytesview Raw; xbytesview Value; xx509gencursor FullNames; } xx509distributionname;

xx509distributioncursor类型

分发点列表游标借用完整 CRLDistributionPoints DER。

字段类型语义
Itemsxdercursor元素数组
typedef struct xx509distributioncursor { xdercursor Items; } xx509distributioncursor;

xx509distributionpoint类型

DistributionPoint 保留三项可选字段和完整 DER 视图。

字段类型语义
RawxbytesviewRaw
HasNamebool是否名称
Namexx509distributionname名称
HasReasonsboolHasReasons
Reasonsuint16Reasons
HasIssuerboolHasIssuer
Issuerxx509gencursorIssuer
typedef struct xx509distributionpoint { xbytesview Raw; bool HasName; xx509distributionname Name; bool HasReasons; uint16 Reasons; bool HasIssuer; xx509gencursor Issuer; } xx509distributionpoint;

xx509crlreason类型

CRLReason 保留 RFC 5280 的协议数值;7 没有定义。

值语义
X509_CRL_REASON_UNSPECIFIEDUNSPECIFIED
X509_CRL_REASON_KEY_COMPROMISE密钥泄露
X509_CRL_REASON_CA_COMPROMISECA 泄露
X509_CRL_REASON_AFFILIATION_CHANGED隶属变更
X509_CRL_REASON_SUPERSEDED已被取代
X509_CRL_REASON_CESSATIONCESSATION
X509_CRL_REASON_CERTIFICATE_HOLD证书挂起
X509_CRL_REASON_REMOVEREMOVE
X509_CRL_REASON_PRIVILEGE_WITHDRAWN特权撤销
X509_CRL_REASON_AA_COMPROMISEAA 泄露
typedef enum xx509crlreason { X509_CRL_REASON_UNSPECIFIED = 0, X509_CRL_REASON_KEY_COMPROMISE = 1, X509_CRL_REASON_CA_COMPROMISE = 2, X509_CRL_REASON_AFFILIATION_CHANGED = 3, X509_CRL_REASON_SUPERSEDED = 4, X509_CRL_REASON_CESSATION = 5, X509_CRL_REASON_CERTIFICATE_HOLD = 6, X509_CRL_REASON_REMOVE = 8, X509_CRL_REASON_PRIVILEGE_WITHDRAWN = 9, X509_CRL_REASON_AA_COMPROMISE = 10 } xx509crlreason;

xx509issuingpoint类型

IssuingDistributionPoint 区分所有 DEFAULT、OPTIONAL 和作用域字段。

字段类型语义
HasDistributionPointboolHasDistributionPoint
DistributionPointxx509distributionnameDistributionPoint
OnlyUserCertificatesboolOnlyUserCertificates
OnlyCaCertificatesboolOnlyCaCertificates
HasReasonsboolHasReasons
Reasonsuint16Reasons
IndirectboolIndirect
OnlyAttributeCertificatesboolOnlyAttributeCertificates
typedef struct xx509issuingpoint { bool HasDistributionPoint; xx509distributionname DistributionPoint; bool OnlyUserCertificates; bool OnlyCaCertificates; bool HasReasons; uint16 Reasons; bool Indirect; bool OnlyAttributeCertificates; } xx509issuingpoint;

xx509subtreecursor类型

GeneralSubtrees 游标借用 permitted 或 excluded 的隐式 SEQUENCE 内容。

字段类型语义
Itemsxdercursor元素数组
typedef struct xx509subtreecursor { xdercursor Items; } xx509subtreecursor;

xx509subtree类型

GeneralSubtree 保留名称基点和任意精度非负 distance 借用视图。

字段类型语义
RawxbytesviewRaw
Basexx509gennameBase
HasMinimumboolHasMinimum
MinimumxbytesviewMinimum
HasMaximumboolHasMaximum
MaximumxbytesviewMaximum
typedef struct xx509subtree { xbytesview Raw; xx509genname Base; bool HasMinimum; xbytesview Minimum; bool HasMaximum; xbytesview Maximum; } xx509subtree;

xx509nameconstraints类型

NameConstraints 明确区分 permitted/excluded 不存在与非空列表。

字段类型语义
HasPermittedboolHasPermitted
Permittedxx509subtreecursorPermitted
HasExcludedboolHasExcluded
Excludedxx509subtreecursorExcluded
typedef struct xx509nameconstraints { bool HasPermitted; xx509subtreecursor Permitted; bool HasExcluded; xx509subtreecursor Excluded; } xx509nameconstraints;

xx509crlpolicyflag类型

CRL policy 标志只控制规范要求的字段是否必须显式存在。

值语义
X509_CRL_REQUIRE_NEXT_UPDATE要求 NextUpdate
X509_CRL_REQUIRE_NUMBERNUMBER
X509_CRL_REQUIRE_AUTHORITY_KEY_IDAUTHORITYKEY标识
X509_CRL_REQUIRE_KEY_IDENTIFIERKEYIDENTIFIER
X509_CRL_REQUIRE_KEY_USAGEKEYUSAGE
X509_CRL_ALLOW_SHA1允许 SHA-1 签名的 CRL
typedef enum xx509crlpolicyflag { X509_CRL_REQUIRE_NEXT_UPDATE = UINT32_C(0x00000001), X509_CRL_REQUIRE_NUMBER = UINT32_C(0x00000002), X509_CRL_REQUIRE_AUTHORITY_KEY_ID = UINT32_C(0x00000004), X509_CRL_REQUIRE_KEY_IDENTIFIER = UINT32_C(0x00000008), X509_CRL_REQUIRE_KEY_USAGE = UINT32_C(0x00000010), /* 仅用于必须兼容历史基础设施的显式弱算法策略。 */ X509_CRL_ALLOW_SHA1 = UINT32_C(0x00000020)

xx509revocationstate类型

单项查询区分完整 CRL 的有效、撤销与 delta CRL 的移除记录。

值语义
X509_REVOCATION_GOODGOOD
X509_REVOCATION_REVOKEDREVOKED
X509_REVOCATION_REMOVED已从 CRL 移除
typedef enum xx509revocationstate { X509_REVOCATION_GOOD = 0, X509_REVOCATION_REVOKED, X509_REVOCATION_REMOVED } xx509revocationstate;

xx509crlconfig类型

CRL 策略集中表达确定时间、时钟容差和 critical 扩展处理。

字段类型语义
Timextime时间戳(公元 UTC 毫秒)
Skewuint64Skew
Flagsuint32标志位
Criticalxx509crlcriticalprocCritical
UserDataptr用户数据
typedef struct xx509crlconfig { xtime Time; uint64 Skew; uint32 Flags; xx509crlcriticalproc Critical; ptr UserData; } xx509crlconfig;

xx509crlvalid类型

已验证 CRL 借用原 CRL、签发者证书和全部 profile 子视图。

字段类型语义
Crlconst xx509crl*Crl
Issuerconst xx509cert*Issuer
HasAuthorityKeyIdboolHasAuthorityKeyId
AuthorityKeyIdDerxbytesviewAuthorityKeyIdDer
DeltaboolDelta
HasNumberboolHasNumber
NumberxbytesviewNumber
BaseNumberxbytesviewBaseNumber
HasIssuingPointboolHasIssuingPoint
IssuingPointDerxbytesviewIssuingPointDer
IssuingPointxx509issuingpointIssuingPoint
typedef struct xx509crlvalid { const xx509crl* Crl; const xx509cert* Issuer; bool HasAuthorityKeyId; xbytesview AuthorityKeyIdDer; bool Delta; bool HasNumber; xbytesview Number; xbytesview BaseNumber; bool HasIssuingPoint; xbytesview IssuingPointDer; xx509issuingpoint IssuingPoint; } xx509crlvalid;

xx509revocation类型

吊销结果同时公开覆盖原因、命中条目和可选扩展值。

字段类型语义
Statexx509revocationstate状态
CoveredReasonsuint16CoveredReasons
Entryxx509crlentryEntry
HasReasonbool是否原因文本
Reasonxx509crlreason原因文本
HasInvalidityDateboolHasInvalidityDate
InvalidityDatextimeInvalidityDate
typedef struct xx509revocation { xx509revocationstate State; uint16 CoveredReasons; xx509crlentry Entry; bool HasReason; xx509crlreason Reason; bool HasInvalidityDate; xtime InvalidityDate; } xx509revocation;

xx509revocationcheck类型

多份分段 CRL 的状态归并器只保存原因掩码和最终借用结果。

字段类型语义
CoveredReasonsuint16CoveredReasons
DeterminedboolDetermined
Revocationxx509revocationRevocation
typedef struct xx509revocationcheck { uint16 CoveredReasons; bool Determined; xx509revocation Revocation; } xx509revocationcheck;

xx509crlset类型

CRL set 复制两个已验证借用视图,不复制其底层 DER。

字段类型语义
Basexx509crlvalidBase
Deltaxx509crlvalidDelta
typedef struct xx509crlset { xx509crlvalid Base; xx509crlvalid Delta; } xx509crlset;

xx509pathflag类型

路径策略标志只控制目标证书用途是否必须显式出现。

值语义
X509_PATH_REQUIRE_KEY_USAGEKEYUSAGE
X509_PATH_REQUIRE_PURPOSEPURPOSE
X509_PATH_ALLOW_SHA1允许 SHA-1 签名的路径
typedef enum xx509pathflag { X509_PATH_REQUIRE_KEY_USAGE = UINT32_C(0x00000001), X509_PATH_REQUIRE_PURPOSE = UINT32_C(0x00000002), /* 默认拒绝 SHA-1 路径签名;此标志只为显式 legacy 场景保留。 */ X509_PATH_ALLOW_SHA1 = UINT32_C(0x00000004)

xx509anchor类型

信任锚是受信任名称与公钥,不把自签名证书错误地并入待验证路径。

字段类型语义
Namexbytesview名称
PublicKeyxx509pubkeyPublicKey
CertificatexbytesviewCertificate
HasNameConstraintsboolHasNameConstraints
NameConstraintsxx509nameconstraintsNameConstraints
typedef struct xx509anchor { xbytesview Name; xx509pubkey PublicKey; xbytesview Certificate; bool HasNameConstraints; xx509nameconstraints NameConstraints; } xx509anchor;

xx509pathconfig类型

路径策略把确定时间、目标用途和自定义 critical 扩展处理集中表达。

字段类型语义
Timextime时间戳(公元 UTC 毫秒)
Flagsuint32标志位
KeyUsageuint16KeyUsage
PurposexbytesviewPurpose
Criticalxx509criticalprocCritical
UserDataptr用户数据
typedef struct xx509pathconfig { xtime Time; uint32 Flags; uint16 KeyUsage; xbytesview Purpose; xx509criticalproc Critical; ptr UserData; } xx509pathconfig;

xx509pathsource类型

建链源把调用方已解析的候选发行者和独立信任锚组成借用视图。

字段类型语义
Issuersconst xx509cert* const*Issuers
IssuerCountsize_tIssuerCount
Anchorsconst xx509anchor*Anchors
AnchorCountsize_tAnchorCount
typedef struct xx509pathsource { const xx509cert* const* Issuers; size_t IssuerCount; const xx509anchor* Anchors; size_t AnchorCount; } xx509pathsource;

xx509pathresult类型

建链结果只在成功时发布路径长度和命中的借用信任锚。

字段类型语义
Countsize_t数量
Anchorconst xx509anchor*Anchor
typedef struct xx509pathresult { size_t Count; const xx509anchor* Anchor; } xx509pathresult;

xx509store类型

信任库拥有导入的 DER 和锚对象;公开类型保持不透明。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。

typedef struct xx509store xx509store;

xx509crlcriticalproc类型

未内建处理的 critical CRL/条目扩展由调用方显式决定是否接受。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xx509result(*xx509crlcriticalproc)( const xx509crl* pCrl, const xx509crlentry* pEntry, const xx509ext* pExtension, ptr pUserData)

xx509criticalproc类型

未内建处理的 critical 扩展由调用方返回 VALUE、DONE 或 ERROR。 回调类型;参数与返回语义见签名及各使用方 API 节。

typedef xx509result(*xx509criticalproc)( const xx509cert* pCertificate, const xx509ext* pExtension, size_t iDepth, ptr pUserData)
证书视图

xrtX509Parse函数

把 DER 证书解析为只读证书视图。

bool xrtX509Parse(const void* pDer, size_t iSize, xx509cert* pCert)

参数

参数方向约束说明
pDer输入借用DER 数据
iSize输入—字节数
pCert输出非空接收证书视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析证书

	if ( !xrtX509Parse(exampleLeafDer, sizeof(exampleLeafDer), &Leaf) ||
		!xrtX509Parse(exampleCaDer, sizeof(exampleCaDer), &Ca) ) {

xrtX509ValidAt函数

判断证书在指定时刻处于有效期内。

bool xrtX509ValidAt(const xx509cert* pCert, xtime iTime)

参数

参数方向约束说明
pCert输入非空目标证书
iTime输入—检查时刻
返回值
返回含义失败时状态
true是在有效期内—
false不是在有效期内—
错误
  • 无 — 纯时间比较,不设置错误

范例已编译验证

cert_tour · 有效期判断

			!xrtX509ValidAt(&Leaf, xrtNow()) ||

xrtX509TimeParse函数

解析 X.509 DER 时间值(UTCTime/GeneralizedTime)。

bool xrtX509TimeParse(xbytesview Der, xtime* pTime)

参数

参数方向约束说明
Der输入借用DER 时间值
pTime输出非空接收时间
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析时间

		if ( !xrtX509TimeParse((xbytesview) { arrTimeDer, 17u },
				&ParsedTime) ||
			!xrtX509ValidAt(&Leaf, xrtNow()) ||
			xrtX509ValidAt(&Leaf, ParsedTime) ||
			!xrtX509PublicKey(&Ca, &CaKey) ||
			(xrtX509SignatureParse(&Leaf.SignatureAlgorithm,
				&Scheme) != X509_VALUE) ||
			!xrtX509CertificateVerifyKey(&Leaf, &CaKey) ||
			!xrtX509SignatureVerify(&Scheme, Leaf.Tbs,
				Leaf.Signature, &CaKey) ) {

xrtX509PublicKey函数

从证书提取独立于后端的公钥描述。

bool xrtX509PublicKey(const xx509cert* pCert, xx509pubkey* pPublicKey)

参数

参数方向约束说明
pCert输入非空目标证书
pPublicKey输出非空接收公钥
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 提取公钥

			!xrtX509PublicKey(&Ca, &CaKey) ||

xrtX509Anchor函数

把证书包装为认证路径验证的信任锚。

bool xrtX509Anchor(const xx509cert* pCertificate, xx509anchor* pAnchor)

参数

参数方向约束说明
pCertificate输入非空信任锚证书
pAnchor输出非空接收信任锚
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

path · 构造信任锚

	) || !xrtX509Anchor(&Root, &Anchor) ) {
AlgorithmIdentifier

xrtX509AlgorithmParse函数

解析 AlgorithmIdentifier 并映射到稳定签名方案标识。

bool xrtX509AlgorithmParse(xbytesview Der, xx509algorithm* pAlgorithm)

参数

参数方向约束说明
Der输入借用DER 算法标识
pAlgorithm输出非空接收方案
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法
  • XERR_UNSUPPORTED — 算法不受支持

范例已编译验证

signature · 解析算法

	if ( !xrtX509AlgorithmParse(
		(xbytesview) { AlgorithmDer, sizeof(AlgorithmDer) }, &Algorithm
	) || (xrtX509SignatureParse(
		&Algorithm, &Signature
	) != X509_VALUE) ) {
Name

xrtX509NameInit函数

在证书名称 DER 上初始化属性遍历游标。

bool xrtX509NameInit(xbytesview Name, xx509namecursor* pCursor)

参数

参数方向约束说明
Name输入借用名称 DER
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

inspect · 初始化名称遍历

		!xrtX509NameInit(Cert.Subject, &Cursor) ||

xrtX509NameRead函数

返回下一个 RDN 属性。

xx509result xrtX509NameRead(xx509namecursor* pCursor, xx509nameattr* pAttribute)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pAttribute输出非空接收属性
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

inspect · 读名称属性

		(xrtX509NameRead(&Cursor, &Attribute) != X509_VALUE) ||

xrtX509NameFind函数

在名称中查找指定 OID 的首个属性。

bool xrtX509NameFind(xbytesview Name, const void* pOid, size_t iOidSize, xx509nameattr* pAttribute)

参数

参数方向约束说明
Name输入借用名称 DER
pOid输入非空OID
iOidSize输入—OID 长度
pAttribute输出非空接收属性
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 按 OID 查找属性

		if ( !xrtX509NameFind(Leaf.Subject, arrOidCn,
				sizeof(arrOidCn), &Attr) ||
			(Attr.Value.Size != 9u) ||
			(memcmp(Attr.Value.Data, "localhost", 9u) != 0) ||
			(xrtX509NameWithin(Ca.Subject, Ca.Subject) !=
				X509_VALUE) ||
			(xrtX509NameWithin(Leaf.Subject, Ca.Subject) ==
				X509_ERROR) ||
			(xrtX509GeneralNameWithin(
				&(xx509genname) {
					X509_NAME_DNS,

xrtX509NameEqual函数

按规范化 RDN 序列比较两个名称。

xx509result xrtX509NameEqual(xbytesview Left, xbytesview Right)

参数

参数方向约束说明
Left输入借用左名称 DER
Right输入借用右名称 DER
返回值
返回含义失败时状态
X509_VALUE相等—
X509_DONE不相等不设错误
X509_ERROR结构非法XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

name · 名称相等

	xx509result Result = xrtX509NameEqual(
		(xbytesview) { PrintableName, sizeof(PrintableName) },
		(xbytesview) { Utf8Name, sizeof(Utf8Name) }
	);

xrtX509NameWithin函数

判断名称是否位于基础名称子树内。

xx509result xrtX509NameWithin(xbytesview Name, xbytesview Base)

参数

参数方向约束说明
Name输入借用名称 DER
Base输入借用基础名称 DER
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE在子树内—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 名称子树判断

			(xrtX509NameWithin(Ca.Subject, Ca.Subject) !=
				X509_VALUE) ||
Extension

xrtX509ExtensionInit函数

在证书扩展列表上初始化遍历游标。

bool xrtX509ExtensionInit(const xx509cert* pCert, xx509extcursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 初始化扩展遍历

	if ( !xrtX509ExtensionInit(&Leaf, &ExtCursor) ) {

xrtX509ExtensionRead函数

返回下一个扩展项。

xx509result xrtX509ExtensionRead(xx509extcursor* pCursor, xx509ext* pExtension)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pExtension输出非空接收扩展
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 读扩展

	while ( xrtX509ExtensionRead(&ExtCursor, &Ext) == X509_VALUE ) {

xrtX509ExtensionFind函数

在证书中查找指定 OID 的扩展。

bool xrtX509ExtensionFind(const xx509cert* pCert, const void* pOid, size_t iOidSize, xx509ext* pExtension)

参数

参数方向约束说明
pCert输入非空目标证书
pOid输入非空OID
iOidSize输入—OID 长度
pExtension输出非空接收扩展
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 按 OID 查找扩展

		!xrtX509ExtensionFind(&Leaf, arrOidKeyUsage,
			sizeof(arrOidKeyUsage), &Ext) ||

xrtX509ExtensionListInit函数

在独立的扩展列表 DER 上初始化遍历游标。

bool xrtX509ExtensionListInit(xbytesview Extensions, xx509extcursor* pCursor)

参数

参数方向约束说明
Extensions输入借用扩展列表 DER
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 初始化裸扩展遍历

		!xrtX509ExtensionListInit(Leaf.Extensions, &ExtCursor) ||

xrtX509ExtensionListFind函数

在独立扩展列表中查找指定 OID 的扩展。

bool xrtX509ExtensionListFind(xbytesview Extensions, const void* pOid, size_t iOidSize, xx509ext* pExtension)

参数

参数方向约束说明
Extensions输入借用扩展列表 DER
pOid输入非空OID
iOidSize输入—OID 长度
pExtension输出非空接收扩展
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 裸列表按 OID 查找

		!xrtX509ExtensionListFind(Leaf.Extensions, arrOidKeyUsage,
			sizeof(arrOidKeyUsage), &Ext) ) {
NameConstraints

xrtX509NameConstraints函数

从证书取出解码后的名称约束结构。

xx509result xrtX509NameConstraints(const xx509cert* pCertificate, xx509nameconstraints* pConstraints)

参数

参数方向约束说明
pCertificate输入非空目标证书
pConstraints输出非空接收约束
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 取出名称约束

			(xrtX509NameConstraints(&Leaf, &NoConstraints) !=
				X509_DONE) ) {

xrtX509NameConstraintsParse函数

解析名称约束扩展 DER。

bool xrtX509NameConstraintsParse(xbytesview Der, xx509nameconstraints* pConstraints)

参数

参数方向约束说明
Der输入借用扩展 DER
pConstraints输出非空接收约束
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

name_constraints · 解析名称约束

	if ( !xrtX509NameConstraintsParse(
		(xbytesview) { Der, sizeof(Der) }, &Constraints
	) ) {

xrtX509NameConstraintsCheck函数

检查证书的主题与 SAN 是否满足名称约束。

bool xrtX509NameConstraintsCheck(const xx509nameconstraints* pConstraints, const xx509cert* pCertificate)

参数

参数方向约束说明
pConstraints输入非空已解码约束
pCertificate输入非空待检查证书
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 检查名称约束

			if ( !xrtX509NameConstraintsCheck(&NoConstraints,
					&Leaf) ) {

xrtX509SubtreeRead函数

返回名称约束的下一个子树项。

xx509result xrtX509SubtreeRead(xx509subtreecursor* pCursor, xx509subtree* pSubtree)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pSubtree输出非空接收子树
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

name_constraints · 读子树

	while ( (Result = xrtX509SubtreeRead(
		&Cursor, &Subtree
	)) == X509_VALUE ) {
CRL 结构层

xrtX509CrlParse函数

把 DER CRL 解析为只读视图。

bool xrtX509CrlParse(const void* pDer, size_t iSize, xx509crl* pCrl)

参数

参数方向约束说明
pDer输入借用DER 数据
iSize输入—字节数
pCrl输出非空接收 CRL 视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl · 解析 CRL

	if ( !xrtX509CrlParse(CrlDer, sizeof(CrlDer), &Crl) ||
		!xrtX509CrlEntryInit(&Crl, &Cursor) ) {

xrtX509CrlEntryInit函数

在 CRL 上初始化条目遍历游标。

bool xrtX509CrlEntryInit(const xx509crl* pCrl, xx509crlcursor* pCursor)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl · 初始化吊销条目遍历

		!xrtX509CrlEntryInit(&Crl, &Cursor) ) {

xrtX509CrlEntryRead函数

返回下一个吊销条目。

xx509result xrtX509CrlEntryRead(xx509crlcursor* pCursor, xx509crlentry* pEntry)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pEntry输出非空接收条目
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl · 读吊销条目

	while ( (Result = xrtX509CrlEntryRead(
		&Cursor, &Entry
	)) == X509_VALUE ) {

xrtX509CrlEntryReason函数

读取吊销条目的原因代码。

xx509result xrtX509CrlEntryReason(const xx509crlentry* pEntry, xx509crlreason* pReason)

参数

参数方向约束说明
pEntry输入非空目标条目
pReason输出非空接收原因
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 条目原因

		if ( (xrtX509CrlEntryReason(&Entry, &Reason) !=
				X509_VALUE) ||
			(Reason != X509_CRL_REASON_KEY_COMPROMISE) ||
			(xrtX509CrlEntryInvalidityDate(&Entry,
				&Invalidity) != X509_VALUE) ) {

xrtX509CrlEntryInvalidityDate函数

读取吊销条目的失效日期。

xx509result xrtX509CrlEntryInvalidityDate(const xx509crlentry* pEntry, xtime* pTime)

参数

参数方向约束说明
pEntry输入非空目标条目
pTime输出非空接收时间
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 条目失效日期

			(xrtX509CrlEntryInvalidityDate(&Entry,
				&Invalidity) != X509_VALUE) ) {

xrtX509CrlEntryIssuer函数

读取间接 CRL 条目的签发者名称游标。

xx509result xrtX509CrlEntryIssuer(const xx509crlentry* pEntry, xx509gencursor* pIssuer)

参数

参数方向约束说明
pEntry输入非空目标条目
pIssuer输出非空接收名称游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 条目签发者

		if ( (xrtX509CrlEntryIssuer(&Entry, &NoIssuer) !=
				X509_DONE) ||
			!xrtX509CrlInvalidityDateParse(
				(xbytesview) { arrDate, 17u }, &Parsed) ||
			(xrtX509CrlRevokes(&Crl, &Ca, &NoEntry) !=
				X509_DONE) ) {

xrtX509CrlFind函数

在 CRL 中查找指定序列号的吊销条目。

xx509result xrtX509CrlFind(const xx509crl* pCrl, xbytesview Serial, xx509crlentry* pEntry)

参数

参数方向约束说明
pCrl输入非空目标 CRL
Serial输入借用序列号 DER
pEntry输出非空接收条目
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 按序列号查找

	if ( (xrtX509CrlFind(&Crl, Leaf.Serial, &Entry) != X509_VALUE) ||
		(xrtX509CrlRevokes(&Crl, &Leaf, &Entry) != X509_VALUE) ) {

xrtX509CrlNumber函数

读取 CRL 编号扩展。

xx509result xrtX509CrlNumber(const xx509crl* pCrl, xbytesview* pNumber)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pNumber输出非空接收编号视图
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · CRL 编号

		if ( (xrtX509CrlNumber(&Crl, &CrlNumber) != X509_VALUE) ||
			(CrlNumber.Size != 2u) ||
			(CrlNumber.Data[0] != 0x10u) ||
			(CrlNumber.Data[1] != 0x02u) ||
			(xrtX509CrlAuthorityKeyId(&Crl, &AuthorityId) !=
				X509_VALUE) ||
			(!AuthorityId.HasKeyId) ||
			(AuthorityId.KeyId.Size == 0u) ||
			(xrtX509CrlDeltaBase(&Crl, &CrlNumber) !=
				X509_DONE) ||
			(xrtX509CrlIssuingPoint(&Crl, &NoPoint) !=

xrtX509CrlNumberParse函数

解析 CRL 编号扩展 DER。

bool xrtX509CrlNumberParse(xbytesview Der, xbytesview* pNumber)

参数

参数方向约束说明
Der输入借用扩展 DER
pNumber输出非空接收编号视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_profile · 解析 CRL 编号

	if ( !xrtX509CrlNumberParse(
		(xbytesview) { NumberDer, sizeof(NumberDer) }, &Number
	) || !xrtX509CrlReasonParse(
		(xbytesview) { ReasonDer, sizeof(ReasonDer) }, &Reason
	) ) {

xrtX509CrlAuthorityKeyId函数

读取 CRL 的授权密钥标识。

xx509result xrtX509CrlAuthorityKeyId(const xx509crl* pCrl, xx509authoritykeyid* pIdentifier)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pIdentifier输出非空接收标识
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · CRL 签发者密钥标识

			(xrtX509CrlAuthorityKeyId(&Crl, &AuthorityId) !=
				X509_VALUE) ||

xrtX509AuthorityKeyIdParse函数

解析授权密钥标识扩展 DER。

bool xrtX509AuthorityKeyIdParse(xbytesview Der, xx509authoritykeyid* pIdentifier)

参数

参数方向约束说明
Der输入借用扩展 DER
pIdentifier输出非空接收标识
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析授权密钥标识

				!xrtX509AuthorityKeyIdParse(Ext.Value,
					&ParsedAki) ||

xrtX509CrlDeltaBase函数

读取增量 CRL 的基准编号。

xx509result xrtX509CrlDeltaBase(const xx509crl* pCrl, xbytesview* pNumber)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pNumber输出非空接收编号视图
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 增量基准

			(xrtX509CrlDeltaBase(&Crl, &CrlNumber) !=
				X509_DONE) ||

xrtX509CrlValidAt函数

判断 CRL 在指定时刻处于有效期内。

bool xrtX509CrlValidAt(const xx509crl* pCrl, xtime iTime)

参数

参数方向约束说明
pCrl输入非空目标 CRL
iTime输入—检查时刻
返回值
返回含义失败时状态
true是在有效期内—
false不是在有效期内—
错误
  • 无 — 纯时间比较,不设置错误

范例已编译验证

crl_tour · CRL 有效期判断

	if ( !xrtX509CrlValidAt(&Crl, xrtNow()) ||
		!xrtX509PublicKey(&Ca, &CaKey) ||
		!xrtX509CrlVerifyKey(&Crl, &CaKey) ||
		!xrtX509CrlVerify(&Crl, &Ca) ) {
CRL 分发点

xrtX509CrlPoints函数

取出证书的 CRL 分发点游标。

xx509result xrtX509CrlPoints(const xx509cert* pCert, xx509distributioncursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · CRL 分发点

		if ( (xrtX509CrlPoints(&Leaf, &DistCursor) != X509_VALUE) ||
			(xrtX509DistributionRead(&DistCursor, &Point) !=
				X509_VALUE) ||
			/* 独立 DER 形态:单个 DistributionPoint TLV。 */
			!xrtX509DistributionPointParse(Point.Raw, &Point) ||
			(xrtX509FreshestCrl(&Leaf, &DistCursor) !=
				X509_VALUE) ||
			(xrtX509DistributionRead(&DistCursor, &Point) !=
				X509_VALUE) ) {

xrtX509FreshestCrl函数

取出证书的 Freshest CRL 游标。

xx509result xrtX509FreshestCrl(const xx509cert* pCert, xx509distributioncursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 最新 CRL 地址

			(xrtX509FreshestCrl(&Leaf, &DistCursor) !=
				X509_VALUE) ||

xrtX509CrlFreshest函数

取出 CRL 的 Freshest 游标。

xx509result xrtX509CrlFreshest(const xx509crl* pCrl, xx509distributioncursor* pCursor)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pCursor输出非空接收游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_tour · CRL 最新地址

			(xrtX509CrlFreshest(&Crl, &NoPoints) !=
				X509_DONE) ) {

xrtX509DistributionInit函数

在分发点扩展 DER 上初始化游标。

bool xrtX509DistributionInit(xbytesview Der, xx509distributioncursor* pCursor)

参数

参数方向约束说明
Der输入借用扩展 DER
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

distribution · 初始化分发点遍历

	if ( !xrtX509DistributionInit(
		(xbytesview) { PointsDer, sizeof(PointsDer) }, &Points
	) || (xrtX509DistributionRead(&Points, &Point) != X509_VALUE) ||
		!Point.HasName ||
		(xrtX509GeneralNameRead(
			&Point.Name.FullNames, &Name
		) != X509_VALUE) || (Name.Type != X509_NAME_URI) ) {

xrtX509DistributionRead函数

返回下一个分发点。

xx509result xrtX509DistributionRead(xx509distributioncursor* pCursor, xx509distributionpoint* pPoint)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pPoint输出非空接收分发点
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 读分发点

			(xrtX509DistributionRead(&DistCursor, &Point) !=
				X509_VALUE) ||

xrtX509DistributionPointParse函数

解析单个分发点 DER。

bool xrtX509DistributionPointParse(xbytesview Der, xx509distributionpoint* pPoint)

参数

参数方向约束说明
Der输入借用分发点 DER
pPoint输出非空接收分发点
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析单分发点

			!xrtX509DistributionPointParse(Point.Raw, &Point) ||
CRL Profile

xrtX509CrlConfigInit函数

初始化 CRL 验证的默认配置。

void xrtX509CrlConfigInit(xx509crlconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

crl_tour · CRL 验证配置

	xrtX509CrlConfigInit(&Config);

xrtX509CrlValidate函数

按配置验证 CRL 并产出有效性视图。

bool xrtX509CrlValidate(const xx509crl* pCrl, const xx509cert* pIssuer, const xx509crlconfig* pConfig, xx509crlvalid* pValid)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pIssuer输入非空签发者证书
pConfig输入允许空验证配置
pValid输出非空接收有效性视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_tour · 验证 CRL

	if ( !xrtX509CrlValidate(&Crl, &Ca, &Config, &Valid) ) {

xrtX509CrlVerify函数

用签发者证书验证 CRL 签名。

bool xrtX509CrlVerify(const xx509crl* pCrl, const xx509cert* pIssuer)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pIssuer输入非空签发者证书
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 签名不匹配
  • XERR_UNSUPPORTED — 签名算法不受支持

范例已编译验证

crl_tour · 验证 CRL 签名

		!xrtX509CrlVerify(&Crl, &Ca) ) {

xrtX509CrlVerifyKey函数

用独立公钥验证 CRL 签名。

bool xrtX509CrlVerifyKey(const xx509crl* pCrl, const xx509pubkey* pPublicKey)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pPublicKey输入非空公钥
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 签名不匹配
  • XERR_UNSUPPORTED — 签名算法不受支持

范例已编译验证

crl_tour · 用公钥验证 CRL

		!xrtX509CrlVerifyKey(&Crl, &CaKey) ||

xrtX509CrlIssuingPoint函数

读取 CRL 签发点扩展。

xx509result xrtX509CrlIssuingPoint(const xx509crl* pCrl, xx509issuingpoint* pPoint)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pPoint输出非空接收签发点
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 签发点

			(xrtX509CrlIssuingPoint(&Crl, &NoPoint) !=
				X509_DONE) ||

xrtX509IssuingPointParse函数

解析签发点扩展 DER。

bool xrtX509IssuingPointParse(xbytesview Der, xx509issuingpoint* pPoint)

参数

参数方向约束说明
Der输入借用扩展 DER
pPoint输出非空接收签发点
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析签发点

				if ( !xrtX509IssuingPointParse(
						(xbytesview) { arrIdp, 9u },
						&Issuing) ||
					(!Issuing.HasDistributionPoint) ) {

xrtX509CrlInvalidityDateParse函数

解析失效日期扩展 DER。

bool xrtX509CrlInvalidityDateParse(xbytesview Der, xtime* pTime)

参数

参数方向约束说明
Der输入借用扩展 DER
pTime输出非空接收时间
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · 解析失效日期

			!xrtX509CrlInvalidityDateParse(
				(xbytesview) { arrDate, 17u }, &Parsed) ||

xrtX509CrlReasonParse函数

解析吊销原因扩展 DER。

bool xrtX509CrlReasonParse(xbytesview Der, xx509crlreason* pReason)

参数

参数方向约束说明
Der输入借用扩展 DER
pReason输出非空接收原因
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_profile · 解析原因

	) || !xrtX509CrlReasonParse(

xrtX509BasicConstraints函数

读取证书的基础约束扩展。

xx509result xrtX509BasicConstraints(const xx509cert* pCert, xx509basicconstraints* pConstraints)

参数

参数方向约束说明
pCert输入非空目标证书
pConstraints输出非空接收约束
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 基础约束

		(xrtX509BasicConstraints(&Leaf, &Constraints) != X509_VALUE) ||

xrtX509KeyUsage函数

读取证书的密钥用途位掩码。

xx509result xrtX509KeyUsage(const xx509cert* pCert, uint16* pUsage)

参数

参数方向约束说明
pCert输入非空目标证书
pUsage输出非空接收位掩码
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 密钥用途

	if ( (xrtX509KeyUsage(&Leaf, &iUsage) != X509_VALUE) ||
		((iUsage & X509_USAGE_DIGITAL_SIGNATURE) == 0u) ||
		((iUsage & X509_USAGE_KEY_ENCIPHERMENT) == 0u) ||
		(xrtX509BasicConstraints(&Leaf, &Constraints) != X509_VALUE) ||
		(Constraints.CA) ||
		(xrtX509BasicConstraints(&Ca, &Constraints) != X509_VALUE) ||
		(!Constraints.CA) ) {

xrtX509ExtendedKeyUsage函数

取出证书的 EKU OID 游标。

xx509result xrtX509ExtendedKeyUsage(const xx509cert* pCert, xx509oidcursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收 OID 游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 扩展密钥用途

	if ( xrtX509ExtendedKeyUsage(&Leaf, &OidCursor) != X509_VALUE ) {

xrtX509OidInit函数

在 OID 序列 DER 上初始化游标。

bool xrtX509OidInit(xbytesview Oids, xx509oidcursor* pCursor)

参数

参数方向约束说明
Oids输入借用OID 序列 DER
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 初始化 OID 遍历

		!xrtX509OidInit((xbytesview) { arrEkuDer, 12u },
			&OidCursor) ||

xrtX509OidRead函数

返回下一个 OID。

xx509result xrtX509OidRead(xx509oidcursor* pCursor, xbytesview* pOid)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pOid输出非空接收 OID 视图
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 读 OID

	while ( xrtX509OidRead(&OidCursor, &KeyId) == X509_VALUE ) {

xrtX509SubjectKeyId函数

读取证书的主体密钥标识。

xx509result xrtX509SubjectKeyId(const xx509cert* pCert, xbytesview* pKeyId)

参数

参数方向约束说明
pCert输入非空目标证书
pKeyId输出非空接收标识视图
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 主体密钥标识

		if ( (xrtX509SubjectKeyId(&Leaf, &LeafSki) != X509_VALUE) ||
			/* 独立 DER 形态:SKI 扩展值是 OCTET STRING 包裹。 */
			!xrtX509ExtensionFind(&Leaf, arrOidSki,
				sizeof(arrOidSki), &Ext) ||
			!xrtX509SubjectKeyIdParse(Ext.Value, &ParsedSki) ||
			(ParsedSki.Size != LeafSki.Size) ||
			(memcmp(ParsedSki.Data, LeafSki.Data,
				ParsedSki.Size) != 0) ||
			(xrtX509AuthorityKeyId(&Leaf, &AuthorityId) !=
				X509_VALUE) ||
			(!AuthorityId.HasKeyId) ||

xrtX509SubjectKeyIdParse函数

解析主体密钥标识扩展 DER。

bool xrtX509SubjectKeyIdParse(xbytesview Der, xbytesview* pKeyId)

参数

参数方向约束说明
Der输入借用扩展 DER
pKeyId输出非空接收标识视图
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 解析主体密钥标识

			!xrtX509SubjectKeyIdParse(Ext.Value, &ParsedSki) ||

xrtX509AuthorityKeyId函数

读取证书的授权密钥标识。

xx509result xrtX509AuthorityKeyId(const xx509cert* pCert, xx509authoritykeyid* pIdentifier)

参数

参数方向约束说明
pCert输入非空目标证书
pIdentifier输出非空接收标识
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 授权密钥标识

			(xrtX509AuthorityKeyId(&Leaf, &AuthorityId) !=
				X509_VALUE) ||
CRL 策略

xrtX509CrlCheck函数

用已验证 CRL 检查证书吊销状态。

xx509result xrtX509CrlCheck(const xx509crlvalid* pValid, const xx509cert* pCertificate, xx509revocation* pRevocation)

参数

参数方向约束说明
pValid输入非空已验证 CRL
pCertificate输入非空目标证书
pRevocation输出非空接收吊销结论
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_policy · 检查单 CRL

	Result = xrtX509CrlCheck(&Valid, &Certificate, &Revocation);

xrtX509CrlSetInit函数

用基础与增量 CRL 组合成吊销检查集。

bool xrtX509CrlSetInit(xx509crlset* pSet, const xx509crlvalid* pBase, const xx509crlvalid* pDelta)

参数

参数方向约束说明
pSet输出非空接收 CRL 集
pBase输入非空基础 CRL
pDelta输入允许空增量 CRL
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_tour · 初始化 CRL 集

		xrtX509CrlSetInit(&Set, &Valid, NULL) ) {

xrtX509CrlSetCheck函数

用 CRL 集检查证书吊销状态。

xx509result xrtX509CrlSetCheck(const xx509crlset* pSet, const xx509cert* pCertificate, xx509revocation* pRevocation)

参数

参数方向约束说明
pSet输入非空CRL 集
pCertificate输入非空目标证书
pRevocation输出非空接收吊销结论
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_tour · 检查 CRL 集

	if ( (xrtX509CrlSetCheck(&Set, &Leaf, &Revocation) !=
			X509_ERROR) ||
		xrtX509CrlSetInit(&Set, &Valid, NULL) ) {

xrtX509CrlStatus函数

组合验证与检查,直接给出证书吊销结论。

xx509result xrtX509CrlStatus(const xx509crl* pCrl, const xx509cert* pIssuer, const xx509cert* pCertificate, const xx509crlconfig* pConfig, xx509revocation* pRevocation)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pIssuer输入非空签发者证书
pCertificate输入非空目标证书
pConfig输入允许空验证配置
pRevocation输出非空接收吊销结论
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

crl_tour · 一步吊销检查

	if ( (xrtX509CrlStatus(&Crl, &Ca, &Leaf, &Config, &Revocation) !=
			X509_VALUE) ||
		(Revocation.State != X509_REVOCATION_REVOKED) ||
		(!Revocation.HasReason) ||
		(Revocation.Reason != X509_CRL_REASON_KEY_COMPROMISE) ||
		(!Revocation.HasInvalidityDate) ||
		(xrtX509CrlStatus(&Crl, &Ca, &Ca, &Config, &Revocation) !=
			X509_VALUE) ||
		(Revocation.State != X509_REVOCATION_GOOD) ) {

xrtX509CrlRevokes函数

检查 CRL 是否吊销指定证书。

xx509result xrtX509CrlRevokes(const xx509crl* pCrl, const xx509cert* pCert, xx509crlentry* pEntry)

参数

参数方向约束说明
pCrl输入非空目标 CRL
pCert输入非空目标证书
pEntry输出非空接收条目
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

crl_tour · CRL 是否吊销

		(xrtX509CrlRevokes(&Crl, &Leaf, &Entry) != X509_VALUE) ) {

xrtX509RevocationInit函数

初始化跨源聚合的吊销结论结构。

void xrtX509RevocationInit(xx509revocationcheck* pCheck)

参数

参数方向约束说明
pCheck输出非空接收吊销检查
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

store_tour · 初始化吊销结论

	xrtX509RevocationInit(&Check);

xrtX509RevocationResult函数

读取聚合后的最终吊销结论。

xx509result xrtX509RevocationResult(const xx509revocationcheck* pCheck, xx509revocation* pRevocation)

参数

参数方向约束说明
pCheck输入非空吊销检查
pRevocation输出非空接收结论
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

store_tour · 读取吊销结论

		(xrtX509RevocationResult(&Check, &Revocation) !=
			X509_VALUE) ||

xrtX509RevocationUpdate函数

把单源结论并入聚合结构。

xx509result xrtX509RevocationUpdate(xx509revocationcheck* pCheck, const xx509revocation* pRevocation)

参数

参数方向约束说明
pCheck输入/输出非空吊销检查
pRevocation输入非空单源结论
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

store_tour · 并入吊销结论

		(xrtX509RevocationUpdate(&Check, &Revocation) !=
			X509_VALUE) ||
签名算法

xrtX509SignatureParse函数

把算法标识映射为可执行验证的签名方案。

xx509result xrtX509SignatureParse(const xx509algorithm* pAlgorithm, xx509signature* pSignature)

参数

参数方向约束说明
pAlgorithm输入非空算法标识
pSignature输出非空接收方案
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法
  • XERR_UNSUPPORTED — 算法不受支持

范例已编译验证

cert_tour · 解析签名方案

			(xrtX509SignatureParse(&Leaf.SignatureAlgorithm,
				&Scheme) != X509_VALUE) ||

xrtX509SignatureVerify函数

用公钥验证内容与签名。

bool xrtX509SignatureVerify(const xx509signature* pScheme, xbytesview Content, xbytesview Signature, const xx509pubkey* pPublicKey)

参数

参数方向约束说明
pScheme输入非空签名方案
Content输入借用内容
Signature输入借用签名值
pPublicKey输入非空公钥
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 签名不匹配
  • XERR_UNSUPPORTED — 方案不受支持

范例已编译验证

cert_tour · 验证签名

			!xrtX509SignatureVerify(&Scheme, Leaf.Tbs,
				Leaf.Signature, &CaKey) ) {

xrtX509CertificateVerify函数

用签发者证书验证证书签名。

bool xrtX509CertificateVerify(const xx509cert* pCertificate, const xx509cert* pIssuer)

参数

参数方向约束说明
pCertificate输入非空目标证书
pIssuer输入非空签发者证书
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 签名不匹配
  • XERR_UNSUPPORTED — 算法不受支持

范例已编译验证

verify · 用证书验签

	) || !xrtX509CertificateVerify(

xrtX509CertificateVerifyKey函数

用独立公钥验证证书签名。

bool xrtX509CertificateVerifyKey(const xx509cert* pCertificate, const xx509pubkey* pPublicKey)

参数

参数方向约束说明
pCertificate输入非空目标证书
pPublicKey输入非空公钥
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 签名不匹配
  • XERR_UNSUPPORTED — 算法不受支持

范例已编译验证

cert_tour · 用公钥验签证书

			!xrtX509CertificateVerifyKey(&Leaf, &CaKey) ||

xrtX509MatchDns函数

按 RFC 6125 左通配规则匹配 DNS 名称。

xx509result xrtX509MatchDns(xstrview Pattern, xstrview Host)

参数

参数方向约束说明
Pattern输入借用证书模式
Host输入借用主机名
返回值
返回含义失败时状态
X509_VALUE匹配—
X509_DONE不匹配不设错误
X509_ERROR模式非法XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

identity · DNS 模式匹配

	xx509result Result = xrtX509MatchDns(
		XRT_STR_LITERAL("*.example.test"),
		XRT_STR_LITERAL("api.example.test")
	);

xrtX509MatchHost函数

在证书 SAN 中查找匹配主机的名称。

xx509result xrtX509MatchHost(const xx509cert* pCert, xstrview Host, xx509genname* pName)

参数

参数方向约束说明
pCert输入非空目标证书
Host输入借用主机名
pName输出允许空接收命中的名称
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 主机匹配

	if ( xrtX509MatchHost(&Leaf,
			(xstrview) { "localhost", 9u }, NULL) !=
		X509_VALUE ) {

xrtX509SubjectAltName函数

取出证书 SAN 的通用名称游标。

xx509result xrtX509SubjectAltName(const xx509cert* pCert, xx509gencursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 主体备用名

	if ( xrtX509SubjectAltName(&Leaf, &GenCursor) != X509_VALUE ) {

xrtX509IssuerAltName函数

取出证书 IAN 的通用名称游标。

xx509result xrtX509IssuerAltName(const xx509cert* pCert, xx509gencursor* pCursor)

参数

参数方向约束说明
pCert输入非空目标证书
pCursor输出非空接收游标
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — 扩展内容不符合预期结构

范例已编译验证

cert_tour · 签发者备用名

			(xrtX509IssuerAltName(&Leaf, &GenCursor) !=
				X509_DONE) ||

xrtX509GeneralNameInit函数

在 GeneralNames DER 上初始化游标。

bool xrtX509GeneralNameInit(xbytesview Names, xx509gencursor* pCursor)

参数

参数方向约束说明
Names输入借用名称序列 DER
pCursor输出非空接收游标
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

profile · 初始化通用名称遍历

	if ( !xrtX509GeneralNameInit(
		(xbytesview) { GeneralNames, sizeof(GeneralNames) }, &Cursor
	) ) {

xrtX509GeneralNameRead函数

返回下一个通用名称。

xx509result xrtX509GeneralNameRead(xx509gencursor* pCursor, xx509genname* pName)

参数

参数方向约束说明
pCursor输入/输出已初始化目标游标
pName输出非空接收名称
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 读通用名称

	while ( xrtX509GeneralNameRead(&GenCursor, &GenName) ==
		X509_VALUE ) {

xrtX509GeneralNameWithin函数

判断通用名称是否位于基础名称内。

xx509result xrtX509GeneralNameWithin(const xx509genname* pName, const xx509genname* pBase)

参数

参数方向约束说明
pName输入非空待判断名称
pBase输入非空基础名称
返回值
返回含义失败时状态
X509_DONE已完整读取或字段不存在不设错误
X509_VALUE已产出一项或判定成立—
X509_ERROR参数或结构非法XERR_ARGUMENT / XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 名称子树包含

			(xrtX509GeneralNameWithin(
				&(xx509genname) {
					X509_NAME_DNS,
					{ (const uint8*)"localhost", 9u },
					{ (const uint8*)"localhost", 9u }
				},
				&(xx509genname) {
					X509_NAME_DNS,
					{ (const uint8*)"localhost", 9u },
					{ (const uint8*)"localhost", 9u }
				}) != X509_VALUE) ) {
Profile 扩展

xrtX509PathBuild函数

从目标证书出发构建到信任源的认证路径。

bool xrtX509PathBuild(const xx509cert* pTarget, const xx509pathsource* pSource, const xx509pathconfig* pConfig, const xx509cert** ppPath, size_t iCapacity, xx509pathresult* pResult)

参数

参数方向约束说明
pTarget输入非空目标证书
pSource输入非空中间证书来源
pConfig输入允许空构建配置
ppPath输出非空接收路径数组
iCapacity输入—数组容量
pResult输出允许空接收结果
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_NOT_FOUND — 无法到达信任源
  • XERR_RANGE — 容量不足
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

path_build · 构建认证路径

	if ( !xrtX509PathBuild(
		&Leaf, &Source, &Config, Path, 3u, &Result
	) ) {

xrtX509PathConfigInit函数

初始化路径验证的默认配置。

void xrtX509PathConfigInit(xx509pathconfig* pConfig)

参数

参数方向约束说明
pConfig输出非空接收配置
返回值
返回含义失败时状态
无已初始化—
错误
  • 无 — 初始化不失败

范例已编译验证

store_tour · 路径配置

	xrtX509PathConfigInit(&PathConfig);

xrtX509PathValidate函数

按配置和信任锚验证证书链。

bool xrtX509PathValidate(const xx509cert* const* ppCertificates, size_t iCount, const xx509anchor* pAnchor, const xx509pathconfig* pConfig)

参数

参数方向约束说明
ppCertificates输入非空数组证书链(叶在前)
iCount输入> 0链长
pAnchor输入非空信任锚
pConfig输入允许空验证配置
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — 链断裂、有效期或用途不满足
  • XERR_RANGE — 深度超限

范例已编译验证

path · 验证认证路径

	if ( !xrtX509PathValidate(Path, 2u, &Anchor, &Config) ) {

xrtX509IssuerMatch函数

判断证书的签发者字段与签发者证书主题匹配。

xx509result xrtX509IssuerMatch(const xx509cert* pCertificate, const xx509cert* pIssuer)

参数

参数方向约束说明
pCertificate输入非空目标证书
pIssuer输入非空签发者证书
返回值
返回含义失败时状态
X509_VALUE匹配—
X509_DONE不匹配不设错误
X509_ERROR结构非法XERR_PROTOCOL
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

cert_tour · 签发者匹配

		if ( xrtX509IssuerMatch(&Leaf, &Ca) !=
			X509_VALUE ) {
认证路径

xrtX509StoreCreate函数

创建空信任库。

xx509store* xrtX509StoreCreate()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
非空信任库—
NULL分配失败XERR_MEMORY
错误
  • XERR_MEMORY — 分配失败

范例已编译验证

store · 创建信任库

	xx509store* pStore = xrtX509StoreCreate();

xrtX509StoreSystem函数

加载操作系统根证书信任库。

xx509store* xrtX509StoreSystem()

参数

参数方向约束说明
无参数———
返回值
返回含义失败时状态
非空系统信任库—
NULL加载失败XERR_IO 等
错误
  • XERR_IO — 系统证书存储读取失败
  • XERR_MEMORY — 分配失败

范例已编译验证

store_system · 系统信任库

	xx509store* pStore = xrtX509StoreSystem();

xrtX509StoreFree函数

释放信任库及其全部条目。

void xrtX509StoreFree(xx509store* pStore)

参数

参数方向约束说明
pStore输入允许空空 = 空操作
返回值
返回含义失败时状态
无已释放—
错误
  • 无 — 释放不失败

范例已编译验证

store · 释放信任库

		xrtX509StoreFree(pStore);

xrtX509StoreCount函数

返回信任库中的条目总数。

size_t xrtX509StoreCount(const xx509store* pStore)

参数

参数方向约束说明
pStore输入非空目标信任库
返回值
返回含义失败时状态
>= 0条目总数—
错误
  • XERR_ARGUMENT — 指针为空或参数非法

范例已编译验证

store_file · 条目数量

		(unsigned long long)xrtX509StoreCount(pStore),

xrtX509StoreCertificate函数

返回指定位置的借用证书。

const xx509cert* xrtX509StoreCertificate(const xx509store* pStore, size_t iIndex)

参数

参数方向约束说明
pStore输入非空目标信任库
iIndex输入< 条目数位置
返回值
返回含义失败时状态
非空证书借用—
NULL越界不设错误
错误
  • 越界返回 NULL 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

store_tour · 按位取证书

		const xx509cert* pCert = xrtX509StoreCertificate(pStore,
			0u);

xrtX509StoreAnchor函数

返回指定位置的借用信任锚。

const xx509anchor* xrtX509StoreAnchor(const xx509store* pStore, size_t iIndex)

参数

参数方向约束说明
pStore输入非空目标信任库
iIndex输入< 条目数位置
返回值
返回含义失败时状态
非空信任锚借用—
NULL越界不设错误
错误
  • 越界返回 NULL 且不设置错误;句柄为空 XERR_ARGUMENT

范例已编译验证

store_tour · 按位取信任锚

		const xx509anchor* pAnchor = xrtX509StoreAnchor(pStore, 0u);

xrtX509StoreAdd函数

把 DER 证书加入信任库。

xx509result xrtX509StoreAdd(xx509store* pStore, const void* pDer, size_t iSize)

参数

参数方向约束说明
pStore输入/输出非空目标信任库
pDer输入借用DER 数据
iSize输入—字节数
返回值
返回含义失败时状态
X509_DONE已加入—
X509_ERROR解析或加入失败XERR_PROTOCOL 等
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

store · 加入 DER

	if ( (pStore == NULL) || (xrtX509StoreAdd(
		pStore, X509_PATH_ROOT, sizeof(X509_PATH_ROOT)
	) != X509_VALUE) || !xrtX509StoreSource(
		pStore, NULL, 0, &Source
	) ) {

xrtX509StoreAddFile函数

解析文件中的全部证书并加入信任库。

bool xrtX509StoreAddFile(xx509store* pStore, cstr sPath, size_t* pAdded)

参数

参数方向约束说明
pStore输入/输出非空目标信任库
sPath输入非空、零结尾文件路径
pAdded输出允许空接收加入数量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • xrt.file 域错误 — 文件读取失败
  • XERR_PROTOCOL — DER/PEM 解析失败

范例已编译验证

store_file · 从文件加入

	if ( (pStore == NULL) || !xrtX509StoreAddFile(
		pStore, ppArgs[1], &iAdded
	) ) {

xrtX509StoreAddPem函数

解析 PEM 文本中的全部证书并加入信任库。

bool xrtX509StoreAddPem(xx509store* pStore, cstr sText, size_t iSize, size_t* pAdded)

参数

参数方向约束说明
pStore输入/输出非空目标信任库
sText输入借用PEM 文本
iSize输入—文本长度
pAdded输出允许空接收加入数量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL — PEM 结构非法

范例已编译验证

store_tour · 从 PEM 文本加入

		!xrtX509StoreAddPem(pStore = xrtX509StoreCreate(),
			arrPem, iPemSize, &iAdded) ||

xrtX509StoreAddSystem函数

把操作系统根证书并入既有信任库。

bool xrtX509StoreAddSystem(xx509store* pStore, size_t* pAdded)

参数

参数方向约束说明
pStore输入/输出非空目标信任库
pAdded输出允许空接收加入数量
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_IO — 系统证书存储读取失败
  • XERR_MEMORY — 分配失败

范例已编译验证

store_tour · 并入系统根

	if ( !xrtX509StoreAddSystem(pStore, &iAdded) ) {

xrtX509StoreSource函数

把信任库包装为路径构建的中间证书来源。

bool xrtX509StoreSource(const xx509store* pStore, const xx509cert* const* ppIssuers, size_t iIssuerCount, xx509pathsource* pSource)

参数

参数方向约束说明
pStore输入非空目标信任库
ppIssuers输出非空数组签发者借用数组
iIssuerCount输入> 0签发者容量
pSource输出非空接收来源描述
返回值
返回含义失败时状态
true成功—
false失败见错误
错误
  • XERR_ARGUMENT — 指针为空或参数非法
  • XERR_PROTOCOL(x509 语义) — DER 结构或 OID 非法

范例已编译验证

store · 构造路径来源

	) != X509_VALUE) || !xrtX509StoreSource(

常量索引常量

以下常量在本页所属头文件中定义,语义见公共头注释。

常量说明
X509_CRL_ALLOW_SHA1见头文件注释
X509_CRL_REASON_AA_COMPROMISE见头文件注释
X509_CRL_REASON_AFFILIATION_CHANGED见头文件注释
X509_CRL_REASON_CA_COMPROMISE见头文件注释
X509_CRL_REASON_CERTIFICATE_HOLD见头文件注释
X509_CRL_REASON_CESSATION见头文件注释
X509_CRL_REASON_FLAG_AA_COMPROMISE见头文件注释
X509_CRL_REASON_FLAG_AFFILIATION_CHANGED见头文件注释
X509_CRL_REASON_FLAG_ALL见头文件注释
X509_CRL_REASON_FLAG_CA_COMPROMISE见头文件注释
X509_CRL_REASON_FLAG_CERTIFICATE_HOLD见头文件注释
X509_CRL_REASON_FLAG_CESSATION见头文件注释
X509_CRL_REASON_FLAG_KEY_COMPROMISE见头文件注释
X509_CRL_REASON_FLAG_PRIVILEGE_WITHDRAWN见头文件注释
X509_CRL_REASON_FLAG_SUPERSEDED见头文件注释
X509_CRL_REASON_FLAG_UNUSED见头文件注释
X509_CRL_REASON_KEY_COMPROMISE见头文件注释
X509_CRL_REASON_PRIVILEGE_WITHDRAWN见头文件注释
X509_CRL_REASON_REMOVE见头文件注释
X509_CRL_REASON_SUPERSEDED见头文件注释
X509_CRL_REASON_UNSPECIFIED见头文件注释
X509_CRL_REQUIRE_AUTHORITY_KEY_ID见头文件注释
X509_CRL_REQUIRE_KEY_IDENTIFIER见头文件注释
X509_CRL_REQUIRE_KEY_USAGE见头文件注释
X509_CRL_REQUIRE_NEXT_UPDATE见头文件注释
X509_CRL_REQUIRE_NUMBER见头文件注释
X509_CRL_VERSION_1见头文件注释
X509_CRL_VERSION_2见头文件注释
X509_CURVE_P256见头文件注释
X509_CURVE_P384见头文件注释
X509_CURVE_P521见头文件注释
X509_CURVE_UNKNOWN见头文件注释
X509_DISTRIBUTION_FULL_NAME见头文件注释
X509_DISTRIBUTION_RELATIVE_NAME见头文件注释
X509_DONE见头文件注释
X509_ERROR见头文件注释
X509_ERROR_ALGORITHM见头文件注释
X509_ERROR_BASIC_CONSTRAINTS见头文件注释
X509_ERROR_CERTIFICATE见头文件注释
X509_ERROR_CRITICAL_EXTENSION见头文件注释
X509_ERROR_CRL见头文件注释
X509_ERROR_CRL_CERTIFICATE_ISSUER见头文件注释
X509_ERROR_CRL_DELTA见头文件注释
X509_ERROR_CRL_ENTRY见头文件注释
X509_ERROR_CRL_INVALIDITY_DATE见头文件注释
X509_ERROR_CRL_ISSUING_POINT见头文件注释
X509_ERROR_CRL_NUMBER见头文件注释
X509_ERROR_CRL_POLICY见头文件注释
X509_ERROR_CRL_REASON见头文件注释
X509_ERROR_CRL_SCOPE见头文件注释
X509_ERROR_DER见头文件注释
X509_ERROR_DISTRIBUTION_POINT见头文件注释
X509_ERROR_DNS_NAME见头文件注释
X509_ERROR_DUPLICATE_EXTENSION见头文件注释
X509_ERROR_EXTENDED_KEY_USAGE见头文件注释
X509_ERROR_EXTENSION见头文件注释
X509_ERROR_GENERAL_NAME见头文件注释
X509_ERROR_IDENTITY见头文件注释
X509_ERROR_ISSUER见头文件注释
X509_ERROR_KEY_IDENTIFIER见头文件注释
X509_ERROR_KEY_USAGE见头文件注释
X509_ERROR_NAME见头文件注释
X509_ERROR_NAME_CONSTRAINTS见头文件注释
X509_ERROR_NOT_FOUND见头文件注释
X509_ERROR_OID_LIST见头文件注释
X509_ERROR_PATH见头文件注释
X509_ERROR_PATH_BUILD见头文件注释
X509_ERROR_PATH_CONSTRAINT见头文件注释
X509_ERROR_PUBLIC_KEY见头文件注释
X509_ERROR_PURPOSE见头文件注释
X509_ERROR_REVOCATION见头文件注释
X509_ERROR_SERIAL见头文件注释
X509_ERROR_SIGNATURE见头文件注释
X509_ERROR_SIGNATURE_ALGORITHM见头文件注释
X509_ERROR_TIME见头文件注释
X509_ERROR_TRUST_ANCHOR见头文件注释
X509_ERROR_TRUST_STORE见头文件注释
X509_ERROR_TRUST_STORE_FILE见头文件注释
X509_ERROR_TRUST_STORE_SYSTEM见头文件注释
X509_ERROR_VERSION见头文件注释
X509_HASH_NONE见头文件注释
X509_HASH_SHA1见头文件注释
X509_HASH_SHA224见头文件注释
X509_HASH_SHA256见头文件注释
X509_HASH_SHA384见头文件注释
X509_HASH_SHA512见头文件注释
X509_KEY_EC见头文件注释
X509_KEY_ED25519见头文件注释
X509_KEY_ED448见头文件注释
X509_KEY_RSA见头文件注释
X509_KEY_RSA_PSS见头文件注释
X509_KEY_UNKNOWN见头文件注释
X509_KEY_X25519见头文件注释
X509_KEY_X448见头文件注释
X509_NAME_DIRECTORY见头文件注释
X509_NAME_DNS见头文件注释
X509_NAME_EDI见头文件注释
X509_NAME_EMAIL见头文件注释
X509_NAME_IP见头文件注释
X509_NAME_OTHER见头文件注释
X509_NAME_REGISTERED_ID见头文件注释
X509_NAME_URI见头文件注释
X509_NAME_X400见头文件注释
X509_PATH_ALLOW_SHA1见头文件注释
X509_PATH_REQUIRE_KEY_USAGE见头文件注释
X509_PATH_REQUIRE_PURPOSE见头文件注释
X509_REVOCATION_GOOD见头文件注释
X509_REVOCATION_REMOVED见头文件注释
X509_REVOCATION_REVOKED见头文件注释
X509_SIGNATURE_ECDSA见头文件注释
X509_SIGNATURE_ED25519见头文件注释
X509_SIGNATURE_ED448见头文件注释
X509_SIGNATURE_RSA_PKCS1见头文件注释
X509_SIGNATURE_RSA_PSS见头文件注释
X509_USAGE_CERT_SIGN见头文件注释
X509_USAGE_CONTENT_COMMITMENT见头文件注释
X509_USAGE_CRL_SIGN见头文件注释
X509_USAGE_DATA_ENCIPHERMENT见头文件注释
X509_USAGE_DECIPHER_ONLY见头文件注释
X509_USAGE_DIGITAL_SIGNATURE见头文件注释
X509_USAGE_ENCIPHER_ONLY见头文件注释
X509_USAGE_KEY_AGREEMENT见头文件注释
X509_USAGE_KEY_ENCIPHERMENT见头文件注释
X509_VALUE见头文件注释
X509_VERSION_1见头文件注释
X509_VERSION_2见头文件注释
X509_VERSION_3见头文件注释