Тот же код C, приводящий к различным результатам на Mac OS X, чем Windows и Linux

Я работаю с более старой версией OpenSSL, и я сталкиваюсь с некоторым поведением, которое озадачивало меня в течение многих дней при попытке работать с межплатформенным кодом.

У меня есть код, который называет OpenSSL для подписания чего-то. Мой код смоделирован после кода в ASN1_sign, который найден в a_sign.c в OpenSSL, который показывает те же проблемы, когда я использую его. Вот соответствующая строка кода (который находится и используется точно тот же путь в a_sign.c):

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

ctx является структурой, которую OpenSSL использует, не относящийся к этому обсуждению
buf_in является символом* данных, которые должны быть подписаны
inl является длиной buf_in

EVP_SignUpdate можно неоднократно называть для чтения в данных, которые будут подписаны, прежде чем EVP_SignFinal назовут для подписания его.

Все хорошо работает, когда этот код используется на Ubuntu и Windows 7, они оба производят те же самые подписи, учитывая те же исходные данные.

На OS X, если размер inl - меньше чем 64 (который является, существует 64 байта или меньше в buf_in), затем он также производит те же подписи как 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);
}

Это заставляет OS X отклонять свои собственные подписи данных> 64 байта как недопустимые, и я разыскал подобную строку в другом месте для проверки подписей, которые должны были быть разбиты идентичным способом.

Это фиксирует создание подписи и проверку, но что-то все еще идет не так, как надо, поскольку я встречаюсь с другими проблемами, и я действительно не хочу идти, тащась (и изменение!) намного глубже в OpenSSL.

Конечно, я делаю что-то не так, поскольку я вижу те же самые проблемы, когда я использую запас ASN1_sign. Действительно ли это - проблема со способом, которым я скомпилировал OpenSSL? Ни за что в жизни я не могу понять это. Кто-либо может рассказать мне о том, какую глупую ошибку я должен делать?

6
задан Nantucket 3 August 2010 в 22:53
поделиться