%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%% http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
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=ones(1,16)*2;
msg=round(rand(1,16)*3);
d=zeros(1,128);
for k=1:128
for i=1:16
if g(i,k)==0
t=0;
elseif g(i,k)==1
t=msg(i);
elseif g(i,k)==2
t=bitshift(msg(i),1);
else
t=bitxor(bitshift(msg(i),1), msg(i));
end
if t > 3
d(k)=bitxor(bitxor(bitand(t,3),3), d(k));
else
d(k)=bitxor(d(k),t) ;
end
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);
M0 = 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);
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