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