gem5  v20.1.0.0
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 ArmISA {
42 
43 class Crypto
44 {
45  enum SHAOp : uint8_t
46  {
47  CHOOSE = 0,
50  };
51 
53  static const uint8_t aesSBOX[256];
54 
56  static const uint8_t aesInvSBOX[256];
57 
58  static const uint8_t aesSHIFT[16];
59  static const uint8_t aesINVSHIFT[16];
60 
65  static const uint8_t aesFFLOG[256];
66 
71  static const uint8_t aesFFEXP[256];
72 
74  uint8_t aesFFMul(uint8_t a, uint8_t b);
75 
76  uint8_t aesFFMul2(uint8_t a)
77  {
78  return ((a & 0x80) ? ((a << 1) ^ 0x1b) : (a << 1));
79  }
80 
81  void aesSubBytes(uint8_t *output, uint8_t *input);
82  void aesInvSubBytes(uint8_t *output, uint8_t *input);
83  void aesShiftRows(uint8_t *output, uint8_t *input);
84  void aesInvShiftRows(uint8_t *output, uint8_t *input);
85  void aesAddRoundKey(uint8_t *output, uint8_t *input, uint8_t *key);
86 
87  uint32_t ror(uint32_t x, uint8_t shift)
88  {
89  return (x >> shift) | (x << (32 - shift));
90  }
91 
92  uint32_t choose(uint32_t X, uint32_t Y, uint32_t Z)
93  {
94  return (((Y ^ Z) & X) ^ Z);
95  }
96 
97  uint32_t parity(uint32_t X, uint32_t Y, uint32_t Z)
98  {
99  return (X ^ Y ^ Z);
100  }
101 
102  uint32_t majority(uint32_t X, uint32_t Y, uint32_t Z)
103  {
104  return ((X & Y) | ((X | Y) & Z));
105  }
106 
107  uint32_t sigma0(uint32_t X)
108  {
109  return ror(X,2) ^ ror(X,13) ^ ror(X,22);
110  }
111 
112  uint32_t sigma1(uint32_t X)
113  {
114  return ror(X,6) ^ ror(X,11) ^ ror(X,25);
115  }
116 
117  void sha256Op(uint32_t *X, uint32_t *Y, uint32_t *Z);
118  void sha1Op(uint8_t *output, uint8_t *input, uint8_t *input2, SHAOp op);
119  void _sha1Op(uint32_t *X, uint32_t *Y, uint32_t *Z, SHAOp op);
120 
121  void load2Reg(uint32_t *X, uint32_t *Y, uint8_t *output, uint8_t *input);
122  void load3Reg(uint32_t *X, uint32_t *Y, uint32_t *Z,
123  uint8_t *output, uint8_t *input, uint8_t *input2);
124  void store1Reg(uint8_t *output, uint32_t *X);
125 
126  public:
127  void aesMixColumns(uint8_t *output, uint8_t *input);
128  void aesInvMixColumns(uint8_t *output, uint8_t *input);
129  void aesEncrypt(uint8_t *output, uint8_t *input, uint8_t *key);
130  void aesDecrypt(uint8_t *output, uint8_t *input, uint8_t *key);
131  void sha256H(uint8_t *output, uint8_t *input, uint8_t *input2);
132  void sha256H2(uint8_t *output, uint8_t *input, uint8_t *input2);
133  void sha256Su0(uint8_t *output, uint8_t *input);
134  void sha256Su1(uint8_t *output, uint8_t *input, uint8_t *input2);
135 
136  void sha1C(uint8_t *output, uint8_t *input, uint8_t *input2);
137  void sha1P(uint8_t *output, uint8_t *input, uint8_t *input2);
138  void sha1M(uint8_t *output, uint8_t *input, uint8_t *input2);
139  void sha1H(uint8_t *output, uint8_t *input);
140  void sha1Su0(uint8_t *output, uint8_t *input, uint8_t *input2);
141  void sha1Su1(uint8_t *output, uint8_t *input);
142 };
143 
144 } // namespace ArmISA
145 
146 #endif //__ARCH_ARM_INSTS_CRYPTO_HH__
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:71
ArmISA::Crypto::sha256H2
void sha256H2(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:331
output
static void output(const char *filename)
Definition: debug.cc:60
ArmISA::Crypto::sigma0
uint32_t sigma0(uint32_t X)
Definition: crypto.hh:107
ArmISA::Crypto::aesAddRoundKey
void aesAddRoundKey(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:210
ArmISA::Crypto::aesSubBytes
void aesSubBytes(uint8_t *output, uint8_t *input)
Definition: crypto.cc:178
ArmISA::Crypto::store1Reg
void store1Reg(uint8_t *output, uint32_t *X)
Definition: crypto.cc:505
ArmISA::Crypto::CHOOSE
@ CHOOSE
Definition: crypto.hh:47
ArmISA::Crypto::load2Reg
void load2Reg(uint32_t *X, uint32_t *Y, uint8_t *output, uint8_t *input)
Definition: crypto.cc:476
ArmISA::Crypto::aesSBOX
static const uint8_t aesSBOX[256]
Look up table for subByttes transformation.
Definition: crypto.hh:53
ArmISA::Crypto::parity
uint32_t parity(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:97
ArmISA::Crypto::aesSHIFT
static const uint8_t aesSHIFT[16]
Definition: crypto.hh:58
ArmISA::Crypto::sha256H
void sha256H(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:319
ArmISA::Crypto::_sha1Op
void _sha1Op(uint32_t *X, uint32_t *Y, uint32_t *Z, SHAOp op)
Definition: crypto.cc:295
X86ISA::op
Bitfield< 4 > op
Definition: types.hh:78
ArmISA::Crypto::aesMixColumns
void aesMixColumns(uint8_t *output, uint8_t *input)
Definition: crypto.cc:219
ArmISA::Crypto::sha1H
void sha1H(uint8_t *output, uint8_t *input)
Definition: crypto.cc:433
X86ISA::X
Bitfield< 15, 0 > X
Definition: int.hh:53
ArmISA
Definition: ccregs.hh:41
ArmISA::Crypto::sha1Su0
void sha1Su0(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:442
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:489
ArmISA::Crypto::majority
uint32_t majority(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:102
ArmISA::Crypto::aesInvSubBytes
void aesInvSubBytes(uint8_t *output, uint8_t *input)
Definition: crypto.cc:186
ArmISA::Crypto::sha256Op
void sha256Op(uint32_t *X, uint32_t *Y, uint32_t *Z)
Definition: crypto.cc:275
ArmISA::a
Bitfield< 8 > a
Definition: miscregs_types.hh:62
ArmISA::Crypto::sha256Su0
void sha256Su0(uint8_t *output, uint8_t *input)
Definition: crypto.cc:343
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:65
ArmISA::Crypto::MAJORITY
@ MAJORITY
Definition: crypto.hh:49
ArmISA::shift
Bitfield< 6, 5 > shift
Definition: types.hh:126
ArmISA::Crypto
Definition: crypto.hh:43
ArmISA::Crypto::ror
uint32_t ror(uint32_t x, uint8_t shift)
Definition: crypto.hh:87
ArmISA::Crypto::choose
uint32_t choose(uint32_t X, uint32_t Y, uint32_t Z)
Definition: crypto.hh:92
RiscvISA::x
Bitfield< 3 > x
Definition: pagetable.hh:69
ArmISA::Crypto::PARITY
@ PARITY
Definition: crypto.hh:48
ArmISA::Crypto::sha1M
void sha1M(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:424
ArmISA::Crypto::sha256Su1
void sha256Su1(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:366
ArmISA::Crypto::aesFFMul2
uint8_t aesFFMul2(uint8_t a)
Definition: crypto.hh:76
ArmISA::Crypto::aesInvSBOX
static const uint8_t aesInvSBOX[256]
Look up table for inverse subBytes transformation.
Definition: crypto.hh:56
ArmISA::Crypto::aesInvShiftRows
void aesInvShiftRows(uint8_t *output, uint8_t *input)
Definition: crypto.cc:202
ArmISA::Crypto::aesDecrypt
void aesDecrypt(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:264
ArmISA::b
Bitfield< 7 > b
Definition: miscregs_types.hh:376
ArmISA::Crypto::aesEncrypt
void aesEncrypt(uint8_t *output, uint8_t *input, uint8_t *key)
Definition: crypto.cc:253
ArmISA::Crypto::sha1C
void sha1C(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:406
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:163
ArmISA::Crypto::aesInvMixColumns
void aesInvMixColumns(uint8_t *output, uint8_t *input)
Definition: crypto.cc:237
ArmISA::Crypto::aesShiftRows
void aesShiftRows(uint8_t *output, uint8_t *input)
Definition: crypto.cc:194
ArmISA::Crypto::sigma1
uint32_t sigma1(uint32_t X)
Definition: crypto.hh:112
ArmISA::Crypto::SHAOp
SHAOp
Definition: crypto.hh:45
ArmISA::Crypto::sha1P
void sha1P(uint8_t *output, uint8_t *input, uint8_t *input2)
Definition: crypto.cc:415
ArmISA::Crypto::sha1Op
void sha1Op(uint8_t *output, uint8_t *input, uint8_t *input2, SHAOp op)
Definition: crypto.cc:393
ArmISA::Crypto::aesINVSHIFT
static const uint8_t aesINVSHIFT[16]
Definition: crypto.hh:59
ArmISA::Crypto::sha1Su1
void sha1Su1(uint8_t *output, uint8_t *input)
Definition: crypto.cc:460

Generated on Wed Sep 30 2020 14:02:00 for gem5 by doxygen 1.8.17