mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-09 10:34:58 -06:00
target/arm: Implement FEAT_PACQARMA3
Implement the QARMA3 cryptographic algorithm for PAC calculation. Implement a cpu feature to select the algorithm and document it. Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20230829232335.965414-6-richard.henderson@linaro.org Message-Id: <20230609172324.982888-4-aaron@os.amperecomputing.com> [rth: Merge cpu feature addition from another patch.] Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
6c3427eec5
commit
399e5e7125
7 changed files with 94 additions and 23 deletions
|
@ -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] = {
|
||||
0x0000000000000000ull,
|
||||
|
@ -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,48 @@ 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 +315,9 @@ static uint64_t pauth_computepac(CPUARMState *env, uint64_t data,
|
|||
uint64_t modifier, ARMPACKey key)
|
||||
{
|
||||
if (cpu_isar_feature(aa64_pauth_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_qarma3, env_archcpu(env))) {
|
||||
return pauth_computepac_architected(data, modifier, key, true);
|
||||
} else {
|
||||
return pauth_computepac_impdef(data, modifier, key);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue