
load('WS3.mat');

samples = 1000;

analyzed_traces = 'traces_noDummy';
%analyzed_traces = 'traces_withDummy';

byte_to_attack = 1;

delta = 9441-6729;

more off

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Prepare plaintexts
D = aes_plaintexts(1:samples, byte_to_attack);
clear aes_plaintexts byte_to_attack

% Prepare traces
eval(sprintf('traces = %s(1:samples, :);', analyzed_traces));
clear analyzed_traces

K = uint8(0:255);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TASK 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Calculate hypothetical intermediate values
V = SubBytes(bitxor(repmat(D, 1, length(K)), repmat(K, samples, 1)) + 1);

% Calculate hypothetical power consumption
H = HW(V+1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Calculate correlation
tr_length = size(traces, 2);
R = zeros(length(K), tr_length);

for key_idx = uint16(K)+1
    fprintf('Working on key guess = %d\n', K(key_idx));
    
    for k = 1:tr_length
        r = corrcoef( [double(H(:,key_idx)) double(traces(:,k))] );
        R(key_idx, k) = r(1, 2);
    end
end
clear key_idx k r

% Plot correlation traces
%show_plots(R, 1, 256, 4)
%octave_plot2(R, 1, 256, 2, 2)

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% TASK 6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Preprocess traces with windowing
traces_pre = int16(traces(:, 1:end-delta)) + int16(traces(:, 1+delta:end));

% Calculate correlation with preprocessed traces
tr_length = size(traces, 2);
R_win = zeros(length(K), tr_length-delta);

for key_idx = uint16(K)+1
    fprintf('Working on key guess = %d\n', K(key_idx));
    
    for k = 1:tr_length-delta
        r = corrcoef( [double(H(:,key_idx)) double(traces_pre(:,k))] );
        R_win(key_idx, k) = r(1, 2);
    end
end
clear key_idx k r

% Plot correlation traces
%show_plots(R_win, 1, 256, 4)
%octave_plot2(R_win, 1, 256, 2, 2)
