模块契约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.cexamples/x509/name/main.cexamples/x509/name_constraints/main.cexamples/x509/path/main.cexamples/x509/path_build/main.cexamples/x509/store/main.cexamples/x509/store_file/main.cexamples/x509/store_system/main.cexamples/x509/crl/main.cexamples/x509/distribution/main.cexamples/x509/crl_profile/main.cexamples/x509/crl_policy/main.ctests/x509/test_x509_parse.ctests/x509/test_x509_parse_oom.ctests/x509/test_x509_profile.ctests/x509/test_x509_profile_oom.ctests/x509/test_x509_profile_mutation.ctests/x509/test_x509_crl.ctests/x509/test_x509_crl_oom.ctests/x509/test_x509_crl_mutation.ctests/x509/test_x509_distribution.ctests/x509/test_x509_distribution_oom.ctests/x509/test_x509_distribution_mutation.ctests/x509/test_x509_crl_profile.ctests/x509/test_x509_crl_profile_oom.ctests/x509/test_x509_crl_profile_mutation.ctests/x509/test_x509_crl_verify.ctests/x509/test_x509_crl_verify_rsa.ctests/x509/test_x509_crl_verify_rsa_oom.ctests/x509/test_x509_crl_policy_rsa.ctests/x509/test_x509_crl_policy_rsa_oom.ctests/x509/test_x509_name.ctests/x509/test_x509_name_oom.ctests/x509/test_x509_name_mutation.ctests/x509/test_x509_name_constraints.ctests/x509/test_x509_name_constraints_oom.ctests/x509/test_x509_name_constraints_mutation.ctests/x509/test_x509_identity.ctests/x509/test_x509_identity_oom.ctests/x509/test_x509_identity_mutation.ctests/x509/test_x509_signature.ctests/x509/test_x509_signature_oom.ctests/x509/test_x509_signature_mutation.ctests/x509/test_x509_verify.ctests/x509/test_x509_verify_oom.ctests/x509/test_x509_verify_rsa.ctests/x509/test_x509_verify_rsa_oom.ctests/x509/test_x509_verify_ecdsa.ctests/x509/test_x509_verify_ed25519.ctests/x509/test_x509_path.ctests/x509/test_x509_path_oom.ctests/x509/test_x509_path_build.ctests/x509/test_x509_path_build_oom.ctests/x509/test_x509_path_rsa.ctests/x509/test_x509_path_rsa_oom.ctests/x509/test_x509_path_build_rsa.ctests/x509/test_x509_path_build_rsa_oom.ctests/x509/test_x509_store.ctests/x509/test_x509_store_oom.ctests/x509/test_x509_store_rsa.ctests/x509/test_x509_store_file.ctests/x509/test_x509_store_file_oom.ctests/x509/test_x509_store_system.ctests/x509/test_x509_store_system_oom.ctests/single/test_single_x509_parse.ctests/single/test_single_x509_profile.ctests/single/test_single_x509_crl.ctests/single/test_single_x509_distribution.ctests/single/test_single_x509_crl_profile.ctests/single/test_single_x509_crl_verify.ctests/single/test_single_x509_crl_verify_rsa.ctests/single/test_single_x509_crl_policy_rsa.ctests/single/test_single_x509_name_constraints.ctests/single/test_single_x509_identity.ctests/single/test_single_x509_signature.ctests/single/test_single_x509_verify.ctests/single/test_single_x509_verify_rsa.ctests/single/test_single_x509_verify_ecdsa.ctests/single/test_single_x509_verify_ed25519.ctests/single/test_single_x509_path.ctests/single/test_single_x509_path_build.ctests/single/test_single_x509_path_build_rsa.ctests/single/test_single_x509_store.ctests/single/test_single_x509_store_rsa.ctests/single/test_single_x509_store_file.ctests/single/test_single_x509_store_system.ctests/fixtures/x509_vectors.htests/fixtures/x509_profile_vectors.htests/fixtures/x509_crl_vectors.htests/fixtures/x509_distribution_vectors.htests/fixtures/x509_crl_profile_vectors.htests/fixtures/x509_legacy_cert.htests/fixtures/x509_signature_vectors.htests/fixtures/x509_verify_vectors.htests/fixtures/x509_path_legacy.htests/fixtures/x509_name_constraints_vectors.hexamples/x509/profile/main.cexamples/x509/identity/main.cexamples/x509/signature/main.cexamples/x509/verify/main.c
测试把旧版真实 TLS 证书互操作与独立小型 DER 边界向量分开:前者验证生态兼容,后者精确覆盖版本、时间、算法、重复扩展、critical 默认值、空 Subject、未知公钥、失败原子性和错误原因链。
xx509version类型
X.509 版本使用规范文档中的自然编号。
| 值 | 语义 |
|---|---|
X509_VERSION_1 | v1 |
X509_VERSION_2 | v2 |
X509_VERSION_3 | v3 |
xx509result类型
X.509 游标把正常结束和结构错误分开表达。
| 值 | 语义 |
|---|---|
X509_ERROR | 失败 |
X509_DONE | 完成 |
X509_VALUE | 已产出值 |
xx509keytype类型
X.509 公钥类型独立于当前加密后端支持范围。
| 值 | 语义 |
|---|---|
X509_KEY_UNKNOWN | 未知 |
X509_KEY_RSA | RSA |
X509_KEY_RSA_PSS | RSA-PSS |
X509_KEY_EC | ECDSA |
X509_KEY_ED25519 | Ed25519 |
X509_KEY_ED448 | ED448 |
X509_KEY_X25519 | X25519 |
X509_KEY_X448 | X448 |
xx509curve类型
已知命名曲线;未知曲线仍通过 Algorithm 和 Key 原始视图暴露。
| 值 | 语义 |
|---|---|
X509_CURVE_UNKNOWN | 未知 |
X509_CURVE_P256 | P256 |
X509_CURVE_P384 | P384 |
X509_CURVE_P521 | P-521 曲线 |
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_NAME | GENERAL名称 |
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 | DNS名称 |
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 | 名称约束解析失败 |
xx509algorithm类型
AlgorithmIdentifier 的全部视图都借用原 DER;Parameters 保存完整 TLV。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Oid | xbytesview | Oid |
Parameters | xbytesview | Parameters |
HasParameters | bool | HasParameters |
xx509cert类型
证书视图零分配地借用调用方 DER;Serial 保留规范 INTEGER 的完整内容。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Tbs | xbytesview | Tbs |
Version | xx509version | 结构版本 |
Serial | xbytesview | Serial |
TbsSignature | xx509algorithm | TbsSignature |
Issuer | xbytesview | Issuer |
NotBefore | xtime | NotBefore |
NotAfter | xtime | NotAfter |
Subject | xbytesview | Subject |
SubjectPublicKeyInfo | xbytesview | SubjectPublicKeyInfo |
IssuerUniqueId | xbytesview | IssuerUniqueId |
IssuerUniqueIdUnusedBits | uint8 | IssuerUniqueIdUnusedBits |
SubjectUniqueId | xbytesview | SubjectUniqueId |
SubjectUniqueIdUnusedBits | uint8 | SubjectUniqueIdUnusedBits |
Extensions | xbytesview | Extensions |
SignatureAlgorithm | xx509algorithm | SignatureAlgorithm |
Signature | xbytesview | Signature |
xx509namecursor类型
Name 游标逐个返回 AttributeTypeAndValue,并保留所属 RDN 编号。
| 字段 | 类型 | 语义 |
|---|---|---|
Rdns | xdercursor | Rdns |
Attributes | xdercursor | Attributes |
Rdn | size_t | Rdn |
Active | bool | Active |
xx509nameattr类型
Name 属性保留值的 ASN.1 标签和借用内容,不强制转换字符集。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Oid | xbytesview | Oid |
ValueTag | xasn1tag | ValueTag |
Value | xbytesview | 值 |
Rdn | size_t | Rdn |
xx509extcursor类型
Extension 游标遍历证书、CRL 或其他协议对象中的扩展 SEQUENCE。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
xx509ext类型
Extension.Value 是 extnValue OCTET STRING 内借用的 DER 内容。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Oid | xbytesview | Oid |
Critical | bool | Critical |
Value | xbytesview | 值 |
xx509pubkey类型
公钥视图统一保留算法和 BIT STRING 内容,RSA 额外公开模数与指数。
| 字段 | 类型 | 语义 |
|---|---|---|
Type | xx509keytype | 类型 |
Curve | xx509curve | Curve |
Algorithm | xx509algorithm | Algorithm |
Key | xbytesview | 键 |
Modulus | xbytesview | Modulus |
Exponent | xbytesview | 指数 |
xx509crlversion类型
CRL 版本使用规范文档中的自然编号;省略 version 表示 v1。
| 值 | 语义 |
|---|---|
X509_CRL_VERSION_1 | X509CRLVERSION1 |
X509_CRL_VERSION_2 | CRL v2 |
xx509crl类型
CRL 视图零分配地借用调用方 DER,并保留全部可扩展协议字段。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Tbs | xbytesview | Tbs |
Version | xx509crlversion | 结构版本 |
TbsSignature | xx509algorithm | TbsSignature |
Issuer | xbytesview | Issuer |
ThisUpdate | xtime | ThisUpdate |
HasNextUpdate | bool | HasNextUpdate |
NextUpdate | xtime | NextUpdate |
Revoked | xbytesview | Revoked |
Extensions | xbytesview | Extensions |
SignatureAlgorithm | xx509algorithm | SignatureAlgorithm |
Signature | xbytesview | Signature |
xx509crlcursor类型
CRL 条目游标保留列表版本,以正确解释 v2 条目扩展。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
Version | xx509crlversion | 结构版本 |
xx509crlentry类型
CRL 条目保留完整序列号、撤销时间和可选扩展列表。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Serial | xbytesview | Serial |
RevokedAt | xtime | RevokedAt |
Extensions | xbytesview | Extensions |
xx509hash类型
签名摘要是协议标识,不表示当前构建一定包含对应密码后端。
| 值 | 语义 |
|---|---|
X509_HASH_NONE | 无 |
X509_HASH_SHA1 | SHA1 |
X509_HASH_SHA224 | SHA224 |
X509_HASH_SHA256 | SHA256 |
X509_HASH_SHA384 | SHA384 |
X509_HASH_SHA512 | SHA-512 |
xx509signaturetype类型
签名方案与公钥类型分离,ECDSA 的曲线由签名者公钥决定。
| 值 | 语义 |
|---|---|
X509_SIGNATURE_RSA_PKCS1 | RSAPKCS1 |
X509_SIGNATURE_RSA_PSS | RSAPSS |
X509_SIGNATURE_ECDSA | ECDSA |
X509_SIGNATURE_ED25519 | ED25519 |
X509_SIGNATURE_ED448 | Ed448 |
xx509signature类型
RSA-PSS 额外公开 MGF1 摘要、盐长和尾字段,其余方案保留默认零值。
| 字段 | 类型 | 语义 |
|---|---|---|
Type | xx509signaturetype | 类型 |
Hash | xx509hash | Hash |
MaskHash | xx509hash | MaskHash |
SaltSize | size_t | SaltSize |
Trailer | uint32 | 尾部 |
xx509gennametype类型
GeneralName 使用 RFC 5280 CHOICE 的上下文标签编号。
| 值 | 语义 |
|---|---|
X509_NAME_OTHER | OTHER |
X509_NAME_EMAIL | |
X509_NAME_DNS | DNS |
X509_NAME_X400 | X400 |
X509_NAME_DIRECTORY | DIRECTORY |
X509_NAME_EDI | EDI |
X509_NAME_URI | URI |
X509_NAME_IP | IP |
X509_NAME_REGISTERED_ID | registeredID 属性 |
xx509keyusage类型
KeyUsage 位值与 RFC 5280 位编号一一对应。
| 值 | 语义 |
|---|---|
X509_USAGE_DIGITAL_SIGNATURE | DIGITALSIGNATURE |
X509_USAGE_CONTENT_COMMITMENT | CONTENTCOMMITMENT |
X509_USAGE_KEY_ENCIPHERMENT | KEYENCIPHERMENT |
X509_USAGE_DATA_ENCIPHERMENT | 数据损坏ENCIPHERMENT |
X509_USAGE_KEY_AGREEMENT | KEYAGREEMENT |
X509_USAGE_CERT_SIGN | CERTSIGN |
X509_USAGE_CRL_SIGN | CRLSIGN |
X509_USAGE_ENCIPHER_ONLY | ENCIPHERONLY |
X509_USAGE_DECIPHER_ONLY | 仅解密(CRL 用) |
xx509gencursor类型
GeneralNames 游标借用一项完整 DER SEQUENCE。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
xx509genname类型
GeneralName.Value 借用上下文标签内容,Raw 保留完整 TLV。
| 字段 | 类型 | 语义 |
|---|---|---|
Type | xx509gennametype | 类型 |
Raw | xbytesview | Raw |
Value | xbytesview | 值 |
xx509oidcursor类型
OID 序列游标用于 EKU 和其他 SEQUENCE OF OBJECT IDENTIFIER。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
xx509basicconstraints类型
BasicConstraints 同时区分 pathLenConstraint 不存在和数值为零。
| 字段 | 类型 | 语义 |
|---|---|---|
CA | bool | CA |
HasPathLimit | bool | HasPathLimit |
PathLimit | uint32 | PathLimit |
xx509authoritykeyid类型
AuthorityKeyIdentifier 保留借用的 keyIdentifier、发行者游标和完整序列号。
| 字段 | 类型 | 语义 |
|---|---|---|
HasKeyId | bool | HasKeyId |
KeyId | xbytesview | KeyId |
HasIssuer | bool | HasIssuer |
Issuer | xx509gencursor | Issuer |
HasSerial | bool | HasSerial |
Serial | xbytesview | Serial |
xx509crlreasonflag类型
ReasonFlags 位值按 BIT STRING 位编号表达,与 CRLReason 枚举数值相互独立。
| 值 | 语义 |
|---|---|
X509_CRL_REASON_FLAG_UNUSED | 位未使用 |
X509_CRL_REASON_FLAG_KEY_COMPROMISE | KEYCOMPROMISE |
X509_CRL_REASON_FLAG_CA_COMPROMISE | CACOMPROMISE |
X509_CRL_REASON_FLAG_AFFILIATION_CHANGED | AFFILIATIONCHANGED |
X509_CRL_REASON_FLAG_SUPERSEDED | SUPERSEDED |
X509_CRL_REASON_FLAG_CESSATION | CESSATION |
X509_CRL_REASON_FLAG_CERTIFICATE_HOLD | CERTIFICATEHOLD |
X509_CRL_REASON_FLAG_PRIVILEGE_WITHDRAWN | PRIVILEGEWITHDRAWN |
X509_CRL_REASON_FLAG_AA_COMPROMISE | AACOMPROMISE |
X509_CRL_REASON_FLAG_ALL | 全部 |
xx509distributionnametype类型
DistributionPointName 区分完整 GeneralNames 和相对 CRL 发行者的单个 RDN。
| 值 | 语义 |
|---|---|
X509_DISTRIBUTION_FULL_NAME | X509DISTRIBUTION已满名称 |
X509_DISTRIBUTION_RELATIVE_NAME | relativeTo distinguishedName 形式 |
xx509distributionname类型
分发点名称保留完整上下文 TLV;FullNames 仅在完整名称模式下有效。
| 字段 | 类型 | 语义 |
|---|---|---|
Type | xx509distributionnametype | 类型 |
Raw | xbytesview | Raw |
Value | xbytesview | 值 |
FullNames | xx509gencursor | FullNames |
xx509distributioncursor类型
分发点列表游标借用完整 CRLDistributionPoints DER。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
xx509distributionpoint类型
DistributionPoint 保留三项可选字段和完整 DER 视图。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
HasName | bool | 是否名称 |
Name | xx509distributionname | 名称 |
HasReasons | bool | HasReasons |
Reasons | uint16 | Reasons |
HasIssuer | bool | HasIssuer |
Issuer | xx509gencursor | Issuer |
xx509crlreason类型
CRLReason 保留 RFC 5280 的协议数值;7 没有定义。
| 值 | 语义 |
|---|---|
X509_CRL_REASON_UNSPECIFIED | UNSPECIFIED |
X509_CRL_REASON_KEY_COMPROMISE | 密钥泄露 |
X509_CRL_REASON_CA_COMPROMISE | CA 泄露 |
X509_CRL_REASON_AFFILIATION_CHANGED | 隶属变更 |
X509_CRL_REASON_SUPERSEDED | 已被取代 |
X509_CRL_REASON_CESSATION | CESSATION |
X509_CRL_REASON_CERTIFICATE_HOLD | 证书挂起 |
X509_CRL_REASON_REMOVE | REMOVE |
X509_CRL_REASON_PRIVILEGE_WITHDRAWN | 特权撤销 |
X509_CRL_REASON_AA_COMPROMISE | AA 泄露 |
xx509issuingpoint类型
IssuingDistributionPoint 区分所有 DEFAULT、OPTIONAL 和作用域字段。
| 字段 | 类型 | 语义 |
|---|---|---|
HasDistributionPoint | bool | HasDistributionPoint |
DistributionPoint | xx509distributionname | DistributionPoint |
OnlyUserCertificates | bool | OnlyUserCertificates |
OnlyCaCertificates | bool | OnlyCaCertificates |
HasReasons | bool | HasReasons |
Reasons | uint16 | Reasons |
Indirect | bool | Indirect |
OnlyAttributeCertificates | bool | OnlyAttributeCertificates |
xx509subtreecursor类型
GeneralSubtrees 游标借用 permitted 或 excluded 的隐式 SEQUENCE 内容。
| 字段 | 类型 | 语义 |
|---|---|---|
Items | xdercursor | 元素数组 |
xx509subtree类型
GeneralSubtree 保留名称基点和任意精度非负 distance 借用视图。
| 字段 | 类型 | 语义 |
|---|---|---|
Raw | xbytesview | Raw |
Base | xx509genname | Base |
HasMinimum | bool | HasMinimum |
Minimum | xbytesview | Minimum |
HasMaximum | bool | HasMaximum |
Maximum | xbytesview | Maximum |
xx509nameconstraints类型
NameConstraints 明确区分 permitted/excluded 不存在与非空列表。
| 字段 | 类型 | 语义 |
|---|---|---|
HasPermitted | bool | HasPermitted |
Permitted | xx509subtreecursor | Permitted |
HasExcluded | bool | HasExcluded |
Excluded | xx509subtreecursor | Excluded |
xx509crlpolicyflag类型
CRL policy 标志只控制规范要求的字段是否必须显式存在。
| 值 | 语义 |
|---|---|
X509_CRL_REQUIRE_NEXT_UPDATE | 要求 NextUpdate |
X509_CRL_REQUIRE_NUMBER | NUMBER |
X509_CRL_REQUIRE_AUTHORITY_KEY_ID | AUTHORITYKEY标识 |
X509_CRL_REQUIRE_KEY_IDENTIFIER | KEYIDENTIFIER |
X509_CRL_REQUIRE_KEY_USAGE | KEYUSAGE |
X509_CRL_ALLOW_SHA1 | 允许 SHA-1 签名的 CRL |
xx509revocationstate类型
单项查询区分完整 CRL 的有效、撤销与 delta CRL 的移除记录。
| 值 | 语义 |
|---|---|
X509_REVOCATION_GOOD | GOOD |
X509_REVOCATION_REVOKED | REVOKED |
X509_REVOCATION_REMOVED | 已从 CRL 移除 |
xx509crlconfig类型
CRL 策略集中表达确定时间、时钟容差和 critical 扩展处理。
| 字段 | 类型 | 语义 |
|---|---|---|
Time | xtime | 时间戳(公元 UTC 毫秒) |
Skew | uint64 | Skew |
Flags | uint32 | 标志位 |
Critical | xx509crlcriticalproc | Critical |
UserData | ptr | 用户数据 |
xx509crlvalid类型
已验证 CRL 借用原 CRL、签发者证书和全部 profile 子视图。
| 字段 | 类型 | 语义 |
|---|---|---|
Crl | const xx509crl* | Crl |
Issuer | const xx509cert* | Issuer |
HasAuthorityKeyId | bool | HasAuthorityKeyId |
AuthorityKeyIdDer | xbytesview | AuthorityKeyIdDer |
Delta | bool | Delta |
HasNumber | bool | HasNumber |
Number | xbytesview | Number |
BaseNumber | xbytesview | BaseNumber |
HasIssuingPoint | bool | HasIssuingPoint |
IssuingPointDer | xbytesview | IssuingPointDer |
IssuingPoint | xx509issuingpoint | IssuingPoint |
xx509revocation类型
吊销结果同时公开覆盖原因、命中条目和可选扩展值。
| 字段 | 类型 | 语义 |
|---|---|---|
State | xx509revocationstate | 状态 |
CoveredReasons | uint16 | CoveredReasons |
Entry | xx509crlentry | Entry |
HasReason | bool | 是否原因文本 |
Reason | xx509crlreason | 原因文本 |
HasInvalidityDate | bool | HasInvalidityDate |
InvalidityDate | xtime | InvalidityDate |
xx509revocationcheck类型
多份分段 CRL 的状态归并器只保存原因掩码和最终借用结果。
| 字段 | 类型 | 语义 |
|---|---|---|
CoveredReasons | uint16 | CoveredReasons |
Determined | bool | Determined |
Revocation | xx509revocation | Revocation |
xx509crlset类型
CRL set 复制两个已验证借用视图,不复制其底层 DER。
| 字段 | 类型 | 语义 |
|---|---|---|
Base | xx509crlvalid | Base |
Delta | xx509crlvalid | Delta |
xx509pathflag类型
路径策略标志只控制目标证书用途是否必须显式出现。
| 值 | 语义 |
|---|---|
X509_PATH_REQUIRE_KEY_USAGE | KEYUSAGE |
X509_PATH_REQUIRE_PURPOSE | PURPOSE |
X509_PATH_ALLOW_SHA1 | 允许 SHA-1 签名的路径 |
xx509anchor类型
信任锚是受信任名称与公钥,不把自签名证书错误地并入待验证路径。
| 字段 | 类型 | 语义 |
|---|---|---|
Name | xbytesview | 名称 |
PublicKey | xx509pubkey | PublicKey |
Certificate | xbytesview | Certificate |
HasNameConstraints | bool | HasNameConstraints |
NameConstraints | xx509nameconstraints | NameConstraints |
xx509pathconfig类型
路径策略把确定时间、目标用途和自定义 critical 扩展处理集中表达。
| 字段 | 类型 | 语义 |
|---|---|---|
Time | xtime | 时间戳(公元 UTC 毫秒) |
Flags | uint32 | 标志位 |
KeyUsage | uint16 | KeyUsage |
Purpose | xbytesview | Purpose |
Critical | xx509criticalproc | Critical |
UserData | ptr | 用户数据 |
xx509pathsource类型
建链源把调用方已解析的候选发行者和独立信任锚组成借用视图。
| 字段 | 类型 | 语义 |
|---|---|---|
Issuers | const xx509cert* const* | Issuers |
IssuerCount | size_t | IssuerCount |
Anchors | const xx509anchor* | Anchors |
AnchorCount | size_t | AnchorCount |
xx509pathresult类型
建链结果只在成功时发布路径长度和命中的借用信任锚。
| 字段 | 类型 | 语义 |
|---|---|---|
Count | size_t | 数量 |
Anchor | const xx509anchor* | Anchor |
xx509store类型
信任库拥有导入的 DER 和锚对象;公开类型保持不透明。 不透明句柄或别名;生命周期与所有权见各使用方 API 节。
xx509crlcriticalproc类型
未内建处理的 critical CRL/条目扩展由调用方显式决定是否接受。 回调类型;参数与返回语义见签名及各使用方 API 节。
xx509criticalproc类型
未内建处理的 critical 扩展由调用方返回 VALUE、DONE 或 ERROR。 回调类型;参数与返回语义见签名及各使用方 API 节。
xrtX509Parse函数
把 DER 证书解析为只读证书视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
判断证书在指定时刻处于有效期内。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
iTime | 输入 | — | 检查时刻 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 是在有效期内 | — |
false | 不是在有效期内 | — |
- 无 — 纯时间比较,不设置错误
xrtX509TimeParse函数
解析 X.509 DER 时间值(UTCTime/GeneralizedTime)。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
从证书提取独立于后端的公钥描述。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pPublicKey | 输出 | 非空 | 接收公钥 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509Anchor函数
把证书包装为认证路径验证的信任锚。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCertificate | 输入 | 非空 | 信任锚证书 |
pAnchor | 输出 | 非空 | 接收信任锚 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法
xrtX509AlgorithmParse函数
解析 AlgorithmIdentifier 并映射到稳定签名方案标识。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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) ) {
xrtX509NameInit函数
在证书名称 DER 上初始化属性遍历游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Name | 输入 | 借用 | 名称 DER |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509NameRead函数
返回下一个 RDN 属性。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pAttribute | 输出 | 非空 | 接收属性 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509NameFind函数
在名称中查找指定 OID 的首个属性。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 序列比较两个名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
判断名称是否位于基础名称子树内。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Name | 输入 | 借用 | 名称 DER |
Base | 输入 | 借用 | 基础名称 DER |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 在子树内 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509ExtensionInit函数
在证书扩展列表上初始化遍历游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509ExtensionRead函数
返回下一个扩展项。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pExtension | 输出 | 非空 | 接收扩展 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509ExtensionFind函数
在证书中查找指定 OID 的扩展。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 上初始化遍历游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Extensions | 输入 | 借用 | 扩展列表 DER |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509ExtensionListFind函数
在独立扩展列表中查找指定 OID 的扩展。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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) ) {
xrtX509NameConstraints函数
从证书取出解码后的名称约束结构。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCertificate | 输入 | 非空 | 目标证书 |
pConstraints | 输出 | 非空 | 接收约束 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509NameConstraintsParse函数
解析名称约束扩展 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pConstraints | 输出 | 非空 | 接收约束 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
范例已编译验证
name_constraints · 解析名称约束
if ( !xrtX509NameConstraintsParse(
(xbytesview) { Der, sizeof(Der) }, &Constraints
) ) {
xrtX509NameConstraintsCheck函数
检查证书的主题与 SAN 是否满足名称约束。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConstraints | 输入 | 非空 | 已解码约束 |
pCertificate | 输入 | 非空 | 待检查证书 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509SubtreeRead函数
返回名称约束的下一个子树项。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 ) {
xrtX509CrlParse函数
把 DER CRL 解析为只读视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 上初始化条目遍历游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlEntryRead函数
返回下一个吊销条目。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pEntry | 输出 | 非空 | 接收条目 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlEntryReason函数
读取吊销条目的原因代码。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
读取吊销条目的失效日期。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pEntry | 输入 | 非空 | 目标条目 |
pTime | 输出 | 非空 | 接收时间 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlEntryIssuer函数
读取间接 CRL 条目的签发者名称游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 中查找指定序列号的吊销条目。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 编号扩展。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 的授权密钥标识。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pIdentifier | 输出 | 非空 | 接收标识 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509AuthorityKeyIdParse函数
解析授权密钥标识扩展 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pIdentifier | 输出 | 非空 | 接收标识 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlDeltaBase函数
读取增量 CRL 的基准编号。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pNumber | 输出 | 非空 | 接收编号视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlValidAt函数
判断 CRL 在指定时刻处于有效期内。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
iTime | 输入 | — | 检查时刻 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 是在有效期内 | — |
false | 不是在有效期内 | — |
- 无 — 纯时间比较,不设置错误
范例已编译验证
crl_tour · CRL 有效期判断
if ( !xrtX509CrlValidAt(&Crl, xrtNow()) ||
!xrtX509PublicKey(&Ca, &CaKey) ||
!xrtX509CrlVerifyKey(&Crl, &CaKey) ||
!xrtX509CrlVerify(&Crl, &Ca) ) {
xrtX509CrlPoints函数
取出证书的 CRL 分发点游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509CrlFreshest函数
取出 CRL 的 Freshest 游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509DistributionInit函数
在分发点扩展 DER 上初始化游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
返回下一个分发点。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pPoint | 输出 | 非空 | 接收分发点 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509DistributionPointParse函数
解析单个分发点 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 分发点 DER |
pPoint | 输出 | 非空 | 接收分发点 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlConfigInit函数
初始化 CRL 验证的默认配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 已初始化 | — |
- 无 — 初始化不失败
xrtX509CrlValidate函数
按配置验证 CRL 并产出有效性视图。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pIssuer | 输入 | 非空 | 签发者证书 |
pConfig | 输入 | 允许空 | 验证配置 |
pValid | 输出 | 非空 | 接收有效性视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509CrlVerify函数
用签发者证书验证 CRL 签名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pIssuer | 输入 | 非空 | 签发者证书 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 签名不匹配XERR_UNSUPPORTED— 签名算法不受支持
xrtX509CrlVerifyKey函数
用独立公钥验证 CRL 签名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pPublicKey | 输入 | 非空 | 公钥 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 签名不匹配XERR_UNSUPPORTED— 签名算法不受支持
xrtX509CrlIssuingPoint函数
读取 CRL 签发点扩展。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pPoint | 输出 | 非空 | 接收签发点 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509IssuingPointParse函数
解析签发点扩展 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pPoint | 输出 | 非空 | 接收签发点 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
范例已编译验证
cert_tour · 解析签发点
if ( !xrtX509IssuingPointParse(
(xbytesview) { arrIdp, 9u },
&Issuing) ||
(!Issuing.HasDistributionPoint) ) {
xrtX509CrlInvalidityDateParse函数
解析失效日期扩展 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pTime | 输出 | 非空 | 接收时间 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
范例已编译验证
crl_tour · 解析失效日期
!xrtX509CrlInvalidityDateParse(
(xbytesview) { arrDate, 17u }, &Parsed) ||
xrtX509CrlReasonParse函数
解析吊销原因扩展 DER。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pReason | 输出 | 非空 | 接收原因 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509BasicConstraints函数
读取证书的基础约束扩展。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pConstraints | 输出 | 非空 | 接收约束 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509KeyUsage函数
读取证书的密钥用途位掩码。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pCursor | 输出 | 非空 | 接收 OID 游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509OidInit函数
在 OID 序列 DER 上初始化游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Oids | 输入 | 借用 | OID 序列 DER |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509OidRead函数
返回下一个 OID。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pOid | 输出 | 非空 | 接收 OID 视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509SubjectKeyId函数
读取证书的主体密钥标识。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Der | 输入 | 借用 | 扩展 DER |
pKeyId | 输出 | 非空 | 接收标识视图 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509AuthorityKeyId函数
读取证书的授权密钥标识。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pIdentifier | 输出 | 非空 | 接收标识 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509CrlCheck函数
用已验证 CRL 检查证书吊销状态。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pValid | 输入 | 非空 | 已验证 CRL |
pCertificate | 输入 | 非空 | 目标证书 |
pRevocation | 输出 | 非空 | 接收吊销结论 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509CrlSetInit函数
用基础与增量 CRL 组合成吊销检查集。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pSet | 输出 | 非空 | 接收 CRL 集 |
pBase | 输入 | 非空 | 基础 CRL |
pDelta | 输入 | 允许空 | 增量 CRL |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509CrlSetCheck函数
用 CRL 集检查证书吊销状态。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
组合验证与检查,直接给出证书吊销结论。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 是否吊销指定证书。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCrl | 输入 | 非空 | 目标 CRL |
pCert | 输入 | 非空 | 目标证书 |
pEntry | 输出 | 非空 | 接收条目 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509RevocationInit函数
初始化跨源聚合的吊销结论结构。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCheck | 输出 | 非空 | 接收吊销检查 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 已初始化 | — |
- 无 — 初始化不失败
xrtX509RevocationResult函数
读取聚合后的最终吊销结论。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCheck | 输入 | 非空 | 吊销检查 |
pRevocation | 输出 | 非空 | 接收结论 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法
xrtX509RevocationUpdate函数
把单源结论并入聚合结构。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCheck | 输入/输出 | 非空 | 吊销检查 |
pRevocation | 输入 | 非空 | 单源结论 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509SignatureParse函数
把算法标识映射为可执行验证的签名方案。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
用公钥验证内容与签名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pScheme | 输入 | 非空 | 签名方案 |
Content | 输入 | 借用 | 内容 |
Signature | 输入 | 借用 | 签名值 |
pPublicKey | 输入 | 非空 | 公钥 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 签名不匹配XERR_UNSUPPORTED— 方案不受支持
xrtX509CertificateVerify函数
用签发者证书验证证书签名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCertificate | 输入 | 非空 | 目标证书 |
pIssuer | 输入 | 非空 | 签发者证书 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 签名不匹配XERR_UNSUPPORTED— 算法不受支持
xrtX509CertificateVerifyKey函数
用独立公钥验证证书签名。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCertificate | 输入 | 非空 | 目标证书 |
pPublicKey | 输入 | 非空 | 公钥 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 签名不匹配XERR_UNSUPPORTED— 算法不受支持
xrtX509MatchDns函数
按 RFC 6125 左通配规则匹配 DNS 名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 中查找匹配主机的名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 的通用名称游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509IssuerAltName函数
取出证书 IAN 的通用名称游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCert | 输入 | 非空 | 目标证书 |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — 扩展内容不符合预期结构
xrtX509GeneralNameInit函数
在 GeneralNames DER 上初始化游标。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
Names | 输入 | 借用 | 名称序列 DER |
pCursor | 输出 | 非空 | 接收游标 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
范例已编译验证
profile · 初始化通用名称遍历
if ( !xrtX509GeneralNameInit(
(xbytesview) { GeneralNames, sizeof(GeneralNames) }, &Cursor
) ) {
xrtX509GeneralNameRead函数
返回下一个通用名称。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCursor | 输入/输出 | 已初始化 | 目标游标 |
pName | 输出 | 非空 | 接收名称 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_DONE | 已完整读取或字段不存在 | 不设错误 |
X509_VALUE | 已产出一项或判定成立 | — |
X509_ERROR | 参数或结构非法 | XERR_ARGUMENT / XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509GeneralNameWithin函数
判断通用名称是否位于基础名称内。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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) ) {
xrtX509PathBuild函数
从目标证书出发构建到信任源的认证路径。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
初始化路径验证的默认配置。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pConfig | 输出 | 非空 | 接收配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 已初始化 | — |
- 无 — 初始化不失败
xrtX509PathValidate函数
按配置和信任锚验证证书链。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
ppCertificates | 输入 | 非空数组 | 证书链(叶在前) |
iCount | 输入 | > 0 | 链长 |
pAnchor | 输入 | 非空 | 信任锚 |
pConfig | 输入 | 允许空 | 验证配置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— 链断裂、有效期或用途不满足XERR_RANGE— 深度超限
xrtX509IssuerMatch函数
判断证书的签发者字段与签发者证书主题匹配。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pCertificate | 输入 | 非空 | 目标证书 |
pIssuer | 输入 | 非空 | 签发者证书 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
X509_VALUE | 匹配 | — |
X509_DONE | 不匹配 | 不设错误 |
X509_ERROR | 结构非法 | XERR_PROTOCOL |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
xrtX509StoreCreate函数
创建空信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
| 无参数 | — | — | — |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 信任库 | — |
NULL | 分配失败 | XERR_MEMORY |
XERR_MEMORY— 分配失败
xrtX509StoreSystem函数
加载操作系统根证书信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
| 无参数 | — | — | — |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 系统信任库 | — |
NULL | 加载失败 | XERR_IO 等 |
XERR_IO— 系统证书存储读取失败XERR_MEMORY— 分配失败
xrtX509StoreFree函数
释放信任库及其全部条目。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入 | 允许空 | 空 = 空操作 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 无 | 已释放 | — |
- 无 — 释放不失败
xrtX509StoreCount函数
返回信任库中的条目总数。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入 | 非空 | 目标信任库 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
>= 0 | 条目总数 | — |
XERR_ARGUMENT— 指针为空或参数非法
xrtX509StoreCertificate函数
返回指定位置的借用证书。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入 | 非空 | 目标信任库 |
iIndex | 输入 | < 条目数 | 位置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 证书借用 | — |
NULL | 越界 | 不设错误 |
- 越界返回
NULL且不设置错误;句柄为空XERR_ARGUMENT
xrtX509StoreAnchor函数
返回指定位置的借用信任锚。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入 | 非空 | 目标信任库 |
iIndex | 输入 | < 条目数 | 位置 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
| 非空 | 信任锚借用 | — |
NULL | 越界 | 不设错误 |
- 越界返回
NULL且不设置错误;句柄为空XERR_ARGUMENT
xrtX509StoreAdd函数
把 DER 证书加入信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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函数
解析文件中的全部证书并加入信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
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 文本中的全部证书并加入信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入/输出 | 非空 | 目标信任库 |
sText | 输入 | 借用 | PEM 文本 |
iSize | 输入 | — | 文本长度 |
pAdded | 输出 | 允许空 | 接收加入数量 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL— PEM 结构非法
范例已编译验证
store_tour · 从 PEM 文本加入
!xrtX509StoreAddPem(pStore = xrtX509StoreCreate(), arrPem, iPemSize, &iAdded) ||
xrtX509StoreAddSystem函数
把操作系统根证书并入既有信任库。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入/输出 | 非空 | 目标信任库 |
pAdded | 输出 | 允许空 | 接收加入数量 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_IO— 系统证书存储读取失败XERR_MEMORY— 分配失败
xrtX509StoreSource函数
把信任库包装为路径构建的中间证书来源。
参数
| 参数 | 方向 | 约束 | 说明 |
|---|---|---|---|
pStore | 输入 | 非空 | 目标信任库 |
ppIssuers | 输出 | 非空数组 | 签发者借用数组 |
iIssuerCount | 输入 | > 0 | 签发者容量 |
pSource | 输出 | 非空 | 接收来源描述 |
| 返回 | 含义 | 失败时状态 |
|---|---|---|
true | 成功 | — |
false | 失败 | 见错误 |
XERR_ARGUMENT— 指针为空或参数非法XERR_PROTOCOL(x509语义) — DER 结构或 OID 非法
常量索引常量
以下常量在本页所属头文件中定义,语义见公共头注释。
| 常量 | 说明 |
|---|---|
| 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 | 见头文件注释 |