#include <stdio.h>
unsigned int rotate(char round),rcon(FILE *fp, char num);
void sub(FILE *fp, char round);
unsigned int ek[44];
unsigned int rotate(char round)
{
printf("rot word %d\n",round);
unsigned int returnme=(unsigned int)(ek[round]<<8)|(ek[round]>>24);
return returnme;
}
void sub(FILE *fp, char round)
{
unsigned char loop,byte[4];
for(loop=0;loop<4;loop+=1)
{
byte[loop]=(ek[round]>>(24-8*loop))&0xff;
printf("sbox (%02X) ",byte[loop]);
fseek(fp,byte[loop],SEEK_SET);
byte[loop]=fgetc(fp);
printf("%02X\n",byte[loop]);
}
ek[round]=(unsigned int)((byte[0]<<24)|(byte[1]<<16)|(byte[2]<<8)|byte[3]);
}
unsigned int rcon(FILE *fp, char num)
{
unsigned int returnme;
fseek(fp,0x100+4*num,SEEK_SET);
returnme=(unsigned int)((fgetc(fp)<<24)|(fgetc(fp)<<16)|(fgetc(fp)<<8)|fgetc(fp));
printf("rcon (%d) %08X\n",num,returnme);
return returnme;
}
int main(int argc, char **argv)
{
FILE *data, *k;
char x,val;
data=fopen("static.bin","rb");
k=fopen(argv[1],"rb");
for(x=0;x<44;x+=1)
{
if(x<4)
{
ek[x]=(unsigned int)((fgetc(k)<<24)|(fgetc(k)<<16)|(fgetc(k)<<8)|fgetc(k));
}
else
{
if(x&3)
{
ek[x]=ek[x-1]^ek[x-4];
if(x==9){ek[x]=ek[7]^ek[x-4];}
}
else
{
val=x-4;
if(x==4){val=3;}
ek[x]=rotate(val);
sub(data, x);
ek[x]=ek[x]^rcon(data, (x/4)-1)^ek[x-4];
}
}
printf("%08X",ek[x]);
if((x+1)%4==0){printf("\nRound Key %08X%08X%08X%08X",ek[x-3],ek[x-2],ek[x-1],ek[x]);}
if(x<43){getchar();}
}
getchar();
return 0;
}