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