解析ASN.1应用程序收据时出错“预期:[UNIVERSAL 17],期望失败(tn = 0,tm = 0)”

时间:2014-07-11 10:58:44

标签: ios7 in-app-purchase asn.1 receipt receipt-validation

根据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阅读收据。 pldpld_sz分别是数据byteslength

此错误表示什么以及如何避免?

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开头。)它显然是一个签名,我的错误(可能是)我应该从签名的信封里面获取有效载荷...

1 个答案:

答案 0 :(得分:0)

嗯,解决方案实际上是在盯着我看看:在Apple的收据验证编程指南及其中的验证收据的介绍中图1-1。

  

最外层部分(图中标记为Receipt)是PKCS#7   容器,由RFC 2315定义,其有效负载使用编码   ASN.1(抽象语法表示法一),由ITU-T X.690定义。

通过检查签名(清单1-4),还可以获得对有效负载的访问权限(用于清单1-5中的解析)。