summaryrefslogtreecommitdiff
path: root/tests/tcg/aarch64/system/pauth-3.c
blob: 42eff4d5eae926e041837b7aa5a8677299430a65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <inttypes.h>
#include <minilib.h>

int main()
{
    /*
     * Test vector from QARMA paper (https://eprint.iacr.org/2016/444.pdf)
     * to verify one computation of the pauth_computepac() function,
     * which uses sbox2.
     *
     * Use PACGA, because it returns the most bits from ComputePAC.
     * We still only get the most significant 32-bits of the result.
     */

    static const uint64_t d[5] = {
        0xfb623599da6e8127ull,
        0x477d469dec0b8762ull,
        0x84be85ce9804e94bull,
        0xec2802d4e0a488e9ull,
        0xc003b93999b33765ull & 0xffffffff00000000ull
    };
    uint64_t r;

    asm("msr apgakeyhi_el1, %[w0]\n\t"
        "msr apgakeylo_el1, %[k0]\n\t"
        "pacga %[r], %[P], %[T]"
        : [r] "=r"(r)
        : [P] "r" (d[0]),
          [T] "r" (d[1]),
          [w0] "r" (d[2]),
          [k0] "r" (d[3]));

    if (r == d[4]) {
        ml_printf("OK\n");
        return 0;
    } else {
        ml_printf("FAIL: %lx != %lx\n", r, d[4]);
        return 1;
    }
}