【问题标题】:ASN1 parsing with swift快速解析 ASN1
【发布时间】:2015-07-14 13:39:34
【问题描述】:

我想我明白了 ASN.1 解析背后的基本思想。遍历字节,解释它们并用它们做一些有用的事情。唉,我被困在了实现上。

Apple 没有示例代码(我可以找到),可能是出于安全原因。 OpenSSL 没有很好的文档记录,所以我只能猜测这些函数的实际作用。我找到的唯一sample code in swift 不处理案例 17(应用内购买),这是我感兴趣的一件事。

我试图找出指针在数据流中的位置,但我总是得到同样荒谬的结果 49。

    let receiptContents = NSData(contentsOfURL: receiptLocation)!

    let receiptBIO = BIO_new(BIO_s_mem())
    BIO_write(receiptBIO, receiptContents.bytes, Int32(receiptContents.length))
    contents = d2i_PKCS7_bio(receiptBIO, nil)

    //parsing
    var currentIndex    = UnsafePointer<UInt8>()
    var endIndex        = UnsafePointer<UInt8>()

    let octets      = pkcs7_d_data(pkcs7_d_sign(self.contents).memory.contents)

    var ptr = UnsafePointer<UInt8>(octets.memory.data)
    let end = ptr.advancedBy(Int(octets.memory.length))
    println(ptr.memory) //always 49 ???
    println(end.memory) //always 0 ???
    println(octets.memory.length)

我尝试自己解析 NSData,但是,二进制数据的类型是什么?

    receiptContents = NSData(contentsOfURL: receiptLocation)!

    //get bytes
    let count = receiptContents.length / sizeof(UInt8)
    var bytes = [UInt8](count: count, repeatedValue: 0)
    receiptContents.getBytes(&bytes, length:count * sizeof(UInt8))

    //parsing
    for index in 0...5
    {
        let value = Int(bytes[index])
        println(value)
    }

我得到这个输出: 48 130 21 57 6 9

但如果正确理解 ASN.1 格式,它应该以值 17(设置)开始,然后是 3 个字节的长度(Int24?),然后是值 16(第一个序列),序列长度 ( 1字节),序列类型(1字节),序列有效载荷,(重复)。

Int32、Int16 等其他类型对我来说意义不大。

不确定如何在此处继续。有什么建议吗?

【问题讨论】:

    标签: swift openssl in-app-purchase asn.1


    【解决方案1】:

    从一开始,我想我应该否认这一点,说我对许多底层技术(Swift、OpenSSL、我认为您正在使用的生物识别标准)不是很熟悉。

    也就是说,您可能违反了 BER 的标记规则。 The Wiki article on X.690 有一些关于如何构建 BER 标记的介绍性 cmets,但实际上您需要咨询 Annex A of X.690 以获取示例编码和 X.680 §8 以获取有关标记的信息。

    SET 类型可以以几种不同的形式出现;但在你的情况下49 = 0x31 = 0b00110001 = UNIVERSAL 17SET,构造)。可能会出现其他形式,但这是唯一从标签本身明确标识为 SET 的形式:规范可能对 SET 类型使用不同的标签。

    【讨论】:

    • 十进制 49 是十六进制 31 是二进制 110001 是内部 ans.1 类型?他们为什么这样做?十进制不够好? (对不起,对此有点沮丧)
    • @user965972 –(希望)简洁地说,ASN.1 有四种标记环境:通用、应用程序、上下文和私有。标签类型在标识符八位字节的前两位中表示。在标签类型之后是一个标志,表示该类型是原始类型(简单值)还是构造类型(是否是标签-长度-值三元组)。然后是实际的标签。所以在这种情况下,universal 17 写成0b00|1|10001:第一个00 是UNIVERSAL,下一个1 表示它已构建,标签值为10001 表示17。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 2018-07-08
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多