現在、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
、ガイドのリスト 1-1 を入力として (ASN.1 コンパイラ、v0.9.24) によって生成されています。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
更新うーん、このオンライン ASN.1 デコーダーは私のテスト レシピを問題なくダンプできます。(ただし、SEQUENCEで始まります。)明らかに署名であり、署名されたエンベロープ内からペイロードを取得する必要があるという私の間違いは(そうかもしれません)...