%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%% http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function s = GExp256(block)
%clear; clc;
g =[[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 3, 0, 0, 3, 3, 3, 3, 0, 0, 2, 0, 0, 3, 0, 2, 3, 2, 2, 1, 0, 2, 2, 3, 0, 3, 0, 0, 1, 0, 2, 1, 2, 3, 3, 3, 1, 2, 3, 3, 0, 1, 1, 1, 3, 1, 1, 1, 1, 0, 0, 3, 0, 0, 0, 3, 1, 3, 3, 2, 2, 2, 3, 0, 0, 2, 2, 3, 0, 1, 1, 2, 0, 1, 2, 1, 3, 0, 1, 2, 3, 1, 0, 1, 2, 1, 3, 3, 3, 3, 3, 2, 1, 1, 0, 2, 3, 2, 1, 0, 2, 3, 1, 1, 0, 2, 3, 3, 2, 0, 2, 0];
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 3, 3, 0, 2, 1, 1, 1, 3, 0, 1, 2, 0, 2, 3, 1, 0, 2, 3, 1, 1, 1, 3, 0, 3, 2, 3, 0, 3, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 3, 3, 2, 2, 3, 0, 2, 2, 2, 1, 0, 2, 3, 0, 0, 2, 0, 3, 1, 2, 3, 3, 0, 3, 0, 1, 3, 0, 3, 3, 2, 0, 2, 3, 0, 1, 3, 3, 3, 0, 0, 0, 1, 3, 0, 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 0, 2, 1, 1, 1, 0, 0, 2, 1, 1, 0, 1, 1, 2, 1, 2];
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 3, 3, 2, 0, 3, 3, 1, 3, 1, 1, 2, 2, 2, 2, 3, 1, 3, 0, 1, 0, 0, 1, 0, 1, 2, 3, 3, 3, 0, 2, 0, 2, 2, 3, 2, 1, 2, 2, 1, 0, 0, 1, 0, 2, 3, 1, 1, 2, 1, 2, 2, 3, 0, 2, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 0, 1, 0, 0, 0, 3, 0, 1, 2, 3, 3, 3, 0, 2, 2, 3, 0, 2, 2, 3, 3, 1, 3, 3, 3, 0, 1, 2, 2, 0, 3, 1, 1, 1, 0, 3, 3, 3, 2, 0, 3, 2, 0, 1, 2, 3];
[0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 3, 3, 2, 0, 3, 3, 1, 3, 1, 1, 2, 2, 2, 2, 3, 1, 3, 0, 1, 0, 0, 1, 0, 1, 2, 3, 3, 3, 0, 2, 0, 2, 2, 3, 2, 1, 2, 2, 1, 0, 0, 1, 2, 2, 3, 1, 1, 2, 1, 2, 2, 3, 0, 2, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 0, 1, 0, 0, 0, 3, 0, 1, 2, 3, 3, 3, 0, 2, 2, 3, 0, 2, 2, 3, 3, 1, 3, 3, 3, 0, 1, 2, 2, 0, 3, 1, 1, 1, 0, 3, 3, 3, 2, 0, 3, 1, 0, 0, 1];
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 1, 2, 0, 0, 0, 1, 3, 3, 3, 3, 3, 1, 2, 2, 0, 1, 0, 1, 0, 3, 2, 3, 3, 0, 2, 0, 1, 3, 3, 1, 2, 2, 1, 3, 1, 3, 1, 1, 2, 2, 3, 0, 1, 3, 2, 3, 3, 2, 1, 1, 1, 1, 2, 2, 0, 1, 1, 2, 0, 3, 2, 0, 2, 1, 2, 1, 2, 0, 0, 1, 2, 0, 2, 2, 0, 1, 3, 2, 1, 3, 3, 2, 2, 2, 3, 1, 0, 0, 2, 0, 1, 2, 1, 1, 0, 1, 2, 2, 1, 3, 2, 1, 2, 3, 1, 1, 3, 3, 1, 3, 1];
[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 3, 2, 0, 1, 2, 0, 2, 3, 1, 3, 2, 2, 0, 2, 3, 2, 2, 3, 0, 3, 1, 2, 2, 3, 3, 2, 1, 0, 3, 3, 0, 1, 0, 0, 2, 1, 3, 1, 1, 2, 0, 3, 3, 3, 3, 1, 2, 0, 0, 2, 0, 3, 3, 2, 3, 3, 0, 2, 3, 3, 1, 2, 1, 0, 3, 3, 0, 3, 1, 3, 1, 1, 3, 2, 2, 0, 1, 2, 1, 1, 0, 2, 0, 1, 2, 0, 1, 1, 2, 2, 2, 3, 3, 2, 3, 3, 2];
[0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 2, 1, 0, 0, 0, 0, 3, 3, 2, 2, 3, 1, 3, 3, 1, 3, 1, 2, 2, 1, 3, 1, 1, 1, 2, 2, 3, 2, 2, 1, 3, 1, 2, 1, 2, 3, 0, 1, 3, 1, 2, 3, 1, 0, 3, 2, 3, 0, 2, 3, 3, 1, 1, 0, 3, 1, 1, 2, 2, 0, 0, 0, 0, 3, 1, 1, 3, 1, 0, 2, 0, 1, 2, 0, 3, 2, 2, 1, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 0, 1, 2, 1, 1, 0, 2, 3, 3, 1, 3, 2, 2, 2, 2, 3, 0, 1, 2, 2, 1, 1];
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0, 2, 2, 3, 3, 3, 0, 3, 1, 2, 2, 0, 1, 1, 0, 3, 1, 0, 2, 0, 3, 0, 1, 2, 1, 2, 3, 3, 0, 3, 3, 0, 2, 1, 0, 0, 0, 3, 1, 2, 0, 3, 0, 0, 1, 2, 3, 3, 0, 1, 3, 3, 1, 2, 1, 0, 2, 3, 0, 0, 3, 0, 0, 2, 1, 2, 1, 2, 0, 2, 2, 1, 3, 3, 3, 3, 3, 0, 2, 0, 0, 1, 2, 1, 3, 0, 0, 2, 3, 2, 0, 3, 1, 3, 3, 0, 2, 3, 3, 0, 3, 3, 2, 0, 0, 3, 0, 2, 2, 0];
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 1, 0, 2, 2, 3, 3, 3, 0, 3, 1, 2, 2, 0, 1, 1, 0, 3, 1, 0, 2, 0, 3, 0, 1, 2, 1, 2, 3, 3, 0, 3, 3, 0, 2, 1, 0, 0, 0, 3, 1, 2, 0, 3, 3, 0, 1, 2, 3, 3, 0, 1, 3, 3, 1, 2, 1, 0, 2, 3, 0, 0, 3, 0, 0, 2, 1, 2, 1, 2, 0, 2, 2, 1, 3, 3, 3, 3, 3, 0, 2, 0, 0, 1, 2, 1, 3, 0, 0, 2, 3, 2, 0, 3, 1, 3, 3, 0, 2, 3, 3, 0, 3, 3, 2, 0, 0, 3, 0, 1, 2];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 3, 1, 2, 3, 1, 2, 0, 0, 1, 3, 3, 1, 3, 1, 0, 2, 1, 3, 0, 1, 0, 1, 1, 3, 2, 3, 2, 1, 2, 2, 2, 2, 0, 1, 1, 1, 2, 1, 0, 2, 2, 0, 0, 2, 1, 2, 3, 0, 3, 2, 2, 3, 1, 0, 1, 3, 1, 2, 0, 3, 1, 3, 2, 2, 0, 3, 1, 1, 0, 1, 1, 2, 3, 0, 1, 3, 2, 1, 3, 0, 2, 1, 3, 2, 3, 1, 2, 0, 3, 1, 2, 2, 3, 0, 1, 0, 2, 3, 2, 0, 0, 3, 1, 0, 3, 3, 2, 0, 2, 3, 3, 3, 3];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 0, 0, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 3, 1, 1, 3, 2, 0];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 0, 1, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 3, 1, 1, 2, 2];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 3, 3, 1, 0, 2, 3, 0, 3, 1, 1, 1, 3, 0, 1, 3, 0, 0, 1, 0, 0, 3, 3, 0, 2, 2, 2, 2, 2, 2, 1, 0, 2, 1, 0, 3, 0, 0, 0, 0, 2, 1, 3, 2, 2, 2, 3, 1, 0, 1, 2, 1, 2, 2, 2, 1, 0, 1, 2, 3, 3, 1, 0, 2, 0, 3, 2, 0, 0, 2, 0, 0, 3, 3, 1, 3, 2, 2, 1, 3, 1, 1, 3, 3, 3, 3, 0, 0, 3, 3, 1, 2, 0, 3, 1, 1, 2, 1, 3, 3, 0, 0, 0, 3, 2, 3, 2, 3, 0, 0, 1, 1, 0];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 3, 2, 2, 2, 3, 1, 1, 3, 2, 1, 3, 1, 2, 1, 3, 1, 1, 0, 1, 3, 2, 2, 0, 0, 0, 1, 2, 3, 2, 2, 0, 2, 2, 2, 1, 0, 1, 2, 2, 3, 1, 1, 2, 3, 1, 0, 3, 2, 1, 3, 2, 1, 2, 0, 2, 2, 2, 0, 2, 0, 3, 0, 0, 2, 1, 2, 0, 0, 1, 1, 0, 0, 2, 3, 3, 1, 2, 1, 3, 2, 3, 0, 0, 3, 3, 1, 0, 1, 1, 1, 2, 2, 0, 1, 2, 1, 1, 2, 3, 2, 1, 3, 3, 1, 2, 1, 2, 0, 3, 2, 1, 0, 0, 1];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 2, 3, 3, 3, 1, 0, 1, 3, 0, 2, 1, 1, 1, 0, 2, 0, 2, 1, 2, 1, 1, 2, 1, 0, 3, 2, 1, 0, 3, 1, 3, 3, 2, 3, 1, 3, 1, 3, 1, 1, 0, 2, 2, 1, 1, 2, 0, 2, 1, 0, 0, 2, 2, 0, 3, 0, 2, 2, 1, 1, 0, 1, 2, 1, 1, 3, 1, 3, 3, 3, 3, 0, 0, 1, 3, 3, 1, 2, 2, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 1, 2, 1, 1, 0, 0, 2, 1, 1, 2, 1, 2, 1, 1, 3, 2, 1, 0, 1, 0, 1];
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 3, 2, 0, 0, 2, 2, 2, 2, 0, 0, 1, 0, 0, 2, 0, 1, 2, 1, 1, 3, 0, 1, 1, 2, 0, 2, 0, 0, 3, 0, 1, 3, 1, 2, 2, 2, 3, 1, 2, 2, 0, 3, 3, 3, 2, 3, 3, 3, 3, 0, 0, 2, 0, 0, 0, 2, 3, 2, 2, 1, 1, 1, 2, 0, 0, 1, 1, 2, 0, 3, 3, 1, 0, 3, 1, 3, 2, 0, 3, 1, 2, 3, 0, 3, 1, 3, 2, 2, 2, 2, 2, 1, 3, 3, 0, 1, 2, 1, 3, 0, 1, 2, 3, 3, 0, 1, 2, 2, 3, 0, 0, 1, 1]];
msg=zeros(1,16);
temp=dec2bin(block,8);
for i=1:4
for j=1:4
msg((i-1)*4+j)=bin2dec(temp(i,2*j-1:2*j));
end
end
e=zeros(1,128);
for k=1:128
for i=1:16
if g(i,k)==0
s=0;
elseif g(i,k)==1
s=msg(i);
elseif g(i,k)==2
if msg(i)==0 || msg(i)==1
s=bitshift(msg(i),1);
elseif msg(i)==2
s=3;
else
s=1;
end
else
if msg(i)==0 || msg(i)==1
s=bitxor(bitshift(msg(i),1), msg(i));
elseif msg(i)==2
s=1;
else
s=2;
end
end
e(k)=bitxor(e(k),s) ;
end
end
%T0 = zeros(8,16);
T1 = zeros(8,16);
%M1 = zeros(8,32);
for i=1:8
%T0(i,:) = d(16*(i-1)+1:(16*i));
T1(i,:) = e(16*(i-1)+1:(16*i));
% for j=1:16
% %M0(i,2*j-1:2*j)=dec2bin(T0(i,j),2);
% M1(i,2*j-1:2*j)=dec2bin(T1(i,j),2);
% end
end
%M0=uint8(M0-48);
%M1=uint8(M1-48);
s=zeros(1,8,'uint32');
for i=1:8
tmp=dec2bin(T1(i,:))';
tmp=tmp(:)';
s(i)=bin2dec(tmp);
end
% q=4;
% m0=zeros(8,32,'uint8');
% m1=zeros(8,32,'uint8');
% for i=1:q
% for j=1:16
% m0(i,j) = M0(i,2*j-1);
% m0(i,16+j) = M0(q+i,2*j-1);
% m0(q+i,j) = M0(i,2*j);
% m0(q+i,16+j) = M0(q+i, 2*j);
% m1(i,j) = M1(i,2*j-1);
% m1(i,16+j) = M1(q+i,2*j-1);
% m1(q+i,j) = M1(i,2*j);
% m1(q+i,16+j) = M1(q+i, 2*j);
%
% end
% end
% isequal(m0, m1)
%
%
% m0=num2str(m0);
%
% m1=num2str(m1);
%disp('Expansion Matrix :');
%disp(m0);
%expansion lut
% tmp=zeros(1,32);
% for i=1:16
% tmp(1, 2*i-1:2*i) = dec2bin(msg(i),2);
% end
% tmp = uint8(tmp-48);
%
% b=zeros(1,4);
% for i=1:4
% b(i)=bin2dec(num2str(tmp(8*(i-1)+1:8*i)));
%
% end
%
% b=b+1;
%
% s = zeros(8,1);
% for i=1:8
% s(i) = Exp256(i, b);
% end
% s=dec2bin(s, 32);
% %disp('Expansion Matrix using LUT:');
% %disp(s '\n');
%
% %compare results
% isequal(s,m1);
%
% %reverse calc
% MRev = zeros(8,32);
% for i=1:q
% for j=1:16
% MRev(i,2*j-1) = s(i,j);
% MRev(q+i,2*j-1) = s(i,16+j);
% MRev(i,2*j) = s(q+i,j);
% MRev(q+i, 2*j) = s(q+i,16+j);
%
% end
% end
% MRev = MRev-48;
% sum(sum(MRev))
% sum(sum(M0))
% MRev=num2str(MRev)
% M0=num2str(M0)
% %m0=zeros(8,32);
% for i=1:q
% for j=1:16
% m0(i,j) = MRev(i,2*j-1);
% m0(i,16+j) = MRev(q+i,2*j-1);
% m0(q+i,j) = MRev(i,2*j);
% m0(q+i,16+j) = MRev(q+i, 2*j);
%
% end
% end
end