【问题标题】:OpenSSL RAND_byte issue with iOS SimulatoriOS 模拟器的 OpenSSL RAND_byte 问题
【发布时间】:2014-06-05 08:22:01
【问题描述】:

我已经从OpenSSL Page(2014 年 4 月 7 日发布)下载了最新的源代码,并使用Tutorial 创建了一个 libcrypto.a 库,我按照运行 ./build- 的步骤进行操作openssl.sh 脚本文件,用于在版本 10.9.2 的 Mac OS X 上为所有环境(armv7s、armv7、i386)生成 libcrypto.a 文件。

我可以使用 EVP_aes_256_cbc 加密来加密/解密日期,但是当我尝试获取 RAND_byte 时我的代码失败了。代码在 RAND_byte 调用时崩溃

以下是我正在尝试获取 RAND_byte 种子的代码:

// 代码1

unsigned char seed[32];
RAND_bytes(seed, 32);

// 代码2

int count = 24;
unsigned char *buffer = (unsigned char *)calloc(count, sizeof(unsigned char));
RAND_bytes(buffer, count);

// 代码3

int count = 24;
unsigned char *buffer = (unsigned char *)malloc(sizeof(int)*count);
RAND_bytes(buffer, count);

// 代码4

int count = 24;
unsigned char *buffer = OPENSSL_malloc(count);
RAND_bytes(buffer, count);

当我在 iOS 6.0/6.1 模拟器上运行上述代码时,它在 RAND_byte 调用时崩溃,我在线程 1 上得到 “_interposition_vtable_unimplemented”,并且控制台上没有显示任何消息。

当我在 iOS 7.0+ 模拟器上运行相同的代码时,它在 RAND_byte 调用时崩溃,我在线程 1 上得到 “__pthread_kill”“检测到尝试在iPhone 上不存在的系统库:从图像 CryptographyTest 中的函数 RAND_poll 调用的 open$UNIX2003。” 在控制台上。

但是,当我在装有 iOS 7.0.4 的 iPad 上运行相同的代码时,上述所有代码都可以完美运行。我从 RAND_byte 得到的返回值是 1。

我不明白某些功能在 iOS 模拟器上不起作用但一切都适用于 iOS 设备的行为。

非常感谢任何帮助!非常感谢。

【问题讨论】:

    标签: iphone macos openssl ios-simulator ios6.1


    【解决方案1】:
    ... using Tutorial where i have followed the steps in which i
    run ./build-openssl.sh script file to generate libcrypto.a file
    for all environments (armv7s, armv7, i386) 
    ...
    I don’t understand the behavior that some of the functions does
    not work on iOS simulator but everything works with iOS devices.
    

    脚本不适合您的使用:

    不是为模拟器构建的。它为桌面构建。这个:

    ARCHS=("armv7s" "armv7" "i386")
    SDKS=("iphoneos" "iphoneos" "macosx")
    

    可能需要改成:

    ARCHS=("armv7s" "armv7" "i386")
    SDKS=("iphoneos" "iphoneos" "iPhoneSimulator")
    

    对于iPhoneSimulator,将使用正确的 SDK:

    $ ls /Applications/Xcode.app/Contents/Developer/Platforms/
    MacOSX.platform         iPhoneSimulator.platform
    iPhoneOS.platform
    

    您正在使用的项目是否声称它具有多拱结构并适用于 iPhone 和 iPhone 模拟器?或者它声称它的多架构并适用于 iPhone 和 OS X?

    【讨论】:

    • 谢谢哥们!!我遇到了该脚本文件的一些问题。
    【解决方案2】:

    并使用教程创建了一个供 iOS 使用的 libcrypto.a 库。

    我不知道那个教程,但是 OpenSSL 有为 iOS 构建库的过程。您可以在FIPS User Guide 2.0,附录 E 中找到它。

    您可以在Github 获取适用于 iOS 的预构建版本的 OpenSSL。它是使用 OpenSSL 程序构建的。它是一个胖库,具有 i386、ARMv7、ARMv7s 和 ARM64 架构。


    线程 1 上的“__pthread_kill”和“检测到尝试调用 iPhone 上不存在的系统库中的符号:从图像 CryptographyTest 中的函数 RAND_poll 调用的 open$UNIX2003。”在控制台上。

    我相信这表明 OpenSSL 库没有为模拟器或设备正确构建。


    int count = 24;
    unsigned char *buffer = OPENSSL_malloc(count);
    RAND_bytes(buffer, count);
    

    这里只是自行车脱落,但您忽略了来自RAND_bytes 的返回值。根据RAND_bytes 上的文档:

    RAND_bytes() 成功返回 1,否则返回 0。错误代码可以是 由 ERR_get_error(3) 获得。

    无声的失败是高完整性软件的死亡之吻。

    【讨论】:

    • 感谢您的回复!该教程非常简单,它使用 ./build-openssl.sh 文件来构建 lib,我在谷歌搜索时只在大多数地方找到了这个脚本。如果该库未正确构建,则它在 iPhone 上的完美运行甚至在模拟器上运行以进行 EVP_aes_256_cbc 加密。而且我无法检查 RAND_byte 的返回值,因为代码无法进一步运行。我喜欢你回答的最后一行。 :]
    • 您提到的 github 页面上的 OpenSSL 预构建版本不工作,因为它不包含引擎文件。
    • 这个在Github 预建的为我解决了我的问题。还是想知道到底发生了什么问题,等待解答...
    • @Zeeshan - “...不工作,因为它不包含引擎文件” - 你在 iOS 上使用什么引擎?
    • @Zeeshan - “仍然想知道发生的确切问题,所以等待答案” - 为此,我们需要看看您如何设置交叉编译环境以及 @Zeeshan 的输出987654328@。如果这是您想要的,您应该更新您的问题,否则可能会因为“信息不足”而关闭它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2016-05-25
    • 2011-11-23
    • 1970-01-01
    • 2022-01-20
    • 2016-04-03
    相关资源
    最近更新 更多