module DES(key,data,clk,rst,hash,match,done,next);
input [63:0] key; // 64 bit key with parity bit; (56 bits of data)
input [63:0] data; // 64 bit data
input wire clk;
input wire rst;
input wire [63:0] hash; // hash value to match
output reg match; // match flag, high if plain-text match is found
output reg done; // done flag; high when current hash is done computing
input wire next; // next signal; to start the next computation.
reg [27:0] c;
reg [27:0] d;
reg [47:0] k;
reg [31:0] r,r_old;
reg [31:0] l;
reg [4:0] state;
reg [47:0] x_r; // expansion of r
reg [31:0] cp_b; // concatenation and permutation of b[j] j:1->8
reg [63:0] out; // result of the hash
reg [1:0] s1r,s2r,s3r,s4r,s5r,s6r,s7r,s8r; // sbox row m
reg [3:0] s1c,s2c,s3c,s4c,s5c,s6c,s7c,s8c; // sbox col n
wire [3:0] b1,b2,b3,b4,b5,b6,b7,b8; // sbox output register
//instantiate sboxes
sbox1 s1(s1r,s1c,b1);
sbox2 s2(s2r,s2c,b2);
sbox3 s3(s3r,s3c,b3);
sbox4 s4(s4r,s4c,b4);
sbox5 s5(s5r,s5c,b5);
sbox6 s6(s6r,s6c,b6);
sbox7 s7(s7r,s7c,b7);
sbox8 s8(s8r,s8c,b8);
always@(posedge clk or posedge rst)
begin
if(rst)
begin
match = 1'b0; // set the match flag to zero
done = 1'b1;
c={key[7],key[15],key[23],key[31],key[39],key[47],key[55], // c0
key[63],key[6],key[14],key[22],key[30],key[38],key[46],
key[54],key[62],key[5],key[13],key[21],key[29],key[37],
key[45],key[53],key[61],key[4],key[12],key[20],key[28]};
d={key[1],key[9],key[17],key[25],key[33],key[41],key[49], // d0
key[57],key[2],key[10],key[18],key[26],key[34],key[42],
key[50],key[58],key[3],key[11],key[19],key[27],key[35],
key[43],key[51],key[59],key[36],key[44],key[52],key[60]};
l={data[6],data[14],data[22],data[30],data[38],data[46],data[54],data[62], // l0
data[4],data[12],data[20],data[28],data[36],data[44],data[52],data[60],
data[2],data[10],data[18],data[26],data[34],data[42],data[50],data[58],
data[0],data[8],data[16],data[24],data[32],data[40],data[48],data[56]};
r={data[7],data[15],data[23],data[31],data[39],data[47],data[55],data[63], // r0
data[5],data[13],data[21],data[29],data[37],data[45],data[53],data[61],
data[3],data[11],data[19],data[27],data[35],data[43],data[51],data[59],
data[1],data[9],data[17],data[25],data[33],data[41],data[49],data[57]};
state = 5'd18; // go to state 18, wait for next signal
end
else
begin
case(state)
0: // stage 0
begin
c={c[26:0],c[27]}; // c1 = CLS(c0,1)
d={d[26:0],d[27]}; // d1 = CLS(d0,1)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k1=PC-2(c1d1)
state = 5'd1;
end
1: // stage 1
begin
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r0)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k1
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[26:0],c[27]}; // c2 = CLS(c1,1)
d={d[26:0],d[27]}; // d2 = CLS(d1,1)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k2=PC-2(c2d2)
state = 5'd2;
end // case: 1
2: // stage 2
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R0
r = cp_b ^ l; // xor with L to get R1
l=r_old; // L1 = R0
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r1)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k1
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c3 = CLS(c2,2)
d={d[25:0],d[27:26]}; // d3 = CLS(d2,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k3=PC-2(c3d3)
state = 5'd3;
end // case: 2
3: // stage 3
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R2
l=r_old; // L2 = R1
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r2)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c4 = CLS(c3,2)
d={d[25:0],d[27:26]}; // d4 = CLS(d3,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k4=PC-2(c4d4)
state = 5'd4;
end // case: 3
4: // stage 4
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R3
l=r_old; // L3 = R2
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r3)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c5 = CLS(c4,2)
d={d[25:0],d[27:26]}; // d5 = CLS(d4,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k5=PC-2(c5d5)
state = 5'd5;
end // case: 4
5: // stage 5
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R4
l=r_old; // L4 = R3
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r4)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c6 = CLS(c5,2)
d={d[25:0],d[27:26]}; // d6 = CLS(d5,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k6=PC-2(c6d6)
state = 5'd6;
end // case: 5
6: // stage 6
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R5
l=r_old; // L5 = R4
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r5)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c7 = CLS(c6,2)
d={d[25:0],d[27:26]}; // d7 = CLS(d6,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k7=PC-2(c7d7)
state = 5'd7;
end // case: 6
7: // stage 7
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R6
l=r_old; // L6 = R5
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r6)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c8 = CLS(c7,2)
d={d[25:0],d[27:26]}; // d8 = CLS(d7,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k8=PC-2(c8d8)
state = 5'd8;
end // case: 7
8: // stage 8
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R7
l=r_old; // L7 = R6
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r7)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[26:0],c[27]}; // c9 = CLS(c8,1)
d={d[26:0],d[27]}; // d9 = CLS(d8,1)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k9=PC-2(c9d9)
state = 5'd9;
end // case: 8
9: // stage 9
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R8
l=r_old; // L8 = R7
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r8)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c10 = CLS(c9,2)
d={d[25:0],d[27:26]}; // d10 = CLS(d9,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k10=PC-2(c10d10)
state = 5'd10;
end // case: 9
10: // stage 10
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R9
l=r_old; // L9 = R8
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r9)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c11 = CLS(c10,2)
d={d[25:0],d[27:26]}; // d11 = CLS(d10,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k11=PC-2(c11d11)
state = 5'd11;
end // case: 10
11: // stage 11
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R10
l=r_old; // L10 = R9
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r10)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c12 = CLS(c11,2)
d={d[25:0],d[27:26]}; // d12 = CLS(d11,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k12=PC-2(c12d12)
state = 5'd12;
end // case: 11
12: // stage 12
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R11
l=r_old; // L11 = R10
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r11)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c13 = CLS(c12,2)
d={d[25:0],d[27:26]}; // d13 = CLS(d12,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k13=PC-2(c13d13)
state = 5'd13;
end // case: 12
13: // stage 13
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R12
l=r_old; // L12 = R11
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r12)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c14 = CLS(c13,2)
d={d[25:0],d[27:26]}; // d14 = CLS(d13,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k14=PC-2(c14d14)
state = 5'd14;
end // case: 13
14: // stage 14
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R13
l=r_old; // L13 = R12
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r13)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[25:0],c[27:26]}; // c15 = CLS(c14,2)
d={d[25:0],d[27:26]}; // d15 = CLS(d14,2)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k15=PC-2(c15d15)
state = 5'd15;
end // case: 14
15: // stage 15
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R14
l=r_old; // L14 = R13
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r14)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
c={c[26:0],c[27]}; // c16 = CLS(c15,1)
d={d[26:0],d[27]}; // d16 = CLS(d15,1)
k={c[14],c[11],c[17],c[4],c[27],c[23],
c[25],c[0],c[13],c[22],c[7],c[18],
c[5],c[9],c[16],c[24],c[2],c[20],
c[12],c[21],c[1],c[8],c[15],c[26],
d[15],d[4],d[25],d[19],d[9],d[1],
d[26],d[16],d[5],d[11],d[23],d[8],
d[12],d[7],d[17],d[0],d[22],d[3],
d[10],d[14],d[6],d[20],d[27],d[24]}; // k16=PC-2(c16d16)
state = 5'd16;
end // case: 15
16: // stage 16
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R15
l=r_old; // L15 = R14
x_r={r[0],r[31],r[30],r[29],r[28],r[27], // expansion(r15)
r[28],r[27],r[26],r[25],r[24],r[23],
r[24],r[23],r[22],r[21],r[20],r[19],
r[20],r[19],r[18],r[17],r[16],r[15],
r[16],r[15],r[14],r[13],r[12],r[11],
r[12],r[11],r[10],r[9],r[8],r[7],
r[8],r[7],r[6],r[5],r[4],r[3],
r[4],r[3],r[2],r[1],r[0],r[31]};
x_r = x_r ^ k; // expansion xor k
s1r = {x_r[47],x_r[42]}; // initialize the sbox
s2r = {x_r[41],x_r[36]};
s3r = {x_r[35],x_r[30]};
s4r = {x_r[29],x_r[24]};
s5r = {x_r[23],x_r[18]};
s6r = {x_r[17],x_r[12]};
s7r = {x_r[11],x_r[6]};
s8r = {x_r[5],x_r[0]};
s1c = x_r[46:43];
s2c = x_r[40:37];
s3c = x_r[34:31];
s4c = x_r[28:25];
s5c = x_r[22:19];
s6c = x_r[16:13];
s7c = x_r[10:7];
s8c = x_r[4:1];
state = 5'd17;
end // case: 16
17: // stage 17
begin
cp_b={b4[0],b2[1],b5[0],b6[3], // concatenate b's and permute
b8[3],b3[0],b7[0],b5[3],
b1[3],b4[1],b6[1],b7[2],
b2[3],b5[2],b8[1],b3[2],
b1[2],b2[0],b6[0],b4[2],
b8[0],b7[1],b1[1],b3[3],
b5[1],b4[3],b8[2],b2[2],
b6[2],b3[1],b1[0],b7[3]};
r_old=r; // save R
r = cp_b ^ l; // xor with L to get R16
l=r_old; // L16 = R15
out = {l[24],r[24],l[16],r[16],l[8],r[8],l[0],r[0],
l[25],r[25],l[17],r[17],l[9],r[9],l[1],r[1],
l[26],r[26],l[18],r[18],l[10],r[10],l[2],r[2],
l[27],r[27],l[19],r[19],l[11],r[11],l[3],r[3],
l[28],r[28],l[20],r[20],l[12],r[12],l[4],r[4],
l[29],r[29],l[21],r[21],l[13],r[13],l[5],r[5],
l[30],r[30],l[22],r[22],l[14],r[14],l[6],r[6],
l[31],r[31],l[23],r[23],l[15],r[15],l[7],r[7]};
if(out==hash)
begin
match=1'b1;
end
state = 5'd18;
done = 1'b1; // hash computation done
end // case: 17
18: // trap here until next signal is received
begin
if(next)
begin
//prepare next computation
c={key[7],key[15],key[23],key[31],key[39],key[47],key[55], // c0
key[63],key[6],key[14],key[22],key[30],key[38],key[46],
key[54],key[62],key[5],key[13],key[21],key[29],key[37],
key[45],key[53],key[61],key[4],key[12],key[20],key[28]};
d={key[1],key[9],key[17],key[25],key[33],key[41],key[49], // d0
key[57],key[2],key[10],key[18],key[26],key[34],key[42],
key[50],key[58],key[3],key[11],key[19],key[27],key[35],
key[43],key[51],key[59],key[36],key[44],key[52],key[60]};
l={data[6],data[14],data[22],data[30],data[38],data[46],data[54],data[62], // l0
data[4],data[12],data[20],data[28],data[36],data[44],data[52],data[60],
data[2],data[10],data[18],data[26],data[34],data[42],data[50],data[58],
data[0],data[8],data[16],data[24],data[32],data[40],data[48],data[56]};
r={data[7],data[15],data[23],data[31],data[39],data[47],data[55],data[63], // r0
data[5],data[13],data[21],data[29],data[37],data[45],data[53],data[61],
data[3],data[11],data[19],data[27],data[35],data[43],data[51],data[59],
data[1],data[9],data[17],data[25],data[33],data[41],data[49],data[57]};
state = 5'd0;
done = 1'b0;
end // if (next)
end
endcase // case (state)
end // else: !if(rst)
end // always@ (posedge clk)
endmodule // DES