xref: /qemu/tests/tcg/aarch64/system/pauth-3.c (revision a976a99a)
1 #include <stdint.h>
2 #include <minilib.h>
3 
4 int main()
5 {
6     /*
7      * Test vector from QARMA paper (https://eprint.iacr.org/2016/444.pdf)
8      * to verify one computation of the pauth_computepac() function,
9      * which uses sbox2.
10      *
11      * Use PACGA, because it returns the most bits from ComputePAC.
12      * We still only get the most significant 32-bits of the result.
13      */
14 
15     static const uint64_t d[5] = {
16         0xfb623599da6e8127ull,
17         0x477d469dec0b8762ull,
18         0x84be85ce9804e94bull,
19         0xec2802d4e0a488e9ull,
20         0xc003b93999b33765ull & 0xffffffff00000000ull
21     };
22     uint64_t r;
23 
24     asm("msr apgakeyhi_el1, %[w0]\n\t"
25         "msr apgakeylo_el1, %[k0]\n\t"
26         "pacga %[r], %[P], %[T]"
27         : [r] "=r"(r)
28         : [P] "r" (d[0]),
29           [T] "r" (d[1]),
30           [w0] "r" (d[2]),
31           [k0] "r" (d[3]));
32 
33     if (r == d[4]) {
34         ml_printf("OK\n");
35         return 0;
36     } else {
37         ml_printf("FAIL: %lx != %lx\n", r, d[4]);
38         return 1;
39     }
40 }
41