我想我明白ASN.1解析背后的基本想法了。遍历字节,解释它们并对它们做一些有用的事情。唉,我被困在执行上了。
苹果没有示例代码(我可以找到),可能是出于安全原因。OpenSSL并没有很好的文档,所以我只能猜测这些函数到底做了什么。我找到的唯一一个示例代码不处理案例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 (set)开始,然后以长度(Int24?)为3个字节,然后是16 (第一个序列)、序列长度(1字节)、序列类型(1字节)、序列有效载荷(重复)。
其他类型如Int32、Int16对我来说就更没有意义了。
不知道该怎么做。有什么建议吗?
发布于 2015-07-14 15:38:29
从一开始,我想我应该否认这一点,说我不太熟悉许多底层技术(Swift,OpenSSL,我认为你正在使用的生物特征标准)。
尽管如此,你可能违反了BER的标记规则。关于X.690的Wiki文章对BER标记的构造有一些介绍性的评论,但实际上您需要参考附件A. X.690的示例编码和X.680§8的标记信息。
SET类型可以以几种不同的形式出现;但在您的例子中,49 = 0x31 = 0b00110001 = UNIVERSAL 17 (SET,构造)。可能会出现其他形式,但这是唯一一个从标记本身显式标识为SET的表单:规范可以为SET类型使用不同的标记。
https://stackoverflow.com/questions/31408341
复制相似问题