По материалам https://github.com/veorq/cryptocoding (материалы обрезаны; добавлено своё)
Ошибки для тайминг-атак
1. Допущение неконстантного энергопотребления или выполнения времени.
Например, при сравнении строк, строки сравниваются побайтово и первый же несовпавший байт вызывает прекращение сравнения.
По возможности, все времена и энергопотребление должны быть константными.
Для этого необходимо как делать время исполнения не зависящим от данных (желательно даже по кешу, на всякий случай), так и выравнивать операции по времени (хотя выравнивание не исключает возможность измерения времени высокого энергопотребления, которое может быть отличным от времени выполнения операции или иметь другую сигнатуру на операции-заглушке).
2. Неучёт оптимизации компилятора. Компилятор, ОС или библиотека может не выполнить операции обнуления или ещё какие-либо операции. Вплоть до прекращения выполнения цикла заранее, см. пункт 1.
Здесь также можно указать, что использование своих операций обнуления уменьшает вероятность того, что компилятор будет давать оптимизации, т.к. он не понимает, что это именно операции очистки.
3. Неосторожное использование конфиденциальных данных для контроля потока управления.
Время выполнения операции и выполняемый код также зависит от секретных данных.
И, вообще говоря, результат также, даже с одинаковым временем выполнения, тоже зависит от секретных данных.
Для времени выполнения могут быть использованы условные операции, такие, как cmov. Либо, иногда, побитовые операции.
4. Неосторожное использование индекса из конфиденциальных данных для доступа к таблице.
Часть таблицы может быть незакеширована, в результате чего время доступа будет различаться.
5. Неосторожное использование библиотечных функций, реализация которых и свойства значений неизвестны или могут изменяться в библиотеке от версии к версии или от платформы к платформе.
В том числе, некриптостойкие генераторы псевдослучайных чисел, неконстантные и оптимизированные компилятором сравнения и обнуления, различного рода парсеры, интерпретаторы (даже очень простые: файловые пути с ".."), сложные файловые системы (NTFS - файловые потоки могут прятать вредоносную информацию) и т.п.
В этом случае, должны быть использованы собственные реализации.
Нельзя доверять чужим реализациям, если на это нет необходимости (например, мы сами не знаем, как это сделать, или не уверены, что сделаем это верно)
6. Забытая очистка памяти либо преждевременная очистка (перед использованием). Память, неочищенная в стеке или в регистре (регистр может быть выгружен при переключении задач).
При комментировании кода хорошо, если комментарии выражают не то, что делает код, а намерения, с которыми программист писал этот код.
Если код реализует какой-то стандарт, желательно указывать, какой именно пукнт и как именно он реализует.
Если это нестандартное поведение, защитное программирование и проч., то также описывать это дополнительно.
Хуже документации с одним примером только документация вообще без примеров.
Обрезание кода (необходимо проверить на тестах, что все биты зависят от всех битов).