Swift 中安全至上的 ASN.1 解析器。
您可以将 ASN1Parser.docc
导入 Xcode,打开 docs/documentation/asn1parser/index.html
中预构建的静态站点,使用 preview-doc.sh
在本地预览,或者使用 gen-doc.sh
自行构建静态网站。
请注意,遗憾的是,由于其不区分大小写的链接,github pages 无法托管该静态站点,github pages 会将这些链接路由为 404。
给定公钥的 DER 编码 ASN.1 表示形式,例如在 .pem
文件中找到的
// Public key data blob from pem file
let pemBlob = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEQPtmXeh4gkzq30Zq3LXdgcl39fgCOBRZExhNWgZTSv5NTvbRoZNx28Ln/+Wtkfc42nWdunurluAeMPr0BrnLtA=="
guard let derData = Data(base64Encoded: pemBlob) else { return }
// Parse DER into ASN.1 value, which is a tree like structure
let tree = try DERParser.parse(derData)
// Access values within the tree
let q = try tree.asSequence[1].asBitString
请注意,选择隐式格式规范是经过深思熟虑的。我认为 ASN.1 并不特别适合 1:1 映射到 Swift 类型。因此,您很可能需要引入一个抽象层,即,除了您理想情况下希望在其余代码中使用的 Swift 类型定义之外,还需要一个显式的 ASN.1 格式规范。然而,恕我直言,这个抽象层是不必要的,因为它只包含样板定义和用于在 ASN.1 格式和您的 Swift 类型之间进行转换的代码。除了样板代码通常浪费且混乱的性质之外,对同一底层概念使用两个不同的抽象可能会导致不一致,从而导致错误。
使用隐式 ASN.1 格式规范,您可以安全快速地访问 ASN.1 数据,而无需担心在您的代码库中引入任何意外的不一致,因为不会存在额外的抽象层。只需在 Swift 中定义您想要的类型,并从解码后的 ASN.1 表示形式中动态加载其值。
当然,非常欢迎 Pull Request :)