Я работаю со старой версией 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?Для жизни я не могу понять это.Может ли кто-нибудь рассказать мне о том, какую ошибку с головой я должен совершить?