Время измерения различается на микроконтроллере - PullRequest
0 голосов
/ 24 ноября 2018

Я измеряю количество циклов различных функций 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

Спасибо

1 Ответ

0 голосов
/ 25 ноября 2018

Используемый вами микроконтроллер Infineon Aurix предназначен для работы в тяжелых условиях в режиме реального времени. намеренно был разработан для обеспечения стабильной производительности во время выполнения - ему не хватает большинства функций, которые могут привести к нестабильной производительности на более сложных процессорах, таких как кэш-память или предсказание переходов.

При отображениито, что ваш код имеет постоянное время выполнения в этой части, является началом, ваш код все еще может иметь переменное время выполнения при запуске на других процессорах.Также возможно, что устройство, содержащее этот ЦП, может пропускать информацию по другим каналам, особенно посредством анализа мощности.Если критически важно сделать ваше приложение устойчивым к анализу боковых каналов, вы можете рассмотреть возможность использования компонента, предназначенного для криптографических приложений.(Aurix не такая часть.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...