OpenCores
URL https://opencores.org/ocsvn/aes_highthroughput_lowarea/aes_highthroughput_lowarea/trunk

Subversion Repositories aes_highthroughput_lowarea

[/] [aes_highthroughput_lowarea/] [trunk/] [verilog/] [rtl/] [sbox.v] - Blame information for rev 5

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 motilito
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  Sub Bytes Box file                                          ////
4
////                                                              ////
5
////  Description:                                                ////
6
////  Implement sub byte box look up table                        ////
7
////                                                              ////
8
////  To Do:                                                      ////
9
////   - done                                                     ////
10
////                                                              ////
11
////  Author(s):                                                  ////
12
////      - Luo Dongjun,   dongjun_luo@hotmail.com                ////
13
////                                                              ////
14
//////////////////////////////////////////////////////////////////////
15
module sbox(
16
        clk,
17
        reset_n,
18
        enable,
19
        din,
20
        ende,
21
        en_dout,
22
        de_dout);
23
 
24
input           clk;
25
input           reset_n;
26
input           enable;
27
input   [7:0]    din;
28
input           ende;  //0: encryption;  1: decryption
29
output  [7:0]    en_dout;
30
output  [7:0]    de_dout;
31
 
32
wire [7:0] first_matrix_out,first_matrix_in,last_matrix_out_enc,last_matrix_out_dec;
33
wire [3:0] p,q,p2,q2,sumpq,sump2q2,inv_sump2q2,p_new,q_new,mulpq,q2B;
34
reg [7:0]  first_matrix_out_L;
35
reg [3:0]  p_new_L,q_new_L;
36
 
37
// GF(256) to GF(16) transformation
38
assign first_matrix_in[7:0] = ende ? INV_AFFINE(din[7:0]): din[7:0];
39
assign first_matrix_out[7:0] = GF256_TO_GF16(first_matrix_in[7:0]);
40
 
41
// pipeline 1
42
always @ (posedge clk or negedge reset_n)
43
begin
44
        if (!reset_n)
45
                first_matrix_out_L[7:0] <= 8'b0;
46
        else if (enable)
47
                first_matrix_out_L[7:0] <= first_matrix_out[7:0];
48
end
49
 
50
/*****************************************************************************/
51
// GF16 inverse logic
52
/*****************************************************************************/
53
//                     p+q _____ 
54
//                              \
55
//  p --> p2 ___                 \
56
//   \          \                 x --> p_new
57
//    x -> p*q -- + --> inverse -/
58
//   /          /                \
59
//  q --> q2*B-/                  x --> q_new 
60
//   \___________________________/
61
//
62
assign p[3:0] = first_matrix_out_L[3:0];
63
assign q[3:0] = first_matrix_out_L[7:4];
64
assign p2[3:0] = SQUARE(p[3:0]);
65
assign q2[3:0] = SQUARE(q[3:0]);
66
//p+q
67
assign sumpq[3:0] = p[3:0] ^ q[3:0];
68
//p*q
69
assign mulpq[3:0] = MUL(p[3:0],q[3:0]);
70
//q2B calculation
71
assign q2B[0]=q2[1]^q2[2]^q2[3];
72
assign q2B[1]=q2[0]^q2[1];
73
assign q2B[2]=q2[0]^q2[1]^q2[2];
74
assign q2B[3]=q2[0]^q2[1]^q2[2]^q2[3];
75
//p2+p*q+q2B
76
assign sump2q2[3:0] = q2B[3:0] ^ mulpq[3:0] ^ p2[3:0];
77
// inverse p2+pq+q2B
78
assign inv_sump2q2[3:0] = INVERSE(sump2q2[3:0]);
79
// results
80
assign p_new[3:0] = MUL(sumpq[3:0],inv_sump2q2[3:0]);
81
assign q_new[3:0] = MUL(q[3:0],inv_sump2q2[3:0]);
82
 
83
// pipeline 2
84
always @ (posedge clk or negedge reset_n)
85
begin
86
        if (!reset_n)
87
                {p_new_L[3:0],q_new_L[3:0]} <= 8'b0;
88
        else if (enable)
89
                {p_new_L[3:0],q_new_L[3:0]} <= {p_new[3:0],q_new[3:0]};
90
end
91
 
92
// GF(16) to GF(256) transformation
93
assign last_matrix_out_dec[7:0] = GF16_TO_GF256(p_new_L[3:0],q_new_L[3:0]);
94
assign last_matrix_out_enc[7:0] = AFFINE(last_matrix_out_dec[7:0]);
95
assign en_dout[7:0] = last_matrix_out_enc[7:0];
96
assign de_dout[7:0] = last_matrix_out_dec[7:0];
97
 
98
/*****************************************************************************/
99
// Functions
100
/*****************************************************************************/
101
 
102
// convert GF(256) to GF(16)
103
function [7:0] GF256_TO_GF16;
104
input [7:0] data;
105
reg a,b,c;
106
begin
107
        a = data[1]^data[7];
108
        b = data[5]^data[7];
109
        c = data[4]^data[6];
110
        GF256_TO_GF16[0] = c^data[0]^data[5];
111
        GF256_TO_GF16[1] = data[1]^data[2];
112
        GF256_TO_GF16[2] = a;
113
        GF256_TO_GF16[3] = data[2]^data[4];
114
        GF256_TO_GF16[4] = c^data[5];
115
        GF256_TO_GF16[5] = a^c;
116
        GF256_TO_GF16[6] = b^data[2]^data[3];
117
        GF256_TO_GF16[7] = b;
118
end
119
endfunction
120
 
121
// squre 
122
function [3:0] SQUARE;
123
input [3:0] data;
124
begin
125
        SQUARE[0] = data[0]^data[2];
126
        SQUARE[1] = data[2];
127
        SQUARE[2] = data[1]^data[3];
128
        SQUARE[3] = data[3];
129
end
130
endfunction
131
 
132
// inverse
133
function [3:0] INVERSE;
134
input [3:0] data;
135
reg a;
136
begin
137
        a=data[1]^data[2]^data[3]^(data[1]&data[2]&data[3]);
138
        INVERSE[0]=a^data[0]^(data[0]&data[2])^(data[1]&data[2])^(data[0]&data[1]&data[2]);
139
        INVERSE[1]=(data[0]&data[1])^(data[0]&data[2])^(data[1]&data[2])^data[3]^
140
                (data[1]&data[3])^(data[0]&data[1]&data[3]);
141
        INVERSE[2]=(data[0]&data[1])^data[2]^(data[0]&data[2])^data[3]^
142
                (data[0]&data[3])^(data[0]&data[2]&data[3]);
143
        INVERSE[3]=a^(data[0]&data[3])^(data[1]&data[3])^(data[2]&data[3]);
144
end
145
endfunction
146
 
147
// multiply
148
function [3:0] MUL;
149
input [3:0] d1,d2;
150
reg a,b;
151
begin
152
        a=d1[0]^d1[3];
153
        b=d1[2]^d1[3];
154
 
155
        MUL[0]=(d1[0]&d2[0])^(d1[3]&d2[1])^(d1[2]&d2[2])^(d1[1]&d2[3]);
156
        MUL[1]=(d1[1]&d2[0])^(a&d2[1])^(b&d2[2])^((d1[1]^d1[2])&d2[3]);
157
        MUL[2]=(d1[2]&d2[0])^(d1[1]&d2[1])^(a&d2[2])^(b&d2[3]);
158
        MUL[3]=(d1[3]&d2[0])^(d1[2]&d2[1])^(d1[1]&d2[2])^(a&d2[3]);
159
end
160
endfunction
161
 
162
// GF16 to GF256 transform
163
function [7:0] GF16_TO_GF256;
164
input [3:0] p,q;
165
reg a,b;
166
begin
167
        a=p[1]^q[3];
168
        b=q[0]^q[1];
169
 
170
        GF16_TO_GF256[0]=p[0]^q[0];
171
        GF16_TO_GF256[1]=b^q[3];
172
        GF16_TO_GF256[2]=a^b;
173
        GF16_TO_GF256[3]=b^p[1]^q[2];
174
        GF16_TO_GF256[4]=a^b^p[3];
175
        GF16_TO_GF256[5]=b^p[2];
176
        GF16_TO_GF256[6]=a^p[2]^p[3]^q[0];
177
        GF16_TO_GF256[7]=b^p[2]^q[3];
178
end
179
endfunction
180
 
181
// affine transformation
182
function [7:0] AFFINE;
183
input [7:0] data;
184
begin
185
        //affine trasformation
186
        AFFINE[0]=(!data[0])^data[4]^data[5]^data[6]^data[7];
187
        AFFINE[1]=(!data[0])^data[1]^data[5]^data[6]^data[7];
188
        AFFINE[2]=data[0]^data[1]^data[2]^data[6]^data[7];
189
        AFFINE[3]=data[0]^data[1]^data[2]^data[3]^data[7];
190
        AFFINE[4]=data[0]^data[1]^data[2]^data[3]^data[4];
191
        AFFINE[5]=(!data[1])^data[2]^data[3]^data[4]^data[5];
192
        AFFINE[6]=(!data[2])^data[3]^data[4]^data[5]^data[6];
193
        AFFINE[7]=data[3]^data[4]^data[5]^data[6]^data[7];
194
end
195
endfunction
196
 
197
// inverse affine transformation
198
function [7:0] INV_AFFINE;
199
input [7:0] data;
200
reg a,b,c,d;
201
begin
202
        a=data[0]^data[5];
203
        b=data[1]^data[4];
204
        c=data[2]^data[7];
205
        d=data[3]^data[6];
206
        INV_AFFINE[0]=(!data[5])^c;
207
        INV_AFFINE[1]=data[0]^d;
208
        INV_AFFINE[2]=(!data[7])^b;
209
        INV_AFFINE[3]=data[2]^a;
210
        INV_AFFINE[4]=data[1]^d;
211
        INV_AFFINE[5]=data[4]^c;
212
        INV_AFFINE[6]=data[3]^a;
213
        INV_AFFINE[7]=data[6]^b;
214
end
215
endfunction
216
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.