Программирование за константное время
Написание криптографического кода так, чтобы время работы и характер обращений к памяти не зависели от секретных значений — и секундомер не мог подменить ключ.
Правил немного, но все неудобные: никаких ветвлений по секретным данным, никаких индексов таблиц, выведенных из ключа, и никаких инструкций с переменной задержкой на секретных операндах. Классическая ошибка — проверять MAC через memcmp, который останавливается на первом несовпадении и тем самым сообщает, сколько байтов угадано. Правильный вариант делает XOR по каждому байту, накапливает результат и смотрит на него только в конце.
Пол Кохер показал в 1996 году, что атаки по времени на RSA работают на практике, и с тех пор область в основном состоит из поиска новых мест, где время течёт. Трудность в том, что у компилятора другая цель: оптимизатор, заметив, что ответ уже известен, с удовольствием вставит ранний выход в ваш тщательно безветвистый код. Поэтому критичные процедуры часто пишут на ассемблере или потом проверяют инструментами, ищущими ветвления по секретам.