附录 B. 使用 TLSA 的伪代码 (Pseudocode for Using TLSA)
本附录以 pseudocode 形式描述本规范前文给出的交互. 如果以下步骤与本文档前文正文不一致, 应以前文正文为准, 本附录文本为误. 注意, 该 pseudocode 比规范性正文更严格. 例如, 它强制规定了评估 criteria 的顺序, 而规范性正文并不要求这种顺序.
B.1. 辅助函数 (Helper Functions)
Finish(F) 根据结果中止 TLS handshake, 阻止 TLS 启动, 回退到非 TLSA certificate validation, 或接受 TLS connection.
Select(S, X) 根据 selector 返回 certificate 的比较输入: selector 0 返回 DER encoding 中的完整 certificate, selector 1 返回 DER encoding 中的 SubjectPublicKeyInfo.
Match(M, X, Y) 根据 matching type 执行比较: matching type 0 对 selected content 做 exact match, matching type 1 比较 SHA-256(X) 与 Y, matching type 2 比较 SHA-512(X) 与 Y.
B.2. 主要 TLSA 伪代码 (Main TLSA Pseudocode)
TLS client 使用 [transport] 连接到 [name] 的 [port], 并接收 TLS server 的 end entity certificate C. client 对 _[port]._[transport].[name] 执行 DNSSEC-validated lookup, 查询 RRtype TLSA, 得到 TLSArecords 和 ValState.
如果 ValState 为 BOGUS, client 调用 Finish(ABORT_TLS). 如果 ValState 为 INDETERMINATE 或 INSECURE, client 调用 Finish(NO_TLSA). 如果 validation state 为 SECURE, client 删除所有不可用 records, 包括 unknown certUsage, unknown selectorType, unknown matchingType, erroneous RDATA, 以及 local policy 禁止的 records.
如果没有剩余 TLSA records, client 回退到非 TLSA certificate validation. 否则, client 逐条检查 TLSA records: usage 0 要求 PKIX validation 通过, 且 certification path 中有来自 TLSA 的匹配 CA certificate; usage 1 要求 PKIX validation 通过, 且 end entity certificate 匹配 TLSA; usage 2 使用匹配 TLSA record 的 certificate 作为 trust anchor 执行 PKIX validation; usage 3 直接匹配 TLSA record 与 TLS certificate. 若没有任何 TLSA record 产生 Finish(ACCEPT), client 最终调用 Finish(ABORT_TLS).