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: