1 /* 2 * QTest testcase for the ASPEED Hash and Crypto Engine 3 * 4 * SPDX-License-Identifier: GPL-2.0-or-later 5 * Copyright 2021 IBM Corp. 6 */ 7 8 #include "qemu/osdep.h" 9 10 #include "libqtest.h" 11 #include "qemu/bitops.h" 12 13 #define HACE_CMD 0x10 14 #define HACE_SHA_BE_EN BIT(3) 15 #define HACE_MD5_LE_EN BIT(2) 16 #define HACE_ALGO_MD5 0 17 #define HACE_ALGO_SHA1 BIT(5) 18 #define HACE_ALGO_SHA224 BIT(6) 19 #define HACE_ALGO_SHA256 (BIT(4) | BIT(6)) 20 #define HACE_ALGO_SHA512 (BIT(5) | BIT(6)) 21 #define HACE_ALGO_SHA384 (BIT(5) | BIT(6) | BIT(10)) 22 #define HACE_SG_EN BIT(18) 23 #define HACE_ACCUM_EN BIT(8) 24 25 #define HACE_STS 0x1c 26 #define HACE_RSA_ISR BIT(13) 27 #define HACE_CRYPTO_ISR BIT(12) 28 #define HACE_HASH_ISR BIT(9) 29 #define HACE_RSA_BUSY BIT(2) 30 #define HACE_CRYPTO_BUSY BIT(1) 31 #define HACE_HASH_BUSY BIT(0) 32 #define HACE_HASH_SRC 0x20 33 #define HACE_HASH_DIGEST 0x24 34 #define HACE_HASH_KEY_BUFF 0x28 35 #define HACE_HASH_DATA_LEN 0x2c 36 #define HACE_HASH_CMD 0x30 37 /* Scatter-Gather Hash */ 38 #define SG_LIST_LEN_LAST BIT(31) 39 struct AspeedSgList { 40 uint32_t len; 41 uint32_t addr; 42 } __attribute__ ((__packed__)); 43 44 /* 45 * Test vector is the ascii "abc" 46 * 47 * Expected results were generated using command line utitiles: 48 * 49 * echo -n -e 'abc' | dd of=/tmp/test 50 * for hash in sha512sum sha256sum md5sum; do $hash /tmp/test; done 51 * 52 */ 53 static const uint8_t test_vector[] = {0x61, 0x62, 0x63}; 54 55 static const uint8_t test_result_sha512[] = { 56 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 57 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 58 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 59 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 60 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 61 0xa5, 0x4c, 0xa4, 0x9f}; 62 63 static const uint8_t test_result_sha256[] = { 64 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 65 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 66 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}; 67 68 static const uint8_t test_result_md5[] = { 69 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0, 0xd6, 0x96, 0x3f, 0x7d, 70 0x28, 0xe1, 0x7f, 0x72}; 71 72 /* 73 * The Scatter-Gather Test vector is the ascii "abc" "def" "ghi", broken 74 * into blocks of 3 characters as shown 75 * 76 * Expected results were generated using command line utitiles: 77 * 78 * echo -n -e 'abcdefghijkl' | dd of=/tmp/test 79 * for hash in sha512sum sha256sum; do $hash /tmp/test; done 80 * 81 */ 82 static const uint8_t test_vector_sg1[] = {0x61, 0x62, 0x63, 0x64, 0x65, 0x66}; 83 static const uint8_t test_vector_sg2[] = {0x67, 0x68, 0x69}; 84 static const uint8_t test_vector_sg3[] = {0x6a, 0x6b, 0x6c}; 85 86 static const uint8_t test_result_sg_sha512[] = { 87 0x17, 0x80, 0x7c, 0x72, 0x8e, 0xe3, 0xba, 0x35, 0xe7, 0xcf, 0x7a, 0xf8, 88 0x23, 0x11, 0x6d, 0x26, 0xe4, 0x1e, 0x5d, 0x4d, 0x6c, 0x2f, 0xf1, 0xf3, 89 0x72, 0x0d, 0x3d, 0x96, 0xaa, 0xcb, 0x6f, 0x69, 0xde, 0x64, 0x2e, 0x63, 90 0xd5, 0xb7, 0x3f, 0xc3, 0x96, 0xc1, 0x2b, 0xe3, 0x8b, 0x2b, 0xd5, 0xd8, 91 0x84, 0x25, 0x7c, 0x32, 0xc8, 0xf6, 0xd0, 0x85, 0x4a, 0xe6, 0xb5, 0x40, 92 0xf8, 0x6d, 0xda, 0x2e}; 93 94 static const uint8_t test_result_sg_sha256[] = { 95 0xd6, 0x82, 0xed, 0x4c, 0xa4, 0xd9, 0x89, 0xc1, 0x34, 0xec, 0x94, 0xf1, 96 0x55, 0x1e, 0x1e, 0xc5, 0x80, 0xdd, 0x6d, 0x5a, 0x6e, 0xcd, 0xe9, 0xf3, 97 0xd3, 0x5e, 0x6e, 0x4a, 0x71, 0x7f, 0xbd, 0xe4}; 98 99 /* 100 * The accumulative mode requires firmware to provide internal initial state 101 * and message padding (including length L at the end of padding). 102 * 103 * This test vector is a ascii text "abc" with padding message. 104 * 105 * Expected results were generated using command line utitiles: 106 * 107 * echo -n -e 'abc' | dd of=/tmp/test 108 * for hash in sha512sum sha256sum; do $hash /tmp/test; done 109 */ 110 static const uint8_t test_vector_accum_512[] = { 111 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00, 112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 122 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 123 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 126 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18}; 127 128 static const uint8_t test_vector_accum_256[] = { 129 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00, 130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18}; 137 138 static const uint8_t test_result_accum_sha512[] = { 139 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49, 140 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2, 141 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a, 142 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd, 143 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f, 144 0xa5, 0x4c, 0xa4, 0x9f}; 145 146 static const uint8_t test_result_accum_sha256[] = { 147 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde, 148 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c, 149 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad}; 150 151 static void write_regs(QTestState *s, uint32_t base, uint32_t src, 152 uint32_t length, uint32_t out, uint32_t method) 153 { 154 qtest_writel(s, base + HACE_HASH_SRC, src); 155 qtest_writel(s, base + HACE_HASH_DIGEST, out); 156 qtest_writel(s, base + HACE_HASH_DATA_LEN, length); 157 qtest_writel(s, base + HACE_HASH_CMD, HACE_SHA_BE_EN | method); 158 } 159 160 static void test_md5(const char *machine, const uint32_t base, 161 const uint32_t src_addr) 162 163 { 164 QTestState *s = qtest_init(machine); 165 166 uint32_t digest_addr = src_addr + 0x01000000; 167 uint8_t digest[16] = {0}; 168 169 /* Check engine is idle, no busy or irq bits set */ 170 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 171 172 /* Write test vector into memory */ 173 qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 174 175 write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, HACE_ALGO_MD5); 176 177 /* Check hash IRQ status is asserted */ 178 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 179 180 /* Clear IRQ status and check status is deasserted */ 181 qtest_writel(s, base + HACE_STS, 0x00000200); 182 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 183 184 /* Read computed digest from memory */ 185 qtest_memread(s, digest_addr, digest, sizeof(digest)); 186 187 /* Check result of computation */ 188 g_assert_cmpmem(digest, sizeof(digest), 189 test_result_md5, sizeof(digest)); 190 191 qtest_quit(s); 192 } 193 194 static void test_sha256(const char *machine, const uint32_t base, 195 const uint32_t src_addr) 196 { 197 QTestState *s = qtest_init(machine); 198 199 const uint32_t digest_addr = src_addr + 0x1000000; 200 uint8_t digest[32] = {0}; 201 202 /* Check engine is idle, no busy or irq bits set */ 203 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 204 205 /* Write test vector into memory */ 206 qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 207 208 write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, HACE_ALGO_SHA256); 209 210 /* Check hash IRQ status is asserted */ 211 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 212 213 /* Clear IRQ status and check status is deasserted */ 214 qtest_writel(s, base + HACE_STS, 0x00000200); 215 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 216 217 /* Read computed digest from memory */ 218 qtest_memread(s, digest_addr, digest, sizeof(digest)); 219 220 /* Check result of computation */ 221 g_assert_cmpmem(digest, sizeof(digest), 222 test_result_sha256, sizeof(digest)); 223 224 qtest_quit(s); 225 } 226 227 static void test_sha512(const char *machine, const uint32_t base, 228 const uint32_t src_addr) 229 { 230 QTestState *s = qtest_init(machine); 231 232 const uint32_t digest_addr = src_addr + 0x1000000; 233 uint8_t digest[64] = {0}; 234 235 /* Check engine is idle, no busy or irq bits set */ 236 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 237 238 /* Write test vector into memory */ 239 qtest_memwrite(s, src_addr, test_vector, sizeof(test_vector)); 240 241 write_regs(s, base, src_addr, sizeof(test_vector), digest_addr, HACE_ALGO_SHA512); 242 243 /* Check hash IRQ status is asserted */ 244 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 245 246 /* Clear IRQ status and check status is deasserted */ 247 qtest_writel(s, base + HACE_STS, 0x00000200); 248 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 249 250 /* Read computed digest from memory */ 251 qtest_memread(s, digest_addr, digest, sizeof(digest)); 252 253 /* Check result of computation */ 254 g_assert_cmpmem(digest, sizeof(digest), 255 test_result_sha512, sizeof(digest)); 256 257 qtest_quit(s); 258 } 259 260 static void test_sha256_sg(const char *machine, const uint32_t base, 261 const uint32_t src_addr) 262 { 263 QTestState *s = qtest_init(machine); 264 265 const uint32_t src_addr_1 = src_addr + 0x1000000; 266 const uint32_t src_addr_2 = src_addr + 0x2000000; 267 const uint32_t src_addr_3 = src_addr + 0x3000000; 268 const uint32_t digest_addr = src_addr + 0x4000000; 269 uint8_t digest[32] = {0}; 270 struct AspeedSgList array[] = { 271 { cpu_to_le32(sizeof(test_vector_sg1)), 272 cpu_to_le32(src_addr_1) }, 273 { cpu_to_le32(sizeof(test_vector_sg2)), 274 cpu_to_le32(src_addr_2) }, 275 { cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST), 276 cpu_to_le32(src_addr_3) }, 277 }; 278 279 /* Check engine is idle, no busy or irq bits set */ 280 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 281 282 /* Write test vector into memory */ 283 qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1)); 284 qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2)); 285 qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3)); 286 qtest_memwrite(s, src_addr, array, sizeof(array)); 287 288 write_regs(s, base, src_addr, 289 (sizeof(test_vector_sg1) 290 + sizeof(test_vector_sg2) 291 + sizeof(test_vector_sg3)), 292 digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN); 293 294 /* Check hash IRQ status is asserted */ 295 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 296 297 /* Clear IRQ status and check status is deasserted */ 298 qtest_writel(s, base + HACE_STS, 0x00000200); 299 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 300 301 /* Read computed digest from memory */ 302 qtest_memread(s, digest_addr, digest, sizeof(digest)); 303 304 /* Check result of computation */ 305 g_assert_cmpmem(digest, sizeof(digest), 306 test_result_sg_sha256, sizeof(digest)); 307 308 qtest_quit(s); 309 } 310 311 static void test_sha512_sg(const char *machine, const uint32_t base, 312 const uint32_t src_addr) 313 { 314 QTestState *s = qtest_init(machine); 315 316 const uint32_t src_addr_1 = src_addr + 0x1000000; 317 const uint32_t src_addr_2 = src_addr + 0x2000000; 318 const uint32_t src_addr_3 = src_addr + 0x3000000; 319 const uint32_t digest_addr = src_addr + 0x4000000; 320 uint8_t digest[64] = {0}; 321 struct AspeedSgList array[] = { 322 { cpu_to_le32(sizeof(test_vector_sg1)), 323 cpu_to_le32(src_addr_1) }, 324 { cpu_to_le32(sizeof(test_vector_sg2)), 325 cpu_to_le32(src_addr_2) }, 326 { cpu_to_le32(sizeof(test_vector_sg3) | SG_LIST_LEN_LAST), 327 cpu_to_le32(src_addr_3) }, 328 }; 329 330 /* Check engine is idle, no busy or irq bits set */ 331 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 332 333 /* Write test vector into memory */ 334 qtest_memwrite(s, src_addr_1, test_vector_sg1, sizeof(test_vector_sg1)); 335 qtest_memwrite(s, src_addr_2, test_vector_sg2, sizeof(test_vector_sg2)); 336 qtest_memwrite(s, src_addr_3, test_vector_sg3, sizeof(test_vector_sg3)); 337 qtest_memwrite(s, src_addr, array, sizeof(array)); 338 339 write_regs(s, base, src_addr, 340 (sizeof(test_vector_sg1) 341 + sizeof(test_vector_sg2) 342 + sizeof(test_vector_sg3)), 343 digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN); 344 345 /* Check hash IRQ status is asserted */ 346 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 347 348 /* Clear IRQ status and check status is deasserted */ 349 qtest_writel(s, base + HACE_STS, 0x00000200); 350 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 351 352 /* Read computed digest from memory */ 353 qtest_memread(s, digest_addr, digest, sizeof(digest)); 354 355 /* Check result of computation */ 356 g_assert_cmpmem(digest, sizeof(digest), 357 test_result_sg_sha512, sizeof(digest)); 358 359 qtest_quit(s); 360 } 361 362 static void test_sha256_accum(const char *machine, const uint32_t base, 363 const uint32_t src_addr) 364 { 365 QTestState *s = qtest_init(machine); 366 367 const uint32_t buffer_addr = src_addr + 0x1000000; 368 const uint32_t digest_addr = src_addr + 0x4000000; 369 uint8_t digest[32] = {0}; 370 struct AspeedSgList array[] = { 371 { cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST), 372 cpu_to_le32(buffer_addr) }, 373 }; 374 375 /* Check engine is idle, no busy or irq bits set */ 376 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 377 378 /* Write test vector into memory */ 379 qtest_memwrite(s, buffer_addr, test_vector_accum_256, 380 sizeof(test_vector_accum_256)); 381 qtest_memwrite(s, src_addr, array, sizeof(array)); 382 383 write_regs(s, base, src_addr, sizeof(test_vector_accum_256), 384 digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN); 385 386 /* Check hash IRQ status is asserted */ 387 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 388 389 /* Clear IRQ status and check status is deasserted */ 390 qtest_writel(s, base + HACE_STS, 0x00000200); 391 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 392 393 /* Read computed digest from memory */ 394 qtest_memread(s, digest_addr, digest, sizeof(digest)); 395 396 /* Check result of computation */ 397 g_assert_cmpmem(digest, sizeof(digest), 398 test_result_accum_sha256, sizeof(digest)); 399 400 qtest_quit(s); 401 } 402 403 static void test_sha512_accum(const char *machine, const uint32_t base, 404 const uint32_t src_addr) 405 { 406 QTestState *s = qtest_init(machine); 407 408 const uint32_t buffer_addr = src_addr + 0x1000000; 409 const uint32_t digest_addr = src_addr + 0x4000000; 410 uint8_t digest[64] = {0}; 411 struct AspeedSgList array[] = { 412 { cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST), 413 cpu_to_le32(buffer_addr) }, 414 }; 415 416 /* Check engine is idle, no busy or irq bits set */ 417 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 418 419 /* Write test vector into memory */ 420 qtest_memwrite(s, buffer_addr, test_vector_accum_512, 421 sizeof(test_vector_accum_512)); 422 qtest_memwrite(s, src_addr, array, sizeof(array)); 423 424 write_regs(s, base, src_addr, sizeof(test_vector_accum_512), 425 digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN); 426 427 /* Check hash IRQ status is asserted */ 428 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200); 429 430 /* Clear IRQ status and check status is deasserted */ 431 qtest_writel(s, base + HACE_STS, 0x00000200); 432 g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0); 433 434 /* Read computed digest from memory */ 435 qtest_memread(s, digest_addr, digest, sizeof(digest)); 436 437 /* Check result of computation */ 438 g_assert_cmpmem(digest, sizeof(digest), 439 test_result_accum_sha512, sizeof(digest)); 440 441 qtest_quit(s); 442 } 443 444 struct masks { 445 uint32_t src; 446 uint32_t dest; 447 uint32_t len; 448 }; 449 450 static const struct masks ast2600_masks = { 451 .src = 0x7fffffff, 452 .dest = 0x7ffffff8, 453 .len = 0x0fffffff, 454 }; 455 456 static const struct masks ast2500_masks = { 457 .src = 0x3fffffff, 458 .dest = 0x3ffffff8, 459 .len = 0x0fffffff, 460 }; 461 462 static const struct masks ast2400_masks = { 463 .src = 0x0fffffff, 464 .dest = 0x0ffffff8, 465 .len = 0x0fffffff, 466 }; 467 468 static void test_addresses(const char *machine, const uint32_t base, 469 const struct masks *expected) 470 { 471 QTestState *s = qtest_init(machine); 472 473 /* 474 * Check command mode is zero, meaning engine is in direct access mode, 475 * as this affects the masking behavior of the HASH_SRC register. 476 */ 477 g_assert_cmphex(qtest_readl(s, base + HACE_CMD), ==, 0); 478 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0); 479 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0); 480 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0); 481 482 483 /* Check that the address masking is correct */ 484 qtest_writel(s, base + HACE_HASH_SRC, 0xffffffff); 485 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, expected->src); 486 487 qtest_writel(s, base + HACE_HASH_DIGEST, 0xffffffff); 488 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, expected->dest); 489 490 qtest_writel(s, base + HACE_HASH_DATA_LEN, 0xffffffff); 491 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, expected->len); 492 493 /* Reset to zero */ 494 qtest_writel(s, base + HACE_HASH_SRC, 0); 495 qtest_writel(s, base + HACE_HASH_DIGEST, 0); 496 qtest_writel(s, base + HACE_HASH_DATA_LEN, 0); 497 498 /* Check that all bits are now zero */ 499 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_SRC), ==, 0); 500 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DIGEST), ==, 0); 501 g_assert_cmphex(qtest_readl(s, base + HACE_HASH_DATA_LEN), ==, 0); 502 503 qtest_quit(s); 504 } 505 506 /* ast2600 */ 507 static void test_md5_ast2600(void) 508 { 509 test_md5("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 510 } 511 512 static void test_sha256_ast2600(void) 513 { 514 test_sha256("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 515 } 516 517 static void test_sha256_sg_ast2600(void) 518 { 519 test_sha256_sg("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 520 } 521 522 static void test_sha512_ast2600(void) 523 { 524 test_sha512("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 525 } 526 527 static void test_sha512_sg_ast2600(void) 528 { 529 test_sha512_sg("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 530 } 531 532 static void test_sha256_accum_ast2600(void) 533 { 534 test_sha256_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 535 } 536 537 static void test_sha512_accum_ast2600(void) 538 { 539 test_sha512_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000); 540 } 541 542 static void test_addresses_ast2600(void) 543 { 544 test_addresses("-machine ast2600-evb", 0x1e6d0000, &ast2600_masks); 545 } 546 547 /* ast2500 */ 548 static void test_md5_ast2500(void) 549 { 550 test_md5("-machine ast2500-evb", 0x1e6e3000, 0x80000000); 551 } 552 553 static void test_sha256_ast2500(void) 554 { 555 test_sha256("-machine ast2500-evb", 0x1e6e3000, 0x80000000); 556 } 557 558 static void test_sha512_ast2500(void) 559 { 560 test_sha512("-machine ast2500-evb", 0x1e6e3000, 0x80000000); 561 } 562 563 static void test_addresses_ast2500(void) 564 { 565 test_addresses("-machine ast2500-evb", 0x1e6e3000, &ast2500_masks); 566 } 567 568 /* ast2400 */ 569 static void test_md5_ast2400(void) 570 { 571 test_md5("-machine palmetto-bmc", 0x1e6e3000, 0x40000000); 572 } 573 574 static void test_sha256_ast2400(void) 575 { 576 test_sha256("-machine palmetto-bmc", 0x1e6e3000, 0x40000000); 577 } 578 579 static void test_sha512_ast2400(void) 580 { 581 test_sha512("-machine palmetto-bmc", 0x1e6e3000, 0x40000000); 582 } 583 584 static void test_addresses_ast2400(void) 585 { 586 test_addresses("-machine palmetto-bmc", 0x1e6e3000, &ast2400_masks); 587 } 588 589 int main(int argc, char **argv) 590 { 591 g_test_init(&argc, &argv, NULL); 592 593 qtest_add_func("ast2600/hace/addresses", test_addresses_ast2600); 594 qtest_add_func("ast2600/hace/sha512", test_sha512_ast2600); 595 qtest_add_func("ast2600/hace/sha256", test_sha256_ast2600); 596 qtest_add_func("ast2600/hace/md5", test_md5_ast2600); 597 598 qtest_add_func("ast2600/hace/sha512_sg", test_sha512_sg_ast2600); 599 qtest_add_func("ast2600/hace/sha256_sg", test_sha256_sg_ast2600); 600 601 qtest_add_func("ast2600/hace/sha512_accum", test_sha512_accum_ast2600); 602 qtest_add_func("ast2600/hace/sha256_accum", test_sha256_accum_ast2600); 603 604 qtest_add_func("ast2500/hace/addresses", test_addresses_ast2500); 605 qtest_add_func("ast2500/hace/sha512", test_sha512_ast2500); 606 qtest_add_func("ast2500/hace/sha256", test_sha256_ast2500); 607 qtest_add_func("ast2500/hace/md5", test_md5_ast2500); 608 609 qtest_add_func("ast2400/hace/addresses", test_addresses_ast2400); 610 qtest_add_func("ast2400/hace/sha512", test_sha512_ast2400); 611 qtest_add_func("ast2400/hace/sha256", test_sha256_ast2400); 612 qtest_add_func("ast2400/hace/md5", test_md5_ast2400); 613 614 return g_test_run(); 615 } 616