Я измеряю количество циклов различных функций C, которые я пытаюсь сделать постоянным временем, чтобы смягчить атаки по побочным каналам (крипто).
Я работаю с микроконтроллером (aurix от infineon), который имеетвстроенный счетчик циклов, который увеличивается с каждым тактом и который я могу прочитать.
Примите во внимание следующее:
int result[32], cnt=0;
int secret[32];
/** some other code***/
reset_and_startCounter(); //resets cycles to 0 and starts the counter
int tmp = readCycles(); //read cycles before function call
function(secret) //I want to measure this function, should be constant time
result[cnt++] = readCycles() - tmp; //read out cycles and subtract to get correct result
Когда я измеряю циклы, как показано выше, я иногда получаюразличное количество циклов в зависимости от ввода данных в функцию.(Разница ~ 1-10 циклов, сама функция занимает около 3000 циклов).
Теперь мне было интересно, если это еще не совершенно постоянное время, и что вычисления зависят от некоторого ввода.Я посмотрел на функцию и сделал следующее:
void function(int* input){
reset_and_startCounter();
int tmp = readCycles();
/*********************************
******calculations on input******
*********************************/
result[cnt++] = readCycles() - tmp;
}
, и я получил одинаковое количество циклов независимо от того, что вводится.
Затем я также измерил время, необходимое для вызоватолько функция, и чтобы вернуться из функции.Оба измерения были одинаковыми, независимо от того, какой вход.
Я всегда использовал флаги компилятора gcc -O3, -fomit-frame-pointer.-O3, потому что время выполнения критично, и мне нужно, чтобы оно было быстрым.И также важно, что на микроконтроллере не выполнялся другой код (без ОС и т. Д.)
У кого-нибудь есть объяснение этому.Я хочу быть уверенным, что мой код имеет постоянное время, и эти циклы являются произвольными ...
И извините за то, что здесь не предоставлен исполняемый код, но я полагаю, что не многие имеют Aurix, лежащий вокруг: O
Спасибо