hw/ip/aes/rtl/aes_pkg.sv Cov: 100%
1: // Copyright lowRISC contributors.
2: // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3: // SPDX-License-Identifier: Apache-2.0
4: //
5: // AES package
6:
7: package aes_pkg;
8:
9: typedef enum logic {
10: AES_ENC = 1'b0,
11: AES_DEC = 1'b1
12: } mode_e;
13:
14: typedef enum logic [2:0] {
15: AES_128 = 3'b001,
16: AES_192 = 3'b010,
17: AES_256 = 3'b100
18: } key_len_e;
19:
20: typedef enum logic [1:0] {
21: STATE_INIT,
22: STATE_ROUND,
23: STATE_CLEAR
24: } state_sel_e;
25:
26: typedef enum logic [1:0] {
27: ADD_RK_INIT,
28: ADD_RK_ROUND,
29: ADD_RK_FINAL
30: } add_rk_sel_e;
31:
32: typedef enum logic {
33: KEY_INIT_INPUT,
34: KEY_INIT_CLEAR
35: } key_init_sel_e;
36:
37: typedef enum logic [1:0] {
38: KEY_FULL_ENC_INIT,
39: KEY_FULL_DEC_INIT,
40: KEY_FULL_ROUND,
41: KEY_FULL_CLEAR
42: } key_full_sel_e;
43:
44: typedef enum logic {
45: KEY_DEC_EXPAND,
46: KEY_DEC_CLEAR
47: } key_dec_sel_e;
48:
49: typedef enum logic [1:0] {
50: KEY_WORDS_0123,
51: KEY_WORDS_2345,
52: KEY_WORDS_4567,
53: KEY_WORDS_ZERO
54: } key_words_sel_e;
55:
56: typedef enum logic {
57: ROUND_KEY_DIRECT,
58: ROUND_KEY_MIXED
59: } round_key_sel_e;
60:
61: // Multiplication by {02} (i.e. x) on GF(2^8)
62: // with field generating polynomial {01}{1b} (9'h11b)
63: // Sometimes also denoted by xtime().
64: function automatic logic [7:0] aes_mul2(input logic [7:0] in);
65: aes_mul2[7] = in[6];
66: aes_mul2[6] = in[5];
67: aes_mul2[5] = in[4];
68: aes_mul2[4] = in[3] ^ in[7];
69: aes_mul2[3] = in[2] ^ in[7];
70: aes_mul2[2] = in[1];
71: aes_mul2[1] = in[0] ^ in[7];
72: aes_mul2[0] = in[7];
73: endfunction
74:
75: // Multiplication by {04} (i.e. x^2) on GF(2^8)
76: // with field generating polynomial {01}{1b} (9'h11b)
77: function automatic logic [7:0] aes_mul4(input logic [7:0] in);
78: aes_mul4 = aes_mul2(aes_mul2(in));
79: endfunction
80:
81: // Division by {02} (i.e. x) on GF(2^8)
82: // with field generating polynomial {01}{1b} (9'h11b)
83: // This is the inverse of aes_mul2() or xtime().
84: function automatic logic [7:0] aes_div2(input logic [7:0] in);
85: aes_div2[7] = in[0];
86: aes_div2[6] = in[7];
87: aes_div2[5] = in[6];
88: aes_div2[4] = in[5];
89: aes_div2[3] = in[4] ^ in[0];
90: aes_div2[2] = in[3] ^ in[0];
91: aes_div2[1] = in[2];
92: aes_div2[0] = in[1] ^ in[0];
93: endfunction
94:
95: // Circular byte shift to the left
96: function automatic logic [31:0] aes_circ_byte_shift(input logic [31:0] in, integer shift);
97: integer s = shift % 4;
98: aes_circ_byte_shift = {in[8*((7-s)%4) +: 8], in[8*((6-s)%4) +: 8],
99: in[8*((5-s)%4) +: 8], in[8*((4-s)%4) +: 8]};
100: endfunction
101:
102: // Transpose state matrix
103: function automatic logic [3:0][3:0][7:0] aes_transpose(input logic [3:0][3:0][7:0] in);
104: logic [3:0][3:0][7:0] transpose;
105: transpose = '0;
106: for (int j=0; j<4; j++) begin
107: for (int i=0; i<4; i++) begin
108: transpose[i][j] = in[j][i];
109: end
110: end
111: return transpose;
112: endfunction
113:
114: // Extract single column from state matrix
115: function automatic logic [3:0][7:0] aes_col_get(input logic [3:0][3:0][7:0] in, int idx);
116: for (int i=0; i<4; i++) begin
117: aes_col_get[i] = in[i][idx];
118: end
119: endfunction
120:
121: // Matrix-vector multiplication in GF(2^8): c = A * b
122: function automatic logic [7:0] aes_mvm(
123: input logic [7:0] vec_b,
124: input logic [7:0] mat_a [8]
125: );
126: logic [7:0] vec_c;
127: vec_c = '0;
128: for (int i=0; i<8; i++) begin
129: for (int j=0; j<8; j++) begin
130: vec_c[i] = vec_c[i] ^ (mat_a[j][i] & vec_b[7-j]);
131: end
132: end
133: return vec_c;
134: endfunction
135:
136: endpackage
137: