ASN1 解析 swift
ASN1 parsing with swift
我想我了解了 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 has some introductory comments about how BER tags are constructed, but really you'll want to consult Annex A of X.690 for an example encoding and X.680 §8 获取有关标记的信息。
一个SET
类型可以以几种不同的形式出现;但在你的情况下 49 = 0x31 = 0b00110001 = UNIVERSAL 17
(SET
,构造)。可能会出现其他形式,但这是唯一从标签本身明确标识为 SET
的形式:规范可能对 SET
类型使用不同的标签。
我想我了解了 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 has some introductory comments about how BER tags are constructed, but really you'll want to consult Annex A of X.690 for an example encoding and X.680 §8 获取有关标记的信息。
一个SET
类型可以以几种不同的形式出现;但在你的情况下 49 = 0x31 = 0b00110001 = UNIVERSAL 17
(SET
,构造)。可能会出现其他形式,但这是唯一从标签本身明确标识为 SET
的形式:规范可能对 SET
类型使用不同的标签。