Nan*_*ket 6 macos openssl cross-platform
我正在使用旧版本的OpenSSL,并且我遇到了一些在尝试使用跨平台代码时困扰了我好几天的行为.
我有代码调用OpenSSL来签名.我的代码是在ASN1_sign中的代码之后建模的,该代码可以在OpenSSL的a_sign.c中找到,当我使用它时会出现相同的问题.这是相关的代码行(在a_sign.c中找到并使用完全相同的方式):
EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
Run Code Online (Sandbox Code Playgroud)
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将读取签名并验证它们是正确的,而它将拒绝来自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);
}
Run Code Online (Sandbox Code Playgroud)
这导致OS X拒绝其自己的> 64字节数据的签名无效,并且我在其他地方跟踪了类似的行以验证需要以相同方式分解的签名.
这修复了签名的创建和验证,但是仍然存在问题,因为我遇到了其他问题,而且我真的不想更深入地了解(并修改!)OpenSSL.
当然我做错了,因为当我使用股票ASN1_sign时,我看到完全相同的问题.这是我编译OpenSSL的方式的问题吗?对于我的生活,我无法弄清楚.任何人都可以告诉我我必须犯的骨头错误吗?
| 归档时间: |
|
| 查看次数: |
492 次 |
| 最近记录: |