#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
// Additive constant
uint8_t c[8]= {1,1,0,0,0,1,1,0};
//Global S Box
uint8_t sbox[256] = {0};
//Powers of
int powersoftwo[11]= {1,2,4,8,16,32,64,128,256,512,1024};
//Calculates x such that ax mod m = 1 using extended euclid's algorithm.
int modInverse(int a, int m){
int x, y;
int g = gcdExtended(a, m,&x,&y);
if (g != 1)
else{
int res = (x%m + m) % m;
return res;
}
}
int gcdExtended(int a, int b, int *x, int *y)
{
if (a == 0){
*x = 0, *y = 1;
return b;
}
int x1, y1; // To store results of recursive call
int gcd = gcdExtended(b%a, a, &x1, &y1);
// Update x and y using results of recursive
// call
*x = y1 - (b/a) * x1;
*y = x1;
return gcd;
}
void getbinary(uint8_t n,uint8_t *a){
int i=0;
while(n > 0){
a[i++] = n%2;
n = n/2;
}
return;
}
int getdecimal(uint8_t *a){
int i,n=0;
for(i=0;i<8;i++)
n = n + a[i]*powersoftwo[i];
return n;
}
//generates sbox
void generate_sbox(){
int i,j;
//loop for all 0-255 entries.
//special case = 0
for(i=1;i!=16*16;i++){
uint8_t tmp[8] = {0}; //stores binary of inverse.
uint8_t y;
int inv = modInverse(i,283); //inverse.
getbinary(inv,tmp);
uint8_t newtmp[8];
//Affine transformation
for(j=0;j<8;j++)
newtmp[j] = (tmp[j]^tmp[(j+4)%8]^tmp[(j+5)%8]^tmp[(j+6)%8]^tmp[(j+7)%8]^c[j]);
//decimal to binary conversion.
int num = getdecimal(newtmp);
sbox[i] = num;
}
return ;
}
int main(){
generate_sbox();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgoKLy8gQWRkaXRpdmUgY29uc3RhbnQKdWludDhfdCBjWzhdPSB7MSwxLDAsMCwwLDEsMSwwfTsKCi8vR2xvYmFsIFMgQm94CnVpbnQ4X3Qgc2JveFsyNTZdID0gezB9OwoKLy9Qb3dlcnMgb2YgCmludCBwb3dlcnNvZnR3b1sxMV09IHsxLDIsNCw4LDE2LDMyLDY0LDEyOCwyNTYsNTEyLDEwMjR9OwoKLy9DYWxjdWxhdGVzIHggc3VjaCB0aGF0IGF4IG1vZCBtID0gMSB1c2luZyBleHRlbmRlZCBldWNsaWQncyBhbGdvcml0aG0uIAppbnQgbW9kSW52ZXJzZShpbnQgYSwgaW50IG0pewogICAgaW50IHgsIHk7CiAgICBpbnQgZyA9IGdjZEV4dGVuZGVkKGEsIG0sJngsJnkpOwogICAgaWYgKGcgIT0gMSkKICAgICAgICBwcmludGYoIm5vIGludmVyc2VcbiIpOwogICAgZWxzZXsKICAgICAgICBpbnQgcmVzID0gKHglbSArIG0pICUgbTsKICAgICAgICByZXR1cm4gcmVzOwogICAgfQp9CiAKaW50IGdjZEV4dGVuZGVkKGludCBhLCBpbnQgYiwgaW50ICp4LCBpbnQgKnkpCnsKICAgIGlmIChhID09IDApewogICAgICAgICp4ID0gMCwgKnkgPSAxOwogICAgICAgIHJldHVybiBiOwogICAgfQogICAgaW50IHgxLCB5MTsgLy8gVG8gc3RvcmUgcmVzdWx0cyBvZiByZWN1cnNpdmUgY2FsbAogICAgaW50IGdjZCA9IGdjZEV4dGVuZGVkKGIlYSwgYSwgJngxLCAmeTEpOwogICAgLy8gVXBkYXRlIHggYW5kIHkgdXNpbmcgcmVzdWx0cyBvZiByZWN1cnNpdmUKICAgIC8vIGNhbGwKICAgICp4ID0geTEgLSAoYi9hKSAqIHgxOwogICAgKnkgPSB4MTsKICAgIHJldHVybiBnY2Q7Cn0KCnZvaWQgZ2V0YmluYXJ5KHVpbnQ4X3Qgbix1aW50OF90ICphKXsKICAgIGludCBpPTA7CiAgICB3aGlsZShuID4gMCl7CiAgICAgICAgYVtpKytdID0gbiUyOwogICAgICAgIG4gPSBuLzI7CiAgICB9CiAgICByZXR1cm47Cn0KCmludCBnZXRkZWNpbWFsKHVpbnQ4X3QgKmEpewogICAgaW50IGksbj0wOwogICAgZm9yKGk9MDtpPDg7aSsrKQogICAgICAgIG4gPSBuICsgYVtpXSpwb3dlcnNvZnR3b1tpXTsKICAgIHJldHVybiBuOwp9CgovL2dlbmVyYXRlcyBzYm94CnZvaWQgZ2VuZXJhdGVfc2JveCgpewogICAgaW50IGksajsKICAgIC8vbG9vcCBmb3IgYWxsIDAtMjU1IGVudHJpZXMuCiAgICAvL3NwZWNpYWwgY2FzZSA9IDAKICAgIGZvcihpPTE7aSE9MTYqMTY7aSsrKXsKICAgICAgICB1aW50OF90IHRtcFs4XSA9IHswfTsJCQkvL3N0b3JlcyBiaW5hcnkgb2YgaW52ZXJzZS4KICAgICAgICB1aW50OF90IHk7CiAgICAgICAgaW50IGludiA9IG1vZEludmVyc2UoaSwyODMpOwkvL2ludmVyc2UuCiAgICAgICAgZ2V0YmluYXJ5KGludix0bXApOwogICAgICAgIHVpbnQ4X3QgbmV3dG1wWzhdOwogICAgICAgIC8vQWZmaW5lIHRyYW5zZm9ybWF0aW9uCiAgICAgICAgZm9yKGo9MDtqPDg7aisrKQogICAgICAgICAgICBuZXd0bXBbal0gPSAodG1wW2pdXnRtcFsoais0KSU4XV50bXBbKGorNSklOF1edG1wWyhqKzYpJThdXnRtcFsoais3KSU4XV5jW2pdKTsKICAgICAgICAvL2RlY2ltYWwgdG8gYmluYXJ5IGNvbnZlcnNpb24uCiAgICAgICAgaW50IG51bSA9IGdldGRlY2ltYWwobmV3dG1wKTsKICAgICAgICBzYm94W2ldID0gbnVtOwogICAgfQogICAgcmV0dXJuIDsKfQoKCmludCBtYWluKCl7CiAgICBnZW5lcmF0ZV9zYm94KCk7CiAgICByZXR1cm4gMDsKfQ==