mat*_*odv 4 openssl nsdata ios
我必须在iPhone应用程序内验证应用程序内购买的收据(仅限iOS 7).
不幸的是,加密,openssl和In-App购买对我来说是全新的,所以我有一些问题让他们工作.
我正在按照Apple提供的指南在本地验证收据,我在我的项目中将openssl作为静态库包含在内.这是Apple提供的用于使用OpenSSL验证收据签名的代码:
BIO *b_receipt;
BIO *b_x509;
PKCS7 *p7 = d2i_PKCS7_bio(b_receipt, NULL);
X509_STORE *store = X509_STORE_new();
X509 *appleRootCA = d2i_X509_bio(b_x509, NULL);
X509_STORE_add_cert(store, appleRootCA);
BIO *b_receiptPayload;
int result = PKCS7_verify(p7, NULL, store, NULL, b_receiptPayload, 0);
if (result == 1)
{
// Receipt signature is Valid
// b_receiptPayload contains the payload
}
Run Code Online (Sandbox Code Playgroud)
我使用此代码获取收据和证书:
NSData *receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
NSData *certificateData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"AppleIncRootCertificate" withExtension:@"cer"]];
Run Code Online (Sandbox Code Playgroud)
我如何使用这两种NSData初始化BIO变量b_receipt和b_x509?
来自http://www.openssl.org/docs/crypto/BIO_s_mem.html:
BIO *BIO_new_mem_buf(void *buf, int len);
Run Code Online (Sandbox Code Playgroud)
从给定缓冲区创建只读内存BIO对象.在你的情况下
BIO *b_receipt = BIO_new_mem_buf((void *)[receiptData bytes], (int)[receiptData length]);
Run Code Online (Sandbox Code Playgroud)
直接从提供的缓冲区读取数据.如果receiptData只要b_receipt使用有效,则无需复制数据.
BIO_new_mem_buf()不会修改缓冲区,因此您可以安全地添加
void *强制转换以避免"传递'const void*'到'void*'类型的参数丢弃限定符"警告.
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |