根据Apple的收据验证编程指南,我是currently implementing本地收据验证。我可以获得测试收据但是当我尝试按如下方式解析时(即如指南清单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
指示的网址中的NSBundle appStoreReceiptURL
阅读收据。 pld
和pld_sz
分别是数据bytes
和length
。
此错误表示什么以及如何避免?
UPDATE 当测试配方开头需要标记17(SET和SET OF)时,看起来好像解析器看到了标记16(SEQUENCE和SEQUENCE OF)。清单1-1中Payload的定义确实是指SET。
更新我已按照以下方式管理asn1c
附带的转换器。
export CFLAGS=-DPDU=Payload
make -f Makefile.am.sample
./progname -h
我还设法将收据从物理iOS设备复制到OS X,如so。当我现在尝试使用./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
更新嗯,this在线ASN.1解码器可以很好地转储我的测试配方。 (不过它以SEQUENCE开头。)它显然是一个签名,我的错误(可能是)我应该从签名的信封里面获取有效载荷...
答案 0 :(得分:0)
嗯,解决方案实际上是在盯着我看看:在Apple的收据验证编程指南及其中的验证收据的介绍中图1-1。
最外层部分(图中标记为Receipt)是PKCS#7 容器,由RFC 2315定义,其有效负载使用编码 ASN.1(抽象语法表示法一),由ITU-T X.690定义。
通过检查签名(清单1-4),还可以获得对有效负载的访问权限(用于清单1-5中的解析)。