| #include <stdint.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; |
| } |
| } |