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

Subversion Repositories tiny_aes

[/] [tiny_aes/] [trunk/] [rtl/] [aes_256.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 homer.hsin
/*
2
 * Copyright 2012, Homer Hsing <homer.hsing@gmail.com>
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * http://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
 
17
module aes_256 (clk, state, key, out);
18
    input          clk;
19
    input  [127:0] state;
20
    input  [255:0] key;
21
    output [127:0] out;
22
    reg    [127:0] s0;
23
    reg    [255:0] k0, k0a, k1;
24
    wire   [127:0] s1, s2, s3, s4, s5, s6, s7, s8,
25
                   s9, s10, s11, s12, s13;
26
    wire   [255:0] k2, k3, k4, k5, k6, k7, k8,
27
                   k9, k10, k11, k12, k13;
28
    wire   [127:0] k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8b,
29
                   k9b, k10b, k11b, k12b, k13b;
30
 
31
    always @ (posedge clk)
32
      begin
33
        s0 <= state ^ key[255:128];
34
        k0 <= key;
35
        k0a <= k0;
36
        k1 <= k0a;
37
      end
38
 
39
    assign k0b = k0a[127:0];
40
 
41
    one_round_256
42
         r1 (clk, s0, k0b, s1),
43
         r2 (clk, s1, k1b, s2),
44
         r3 (clk, s2, k2b, s3),
45
         r4 (clk, s3, k3b, s4),
46
         r5 (clk, s4, k4b, s5),
47
         r6 (clk, s5, k5b, s6),
48
         r7 (clk, s6, k6b, s7),
49
         r8 (clk, s7, k7b, s8),
50
         r9 (clk, s8, k8b, s9),
51
        r10 (clk, s9, k9b, s10),
52
        r11 (clk, s10, k10b, s11),
53
        r12 (clk, s11, k11b, s12),
54
        r13 (clk, s12, k12b, s13);
55
 
56
    expand_key_type_A_256
57
        a1 (clk, k1, 8'h1, k2, k1b),
58
        a3 (clk, k3, 8'h2, k4, k3b),
59
        a5 (clk, k5, 8'h4, k6, k5b),
60
        a7 (clk, k7, 8'h8, k8, k7b),
61
        a9 (clk, k9, 8'h10, k10, k9b),
62
        a11 (clk, k11, 8'h20, k12, k11b),
63
        a13 (clk, k13, 8'h40,    , k13b);
64
 
65
    expand_key_type_B_256
66
        a2 (clk, k2, k3, k2b),
67
        a4 (clk, k4, k5, k4b),
68
        a6 (clk, k6, k7, k6b),
69
        a8 (clk, k8, k9, k8b),
70
        a10 (clk, k10, k11, k10b),
71
        a12 (clk, k12, k13, k12b);
72
 
73
    final_round_256
74
        rf (clk, s13, k13b, out);
75
endmodule
76
 
77
/* one AES round for every two clock cycles */
78
module one_round_256 (clk, state_in, key, state_out);
79
    input              clk;
80
    input      [127:0] state_in, key;
81
    output reg [127:0] state_out;
82
    wire       [31:0]  s0,  s1,  s2,  s3,
83
                       z0,  z1,  z2,  z3,
84
                       p00, p01, p02, p03,
85
                       p10, p11, p12, p13,
86
                       p20, p21, p22, p23,
87
                       p30, p31, p32, p33,
88
                       k0,  k1,  k2,  k3;
89
 
90
    assign {k0, k1, k2, k3} = key;
91
 
92
    assign {s0, s1, s2, s3} = state_in;
93
 
94
    table_lookup
95
        t0 (clk, s0, p00, p01, p02, p03),
96
        t1 (clk, s1, p10, p11, p12, p13),
97
        t2 (clk, s2, p20, p21, p22, p23),
98
        t3 (clk, s3, p30, p31, p32, p33);
99
 
100
    assign z0 = p00 ^ p11 ^ p22 ^ p33 ^ k0;
101
    assign z1 = p03 ^ p10 ^ p21 ^ p32 ^ k1;
102
    assign z2 = p02 ^ p13 ^ p20 ^ p31 ^ k2;
103
    assign z3 = p01 ^ p12 ^ p23 ^ p30 ^ k3;
104
 
105
    always @ (posedge clk)
106
        state_out <= {z0, z1, z2, z3};
107
endmodule
108
 
109
module final_round_256 (clk, state_in, key_in, state_out);
110
    input              clk;
111
    input      [127:0] state_in;
112
    input      [127:0] key_in;
113
    output reg [127:0] state_out;
114
    wire [31:0] s0,  s1,  s2,  s3,
115
                z0,  z1,  z2,  z3,
116
                k0,  k1,  k2,  k3;
117
    wire [7:0]  p00, p01, p02, p03,
118
                p10, p11, p12, p13,
119
                p20, p21, p22, p23,
120
                p30, p31, p32, p33;
121
 
122
    assign {k0, k1, k2, k3} = key_in;
123
 
124
    assign {s0, s1, s2, s3} = state_in;
125
 
126
    S4
127
        S4_1 (clk, s0, {p00, p01, p02, p03}),
128
        S4_2 (clk, s1, {p10, p11, p12, p13}),
129
        S4_3 (clk, s2, {p20, p21, p22, p23}),
130
        S4_4 (clk, s3, {p30, p31, p32, p33});
131
 
132
    assign z0 = {p00, p11, p22, p33} ^ k0;
133
    assign z1 = {p10, p21, p32, p03} ^ k1;
134
    assign z2 = {p20, p31, p02, p13} ^ k2;
135
    assign z3 = {p30, p01, p12, p23} ^ k3;
136
 
137
    always @ (posedge clk)
138
        state_out <= {z0, z1, z2, z3};
139
endmodule
140
 
141
/* expand k0,k1,k2,k3 for every two clock cycles */
142
module expand_key_type_A_256 (clk, in, rcon, out_1, out_2);
143
    input              clk;
144
    input      [255:0] in;
145
    input      [7:0]   rcon;
146
    output reg [255:0] out_1;
147
    output     [127:0] out_2;
148
    wire       [31:0]  k0, k1, k2, k3, k4, k5, k6, k7,
149
                       v0, v1, v2, v3;
150
    reg        [31:0]  k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a;
151
    wire       [31:0]  k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8a;
152
 
153
    assign {k0, k1, k2, k3, k4, k5, k6, k7} = in;
154
 
155
    assign v0 = {k0[31:24] ^ rcon, k0[23:0]};
156
    assign v1 = v0 ^ k1;
157
    assign v2 = v1 ^ k2;
158
    assign v3 = v2 ^ k3;
159
 
160
    always @ (posedge clk)
161
        {k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a} <= {v0, v1, v2, v3, k4, k5, k6, k7};
162
 
163
    S4
164
        S4_0 (clk, {k7[23:0], k7[31:24]}, k8a);
165
 
166
    assign k0b = k0a ^ k8a;
167
    assign k1b = k1a ^ k8a;
168
    assign k2b = k2a ^ k8a;
169
    assign k3b = k3a ^ k8a;
170
    assign {k4b, k5b, k6b, k7b} = {k4a, k5a, k6a, k7a};
171
 
172
    always @ (posedge clk)
173
        out_1 <= {k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b};
174
 
175
    assign out_2 = {k0b, k1b, k2b, k3b};
176
endmodule
177
 
178
/* expand k4,k5,k6,k7 for every two clock cycles */
179
module expand_key_type_B_256 (clk, in, out_1, out_2);
180
    input              clk;
181
    input      [255:0] in;
182
    output reg [255:0] out_1;
183
    output     [127:0] out_2;
184
    wire       [31:0]  k0, k1, k2, k3, k4, k5, k6, k7,
185
                       v5, v6, v7;
186
    reg        [31:0]  k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a;
187
    wire       [31:0]  k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b, k8a;
188
 
189
    assign {k0, k1, k2, k3, k4, k5, k6, k7} = in;
190
 
191
    assign v5 = k4 ^ k5;
192
    assign v6 = v5 ^ k6;
193
    assign v7 = v6 ^ k7;
194
 
195
    always @ (posedge clk)
196
        {k0a, k1a, k2a, k3a, k4a, k5a, k6a, k7a} <= {k0, k1, k2, k3, k4, v5, v6, v7};
197
 
198
    S4
199
        S4_0 (clk, k3, k8a);
200
 
201
    assign {k0b, k1b, k2b, k3b} = {k0a, k1a, k2a, k3a};
202
    assign k4b = k4a ^ k8a;
203
    assign k5b = k5a ^ k8a;
204
    assign k6b = k6a ^ k8a;
205
    assign k7b = k7a ^ k8a;
206
 
207
    always @ (posedge clk)
208
        out_1 <= {k0b, k1b, k2b, k3b, k4b, k5b, k6b, k7b};
209
 
210
    assign out_2 = {k4b, k5b, k6b, k7b};
211
endmodule
212
 

powered by: WebSVN 2.1.0

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