xref: /qemu/tests/tcg/aarch64/system/pauth-3.c (revision bb52a8a2)
1bb52a8a2SPaolo Bonzini #include <stdint.h>
273fc0798SRichard Henderson #include <minilib.h>
373fc0798SRichard Henderson 
main()473fc0798SRichard Henderson int main()
573fc0798SRichard Henderson {
673fc0798SRichard Henderson     /*
773fc0798SRichard Henderson      * Test vector from QARMA paper (https://eprint.iacr.org/2016/444.pdf)
873fc0798SRichard Henderson      * to verify one computation of the pauth_computepac() function,
973fc0798SRichard Henderson      * which uses sbox2.
1073fc0798SRichard Henderson      *
1173fc0798SRichard Henderson      * Use PACGA, because it returns the most bits from ComputePAC.
1273fc0798SRichard Henderson      * We still only get the most significant 32-bits of the result.
1373fc0798SRichard Henderson      */
1473fc0798SRichard Henderson 
1573fc0798SRichard Henderson     static const uint64_t d[5] = {
1673fc0798SRichard Henderson         0xfb623599da6e8127ull,
1773fc0798SRichard Henderson         0x477d469dec0b8762ull,
1873fc0798SRichard Henderson         0x84be85ce9804e94bull,
1973fc0798SRichard Henderson         0xec2802d4e0a488e9ull,
2073fc0798SRichard Henderson         0xc003b93999b33765ull & 0xffffffff00000000ull
2173fc0798SRichard Henderson     };
2273fc0798SRichard Henderson     uint64_t r;
2373fc0798SRichard Henderson 
2473fc0798SRichard Henderson     asm("msr apgakeyhi_el1, %[w0]\n\t"
2573fc0798SRichard Henderson         "msr apgakeylo_el1, %[k0]\n\t"
2673fc0798SRichard Henderson         "pacga %[r], %[P], %[T]"
2773fc0798SRichard Henderson         : [r] "=r"(r)
2873fc0798SRichard Henderson         : [P] "r" (d[0]),
2973fc0798SRichard Henderson           [T] "r" (d[1]),
3073fc0798SRichard Henderson           [w0] "r" (d[2]),
3173fc0798SRichard Henderson           [k0] "r" (d[3]));
3273fc0798SRichard Henderson 
3373fc0798SRichard Henderson     if (r == d[4]) {
3473fc0798SRichard Henderson         ml_printf("OK\n");
3573fc0798SRichard Henderson         return 0;
3673fc0798SRichard Henderson     } else {
3773fc0798SRichard Henderson         ml_printf("FAIL: %lx != %lx\n", r, d[4]);
3873fc0798SRichard Henderson         return 1;
3973fc0798SRichard Henderson     }
4073fc0798SRichard Henderson }
41