%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 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