Re: [PATCH v2 2/7] target/arm: Implement v8.3 QARMA3 PAC cipher

2023-02-22 Thread Richard Henderson

On 2/22/23 09:35, Aaron Lindsay wrote:

-workingval = pac_sub(workingval);
+if (isqarma3)
+workingval = pac_sub1(workingval);
+else
+workingval = pac_sub(workingval);


Braces required for all if+else.  Multiple instances.

Otherwise,
Reviewed-by: Richard Henderson 


r~



[PATCH v2 2/7] target/arm: Implement v8.3 QARMA3 PAC cipher

2023-02-22 Thread Aaron Lindsay
Signed-off-by: Aaron Lindsay 
Reviewed-by: Peter Maydell 
---
 target/arm/pauth_helper.c | 50 +++
 1 file changed, 40 insertions(+), 10 deletions(-)

diff --git a/target/arm/pauth_helper.c b/target/arm/pauth_helper.c
index e5206453f6..f525ef7fad 100644
--- a/target/arm/pauth_helper.c
+++ b/target/arm/pauth_helper.c
@@ -96,6 +96,21 @@ static uint64_t pac_sub(uint64_t i)
 return o;
 }
 
+static uint64_t pac_sub1(uint64_t i)
+{
+static const uint8_t sub1[16] = {
+0xa, 0xd, 0xe, 0x6, 0xf, 0x7, 0x3, 0x5,
+0x9, 0x8, 0x0, 0xc, 0xb, 0x1, 0x2, 0x4,
+};
+uint64_t o = 0;
+int b;
+
+for (b = 0; b < 64; b += 4) {
+o |= (uint64_t)sub1[(i >> b) & 0xf] << b;
+}
+return o;
+}
+
 static uint64_t pac_inv_sub(uint64_t i)
 {
 static const uint8_t inv_sub[16] = {
@@ -209,7 +224,7 @@ static uint64_t tweak_inv_shuffle(uint64_t i)
 }
 
 static uint64_t pauth_computepac_architected(uint64_t data, uint64_t modifier,
- ARMPACKey key)
+ ARMPACKey key, bool isqarma3)
 {
 static const uint64_t RC[5] = {
 0xull,
@@ -219,6 +234,7 @@ static uint64_t pauth_computepac_architected(uint64_t data, 
uint64_t modifier,
 0x452821E638D01377ull,
 };
 const uint64_t alpha = 0xC0AC29B7C97C50DDull;
+int iterations = isqarma3 ? 2 : 4;
 /*
  * Note that in the ARM pseudocode, key0 contains bits <127:64>
  * and key1 contains bits <63:0> of the 128-bit key.
@@ -231,7 +247,7 @@ static uint64_t pauth_computepac_architected(uint64_t data, 
uint64_t modifier,
 runningmod = modifier;
 workingval = data ^ key0;
 
-for (i = 0; i <= 4; ++i) {
+for (i = 0; i <= iterations; ++i) {
 roundkey = key1 ^ runningmod;
 workingval ^= roundkey;
 workingval ^= RC[i];
@@ -239,32 +255,44 @@ static uint64_t pauth_computepac_architected(uint64_t 
data, uint64_t modifier,
 workingval = pac_cell_shuffle(workingval);
 workingval = pac_mult(workingval);
 }
-workingval = pac_sub(workingval);
+if (isqarma3)
+workingval = pac_sub1(workingval);
+else
+workingval = pac_sub(workingval);
 runningmod = tweak_shuffle(runningmod);
 }
 roundkey = modk0 ^ runningmod;
 workingval ^= roundkey;
 workingval = pac_cell_shuffle(workingval);
 workingval = pac_mult(workingval);
-workingval = pac_sub(workingval);
+if (isqarma3)
+workingval = pac_sub1(workingval);
+else
+workingval = pac_sub(workingval);
 workingval = pac_cell_shuffle(workingval);
 workingval = pac_mult(workingval);
 workingval ^= key1;
 workingval = pac_cell_inv_shuffle(workingval);
-workingval = pac_inv_sub(workingval);
+if (isqarma3)
+workingval = pac_sub1(workingval);
+else
+workingval = pac_inv_sub(workingval);
 workingval = pac_mult(workingval);
 workingval = pac_cell_inv_shuffle(workingval);
 workingval ^= key0;
 workingval ^= runningmod;
-for (i = 0; i <= 4; ++i) {
-workingval = pac_inv_sub(workingval);
-if (i < 4) {
+for (i = 0; i <= iterations; ++i) {
+if (isqarma3)
+workingval = pac_sub1(workingval);
+else
+workingval = pac_inv_sub(workingval);
+if (i < iterations) {
 workingval = pac_mult(workingval);
 workingval = pac_cell_inv_shuffle(workingval);
 }
 runningmod = tweak_inv_shuffle(runningmod);
 roundkey = key1 ^ runningmod;
-workingval ^= RC[4 - i];
+workingval ^= RC[iterations - i];
 workingval ^= roundkey;
 workingval ^= alpha;
 }
@@ -283,7 +311,9 @@ static uint64_t pauth_computepac(CPUARMState *env, uint64_t 
data,
  uint64_t modifier, ARMPACKey key)
 {
 if (cpu_isar_feature(aa64_pauth_arch_qarma5, env_archcpu(env))) {
-return pauth_computepac_architected(data, modifier, key);
+return pauth_computepac_architected(data, modifier, key, false);
+} else if (cpu_isar_feature(aa64_pauth_arch_qarma3, env_archcpu(env))) {
+return pauth_computepac_architected(data, modifier, key, true);
 } else {
 return pauth_computepac_impdef(data, modifier, key);
 }
-- 
2.25.1