我正在MacOS上编译OpenSSL 1.1.0h,我遇到了一个问题,即任何包含文件中都没有定义函数int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp)
。 Grep-ing OpenSSL源代码我看到该函数在asn1_locl.h和a_int.c文件中定义,但它没有在编译库公共接口中公开。
基本上我正在玩一些Apple In App Purchase收据验证示例,他们都假设此功能正在asn1.h中定义。 i2c_ASN1_INTEGER用于/* Convert ASN1 INTEGER content octets to ASN1_INTEGER structure */
。
我正在使用以下命令编译库:
./Configure darwin64-x86_64-cc
make depend
make
当我使用此过程构建OpenSSL 1.0.2o时,该函数在asn1.h中按预期定义...
答案 0 :(得分:1)
Grep-ing OpenSSL源我看到该函数在asn1_locl.h和a_int.c文件中定义,但它没有在编译库公共接口中公开。
有significant changes to OpenSSL in version 1.1.0,直接从公共界面删除重要功能:
此页面讨论OpenSSL 1.1版的API更改。该 API更改的总体目标是使许多数据结构不透明 应用程序。数据隐藏提供了许多好处:
- 可以在不破坏二进制兼容性的情况下更改字段
- 应用程序更加强大,可以更加确定正确性
- 例如,它有助于确定哪些(新)访问者和设置者需要
支持OpenSSL 1.0.2(及以下)和OpenSSL的应用程序 1.1.0(及以上)应访问下面的兼容层部分。兼容层提供OpenSSL 1.1.0功能,如 RSA_get0_key,OpenSSL 1.0.2客户端。源代码可用 下载
如果您发现您的库或程序曾用于OpenSSL 1.0.2 但不再适用于OpenSSL 1.1.0,请添加详细信息 以下Things that no longer work讨论。
关于
他们都认为这个功能是在asn1.h
中定义的
我甚至说这对OpenSSL v1.1.0来说不是一个好的假设。
答案 1 :(得分:0)
对于Apple收据解析,由于我们不使用大整数(例如BIGNUM),因此这里有一个小函数可以将整数解析为长整数。
long long longLongFromASN1Content(const uint8_t *ptr, int length) {
assert(length <= sizeof(long long));
long long v = 0;
for (int i = 0; i< length; i++) {
if (i > 0) v <<= 8;
v |= ptr[i];
}
return v;
}