ios - 在 iphone 上用 NSData 字节初始化 BIO 变量

标签 ios openssl nsdata

我必须在 iPhone 应用程序(仅限 iOS 7)中验证应用内购买的收据。
不幸的是,密码学、openssl 和应用内购买对我来说是全新的,所以我在使用它们时遇到了一些问题。
我正在按照 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
}

我使用此代码获取收据和证书:

NSData *receiptData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];
NSData *certificateData = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] URLForResource:@"AppleIncRootCertificate" withExtension:@"cer"]];

如何使用这两个 NSData 来初始化 BIO 变量 b_receiptb_x509

最佳答案

来自 http://www.openssl.org/docs/crypto/BIO_s_mem.html :

BIO *BIO_new_mem_buf(void *buf, int len);

从给定的缓冲区创建一个只读内存 BIO 对象。在你的情况下

BIO *b_receipt = BIO_new_mem_buf((void *)[receiptData bytes], (int)[receiptData length]);

数据直接从提供的缓冲区中读取。如果 receiptData 有效只要 因为使用了b_receipt,所以不需要复制数据。

BIO_new_mem_buf() 不会修改缓冲区,因此您可以安全地添加一个 void * 转换以避免“将‘const void *’传递给‘void *’类型的参数丢弃限定符”警告。

关于ios - 在 iphone 上用 NSData 字节初始化 BIO 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20024861/

相关文章:

ios - 类型 'Any' 的值在 swift 4 中没有成员 'text

php - 在 PHP 中生成 SAN CSR

ruby - 我应该将属于 Ruby 标准库的文件添加到 `Gemfile` 吗?

objective-c - 将问题 Objective-C 转换为 Swift

ios - NSData 不返回字节

ios - 无法追踪 [NSData getBytes :length:] crash

objective-c - 对按钮xcode视而不见的函数

ios - 我怎样才能拥有类似于AirBNB iOS App上的UIScroll效果,如下图所示

iphone - 野外的 NSOperationQueueDefaultMaxConcurrentOperationCount

c - 使用 libgcrypt 从密码加密文件