Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Same C code producing different results on Mac OS X than Windows and Linux

I'm working with an older version of OpenSSL, and I'm running into some behavior that has stumped me for days when trying to work with cross-platform code.

I have code that calls OpenSSL to sign something. My code is modeled after the code in ASN1_sign, which is found in a_sign.c in OpenSSL, which exhibits the same issues when I use it. Here is the relevant line of code (which is found and used exactly the same way in a_sign.c):

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

ctx is a structure that OpenSSL uses, not relevant to this discussion
buf_in is a char* of the data that is to be signed
inl is the length of buf_in

EVP_SignUpdate can be called repeatedly in order to read in data to be signed before EVP_SignFinal is called to sign it.

Everything works fine when this code is used on Ubuntu and Windows 7, both of them produce the exact same signatures given the same inputs.

On OS X, if the size of inl is less than 64 (that is there are 64 bytes or less in buf_in), then it too produces the same signatures as Ubuntu and Windows. However, if the size of inl becomes greater than 64, it produces its own internally consistent signatures that differ from the other platforms. By internally consistent, I mean that the Mac will read the signatures and verify them as proper, while it will reject the signatures from Ubuntu and Windows, and vice versa.

I managed to fix this issue, and cause the same signatures to be created by changing that line above to the following, where it reads the buffer one byte at a time:

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);
}

This causes OS X to reject its own signatures of data > 64 bytes as invalid, and I tracked down a similar line elsewhere for verifying signatures that needed to be broken up in an identical manner.

This fixes the signature creation and verification, but something is still going wrong, as I'm encountering other problems, and I really don't want to go traipsing (and modifying!) much deeper into OpenSSL.

Surely I'm doing something wrong, as I'm seeing the exact same issues when I use stock ASN1_sign. Is this an issue with the way that I compiled OpenSSL? For the life of me I can't figure it out. Can anyone educate me on what bone-headed mistake I must be making?

like image 846
Nantucket Avatar asked Aug 03 '10 22:08

Nantucket


People also ask

Is Linux better than Windows and Mac?

A Linux system, it's more reliable and secure than Windows and Mac OS. That's why, around the world, starting from beginners to IT experts, make their choices to use Linux than any other system. And in the server and supercomputer sector, Linux becomes the first choice and dominant platform for most users.

How similar are OSX and Linux?

Both Linux and macOS are Unix-like OS and give access to Unix commands, BASH and other shells. Both of them have fewer applications and games than Windows. But the similarity ends here. Graphic designers and video editors swear by macOS whereas Linux is a favorite of developers, sysadmins and devops .

What are the differences between Windows Linux and Mac OS X?

Key Differences Between Linux and MAC and WindowsLinux is the least used operating system, with users accounting for 1%. MAC is popular and has an overall user base of 7% over the world. When it comes to the risk of malware, Windows is the most prone. This is due to a larger user base.

Is it better to code on Linux or Mac?

Mac is the best choice for the developer as it gives you high-end media or graphics for web or app UI/UX design and development. Developers also prefer Mac to work on because of its high performance.


1 Answers

This is likely a bug in the MacOS implementation. I recommend you file a bug by sending the above text to the developers as described at http://www.openssl.org/support/faq.html#BUILD17

like image 138
levis501 Avatar answered Oct 26 '22 17:10

levis501