blob: bf2a22aa23a784953b49a9ba75db16089819f7f3 [file] [log] [blame]
Silvestrs Timofejevsb33dbd62020-06-02 17:12:51 +01001// 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#include "sw/device/lib/dif/dif_aes.h"
6
7#include "gtest/gtest.h"
8#include "sw/device/lib/base/mmio.h"
Miguel Osorio96d8d572021-04-25 12:47:24 -07009#include "sw/device/lib/base/testing/mock_mmio.h"
Silvestrs Timofejevsb33dbd62020-06-02 17:12:51 +010010
11extern "C" {
12#include "aes_regs.h" // Generated.
13} // extern "C"
14
15namespace dif_aes_test {
16namespace {
17using mock_mmio::MmioTest;
18using mock_mmio::MockDevice;
19using testing::Test;
20
Douglas Reis9ab20c32021-10-25 10:44:03 +010021// Base class for the rest fixtures in this file.
22class AesTest : public testing::Test, public mock_mmio::MmioTest {
23 public:
24 void setExpectedKey(const dif_aes_key_share_t &key, uint32_t key_size = 8) {
Drew Macraeae2a8832021-11-10 19:38:05 +000025 for (uint32_t i = 0; i < key_size; ++i) {
Douglas Reis9ab20c32021-10-25 10:44:03 +010026 ptrdiff_t offset = AES_KEY_SHARE0_0_REG_OFFSET + (i * sizeof(uint32_t));
27 EXPECT_WRITE32(offset, key.share0[i]);
28 }
29
Drew Macraeae2a8832021-11-10 19:38:05 +000030 for (uint32_t i = 0; i < key_size; ++i) {
Douglas Reis9ab20c32021-10-25 10:44:03 +010031 ptrdiff_t offset = AES_KEY_SHARE1_0_REG_OFFSET + (i * sizeof(uint32_t));
32 EXPECT_WRITE32(offset, key.share1[i]);
33 }
34 }
35
36 void setExpectedIv(const dif_aes_iv_t &iv, const uint32_t kIvSize = 4) {
Drew Macraeae2a8832021-11-10 19:38:05 +000037 for (uint32_t i = 0; i < kIvSize; ++i) {
Douglas Reis9ab20c32021-10-25 10:44:03 +010038 ptrdiff_t offset = AES_IV_0_REG_OFFSET + (i * sizeof(uint32_t));
39 EXPECT_WRITE32(offset, iv.iv[i]);
40 }
41 }
Douglas Reis09508582022-02-09 11:56:42 +000042 void setExpectedConfig(uint32_t key_len, uint32_t mode, uint32_t operation) {
43 for (int i = 0; i < 2; i++) {
44 EXPECT_WRITE32(AES_CTRL_SHADOWED_REG_OFFSET,
45 {{AES_CTRL_SHADOWED_KEY_LEN_OFFSET, key_len},
46 {AES_CTRL_SHADOWED_MODE_OFFSET, mode},
47 {AES_CTRL_SHADOWED_OPERATION_OFFSET, operation},
48 {AES_CTRL_SHADOWED_MANUAL_OPERATION_BIT, false},
49 {AES_CTRL_SHADOWED_FORCE_ZERO_MASKS_BIT, false}});
50 }
51 }
Douglas Reis9ab20c32021-10-25 10:44:03 +010052};
53
54// Init tests
55class AesInitTest : public AesTest {};
56
57TEST_F(AesInitTest, NullArgs) {
58 EXPECT_EQ(dif_aes_init(dev().region(), nullptr), kDifBadArg);
59}
60
61TEST_F(AesInitTest, Sucess) {
62 dif_aes_t aes;
63 EXPECT_EQ(dif_aes_init(dev().region(), &aes), kDifOk);
64}
65
66// Base class for the rest of the tests in this file, provides a
67// `dif_aes_t` instance.
68class AesTestInitialized : public AesTest {
69 protected:
70 dif_aes_t aes_;
71
Douglas Reis0c2ddc12022-02-09 11:37:07 +000072 dif_aes_transaction_t transaction = {
Pirmin Vogel553759a2022-01-28 18:32:37 +010073 .operation = kDifAesOperationEncrypt,
74 .mode = kDifAesModeEcb,
Douglas Reis9ab20c32021-10-25 10:44:03 +010075 .key_len = kDifAesKey128,
Pirmin Vogel553759a2022-01-28 18:32:37 +010076 .manual_operation = kDifAesManualOperationAuto,
Douglas Reis9ab20c32021-10-25 10:44:03 +010077 .masking = kDifAesMaskingInternalPrng,
78 };
79
80 const dif_aes_key_share_t kKey_ = {
81 .share0 = {0x59, 0x70, 0x33, 0x73, 0x36, 0x76, 0x39, 0x79},
82 .share1 = {0x4B, 0x61, 0x50, 0x64, 0x53, 0x67, 0x56, 0x6B}};
83
84 const dif_aes_iv_t kIv_ = {0x50, 0x64, 0x53, 0x67};
85
86 AesTestInitialized() {
87 EXPECT_EQ(dif_aes_init(dev().region(), &aes_), kDifOk);
88 }
89};
90
91// ECB tests
Douglas Reis0c2ddc12022-02-09 11:37:07 +000092class EcbTest : public AesTestInitialized {
93 protected:
94 EcbTest() { transaction.mode = kDifAesModeEcb; }
95};
Douglas Reis9ab20c32021-10-25 10:44:03 +010096
97TEST_F(EcbTest, start) {
98 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
Douglas Reis09508582022-02-09 11:56:42 +000099 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
100 AES_CTRL_SHADOWED_MODE_VALUE_AES_ECB,
101 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100102 setExpectedKey(kKey_, 8);
103
Douglas Reis09508582022-02-09 11:56:42 +0000104 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, NULL), kDifOk);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100105}
106
Douglas Reis0c2ddc12022-02-09 11:37:07 +0000107class CbcTest : public AesTestInitialized {
108 protected:
109 CbcTest() { transaction.mode = kDifAesModeCbc; }
110};
Douglas Reis9ab20c32021-10-25 10:44:03 +0100111
112TEST_F(CbcTest, start) {
113 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
Douglas Reis09508582022-02-09 11:56:42 +0000114 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
115 AES_CTRL_SHADOWED_MODE_VALUE_AES_CBC,
116 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100117 setExpectedKey(kKey_, 8);
118 setExpectedIv(kIv_);
119
Douglas Reis09508582022-02-09 11:56:42 +0000120 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100121}
122
123// CFB tests
Douglas Reis0c2ddc12022-02-09 11:37:07 +0000124class CFBTest : public AesTestInitialized {
125 protected:
126 CFBTest() { transaction.mode = kDifAesModeCfb; }
127};
Douglas Reis9ab20c32021-10-25 10:44:03 +0100128
129TEST_F(CFBTest, start) {
130 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
Douglas Reis09508582022-02-09 11:56:42 +0000131 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
132 AES_CTRL_SHADOWED_MODE_VALUE_AES_CFB,
133 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100134 setExpectedKey(kKey_, 8);
135 setExpectedIv(kIv_);
136
Douglas Reis09508582022-02-09 11:56:42 +0000137 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100138}
139
140// OFB tests
Douglas Reis0c2ddc12022-02-09 11:37:07 +0000141class OFBTest : public AesTestInitialized {
142 protected:
143 OFBTest() { transaction.mode = kDifAesModeOfb; }
144};
Douglas Reis9ab20c32021-10-25 10:44:03 +0100145
146TEST_F(OFBTest, start) {
147 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
Douglas Reis09508582022-02-09 11:56:42 +0000148 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
149 AES_CTRL_SHADOWED_MODE_VALUE_AES_OFB,
150 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100151 setExpectedKey(kKey_, 8);
152 setExpectedIv(kIv_);
153
Douglas Reis09508582022-02-09 11:56:42 +0000154 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100155}
156
157// CTR tests
Douglas Reis0c2ddc12022-02-09 11:37:07 +0000158class CTRTest : public AesTestInitialized {
159 protected:
160 CTRTest() { transaction.mode = kDifAesModeCtr; }
161};
Douglas Reis9ab20c32021-10-25 10:44:03 +0100162
163TEST_F(CTRTest, start) {
164 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
Douglas Reis09508582022-02-09 11:56:42 +0000165 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
166 AES_CTRL_SHADOWED_MODE_VALUE_AES_CTR,
167 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_ENC);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100168 setExpectedKey(kKey_, 8);
169 setExpectedIv(kIv_);
170
Douglas Reis09508582022-02-09 11:56:42 +0000171 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk);
172}
173
174// Decrypt tests
175class DecryptTest : public AesTestInitialized {
176 protected:
177 DecryptTest() {
178 transaction.mode = kDifAesModeEcb;
179 transaction.operation = kDifAesOperationDecrypt;
180 }
181};
182
183TEST_F(DecryptTest, start) {
184 EXPECT_READ32(AES_STATUS_REG_OFFSET, 1);
185 setExpectedConfig(AES_CTRL_SHADOWED_KEY_LEN_VALUE_AES_128,
186 AES_CTRL_SHADOWED_MODE_VALUE_AES_ECB,
187 AES_CTRL_SHADOWED_OPERATION_VALUE_AES_DEC);
188 setExpectedKey(kKey_, 8);
189
190 EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, NULL), kDifOk);
Douglas Reis9ab20c32021-10-25 10:44:03 +0100191}
Silvestrs Timofejevsb33dbd62020-06-02 17:12:51 +0100192
193} // namespace
194} // namespace dif_aes_test