Silvestrs Timofejevs | b33dbd6 | 2020-06-02 17:12:51 +0100 | [diff] [blame] | 1 | // 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 Osorio | 96d8d57 | 2021-04-25 12:47:24 -0700 | [diff] [blame] | 9 | #include "sw/device/lib/base/testing/mock_mmio.h" |
Silvestrs Timofejevs | b33dbd6 | 2020-06-02 17:12:51 +0100 | [diff] [blame] | 10 | |
| 11 | extern "C" { |
| 12 | #include "aes_regs.h" // Generated. |
| 13 | } // extern "C" |
| 14 | |
| 15 | namespace dif_aes_test { |
| 16 | namespace { |
| 17 | using mock_mmio::MmioTest; |
| 18 | using mock_mmio::MockDevice; |
| 19 | using testing::Test; |
| 20 | |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 21 | // Base class for the rest fixtures in this file. |
| 22 | class 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 Macrae | ae2a883 | 2021-11-10 19:38:05 +0000 | [diff] [blame] | 25 | for (uint32_t i = 0; i < key_size; ++i) { |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 26 | ptrdiff_t offset = AES_KEY_SHARE0_0_REG_OFFSET + (i * sizeof(uint32_t)); |
| 27 | EXPECT_WRITE32(offset, key.share0[i]); |
| 28 | } |
| 29 | |
Drew Macrae | ae2a883 | 2021-11-10 19:38:05 +0000 | [diff] [blame] | 30 | for (uint32_t i = 0; i < key_size; ++i) { |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 31 | 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 Macrae | ae2a883 | 2021-11-10 19:38:05 +0000 | [diff] [blame] | 37 | for (uint32_t i = 0; i < kIvSize; ++i) { |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 38 | ptrdiff_t offset = AES_IV_0_REG_OFFSET + (i * sizeof(uint32_t)); |
| 39 | EXPECT_WRITE32(offset, iv.iv[i]); |
| 40 | } |
| 41 | } |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 42 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 52 | }; |
| 53 | |
| 54 | // Init tests |
| 55 | class AesInitTest : public AesTest {}; |
| 56 | |
| 57 | TEST_F(AesInitTest, NullArgs) { |
| 58 | EXPECT_EQ(dif_aes_init(dev().region(), nullptr), kDifBadArg); |
| 59 | } |
| 60 | |
| 61 | TEST_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. |
| 68 | class AesTestInitialized : public AesTest { |
| 69 | protected: |
| 70 | dif_aes_t aes_; |
| 71 | |
Douglas Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 72 | dif_aes_transaction_t transaction = { |
Pirmin Vogel | 553759a | 2022-01-28 18:32:37 +0100 | [diff] [blame] | 73 | .operation = kDifAesOperationEncrypt, |
| 74 | .mode = kDifAesModeEcb, |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 75 | .key_len = kDifAesKey128, |
Pirmin Vogel | 553759a | 2022-01-28 18:32:37 +0100 | [diff] [blame] | 76 | .manual_operation = kDifAesManualOperationAuto, |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 77 | .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 Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 92 | class EcbTest : public AesTestInitialized { |
| 93 | protected: |
| 94 | EcbTest() { transaction.mode = kDifAesModeEcb; } |
| 95 | }; |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 96 | |
| 97 | TEST_F(EcbTest, start) { |
| 98 | EXPECT_READ32(AES_STATUS_REG_OFFSET, 1); |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 99 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 102 | setExpectedKey(kKey_, 8); |
| 103 | |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 104 | EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, NULL), kDifOk); |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 105 | } |
| 106 | |
Douglas Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 107 | class CbcTest : public AesTestInitialized { |
| 108 | protected: |
| 109 | CbcTest() { transaction.mode = kDifAesModeCbc; } |
| 110 | }; |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 111 | |
| 112 | TEST_F(CbcTest, start) { |
| 113 | EXPECT_READ32(AES_STATUS_REG_OFFSET, 1); |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 114 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 117 | setExpectedKey(kKey_, 8); |
| 118 | setExpectedIv(kIv_); |
| 119 | |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 120 | EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk); |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 121 | } |
| 122 | |
| 123 | // CFB tests |
Douglas Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 124 | class CFBTest : public AesTestInitialized { |
| 125 | protected: |
| 126 | CFBTest() { transaction.mode = kDifAesModeCfb; } |
| 127 | }; |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 128 | |
| 129 | TEST_F(CFBTest, start) { |
| 130 | EXPECT_READ32(AES_STATUS_REG_OFFSET, 1); |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 131 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 134 | setExpectedKey(kKey_, 8); |
| 135 | setExpectedIv(kIv_); |
| 136 | |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 137 | EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk); |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 138 | } |
| 139 | |
| 140 | // OFB tests |
Douglas Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 141 | class OFBTest : public AesTestInitialized { |
| 142 | protected: |
| 143 | OFBTest() { transaction.mode = kDifAesModeOfb; } |
| 144 | }; |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 145 | |
| 146 | TEST_F(OFBTest, start) { |
| 147 | EXPECT_READ32(AES_STATUS_REG_OFFSET, 1); |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 148 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 151 | setExpectedKey(kKey_, 8); |
| 152 | setExpectedIv(kIv_); |
| 153 | |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 154 | EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk); |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 155 | } |
| 156 | |
| 157 | // CTR tests |
Douglas Reis | 0c2ddc1 | 2022-02-09 11:37:07 +0000 | [diff] [blame] | 158 | class CTRTest : public AesTestInitialized { |
| 159 | protected: |
| 160 | CTRTest() { transaction.mode = kDifAesModeCtr; } |
| 161 | }; |
Douglas Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 162 | |
| 163 | TEST_F(CTRTest, start) { |
| 164 | EXPECT_READ32(AES_STATUS_REG_OFFSET, 1); |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 165 | 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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 168 | setExpectedKey(kKey_, 8); |
| 169 | setExpectedIv(kIv_); |
| 170 | |
Douglas Reis | 0950858 | 2022-02-09 11:56:42 +0000 | [diff] [blame^] | 171 | EXPECT_EQ(dif_aes_start(&aes_, &transaction, kKey_, &kIv_), kDifOk); |
| 172 | } |
| 173 | |
| 174 | // Decrypt tests |
| 175 | class DecryptTest : public AesTestInitialized { |
| 176 | protected: |
| 177 | DecryptTest() { |
| 178 | transaction.mode = kDifAesModeEcb; |
| 179 | transaction.operation = kDifAesOperationDecrypt; |
| 180 | } |
| 181 | }; |
| 182 | |
| 183 | TEST_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 Reis | 9ab20c3 | 2021-10-25 10:44:03 +0100 | [diff] [blame] | 191 | } |
Silvestrs Timofejevs | b33dbd6 | 2020-06-02 17:12:51 +0100 | [diff] [blame] | 192 | |
| 193 | } // namespace |
| 194 | } // namespace dif_aes_test |