在OpenSSL lib包含文件中找不到i2c_ASN1_INTEGER函数

时间:2018-05-04 22:47:07

标签: c macos openssl

我正在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中按预期定义...

2 个答案:

答案 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;

}