function Out4 = SBox(In6, n)  
% Out4 = SBox(In6, n)
% Inputs: In6 = a 6 bit binary vector , and n = an S-box number  (between 1
% and 8).  
% Output:  Out4= the 4 bit vector resulting from  applying the nth S-box 
% from Table 6.8 to the 6 bit vector In6. 

%First we create a 3-dimensional array SBoxes for the 8 S-boxes.  The nth
%S-box will be SBoxes(:,:,n).

if n < 1|n>8|floor(n)<n
    error('The box number (second) input for the S-box must be an integer between 1 and 8.'), return
end

SBoxes(:,:,1) = [14	4	13	1	2	15	11	8	3	10	6	12	5	9	0	7; ...
                0	15	7	4	14	2	13	1	10	6	12	11	9	5	3	8; ...
                4	1	14	8	13	6	2	11	15	12	9	7	3	10	5	0; ...
                15	12	8	2	4	9	1	7	5	11	3	14	10	0	6	13];


SBoxes(:,:,2) = [15	1	8	14	6	11	3	4	9	7	2	13	12	0	5	10; ...
                3	13	4	7	15	2	8	14	12	0	1	10	6	9	11	5; ...
                0	14	7	11	10	4	13	1	5	8	12	6	9	3	2	15; ...
                13	8	10	1	3	15	4	2	11	6	7	12	0	5	14	9];

            
SBoxes(:,:,3) = [10	0	9	14	6	3	15	5	1	13	12	7	11	4	2	8; ...
                13	7	0	9	3	4	6	10	2	8	5	14	12	11	15	1; ...
                13	6	4	9	8	15	3	0	11	1	2	12	5	10	14	7; ...
                1	10	13	0	6	9	8	7	4	15	14	3	11	5	2	12];
                
                
SBoxes(:,:,4) = [7	13	14	3	0	6	9	10	1	2	8	5	11	12	4	15; ...
                13	8	11	5	6	15	0	3	4	7	2	12	1	10	14	9; ...
                10	6	9	0	12	11	7	13	15	1	3	14	5	2	8	4; ...
                3	15	0	6	10	1	13	8	9	4	5	11	12	7	2	14];
                

SBoxes(:,:,5) = [2	12	4	1	7	10	11	6	8	5	3	15	13	0	14	9; ...
                14	11	2	12	4	7	13	1	5	0	15	10	3	9	8	6; ...
                4	2	1	11	10	13	7	8	15	9	12	5	6	3	0	14; ...
                11	8	12	7	1	14	2	13	6	15	0	9	10	4	5	3];
                
SBoxes(:,:,6) = [12	1	10	15	9	2	6	8	0	13	3	4	14	7	5	11; ...
                10	15	4	2	7	12	9	5	6	1	13	14	0	11	3	8; ...
                9	14	15	5	2	8	12	3	7	0	4	10	1	13	11	6; ...
                4	3	2	12	9	5	15	10	11	14	1	7	6	0	8	13];

SBoxes(:,:,7) = [4	11	2	14	15	0	8	13	3	12	9	7	5	10	6	1; ...
                13	0	11	7	4	9	1	10	14	3	5	12	2	15	8	6; ...
                1	4	11	13	12	3	7	14	10	15	6	8	0	5	9	2; ...
                6	11	13	8	1	4	10	7	9	5	0	15	14	2	3	12];
           
SBoxes(:,:,8) = [13	2	8	4	6	15	11	1	10	9	3	14	5	0	12	7; ...
                1	15	13	8	10	3	7	4	12	5	6	11	0	14	9	2; ...
                7	11	4	1	9	12	14	2	0	6	10	13	15	3	5	8; ...
                2	1	14	7	4	10	8	13	15	12	9	0	3	5	6	11];
                
%Select the appropriate S-Box
Box = SBoxes(:,:,n);
%We use the outer digits of In6 to determine the row of the S-box.
row = 2*In6(1) + In6(6) + 1;
%The inner 4 bits of In6 determine the column of the S-box.
col = 8*In6(2) + 4*In6(3) + 2*In6(4) + In6(5) + 1;

preout = Box(row,col); %This needs to be put in a 4 digit binary expansion.
total = preout;
if preout >= 8, Out4(1) = 1; total = total - 8; else Out4(1) = 0; end
if total  >= 4, Out4(2) = 1; total = total - 4; else Out4(2) = 0; end
if total  >= 2, Out4(3) = 1; total = total - 2; else Out4(3) = 0; end
if total  >= 1, Out4(4) = 1;  else Out4(4) = 0; end
