M2_SETI/A1/TP/TP Logical Side channel Attack/FILESFORATTACK-FlushAndReload/RSA/Threshold/l1vl3.c

57 lines
1.5 KiB
C
Raw Normal View History

2022-11-28 11:40:47 +01:00
#include <stdio.h>
#include <stdlib.h>
#define SAMPLES 100000
#define CACHE_LINE 64
int time_access_no_flush(const char *adrs) {
volatile unsigned long time;
asm __volatile__ (
" mfence \n"
" lfence \n"
" rdtsc \n"
" lfence \n"
" movl %%eax, %%esi \n"
" movl (%1), %%eax \n"
" lfence \n"
" rdtsc \n"
" subl %%esi, %%eax \n"
: "=a" (time)
: "c" (adrs)
: "%esi", "%edx");
return time;
}
void flush(const char *adrs) {
asm __volatile__ ("mfence\nclflush 0(%0)" : : "r" (adrs) :);
}
const char x[] = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\x00"
"BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB\x00"
"CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC\x00"
"DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD\x00";
int main (int argc, char **argv)
{
unsigned int *times = malloc(SAMPLES * sizeof(unsigned int));
if (times == NULL) {
return 1;
}
int i;
for (i = 0; i < SAMPLES; i++) {
// Flush the first time, and then every second time.
// So that it's uncached, cached, uncached, cached, ...
if (i % 2 == 0) {
flush(x);
}
times[i] = time_access_no_flush(x);
}
for (i = 0; i < SAMPLES; i++) {
printf("%u\n", times[i]);
}
return 0;
}