gem5  v21.1.0.2
crypto.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #ifndef __ARCH_ARM_INSTS_CRYPTO_HH__
39 #define __ARCH_ARM_INSTS_CRYPTO_HH__
40 
41 namespace gem5
42 {
43 
44 namespace ArmISA {
45 
46 class Crypto
47 {
48  enum SHAOp : uint8_t
49  {
50  CHOOSE = 0,
53  };
54 
56  static const uint8_t aesSBOX[256];
57 
59  static const uint8_t aesInvSBOX[256];
60 
61  static const uint8_t aesSHIFT[16];
62  static const uint8_t aesINVSHIFT[16];
63 
68  static const uint8_t aesFFLOG[256];
69 
74  static const uint8_t aesFFEXP[256];
75 
77  uint8_t aesFFMul(uint8_t a, uint8_t b);
78 
79  uint8_t aesFFMul2(uint8_t a)
80  {
81  return ((a & 0x80) ? ((a << 1) ^ 0x1b) : (a << 1));
82  }
83 
84  void aesSubBytes(uint8_t *output, uint8_t *input);
85  void aesInvSubBytes(uint8_t *output, uint8_t *input);
86  void aesShiftRows(uint8_t *output, uint8_t *input);
87  void aesInvShiftRows(uint8_t *output, uint8_t *input);
88  void aesAddRoundKey(uint8_t *output, uint8_t *input, uint8_t *key);
89 
90  uint32_t ror(uint32_t x, uint8_t shift)
91  {
92  return (x >> shift) | (x << (32 - shift));
93  }
94 
95  uint32_t choose(uint32_t X, uint32_t Y, uint32_t Z)
96  {
97  return (((Y ^ Z) & X) ^ Z);
98  }
99 
100  uint32_t parity(uint32_t X, uint32_t Y, uint32_t Z)
101  {
102  return (X ^ Y ^ Z);
103  }
104 
105  uint32_t majority(uint32_t X, uint32_t Y, uint32_t Z)
106  {
107  return ((X & Y) | ((X | Y) & Z));
108  }
109 
110  uint32_t sigma0(uint32_t X)
111  {
112  return ror(X,2) ^ ror(X,13) ^ ror(X,22);
113  }
114 
115  uint32_t sigma1(uint32_t X)
116  {
117  return ror(X,6) ^ ror(X,11) ^ ror(X,25);
118  }
119 
120  void sha256Op(uint32_t *X, uint32_t *Y, uint32_t *Z);
121  void sha1Op(uint8_t *output, uint8_t *input, uint8_t *input2, SHAOp op);
122  void _sha1Op(uint32_t *X, uint32_t *Y, uint32_t *Z, SHAOp op);
123 
124  void load2Reg(uint32_t *X, uint32_t *Y, uint8_t *output, uint8_t *input);
125  void load3Reg(uint32_t *X, uint32_t *Y, uint32_t *Z,
126  uint8_t *output, uint8_t *input, uint8_t *input2);
127  void store1Reg(uint8_t *output, uint32_t *X);
128 
129  public:
130  void aesMixColumns(uint8_t *output, uint8_t *input);
131  void aesInvMixColumns(uint8_t *output, uint8_t *input);
132  void aesEncrypt(uint8_t *output, uint8_t *input, uint8_t *key);
133  void aesDecrypt(uint8_t *output, uint8_t *input, uint8_t *key);
134  void sha256H(uint8_t *output, uint8_t *input, uint8_t *input2);
135  void sha256H2(uint8_t *output, uint8_t *input, uint8_t *input2);
136  void sha256Su0(uint8_t *output, uint8_t *input);
137  void sha256Su1(uint8_t *output, uint8_t *input, uint8_t *input2);
138 
139  void sha1C(uint8_t *output, uint8_t *input, uint8_t *input2);
140  void sha1P(uint8_t *output, uint8_t *input, uint8_t *input2);
141  void sha1M(uint8_t *output, uint8_t *input, uint8_t *input2);
142  void sha1H(uint8_t *output, uint8_t *input);
143  void sha1Su0(uint8_t *output, uint8_t *input, uint8_t *input2);
144  void sha1Su1(uint8_t *output, uint8_t *input);
145 };
146 
147 } // namespace ArmISA
148 } // namespace gem5
149 
150 #endif //__ARCH_ARM_INSTS_CRYPTO_HH__
gem5::ArmISA::Crypto::aesSBOX
static const uint8_t aesSBOX[256]
Look up table for subByttes transformation.
Definition: crypto.hh:56
gem5::ArmISA::Crypto::sha1M
void sha1M(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:427
gem5::ArmISA::Crypto::sha256Su1
void sha256Su1(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:369
gem5::ArmISA::Crypto::CHOOSE
@ CHOOSE
Definition: crypto.hh:50
gem5::ArmISA::Crypto::sha1Su1
void sha1Su1(uint8_t *output, uint8_t *input)
Definition: crypto.cc:463
gem5::ArmISA::Crypto::sha256H2
void sha256H2(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:334
gem5::ArmISA::Crypto::aesDecrypt
void aesDecrypt(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:267
gem5::ArmISA::Crypto
Definition: crypto.hh:46
gem5::output
static void output(const char *filename)
Definition: debug.cc:66
gem5::ArmISA::Crypto::sha256H
void sha256H(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:322
gem5::ArmISA::Crypto::aesFFEXP
static const uint8_t aesFFEXP[256]
Look up table for {03}^X where {03} and X are elements in the filed G(256)
Definition: crypto.hh:74
gem5::ArmISA::Crypto::sha1C
void sha1C(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:409
gem5::ArmISA::Crypto::sha1P
void sha1P(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:418
gem5::ArmISA::a
Bitfield< 8 > a
Definition: misc_types.hh:65
gem5::ArmISA::Crypto::aesFFMul
uint8_t aesFFMul(uint8_t a, uint8_t b)
Finite field multiplication of two elements in the field G(256)
Definition: crypto.cc:166
gem5::ArmISA::Crypto::sha1Op
void sha1Op(uint8_t *output, uint8_t *input, uint8_t *input2, SHAOp op)
Definition: crypto.cc:396
gem5::ArmISA::Crypto::aesShiftRows
void aesShiftRows(uint8_t *output, uint8_t *input)
Definition: crypto.cc:197
gem5::ArmISA::Crypto::store1Reg
void store1Reg(uint8_t *output, uint32_t *X)
Definition: crypto.cc:508
gem5::ArmISA::Crypto::ror
uint32_t ror(uint32_t x, uint8_t shift)
Definition: crypto.hh:90
gem5::ArmISA::Crypto::MAJORITY
@ MAJORITY
Definition: crypto.hh:52
gem5::ArmISA::Crypto::sigma0
uint32_t sigma0(uint32_t X)
Definition: crypto.hh:110
gem5::ArmISA::Crypto::aesINVSHIFT
static const uint8_t aesINVSHIFT[16]
Definition: crypto.hh:62
gem5::ArmISA::shift
Bitfield< 6, 5 > shift
Definition: types.hh:117
gem5::ArmISA::Crypto::aesInvShiftRows
void aesInvShiftRows(uint8_t *output, uint8_t *input)
Definition: crypto.cc:205
gem5::ArmISA::b
Bitfield< 7 > b
Definition: misc_types.hh:381
gem5::ArmISA::Crypto::PARITY
@ PARITY
Definition: crypto.hh:51
gem5::ArmISA::Crypto::aesInvSBOX
static const uint8_t aesInvSBOX[256]
Look up table for inverse subBytes transformation.
Definition: crypto.hh:59
gem5::ArmISA::Crypto::sha1H
void sha1H(uint8_t *output, uint8_t *input)
Definition: crypto.cc:436
gem5::ArmISA::Crypto::sha256Op
void sha256Op(uint32_t *X, uint32_t *Y, uint32_t *Z)
Definition: crypto.cc:278
gem5::ArmISA::Crypto::sha256Su0
void sha256Su0(uint8_t *output, uint8_t *input)
Definition: crypto.cc:346
gem5::ArmISA::Crypto::SHAOp
SHAOp
Definition: crypto.hh:48
gem5::ArmISA::Crypto::majority
uint32_t majority(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:105
gem5::ArmISA::Crypto::sha1Su0
void sha1Su0(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:445
gem5::ArmISA::Crypto::_sha1Op
void _sha1Op(uint32_t *X, uint32_t *Y, uint32_t *Z, SHAOp op)
Definition: crypto.cc:298
gem5::ArmISA::Crypto::aesInvSubBytes
void aesInvSubBytes(uint8_t *output, uint8_t *input)
Definition: crypto.cc:189
gem5::ArmISA::Crypto::load2Reg
void load2Reg(uint32_t *X, uint32_t *Y, uint8_t *output, uint8_t *input)
Definition: crypto.cc:479
gem5::ArmISA::Crypto::sigma1
uint32_t sigma1(uint32_t X)
Definition: crypto.hh:115
gem5::ArmISA::Crypto::aesFFLOG
static const uint8_t aesFFLOG[256]
Look up table for Finite Field logarithm where the base is the element {03} in the field G(256)
Definition: crypto.hh:68
gem5::ArmISA::Crypto::aesSubBytes
void aesSubBytes(uint8_t *output, uint8_t *input)
Definition: crypto.cc:181
gem5::RiscvISA::x
Bitfield< 3 > x
Definition: pagetable.hh:73
gem5::ArmISA::Crypto::load3Reg
void load3Reg(uint32_t *X, uint32_t *Y, uint32_t *Z, uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:492
gem5::ArmISA::Crypto::aesEncrypt
void aesEncrypt(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:256
gem5::ArmISA::Crypto::choose
uint32_t choose(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:95
gem5::ArmISA::Crypto::aesMixColumns
void aesMixColumns(uint8_t *output, uint8_t *input)
Definition: crypto.cc:222
gem5::ArmISA::Crypto::aesInvMixColumns
void aesInvMixColumns(uint8_t *output, uint8_t *input)
Definition: crypto.cc:240
gem5::ArmISA::Crypto::parity
uint32_t parity(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:100
gem5::ArmISA::Crypto::aesFFMul2
uint8_t aesFFMul2(uint8_t a)
Definition: crypto.hh:79
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
gem5::X86ISA::op
Bitfield< 4 > op
Definition: types.hh:83
gem5::X86ISA::X
Bitfield< 15, 0 > X
Definition: int.hh:55
gem5::ArmISA::Crypto::aesSHIFT
static const uint8_t aesSHIFT[16]
Definition: crypto.hh:61
gem5::ArmISA::Crypto::aesAddRoundKey
void aesAddRoundKey(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:213

Generated on Tue Sep 21 2021 12:24:34 for gem5 by doxygen 1.8.17