Тот же код C, производящий разные результаты на Mac OS X, чем Windows и Linux - PullRequest
6 голосов
/ 04 августа 2010

Я работаю со старой версией OpenSSL, и я сталкиваюсь с некоторым поведением, которое несколько дней ставило меня в тупик при попытке работать с кросс-платформенным кодом.

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

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

ctx - это структура, которую использует OpenSSL, не относящаяся к этому обсуждению
buf_in ischar * данных, которые должны быть подписаны
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);
}

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

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

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

Ответы [ 3 ]

1 голос
/ 06 августа 2010

Вероятно, это ошибка в реализации MacOS. Я рекомендую вам сообщить об ошибке, отправив приведенный выше текст разработчикам, как описано в http://www.openssl.org/support/faq.html#BUILD17

0 голосов
/ 08 августа 2010

Есть известные проблемы с OpenSSL на Mac (вам нужно прыгнуть через несколько обручей, чтобы убедиться, что он связывается с правильной библиотекой вместо системной библиотеки).Вы сами это скомпилировали?Файл ПРОБЛЕМЫ в дистрибутиве объясняет детали проблемы и предлагает несколько обходных путей.(Или, если вы работаете с общими библиотеками, дважды проверьте правильность установки DYLD_LIBRARY_PATH).Нет гарантии, но это выглядит вероятным местом для начала ...

0 голосов
/ 06 августа 2010

Наиболее распространенной проблемой при переносе кода Windows и Linux являются значения памяти по умолчанию.Я думаю, что Windows устанавливает 0xDEADBEEF, а Linux устанавливает 0s.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...