我目前正在按照 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 dataWithContentsOfURL
从NSBundle appStoreReceiptURL
. pld
和pld_sz
分别是数据的bytes
和length
。
此错误表示什么以及如何避免?
更新当解析器在测试配方的开头预期标签 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 开头。)这显然是一个签名,我的错误是(可能是)我应该从签名的信封中获取有效负载......