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