gpt4 book ai didi

macos - 与Windows和Linux相比,相同的C代码在Mac OS X上产生不同的结果

转载 作者:行者123 更新时间:2023-12-04 16:13:12 26 4
gpt4 key购买 nike

我正在使用旧版本的OpenSSL,并且在尝试使用跨平台代码时遇到了困扰我好几天的行为。

我有调用OpenSSL进行签名的代码。我的代码是按照ASN1_sign中的代码建模的,该代码位于OpenSSL的a_sign.c中,在使用时也会出现相同的问题。这是相关的代码行(在a_sign.c中找到并使用的方式完全相同):

EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);

ctx是OpenSSL使用的结构,与本讨论无关
buf_in是要签名的数据的char *
inl是buf_in的长度

可以重复调用EVP_SignUpdate以便读入要签名的数据,然后再调用EVP_SignFinal对其进行签名。

在Ubuntu和Windows 7上使用此代码时,一切工作正常,如果给定相同的输入,它们都将产生完全相同的签名。

在OS X上,如果inl的大小小于64(在buf_in中小于等于64个字节),那么它也会产生与Ubuntu和Windows相同的签名。但是,如果inl的大小变得大于64,则它将产生自己的内部一致的签名,这些签名与其他平台不同。内部一致性是指Mac将读取签名并验证它们是否正确,而Mac将拒绝来自Ubuntu和Windows的签名,反之亦然。

我设法解决了这个问题,并通过将上面的行更改为以下内容来创建了相同的签名,在该行中,它一次读取一个字节的缓冲区:
int input_it;
for(input_it = (int)buf_in; input_it < inl + (int)buf_in; intput_it++){
EVP_SIGNUpdate(&ctx, (unsigned char*) input_it, 1);
}

这导致OS X拒绝其自己的大于64字节的数据签名为无效,并且我在其他地方跟踪了类似的行以验证需要以相同方式分解的签名。

这可以修复签名的创建和验证,但是仍然存在问题,因为我遇到了其他问题,我真的不想深入研究(并修改!)OpenSSL。

当然,我做错了,因为使用库存ASN1_sign时会看到完全相同的问题。这是我编译OpenSSL的方式的问题吗?对于我的一生,我无法弄清楚。谁能教育我必须做的哪些愚蠢的错误?

最佳答案

这可能是MacOS实现中的错误。我建议您按照http://www.openssl.org/support/faq.html#BUILD17的说明将上述文本发送给开发人员,以提交错误报告

关于macos - 与Windows和Linux相比,相同的C代码在Mac OS X上产生不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3401299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com