【问题标题】:Not finding i2c_ASN1_INTEGER function in OpenSSL lib include files在 OpenSSL 库包含文件中找不到 i2c_ASN1_INTEGER 函数
【发布时间】:2018-10-15 11:25:47
【问题描述】:

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

【问题讨论】:

  • 你有没有找到解决办法?

标签: c macos openssl


【解决方案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 来说不是一个好的假设。

【讨论】:

【解决方案2】:

对于Apple收据解析的情况,由于我们不使用大整数(例如BIGNUM),这里有一个小函数可以将整数解析为long long。

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;

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多