#include #include "cpucycles.h" #include "aes.h" unsigned char current[16]; unsigned int currentpos = 16; unsigned int randombyte(void) { if (currentpos == 16) { aes(current,current,current); currentpos = 0; } return current[currentpos++]; } unsigned char k[256][16]; unsigned char n[256][16]; int count[36][256][256]; int total[256][256]; /* count[u][i][j] is number of times that aes(out,k[i],n[j]) took typical+u-18 cycles; u=0 includes typical-18,typical-19,typical-20,etc.; u=35 includes typical+17,typical+18,typical+19,etc. */ int kpos[32]; int npos[32]; unsigned char kselect[32][16]; unsigned char nselect[32][16]; unsigned char out[32][16]; long long times[32]; long long typical; main() { int loop; int i; int j; long long u; for (i = 0;i < 256;++i) for (j = 0;j < 16;++j) { k[i][j] = randombyte(); n[i][j] = randombyte(); } typical = 0; for (loop = 0;loop < 1000;++loop) { for (i = 0;i < 32;++i) { kpos[i] = randombyte(); npos[i] = randombyte(); for (j = 0;j < 16;++j) kselect[i][j] = k[kpos[i]][j]; for (j = 0;j < 16;++j) nselect[i][j] = n[npos[i]][j]; } for (i = 0;i < 32;++i) { times[i] = cpucycles(); aes(out[i],kselect[i],nselect[i]); } for (i = 0;i < 31;++i) times[i] = times[i + 1] - times[i]; j = 31; while (j > 1) { for (i = 0;i < j;++i) if (times[i] < times[j - 1]) { u = times[i]; times[i] = times[j - 1]; times[j - 1] = u; } --j; for (i = 0;i < j;++i) if (times[i] > times[j - 1]) { u = times[i]; times[i] = times[j - 1]; times[j - 1] = u; } --j; } typical += times[0]; } typical -= (loop / 2); typical /= loop; for (loop = 0;loop < 6553600;++loop) { for (i = 0;i < 32;++i) { kpos[i] = randombyte(); npos[i] = randombyte(); for (j = 0;j < 16;++j) kselect[i][j] = k[kpos[i]][j]; for (j = 0;j < 16;++j) nselect[i][j] = n[npos[i]][j]; } for (i = 0;i < 32;++i) { times[i] = cpucycles(); aes(out[i],kselect[i],nselect[i]); } for (i = 0;i < 31;++i) { u = times[i + 1] - times[i]; u = u - typical + 18; if (u < 0) u = 0; if (u > 35) u = 35; ++count[u][kpos[i]][npos[i]]; } } for (i = 0;i < 256;++i) for (j = 0;j < 256;++j) for (u = 0;u < 36;++u) total[i][j] += count[u][i][j]; for (i = 0;i < 256;++i) for (j = 0;j < 256;++j) for (u = 0;u < 36;++u) count[u][i][j] = (255 * (long long) count[u][i][j]) / total[i][j]; printf("P6\n"); printf("1024 768\n"); printf("255\n"); for (i = 0;i < 768;++i) for (j = 0;j < 1024;++j) for (u = 0;u < 3;++u) printf("%c",count[(31 * u + 12 * (i % 3) + 9 * (j % 4)) % 36][i / 3][j / 4]); return 0; }