2, 3, 4, 5, 3, 5, 7, 2
};
+static
+void shift_columns(uint8_t* a, const uint8_t *shifts){
+ uint8_t tmp[16];
+ uint8_t i,j,s;
+ for(i=0; i<8; ++i){
+ s = *shifts++;
+ if(s==0){
+ continue;
+ }
+ for(j=0;j<16;++j){
+ tmp[j] = a[i+j*8];
+ }
+ for(j=0;j<16;++j){
+ a[i+((j-s+16)%16)*8] = tmp[j];
+ }
+ }
+}
+
+static const uint8_t p_shifts[8] = { 0, 1, 2, 3, 4, 5, 6, 11 };
+static const uint8_t q_shifts[8] = { 1, 3, 5, 11, 0, 2, 4, 6 };
+
+static
void groestl_large_rounds(uint8_t *m, uint8_t q){
uint8_t r,i,j;
uint8_t tmp[16];
for(r=0; r<ROUNDS; ++r){
if(q){
- m[7] ^= 0xff ^ r;
+ for(i=0;i<64/2; ++i){
+ ((uint32_t*)m)[i] ^= 0xffffffff;
+ }
+ for(i=0; i<16; ++i){
+ m[i*8+7] ^= r ^ (i<<4);
+ }
}else{
- m[0] ^= r;
+ for(i=0; i<16; ++i){
+ m[i*8] ^= r ^ (i<<4);
+ }
}
#if DEBUG
if(r<2){
for(i=0;i<16*8; ++i){
m[i] = aes_sbox[m[i]];
}
- for(i=1; i<7; ++i){
- for(j=0; j<16; ++j)
- tmp[j] = m[i+8*j];
- for(j=0; j<16; ++j){
- m[i+((j-i+16)%16)*8] = tmp[j];
- }
- }
- for(j=0; j<16; ++j)
- tmp[j] = m[7+8*j];
- for(j=0; j<16; ++j){
- m[7+((j-11+16)%16)*8] = tmp[j];
+ if(q){
+ shift_columns(m, q_shifts);
+ }else{
+ shift_columns(m, p_shifts);
}
#if DEBUG