%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Copyright: 2010 Integrated Sytems Laboratory, ETH Zurich
%%            http://www.iis.ee.ethz.ch/~sha3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function W = MessageExpansion(M, f)

alpha = 139;
beta  = 98;
n     = 4;
W     = zeros(32,n);

if f==0,
y = [...
   1   98   95   58   30  113   23  198  129   49  176   29   15  185  140   99 ...
 193  153   88  143  136  221   70  178  225  205   44  200   68  239   35   89 ...
 241  231   22  100   34  248  146  173  249  244   11   50   17  124   73  215 ...
 253  122  134   25  137   62  165  236  255   61   67  141  197   31  211  118 ...
 256  159  162  199  227  144  234   59  128  208   81  228  242   72  117  158 ...
  64  104  169  114  121   36  187   79   32   52  213   57  189   18  222  168 ...
  16   26  235  157  223    9  111   84    8   13  246  207  240  133  184   42 ...
   4  135  123  232  120  195   92   21    2  196  190  116   60  226   46  139];

else
y = [...
   2  156  118  107   45  212  111  419  354  249  211  260   49  358  151  223 ...
 446  178  253  204  333  339  232  322  353  433  161  304  189  318  248  107 ...
 257  388  133  113  274  290  269  368  251  360   57  148   47  322  249  400 ...
 446  265  204  230  205  151  187  484  504  111  140  263  334  267  278  149 ...
 512  358  396  407  469  302  403   95  160  265  303  254  465  156  363  291 ...
  68  336  261  310  181  175  282  192  161   81  353  210  325  196  266  407 ...
 257  126  381  401  240  224  245  146  263  154  457  366  467  192  265  114 ...
  68  249  310  284  309  363  327   30   10  403  374  251  180  247  236  365];

end

alpha_i = 1;

P = [4 6 0 2 7 5 3 1 15 11 12 8 9 13 10 14 17 18 23 20 22 21 16 19 30 24 25 31 27 29 28 26]+1;

%--------------------------------------------------------------------------
for i = 1:128,
    alpha_ij = 1;
    
    %fprintf('%3X\n', alpha_i);
    
    for j = 1:64,
        
        y(i)     = mod((y(i) + alpha_ij*M(j)), 257);
        alpha_ij = mod(alpha_ij*alpha_i, 257);
        
%         if alpha_ij > 255,
%             fprintf('z1z & x"%02X", ', bitand(alpha_ij, hex2dec('FF')));
%             
%         else
%             fprintf('z0z & x"%02X", ', alpha_ij);
%         end
        
        
    end
    
%     fprintf('\n');
    
    alpha_i = mod(alpha_i*alpha, 257);
end
 
%  fprintf('\n');

%--------------------------------------------------------------------------
for i = 1:128,
    
    if y(i) > 128,
        y(i) = y(i)-257;
    end
end

yy = NTT(M,f);

if isequal(yy,y) == 0,
    disp('error')
end

for i=0:16-1,
    for j=0:n-1,
      Z(i+1,j+1) = dec2u32(mod(y(2*i*n+2*j+1) * 185, hex2dec('ffff')+1) + y(2*i*n+2*j+1+1) * 185 * 2^16);
%       fprintf('Z[%2i][%i] (y[%3i] and y[%3i])  ', i, j, 2*i*n+2*j, 2*i*n+2*j+1);
    end
%     fprintf('\n');
end

for i=0:8-1,
    for j=0:n-1,
      Z(i+16+1,j+1) = dec2u32(mod(y(2*i*n+2*j+1) * 233, hex2dec('ffff')+1) + y(2*i*n+2*j+128/2+1) * 233 * 2^16);
%       fprintf('Z[%2i][%i] (y[%3i] and y[%3i])  ', i+16, j, 2*i*n+2*j, 2*i*n+2*j+128/2);
    end
%     fprintf('\n');
end
for i=0:8-1, 
    for j=0:n-1,
      Z(i+24+1,j+1) = dec2u32(mod(y(2*i*n+2*j+1+1) * 233, hex2dec('ffff')+1) + y(2*i*n+2*j+128/2+1+1) * 233 * 2^16);
%       fprintf('Z[%2i][%i] (y[%3i] and y[%3i])  ', i+24, j, 2*i*n+2*j+1, 2*i*n+2*j+128/2+1);
    end
%     fprintf('\n');
end

% fprintf('\n');
%--------------------------------------------------------------------------
for i=1:32, 
    for j=1:n
      W(i,j) = Z(P(i),j);
%       fprintf('W[%2i][%i] = Z[%2i][%i] ', i-1, j-1, P(i)-1, j-1);
    end
%     fprintf('\n');
end

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