1

我目前正在按照 Apple 的Receipt Validation Programming Guide实施本地收据验证。我可以获得测试收据,但是当我尝试按如下方式解析它时(即如指南清单 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 dataWithContentsOfURLNSBundle appStoreReceiptURL. pldpld_sz分别是数据的byteslength

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

更新当解析器在测试配方的开头预期标签 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,就像这样。当我现在尝试转储收据时,./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

更新嗯,这个在线 ASN.1 解码器可以很好地转储我的测试配方。(不过,它以 SEQUENCE 开头。)这显然是一个签名,我的错误是(可能是)我应该从签名的信封中获取有效负载......

4

1 回答 1

0

好吧,这个解决方案实际上让我眼前一亮:无论是在 Apple 的Receipt Validation Programming Guide中对Validating Receipts Locally的介绍中,还是在其图 1-1 中。

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

通过检查签名(清单 1-4),还可以访问有效负载(用于在清单 1-5 中进行解析)。

于 2014-07-11T12:39:45.820 回答