OpenCores
URL https://opencores.org/ocsvn/gost28147-89/gost28147-89/trunk

Subversion Repositories gost28147-89

[/] [gost28147-89/] [trunk/] [rtl/] [gost89_ecb.v] - Blame information for rev 5

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 fanatid
module gost89_ecb(
2
  input              clk,
3
  input              reset,
4
  input              mode,
5
  input              load_data,
6
  input      [511:0] sbox,
7
  input      [255:0] key,
8
  input      [63:0]  in,
9
  output reg [63:0]  out,
10
  output reg         busy
11
);
12
  reg  [5:0]  round_num;
13
  reg  [31:0] n1, n2, round_key;
14
  wire [31:0] out1, out2;
15
 
16
  gost89_round
17
    rnd(clk, sbox, round_key, n1, n2, out1, out2);
18
 
19
  always @(posedge clk) begin
20
    if (load_data) begin
21
      n1 <= in[63:32];
22
      n2 <= in[31:0];
23
      busy <= 1;
24
      round_num <= 0;
25
    end
26
 
27
    if (reset && !load_data) begin
28
      busy <= 0;
29
      round_num <= 32;
30
    end
31
 
32
    if (!reset && !load_data) begin
33
      if (round_num < 32)
34
        round_num <= round_num + 1;
35
      if (round_num > 0 && round_num < 32) begin
36
        n1 <= out1;
37
        n2 <= out2;
38
      end
39
      if (round_num == 32) begin
40
        out[63:32] <= out2;
41
        out[31:0]  <= out1;
42
        busy <= 0;
43
      end
44
    end
45
  end
46
 
47
  always @(posedge clk) begin
48
    if (mode)
49
      case (round_num)
50
        0:  round_key <= key[255:224];
51
        1:  round_key <= key[223:192];
52
        2:  round_key <= key[191:160];
53
        3:  round_key <= key[159:128];
54
        4:  round_key <= key[127:96];
55
        5:  round_key <= key[95:64];
56
        6:  round_key <= key[63:32];
57
        7:  round_key <= key[31:0];
58
        8:  round_key <= key[31:0];
59
        9:  round_key <= key[63:32];
60
        10: round_key <= key[95:64];
61
        11: round_key <= key[127:96];
62
        12: round_key <= key[159:128];
63
        13: round_key <= key[191:160];
64
        14: round_key <= key[223:192];
65
        15: round_key <= key[255:224];
66
        16: round_key <= key[31:0];
67
        17: round_key <= key[63:32];
68
        18: round_key <= key[95:64];
69
        19: round_key <= key[127:96];
70
        20: round_key <= key[159:128];
71
        21: round_key <= key[191:160];
72
        22: round_key <= key[223:192];
73
        23: round_key <= key[255:224];
74
        24: round_key <= key[31:0];
75
        25: round_key <= key[63:32];
76
        26: round_key <= key[95:64];
77
        27: round_key <= key[127:96];
78
        28: round_key <= key[159:128];
79
        29: round_key <= key[191:160];
80
        30: round_key <= key[223:192];
81
        31: round_key <= key[255:224];
82
      endcase
83
    else
84
      case (round_num)
85
        0:  round_key <= key[255:224];
86
        1:  round_key <= key[223:192];
87
        2:  round_key <= key[191:160];
88
        3:  round_key <= key[159:128];
89
        4:  round_key <= key[127:96];
90
        5:  round_key <= key[95:64];
91
        6:  round_key <= key[63:32];
92
        7:  round_key <= key[31:0];
93
        8:  round_key <= key[255:224];
94
        9:  round_key <= key[223:192];
95
        10: round_key <= key[191:160];
96
        11: round_key <= key[159:128];
97
        12: round_key <= key[127:96];
98
        13: round_key <= key[95:64];
99
        14: round_key <= key[63:32];
100
        15: round_key <= key[31:0];
101
        16: round_key <= key[255:224];
102
        17: round_key <= key[223:192];
103
        18: round_key <= key[191:160];
104
        19: round_key <= key[159:128];
105
        20: round_key <= key[127:96];
106
        21: round_key <= key[95:64];
107
        22: round_key <= key[63:32];
108
        23: round_key <= key[31:0];
109
        24: round_key <= key[31:0];
110
        25: round_key <= key[63:32];
111
        26: round_key <= key[95:64];
112
        27: round_key <= key[127:96];
113
        28: round_key <= key[159:128];
114
        29: round_key <= key[191:160];
115
        30: round_key <= key[223:192];
116
        31: round_key <= key[255:224];
117
      endcase
118
  end
119
endmodule
120
 
121
module gost89_ecb_encrypt(
122
  input              clk,
123
  input              reset,
124
  input              load_data,
125
  input      [511:0] sbox,
126
  input      [255:0] key,
127
  input      [63:0]  in,
128
  output reg [63:0]  out,
129
  output reg         busy
130
);
131
  reg  [5:0]  round_num;
132
  reg  [31:0] n1, n2, round_key;
133
  wire [31:0] out1, out2;
134
 
135
  gost89_round
136
    rnd(clk, sbox, round_key, n1, n2, out1, out2);
137
 
138
  always @(posedge clk) begin
139
    if (load_data) begin
140
      n1 <= in[63:32];
141
      n2 <= in[31:0];
142
      busy <= 1;
143
      round_num <= 0;
144
    end
145
 
146
    if (reset && !load_data) begin
147
      busy <= 0;
148
      round_num <= 32;
149
    end
150
 
151
    if (!reset && !load_data) begin
152
      if (round_num < 32)
153
        round_num <= round_num + 1;
154
      if (round_num > 0 && round_num < 32) begin
155
        n1 <= out1;
156
        n2 <= out2;
157
      end
158
      if (round_num == 32) begin
159
        out[63:32] <= out2;
160
        out[31:0]  <= out1;
161
        busy <= 0;
162
      end
163
    end
164
  end
165
 
166
  always @(posedge clk)
167
    case (round_num)
168
      0:  round_key <= key[255:224];
169
      1:  round_key <= key[223:192];
170
      2:  round_key <= key[191:160];
171
      3:  round_key <= key[159:128];
172
      4:  round_key <= key[127:96];
173
      5:  round_key <= key[95:64];
174
      6:  round_key <= key[63:32];
175
      7:  round_key <= key[31:0];
176
      8:  round_key <= key[255:224];
177
      9:  round_key <= key[223:192];
178
      10: round_key <= key[191:160];
179
      11: round_key <= key[159:128];
180
      12: round_key <= key[127:96];
181
      13: round_key <= key[95:64];
182
      14: round_key <= key[63:32];
183
      15: round_key <= key[31:0];
184
      16: round_key <= key[255:224];
185
      17: round_key <= key[223:192];
186
      18: round_key <= key[191:160];
187
      19: round_key <= key[159:128];
188
      20: round_key <= key[127:96];
189
      21: round_key <= key[95:64];
190
      22: round_key <= key[63:32];
191
      23: round_key <= key[31:0];
192
      24: round_key <= key[31:0];
193
      25: round_key <= key[63:32];
194
      26: round_key <= key[95:64];
195
      27: round_key <= key[127:96];
196
      28: round_key <= key[159:128];
197
      29: round_key <= key[191:160];
198
      30: round_key <= key[223:192];
199
      31: round_key <= key[255:224];
200
    endcase
201
endmodule
202
 
203
module gost89_ecb_decrypt(
204
  input              clk,
205
  input              reset,
206
  input              load_data,
207
  input      [511:0] sbox,
208
  input      [255:0] key,
209
  input      [63:0]  in,
210
  output reg [63:0]  out,
211
  output reg         busy
212
);
213
  reg  [5:0]  round_num;
214
  reg  [31:0] n1, n2, round_key;
215
  wire [31:0] out1, out2;
216
 
217
  gost89_round
218
    rnd(clk, sbox, round_key, n1, n2, out1, out2);
219
 
220
  initial begin
221
    busy = 0;
222
    round_num = 32;
223
  end
224
 
225
  always @(posedge clk) begin
226
    if (load_data) begin
227
      n1 <= in[63:32];
228
      n2 <= in[31:0];
229
      busy <= 1;
230
      round_num <= 0;
231
    end
232
 
233
    if (reset && !load_data) begin
234
      busy <= 0;
235
      round_num <= 32;
236
    end
237
 
238
    if (!reset && !load_data) begin
239
      if (round_num < 32)
240
        round_num <= round_num + 1;
241
      if (round_num > 0 && round_num < 32) begin
242
        n1 <= out1;
243
        n2 <= out2;
244
      end
245
      if (round_num == 32) begin
246
        out[63:32] = out2;
247
        out[31:0]  = out1;
248
        busy <= 0;
249
      end
250
    end
251
  end
252
 
253
  always @(posedge clk)
254
    case (round_num)
255
      0:  round_key <= key[255:224];
256
      1:  round_key <= key[223:192];
257
      2:  round_key <= key[191:160];
258
      3:  round_key <= key[159:128];
259
      4:  round_key <= key[127:96];
260
      5:  round_key <= key[95:64];
261
      6:  round_key <= key[63:32];
262
      7:  round_key <= key[31:0];
263
      8:  round_key <= key[31:0];
264
      9:  round_key <= key[63:32];
265
      10: round_key <= key[95:64];
266
      11: round_key <= key[127:96];
267
      12: round_key <= key[159:128];
268
      13: round_key <= key[191:160];
269
      14: round_key <= key[223:192];
270
      15: round_key <= key[255:224];
271
      16: round_key <= key[31:0];
272
      17: round_key <= key[63:32];
273
      18: round_key <= key[95:64];
274
      19: round_key <= key[127:96];
275
      20: round_key <= key[159:128];
276
      21: round_key <= key[191:160];
277
      22: round_key <= key[223:192];
278
      23: round_key <= key[255:224];
279
      24: round_key <= key[31:0];
280
      25: round_key <= key[63:32];
281
      26: round_key <= key[95:64];
282
      27: round_key <= key[127:96];
283
      28: round_key <= key[159:128];
284
      29: round_key <= key[191:160];
285
      30: round_key <= key[223:192];
286
      31: round_key <= key[255:224];
287
    endcase
288
endmodule

powered by: WebSVN 2.1.0

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