swift - 使用 swift 进行 ASN1 解析

标签 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,但是二进制数据的类型是什么?

    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、我认为您正在使用的生物识别标准)不太熟悉。

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

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

关于swift - 使用 swift 进行 ASN1 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31408341/

相关文章:

UITableView 不显示单元格。

linux - Linux/Windows 上 Swift 的 GUI 生成器

openssl - 使用 openssl 生成 PKCS#8 私钥

ios - Unity 的 iOS 构建需要应用内购买,尽管我的游戏不使用 IAP

android - 如何在应用处于草稿状态时在 Google Play Developer Console 中激活应用内产品?

ios - 如何计算切片中的细胞总数?

json - 迭代数组以填充 tableviewcells 的 Swift 方法

C: OpenSSL RSA_private_decrypt() 失败,返回 "error:0407A079:rsa routines:RSA_padding_check_PKCS1_OAEP:oaep decoding error”

multithreading - 阐明 OpenSSL 0.9.8L 并发支持 - 如果非并发完成,SSL 实例能否被多个线程使用?