我目前正在按照Apple的《收据验证编程指南》实施本地收据验证。我可以获得测试收据,但是当我尝试按以下方式对其进行解析时(即,如指南清单1-5所示)
rval = asn_DEF_Payload.ber_decoder(NULL, &asn_DEF_Payload, (void **)&payload, pld, pld_sz, 0);
我收到以下错误(来自的输出ASN_DEBUG()
)
Expected: [UNIVERSAL 17], expectation failed (tn=0, tm=0)
asn_DEF_Payload
(和其他C代码)由ans1c
ASN.1编译器(v0.9.24)生成,以指南的清单1-1作为输入。我首先阅读了带有NSData dataWithContentsOfURL
的URL中的收据NSBundle appStoreReceiptURL
。pld
和pld_sz
分别是数据的bytes
和length
。
此错误表示什么,如何避免?
更新看起来当解析器期望在测试配方的开始处有标签17(SET和SET OF)时,解析器似乎看到了标签16(SEQUENCE和SEQUENCE OF)。清单1-1中的有效负载定义确实涉及SET。
更新我管理asn1c
如下附带的转换器。
export CFLAGS=-DPDU=Payload
make -f Makefile.am.sample
./progname -h
我还设法将收据从物理iOS设备复制到OS X,就像这样。现在,当我尝试转储收据时,./progname -d -iber -otext receipt
得到以下输出:
AD: Processing receipt
AD: Decoding 4704 bytes
AD: decode(0) consumed 0+0b (4704), code 2
AD: Clean up partially decoded structure
AD: ofp 1, no=0, oo=0, dbl=0
receipt.ber: Decode failed past byte 0: Input processing error
UPDATE嗯,这个在线ASN.1解码器可以很好地转储我的测试配方。(不过,它以SEQUENCE开头。)显然是一个签名,我的错误是(可能是)我应该从其签名的信封中获取有效载荷...
嗯,解决方案实际上使我望尘莫及:在《 Apple收据验证编程指南》中有关本地验证收据的介绍中以及在图1-1中。
最外面的部分(在图中标记为Receipt)是RFC 2315定义的PKCS#7容器,其有效负载使用ITU-T X.690定义的ASN.1(抽象语法表示法1)编码。
通过检查签名(清单1-4),还可以访问有效负载(清单1-5中的解析)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句