%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%%            http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function state=KeccakPermutation(state, rounds_nr, round_constants, rho_offsets)
for i=1:rounds_nr
    %disp(['round ' num2str(i-1)]);
    %hdisplay(state, 'theta in');
    state=theta(state);
    %hdisplay(state, 'theta');
    state=rho(state, rho_offsets);
    %hdisplay(state,'rho');
    state=pi(state);
    %hdisplay(state,'phi');
    state=chi(state);
    %hdisplay(state,'chi');
    state=iota(state,i,round_constants);
    %hdisplay(state,'iota');
end
end


function a = theta(a)
c=zeros(1,5,'uint64');
d=zeros(1,5,'uint64');
for x=0:4
   c(x+1)=0;
   
   for y=0:4
       c(x+1)=bitxor(c(x+1),a(index(x,y)));
   end
   
   d(x+1)=rol64(c(x+1),1);
end
d_index=[2,3,4,5,1];
c_index=[5,1,2,3,4];
for x=0:4
    for y=0:4
        a(index(x,y))=bitxor(a(index(x,y)),bitxor(d(d_index(x+1)),c(c_index(x+1))));
    end
end
end


function a_out=rho(a, rho_offsets)
a_out=zeros(1,25,'uint64');
for x=0:4
    for y=0:4
        a_out(index(x,y))=rol64(a(index(x,y)), rho_offsets(index(x,y)));
    end
end
end


function a_out=pi(a)
a_out=zeros(1,25,'uint64');
for x=0:4
    for y=0:4
        a_out(index(y,2*x+3*y))=a(index(x,y));
    end
end
end


function a_out=chi(a)
c=zeros(1,5,'uint64');
a_out=zeros(1,25,'uint64');
for y=0:4
   for x=0:4
       a_not=complement(a(index(x+1,y)));
       c(x+1)=bitxor(a(index(x,y)),bitand(a_not ,a(index(x+2,y))));
   end
   for x=0:4
       a_out(index(x,y))=c(x+1);
   end
end
end


function a=iota(a,round_index,round_constants)
a(index(0,0))=bitxor(a(index(0,0)), round_constants(round_index));
end



Generated on Fri Sep 24 10:39:12 CEST 2010
Home