ASN1用swift解析

时间:2015-07-14 13:39:34

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

我想我得到了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,但是,binaire数据的类型是什么?

    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等其他类型对我来说意义不大。

不知道如何继续这里。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

从一开始,我想我应该声称我不熟悉许多基础技术(Swift,OpenSSL,我认为你正在使用的生物识别技术标准)。

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

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