Я наблюдал за потоком в списке рассылки OpenSSL. Поток называется CBC ciphers + TLS 1.0 protocol does not work in OpenSSL 1.0.2d.Является ли поведенческое изменение из-за оптимизации с «определенной реализацией» законной или ожидаемой?
OpenSSL 1.0.2d had intermittent problems due to the following. Он появился под компилятором Microsoft WinCE. Идея состоит в том, чтобы распространять высокий бит на все остальные биты:
#define DUPLICATE_MSB_TO_ALL(x) ((unsigned)((int)(x) >> (sizeof(int)*8-1)))
#define DUPLICATE_MSB_TO_ALL_8(x) ((unsigned char)(DUPLICATE_MSB_TO_ALL(x)))
static unsigned char constant_time_eq_8(unsigned a, unsigned b)
{
unsigned c = a^b;
c--;
return DUPLICATE_MSB_TO_ALL_8(c);
}
OpenSSL пытается следовать за C89. Я считаю, что это implementation defined behavior due to shifting of a negative value on a 2's compliment machine.
Однако, что обнаружил ОП, на него повлияли оптимизации. Без оптимизация кода привела к правильным результатам. С оптимизация кода привела к неправильным результатам.
Мой вопрос в том, что, полагаясь на поведение, определяемое реализацией, является ли оно законным или ожидается, что результаты будут изменены в зависимости от оптимизации?
«Я считаю, что это» - в коде, который вы опубликовали, нет подписанных изменений. –
@ KarolyHorvath - мой плохой ... Я вытащил неправильный фрагмент из сообщений (его длинная нить). Он обновлен. – jww
OpenSSL полон страшного кода, подобного этому .. imho, тем скорее он заброшен лучше. Кто знает, сколько уязвимостей скрывается из-за такого мусора. –