ASN1Kit

Swift 的 ASN.1 解码器

API 文档

生成的 API 文档可在 https://swiftpackageindex.cn/gematik/ASN1Kit/documentation/ 找到。

概述

这个库可以用于 ASN.1 (Abstract Syntax Notation One,抽象语法标记一) 的编码/解码,使用 ITU-T X.690 规定的可区分编码规则 (DER)。

更多信息,请参考完整的 X.690-0207.pdf 规范。

入门

ASN1Kit 需要 Swift 5.5。

集成设置

SPM

将以下内容放入您的 Package.swift 文件中

.package(url: "https://github.com/gematik/ASN1Kit.git", from: "1.2.0")

开发设置

您需要 Bundler, XcodeGenfastlane 以方便地使用已建立的开发环境。

  1. 检出(并构建)依赖项并生成 xcodeproject

    $ make setup

代码示例

使用 ASN1Decoder.decode(asn1:) 解码序列化数据

let expected = Data([0xB, 0xB, 0x0])
let serialized = Data([0x23, 0x0C,
                       0x03, 0x02, 0x00, 0x0B,
                       0x03, 0x02, 0x00, 0x0B,
                       0x03, 0x02, 0x04, 0x0F])
expect(try Data(from: ASN1Decoder.decode(asn1: serialized))) == expected

构造一个您选择的 ASN1Object 并将其序列化

let data = Data([0x0, 0x1, 0x2, 0x4]) as ASN1EncodableType
let data2 = Data([0x4, 0x3, 0x2, 0x1]) as ASN1EncodableType
let array = [data, data2]

let expected = Data([0x30, 0xC, 0x4, 0x4, 0x0, 0x1, 0x2, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2, 0x1])
expect(try array.asn1encode().serialize()) == expected

ASN.1 编码 Swift 原始类型并提取编码值

// 0x0080 = 128
let expected = Data([0x00, 0x80])
expect(try 128.asn1encode(tag: nil).data.primitive) == expected
// 0x0080 = 128
let expected = Data([0x00, 0x80])
expect(try UInt(128).asn1encode(tag: nil).data.primitive) == expected

提取构造的 ASN1Object 的第一个元素的标签

let data = Data([0x1, 0x2, 0x3, 0x4, 0x8])
let tag1 = ASN1Primitive(data: .primitive(data), tag: .taggedTag(3)) // context-specific class tag
let tag2 = ASN1Primitive(data: .primitive(data), tag: .universal(ASN1Tag.octetString))
let implicitTag = ASN1Primitive(data: .constructed([tag1, tag2]), tag: .taggedTag(83))

expect(implicitTag.data.items?.first?.tag) == .taggedTag(3)

许可证

Apache License Version 2.0

参见 LICENSE