xref: /XiangShan/src/main/scala/xiangshan/backend/fu/util/CryptoUtils.scala (revision 8891a219bbc84f568e1d134854d8d5ed86d6d560)
13feeca58Szfw/***************************************************************************************
23feeca58Szfw* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
33feeca58Szfw* Copyright (c) 2020-2021 Peng Cheng Laboratory
43feeca58Szfw*
53feeca58Szfw* XiangShan is licensed under Mulan PSL v2.
63feeca58Szfw* You can use this software according to the terms and conditions of the Mulan PSL v2.
73feeca58Szfw* You may obtain a copy of Mulan PSL v2 at:
83feeca58Szfw*          http://license.coscl.org.cn/MulanPSL2
93feeca58Szfw*
103feeca58Szfw* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
113feeca58Szfw* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
123feeca58Szfw* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
133feeca58Szfw*
143feeca58Szfw* See the Mulan PSL v2 for more details.
153feeca58Szfw***************************************************************************************/
163feeca58Szfw
173feeca58Szfwpackage xiangshan.backend.fu.util
183feeca58Szfw
193feeca58Szfwimport chisel3._
203feeca58Szfwimport chisel3.util._
213feeca58Szfwimport xiangshan._
22*8891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
233feeca58Szfw
243feeca58Szfw// 32bits shift right
253feeca58Szfwobject SHR32 {
263feeca58Szfw  def apply(bits: UInt, shamt: Int) = {
273feeca58Szfw    require(shamt>0 && shamt<32)
283feeca58Szfw    if(shamt == 31) Cat(0.U(63.W), bits(31))
293feeca58Szfw    else            Cat(0.U((32+shamt).W), bits(31,shamt))
303feeca58Szfw  }
313feeca58Szfw}
323feeca58Szfw
333feeca58Szfw// 64bits shift right
343feeca58Szfwobject SHR64 {
353feeca58Szfw  def apply(bits: UInt, shamt: Int) = {
363feeca58Szfw    require(shamt>0 && shamt<64)
373feeca58Szfw    if(shamt == 63) Cat(bits(62,0), bits(63))
383feeca58Szfw    else            Cat(0.U(shamt.W), bits(63,shamt))
393feeca58Szfw  }
403feeca58Szfw}
413feeca58Szfw
423feeca58Szfw// 32bits Rotate shift
433feeca58Szfwobject ROR32 {
443feeca58Szfw  def apply(bits: UInt, shamt: Int) = {
453feeca58Szfw    require(shamt>0 && shamt<32)
463feeca58Szfw    if(shamt == 1)       Cat(0.U(32.W), bits(0), bits(31,1))
473feeca58Szfw    else if(shamt == 31) Cat(0.U(32.W), bits(30,0), bits(31))
483feeca58Szfw    else                 Cat(0.U(32.W), bits(shamt-1,0), bits(31,shamt))
493feeca58Szfw  }
503feeca58Szfw}
513feeca58Szfw
523feeca58Szfw// 64bits Rotate shift
533feeca58Szfwobject ROR64 {
543feeca58Szfw  def apply(bits: UInt, shamt: Int) = {
553feeca58Szfw    require(shamt>0 && shamt<64)
563feeca58Szfw    if(shamt == 1)       Cat(bits(0), bits(63,1))
573feeca58Szfw    else if(shamt == 63) Cat(bits(62,0), bits(63))
583feeca58Szfw    else                 Cat(bits(shamt-1,0), bits(63,shamt))
593feeca58Szfw  }
603feeca58Szfw}
613feeca58Szfw
623feeca58Szfw// AES forward shift rows
633feeca58Szfwobject ForwardShiftRows {
643feeca58Szfw  def apply(src1: Seq[UInt], src2: Seq[UInt]): Seq[UInt] = {
653feeca58Szfw    VecInit(Seq(src1(0), src1(5), src2(2), src2(7),
663feeca58Szfw                src1(4), src2(1), src2(6), src1(3)))
673feeca58Szfw  }
683feeca58Szfw}
693feeca58Szfw
703feeca58Szfw// AES inverse shift rows
713feeca58Szfwobject InverseShiftRows {
723feeca58Szfw  def apply(src1: Seq[UInt], src2: Seq[UInt]): Seq[UInt] = {
733feeca58Szfw    VecInit(Seq(src1(0), src2(5), src2(2), src1(7),
743feeca58Szfw                src1(4), src1(1), src2(6), src2(3)))
753feeca58Szfw  }
763feeca58Szfw}
773feeca58Szfw
783feeca58Szfw// AES encode sbox top
793feeca58Szfwobject SboxAesTop {
803feeca58Szfw  def apply(i: UInt): Seq[Bool] = {
813feeca58Szfw    val t = Wire(Vec(6, Bool()))
823feeca58Szfw    val o = Wire(Vec(21, Bool()))
833feeca58Szfw    t( 0) := i( 3) ^ i( 1)
843feeca58Szfw    t( 1) := i( 6) ^ i( 5)
853feeca58Szfw    t( 2) := i( 6) ^ i( 2)
863feeca58Szfw    t( 3) := i( 5) ^ i( 2)
873feeca58Szfw    t( 4) := i( 4) ^ i( 0)
883feeca58Szfw    t( 5) := i( 1) ^ i( 0)
893feeca58Szfw    o( 0) := i( 0)
903feeca58Szfw    o( 1) := i( 7) ^ i( 4)
913feeca58Szfw    o( 2) := i( 7) ^ i( 2)
923feeca58Szfw    o( 3) := i( 7) ^ i( 1)
933feeca58Szfw    o( 4) := i( 4) ^ i( 2)
943feeca58Szfw    o( 5) := o( 1) ^ t( 0)
953feeca58Szfw    o( 6) := i( 0) ^ o( 5)
963feeca58Szfw    o( 7) := i( 0) ^ t( 1)
973feeca58Szfw    o( 8) := o( 5) ^ t( 1)
983feeca58Szfw    o( 9) := o( 3) ^ o( 4)
993feeca58Szfw    o(10) := o( 5) ^ t( 2)
1003feeca58Szfw    o(11) := t( 0) ^ t( 2)
1013feeca58Szfw    o(12) := t( 0) ^ t( 3)
1023feeca58Szfw    o(13) := o( 7) ^ o(12)
1033feeca58Szfw    o(14) := t( 1) ^ t( 4)
1043feeca58Szfw    o(15) := o( 1) ^ o(14)
1053feeca58Szfw    o(16) := t( 1) ^ t( 5)
1063feeca58Szfw    o(17) := o( 2) ^ o(16)
1073feeca58Szfw    o(18) := o( 2) ^ o( 8)
1083feeca58Szfw    o(19) := o(15) ^ o(13)
1093feeca58Szfw    o(20) := o( 1) ^ t( 3)
1103feeca58Szfw    o
1113feeca58Szfw  }
1123feeca58Szfw}
1133feeca58Szfw
1143feeca58Szfw// AES decode sbox top
1153feeca58Szfwobject SboxIaesTop {
1163feeca58Szfw  def apply(i: UInt): Seq[Bool] = {
1173feeca58Szfw    val t = Wire(Vec(5, Bool()))
1183feeca58Szfw    val o = Wire(Vec(21, Bool()))
1193feeca58Szfw    t( 0) := i( 1) ^  i( 0)
1203feeca58Szfw    t( 1) := i( 6) ^  i( 1)
1213feeca58Szfw    t( 2) := i( 5) ^ ~i( 2)
1223feeca58Szfw    t( 3) := i( 2) ^ ~i( 1)
1233feeca58Szfw    t( 4) := i( 5) ^ ~i( 3)
1243feeca58Szfw    o( 0) := i( 7) ^  t( 2)
1253feeca58Szfw    o( 1) := i( 4) ^  i( 3)
1263feeca58Szfw    o( 2) := i( 7) ^ ~i( 6)
1273feeca58Szfw    o( 3) := o( 1) ^  t( 0)
1283feeca58Szfw    o( 4) := i( 3) ^  o( 6)
1293feeca58Szfw    o( 5) := o(16) ^  t( 2)
1303feeca58Szfw    o( 6) := i( 6) ^ ~o(17)
1313feeca58Szfw    o( 7) := i( 0) ^ ~o( 1)
1323feeca58Szfw    o( 8) := o( 2) ^  o(18)
1333feeca58Szfw    o( 9) := o( 2) ^  t( 0)
1343feeca58Szfw    o(10) := o( 8) ^  t( 3)
1353feeca58Szfw    o(11) := o( 8) ^  o(20)
1363feeca58Szfw    o(12) := t( 1) ^  t( 4)
1373feeca58Szfw    o(13) := i( 5) ^ ~o(14)
1383feeca58Szfw    o(14) := o(16) ^  t( 0)
1393feeca58Szfw    o(15) := o(18) ^  t( 1)
1403feeca58Szfw    o(16) := i( 6) ^ ~i( 4)
1413feeca58Szfw    o(17) := i( 7) ^  i( 4)
1423feeca58Szfw    o(18) := i( 3) ^ ~i( 0)
1433feeca58Szfw    o(19) := i( 5) ^ ~o( 1)
1443feeca58Szfw    o(20) := o( 1) ^  t( 3)
1453feeca58Szfw    o
1463feeca58Szfw  }
1473feeca58Szfw}
1483feeca58Szfw
1493feeca58Szfw// SM4 encode/decode sbox top
1503feeca58Szfwobject SboxSm4Top {
1513feeca58Szfw  def apply(i: UInt): Seq[Bool] = {
1523feeca58Szfw    val t = Wire(Vec(7, Bool()))
1533feeca58Szfw    val o = Wire(Vec(21, Bool()))
1543feeca58Szfw    t( 0) := i(3) ^  i( 4)
1553feeca58Szfw    t( 1) := i(2) ^  i( 7)
1563feeca58Szfw    t( 2) := i(7) ^  o(18)
1573feeca58Szfw    t( 3) := i(1) ^  t( 1)
1583feeca58Szfw    t( 4) := i(6) ^  i( 7)
1593feeca58Szfw    t( 5) := i(0) ^  o(18)
1603feeca58Szfw    t( 6) := i(3) ^  i( 6)
1613feeca58Szfw    o( 0) := i(5) ^ ~o(10)
1623feeca58Szfw    o( 1) := t(0) ^  t( 3)
1633feeca58Szfw    o( 2) := i(0) ^  t( 0)
16419bcce38SFawang Zhang    o( 3) := i(3) ^  o( 4)
16519bcce38SFawang Zhang    o( 4) := i(0) ^  t( 3)
1663feeca58Szfw    o( 5) := i(5) ^  t( 5)
1673feeca58Szfw    o( 6) := i(0) ^ ~i( 1)
1683feeca58Szfw    o( 7) := t(0) ^ ~o(10)
1693feeca58Szfw    o( 8) := t(0) ^  t( 5)
1703feeca58Szfw    o( 9) := i(3)
1713feeca58Szfw    o(10) := i(1) ^  o(18)
1723feeca58Szfw    o(11) := t(0) ^  t( 4)
1733feeca58Szfw    o(12) := i(5) ^  t( 4)
1743feeca58Szfw    o(13) := i(5) ^ ~o( 1)
1753feeca58Szfw    o(14) := i(4) ^ ~t( 2)
1763feeca58Szfw    o(15) := i(1) ^ ~t( 6)
1773feeca58Szfw    o(16) := i(0) ^ ~t( 2)
1783feeca58Szfw    o(17) := t(0) ^ ~t( 2)
1793feeca58Szfw    o(18) := i(2) ^  i( 6)
1803feeca58Szfw    o(19) := i(5) ^ ~o(14)
1813feeca58Szfw    o(20) := i(0) ^  t( 1)
1823feeca58Szfw    o
1833feeca58Szfw  }
1843feeca58Szfw}
1853feeca58Szfw
1863feeca58Szfw// Sbox middle part for AES, AES^-1, SM4
1873feeca58Szfwobject SboxInv {
1883feeca58Szfw  def apply(i: Seq[Bool]): Seq[Bool] = {
1893feeca58Szfw    val t = Wire(Vec(46, Bool()))
1903feeca58Szfw    val o = Wire(Vec(18, Bool()))
1913feeca58Szfw    t( 0) := i( 3) ^ i(12)
1923feeca58Szfw    t( 1) := i( 9) & i( 5)
1933feeca58Szfw    t( 2) := i(17) & i( 6)
1943feeca58Szfw    t( 3) := i(10) ^ t( 1)
1953feeca58Szfw    t( 4) := i(14) & i( 0)
1963feeca58Szfw    t( 5) := t( 4) ^ t( 1)
1973feeca58Szfw    t( 6) := i( 3) & i(12)
1983feeca58Szfw    t( 7) := i(16) & i( 7)
1993feeca58Szfw    t( 8) := t( 0) ^ t( 6)
2003feeca58Szfw    t( 9) := i(15) & i(13)
2013feeca58Szfw    t(10) := t( 9) ^ t( 6)
2023feeca58Szfw    t(11) := i( 1) & i(11)
2033feeca58Szfw    t(12) := i( 4) & i(20)
2043feeca58Szfw    t(13) := t(12) ^ t(11)
2053feeca58Szfw    t(14) := i( 2) & i( 8)
2063feeca58Szfw    t(15) := t(14) ^ t(11)
2073feeca58Szfw    t(16) := t( 3) ^ t( 2)
2083feeca58Szfw    t(17) := t( 5) ^ i(18)
2093feeca58Szfw    t(18) := t( 8) ^ t( 7)
2103feeca58Szfw    t(19) := t(10) ^ t(15)
2113feeca58Szfw    t(20) := t(16) ^ t(13)
2123feeca58Szfw    t(21) := t(17) ^ t(15)
2133feeca58Szfw    t(22) := t(18) ^ t(13)
2143feeca58Szfw    t(23) := t(19) ^ i(19)
2153feeca58Szfw    t(24) := t(22) ^ t(23)
2163feeca58Szfw    t(25) := t(22) & t(20)
2173feeca58Szfw    t(26) := t(21) ^ t(25)
2183feeca58Szfw    t(27) := t(20) ^ t(21)
2193feeca58Szfw    t(28) := t(23) ^ t(25)
2203feeca58Szfw    t(29) := t(28) & t(27)
2213feeca58Szfw    t(30) := t(26) & t(24)
2223feeca58Szfw    t(31) := t(20) & t(23)
2233feeca58Szfw    t(32) := t(27) & t(31)
2243feeca58Szfw    t(33) := t(27) ^ t(25)
2253feeca58Szfw    t(34) := t(21) & t(22)
2263feeca58Szfw    t(35) := t(24) & t(34)
2273feeca58Szfw    t(36) := t(24) ^ t(25)
2283feeca58Szfw    t(37) := t(21) ^ t(29)
2293feeca58Szfw    t(38) := t(32) ^ t(33)
2303feeca58Szfw    t(39) := t(23) ^ t(30)
2313feeca58Szfw    t(40) := t(35) ^ t(36)
2323feeca58Szfw    t(41) := t(38) ^ t(40)
2333feeca58Szfw    t(42) := t(37) ^ t(39)
2343feeca58Szfw    t(43) := t(37) ^ t(38)
2353feeca58Szfw    t(44) := t(39) ^ t(40)
2363feeca58Szfw    t(45) := t(42) ^ t(41)
2373feeca58Szfw    o( 0) := t(38) & i( 7)
2383feeca58Szfw    o( 1) := t(37) & i(13)
2393feeca58Szfw    o( 2) := t(42) & i(11)
2403feeca58Szfw    o( 3) := t(45) & i(20)
2413feeca58Szfw    o( 4) := t(41) & i( 8)
2423feeca58Szfw    o( 5) := t(44) & i( 9)
2433feeca58Szfw    o( 6) := t(40) & i(17)
2443feeca58Szfw    o( 7) := t(39) & i(14)
2453feeca58Szfw    o( 8) := t(43) & i( 3)
2463feeca58Szfw    o( 9) := t(38) & i(16)
2473feeca58Szfw    o(10) := t(37) & i(15)
2483feeca58Szfw    o(11) := t(42) & i( 1)
2493feeca58Szfw    o(12) := t(45) & i( 4)
2503feeca58Szfw    o(13) := t(41) & i( 2)
2513feeca58Szfw    o(14) := t(44) & i( 5)
2523feeca58Szfw    o(15) := t(40) & i( 6)
2533feeca58Szfw    o(16) := t(39) & i( 0)
2543feeca58Szfw    o(17) := t(43) & i(12)
2553feeca58Szfw    o
2563feeca58Szfw  }
2573feeca58Szfw}
2583feeca58Szfw
2593feeca58Szfw// AES encode sbox out
2603feeca58Szfwobject SboxAesOut {
2613feeca58Szfw  def apply(i: Seq[Bool]): UInt = {
2623feeca58Szfw    val t = Wire(Vec(30, Bool()))
2633feeca58Szfw    val o = Wire(Vec(8, Bool()))
2643feeca58Szfw    t( 0) := i(11) ^  i(12)
2653feeca58Szfw    t( 1) := i( 0) ^  i( 6)
2663feeca58Szfw    t( 2) := i(14) ^  i(16)
2673feeca58Szfw    t( 3) := i(15) ^  i( 5)
2683feeca58Szfw    t( 4) := i( 4) ^  i( 8)
2693feeca58Szfw    t( 5) := i(17) ^  i(11)
2703feeca58Szfw    t( 6) := i(12) ^  t( 5)
2713feeca58Szfw    t( 7) := i(14) ^  t( 3)
2723feeca58Szfw    t( 8) := i( 1) ^  i( 9)
2733feeca58Szfw    t( 9) := i( 2) ^  i( 3)
2743feeca58Szfw    t(10) := i( 3) ^  t( 4)
2753feeca58Szfw    t(11) := i(10) ^  t( 2)
2763feeca58Szfw    t(12) := i(16) ^  i( 1)
2773feeca58Szfw    t(13) := i( 0) ^  t( 0)
2783feeca58Szfw    t(14) := i( 2) ^  i(11)
2793feeca58Szfw    t(15) := i( 5) ^  t( 1)
2803feeca58Szfw    t(16) := i( 6) ^  t( 0)
2813feeca58Szfw    t(17) := i( 7) ^  t( 1)
2823feeca58Szfw    t(18) := i( 8) ^  t( 8)
2833feeca58Szfw    t(19) := i(13) ^  t( 4)
2843feeca58Szfw    t(20) := t( 0) ^  t( 1)
2853feeca58Szfw    t(21) := t( 1) ^  t( 7)
2863feeca58Szfw    t(22) := t( 3) ^  t(12)
2873feeca58Szfw    t(23) := t(18) ^  t( 2)
2883feeca58Szfw    t(24) := t(15) ^  t( 9)
2893feeca58Szfw    t(25) := t( 6) ^  t(10)
2903feeca58Szfw    t(26) := t( 7) ^  t( 9)
2913feeca58Szfw    t(27) := t( 8) ^  t(10)
2923feeca58Szfw    t(28) := t(11) ^  t(14)
2933feeca58Szfw    t(29) := t(11) ^  t(17)
2943feeca58Szfw    o( 0) := t( 6) ^ ~t(23)
2953feeca58Szfw    o( 1) := t(13) ^ ~t(27)
2963feeca58Szfw    o( 2) := t(25) ^  t(29)
2973feeca58Szfw    o( 3) := t(20) ^  t(22)
2983feeca58Szfw    o( 4) := t( 6) ^  t(21)
2993feeca58Szfw    o( 5) := t(19) ^ ~t(28)
3003feeca58Szfw    o( 6) := t(16) ^ ~t(26)
3013feeca58Szfw    o( 7) := t( 6) ^  t(24)
3023feeca58Szfw    o.asUInt
3033feeca58Szfw  }
3043feeca58Szfw}
3053feeca58Szfw
3063feeca58Szfw// AES decode sbox out
3073feeca58Szfwobject SboxIaesOut {
3083feeca58Szfw  def apply(i: Seq[Bool]): UInt = {
3093feeca58Szfw    val t = Wire(Vec(30, Bool()))
3103feeca58Szfw    val o = Wire(Vec(8, Bool()))
3113feeca58Szfw    t( 0) := i( 2) ^ i(11)
3123feeca58Szfw    t( 1) := i( 8) ^ i( 9)
3133feeca58Szfw    t( 2) := i( 4) ^ i(12)
3143feeca58Szfw    t( 3) := i(15) ^ i( 0)
3153feeca58Szfw    t( 4) := i(16) ^ i( 6)
3163feeca58Szfw    t( 5) := i(14) ^ i( 1)
3173feeca58Szfw    t( 6) := i(17) ^ i(10)
3183feeca58Szfw    t( 7) := t( 0) ^ t( 1)
3193feeca58Szfw    t( 8) := i( 0) ^ i( 3)
3203feeca58Szfw    t( 9) := i( 5) ^ i(13)
3213feeca58Szfw    t(10) := i( 7) ^ t( 4)
3223feeca58Szfw    t(11) := t( 0) ^ t( 3)
3233feeca58Szfw    t(12) := i(14) ^ i(16)
3243feeca58Szfw    t(13) := i(17) ^ i( 1)
3253feeca58Szfw    t(14) := i(17) ^ i(12)
3263feeca58Szfw    t(15) := i( 4) ^ i( 9)
3273feeca58Szfw    t(16) := i( 7) ^ i(11)
3283feeca58Szfw    t(17) := i( 8) ^ t( 2)
3293feeca58Szfw    t(18) := i(13) ^ t( 5)
3303feeca58Szfw    t(19) := t( 2) ^ t( 3)
3313feeca58Szfw    t(20) := t( 4) ^ t( 6)
3323feeca58Szfw    t(21) := 0.U
3333feeca58Szfw    t(22) := t( 2) ^ t( 7)
3343feeca58Szfw    t(23) := t( 7) ^ t( 8)
3353feeca58Szfw    t(24) := t( 5) ^ t( 7)
3363feeca58Szfw    t(25) := t( 6) ^ t(10)
3373feeca58Szfw    t(26) := t( 9) ^ t(11)
3383feeca58Szfw    t(27) := t(10) ^ t(18)
3393feeca58Szfw    t(28) := t(11) ^ t(25)
3403feeca58Szfw    t(29) := t(15) ^ t(20)
3413feeca58Szfw    o( 0) := t( 9) ^ t(16)
3423feeca58Szfw    o( 1) := t(14) ^ t(23)
3433feeca58Szfw    o( 2) := t(19) ^ t(24)
3443feeca58Szfw    o( 3) := t(23) ^ t(27)
3453feeca58Szfw    o( 4) := t(12) ^ t(22)
3463feeca58Szfw    o( 5) := t(17) ^ t(28)
3473feeca58Szfw    o( 6) := t(26) ^ t(29)
3483feeca58Szfw    o( 7) := t(13) ^ t(22)
3493feeca58Szfw    o.asUInt
3503feeca58Szfw  }
3513feeca58Szfw}
3523feeca58Szfw
3533feeca58Szfw// SM4 encode/decode sbox out
3543feeca58Szfwobject SboxSm4Out {
3553feeca58Szfw  def apply(i: Seq[Bool]): UInt = {
3563feeca58Szfw    val t = Wire(Vec(30, Bool()))
3573feeca58Szfw    val o = Wire(Vec(8, Bool()))
3583feeca58Szfw    t( 0) := i( 4) ^  i( 7)
3593feeca58Szfw    t( 1) := i(13) ^  i(15)
3603feeca58Szfw    t( 2) := i( 2) ^  i(16)
3613feeca58Szfw    t( 3) := i( 6) ^  t( 0)
3623feeca58Szfw    t( 4) := i(12) ^  t( 1)
3633feeca58Szfw    t( 5) := i( 9) ^  i(10)
3643feeca58Szfw    t( 6) := i(11) ^  t( 2)
3653feeca58Szfw    t( 7) := i( 1) ^  t( 4)
3663feeca58Szfw    t( 8) := i( 0) ^  i(17)
3673feeca58Szfw    t( 9) := i( 3) ^  i(17)
3683feeca58Szfw    t(10) := i( 8) ^  t( 3)
3693feeca58Szfw    t(11) := t( 2) ^  t( 5)
3703feeca58Szfw    t(12) := i(14) ^  t( 6)
3713feeca58Szfw    t(13) := t( 7) ^  t( 9)
3723feeca58Szfw    t(14) := i( 0) ^  i( 6)
3733feeca58Szfw    t(15) := i( 7) ^  i(16)
3743feeca58Szfw    t(16) := i( 5) ^  i(13)
3753feeca58Szfw    t(17) := i( 3) ^  i(15)
3763feeca58Szfw    t(18) := i(10) ^  i(12)
3773feeca58Szfw    t(19) := i( 9) ^  t( 1)
3783feeca58Szfw    t(20) := i( 4) ^  t( 4)
3793feeca58Szfw    t(21) := i(14) ^  t( 3)
3803feeca58Szfw    t(22) := i(16) ^  t( 5)
3813feeca58Szfw    t(23) := t( 7) ^  t(14)
3823feeca58Szfw    t(24) := t( 8) ^  t(11)
3833feeca58Szfw    t(25) := t( 0) ^  t(12)
3843feeca58Szfw    t(26) := t(17) ^  t( 3)
3853feeca58Szfw    t(27) := t(18) ^  t(10)
3863feeca58Szfw    t(28) := t(19) ^  t( 6)
3873feeca58Szfw    t(29) := t( 8) ^  t(10)
3883feeca58Szfw    o( 0) := t(11) ^ ~t(13)
3893feeca58Szfw    o( 1) := t(15) ^ ~t(23)
3903feeca58Szfw    o( 2) := t(20) ^  t(24)
3913feeca58Szfw    o( 3) := t(16) ^  t(25)
3923feeca58Szfw    o( 4) := t(26) ^ ~t(22)
3933feeca58Szfw    o( 5) := t(21) ^  t(13)
3943feeca58Szfw    o( 6) := t(27) ^ ~t(12)
3953feeca58Szfw    o( 7) := t(28) ^ ~t(29)
3963feeca58Szfw    o.asUInt
3973feeca58Szfw  }
3983feeca58Szfw}
3993feeca58Szfw
4003feeca58Szfwobject SboxAes {
4013feeca58Szfw  def apply(byte: UInt): UInt = {
4023feeca58Szfw    SboxAesOut(SboxInv(SboxAesTop(byte)))
4033feeca58Szfw  }
4043feeca58Szfw}
4053feeca58Szfw
4063feeca58Szfwobject SboxIaes {
4073feeca58Szfw  def apply(byte: UInt): UInt = {
4083feeca58Szfw    SboxIaesOut(SboxInv(SboxIaesTop(byte)))
4093feeca58Szfw  }
4103feeca58Szfw}
4113feeca58Szfw
4123feeca58Szfwobject SboxSm4 {
4133feeca58Szfw  def apply(byte: UInt): UInt = {
4143feeca58Szfw    SboxSm4Out(SboxInv(SboxSm4Top(byte)))
4153feeca58Szfw  }
4163feeca58Szfw}
4173feeca58Szfw
4183feeca58Szfw// Mix Column
4193feeca58Szfwobject XtN {
4203feeca58Szfw  def Xt2(byte: UInt): UInt = ((byte << 1) ^ Mux(byte(7), "h1b".U, 0.U))(7,0)
4213feeca58Szfw
4223feeca58Szfw  def apply(byte: UInt, t: UInt): UInt = {
4233feeca58Szfw    val byte1 = Xt2(byte)
4243feeca58Szfw    val byte2 = Xt2(byte1)
4253feeca58Szfw    val byte3 = Xt2(byte2)
4263feeca58Szfw    val result = Mux(t(0), byte, 0.U) ^ Mux(t(1), byte1, 0.U) ^ Mux(t(2), byte2, 0.U) ^ Mux(t(3), byte3, 0.U)
4273feeca58Szfw    result(7,0)
4283feeca58Szfw  }
4293feeca58Szfw}
4303feeca58Szfw
4313feeca58Szfwobject ByteEnc {
4323feeca58Szfw  def apply(bytes: Seq[UInt]): UInt = {
4333feeca58Szfw    XtN(bytes(0), "h2".U) ^ XtN(bytes(1), "h3".U) ^ bytes(2) ^ bytes(3)
4343feeca58Szfw  }
4353feeca58Szfw}
4363feeca58Szfw
4373feeca58Szfwobject ByteDec {
4383feeca58Szfw  def apply(bytes: Seq[UInt]): UInt = {
4393feeca58Szfw    XtN(bytes(0), "he".U) ^ XtN(bytes(1), "hb".U) ^ XtN(bytes(2), "hd".U) ^ XtN(bytes(3), "h9".U)
4403feeca58Szfw  }
4413feeca58Szfw}
4423feeca58Szfw
4433feeca58Szfwobject MixFwd {
4443feeca58Szfw  def apply(bytes: Seq[UInt]): UInt = {
4453feeca58Szfw    Cat(ByteEnc(Seq(bytes(3), bytes(0), bytes(1), bytes(2))),
4463feeca58Szfw        ByteEnc(Seq(bytes(2), bytes(3), bytes(0), bytes(1))),
4473feeca58Szfw        ByteEnc(Seq(bytes(1), bytes(2), bytes(3), bytes(0))),
4483feeca58Szfw        ByteEnc(Seq(bytes(0), bytes(1), bytes(2), bytes(3))))
4493feeca58Szfw  }
4503feeca58Szfw}
4513feeca58Szfw
4523feeca58Szfwobject MixInv {
4533feeca58Szfw  def apply(bytes: Seq[UInt]): UInt = {
4543feeca58Szfw    Cat(ByteDec(Seq(bytes(3), bytes(0), bytes(1), bytes(2))),
4553feeca58Szfw        ByteDec(Seq(bytes(2), bytes(3), bytes(0), bytes(1))),
4563feeca58Szfw        ByteDec(Seq(bytes(1), bytes(2), bytes(3), bytes(0))),
4573feeca58Szfw        ByteDec(Seq(bytes(0), bytes(1), bytes(2), bytes(3))))
4583feeca58Szfw  }
4593feeca58Szfw}
460