mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-06-07 13:03:45 +02:00
AES on pi4
This commit is contained in:
parent
37360d5e2e
commit
7d5ba6f739
1 changed files with 167 additions and 90 deletions
83
core/AES.cpp
83
core/AES.cpp
|
@ -1057,20 +1057,96 @@ void AES::CTR::crypt(const void *const input, unsigned int len) noexcept
|
||||||
out += totalLen;
|
out += totalLen;
|
||||||
_len = (totalLen + len);
|
_len = (totalLen + len);
|
||||||
|
|
||||||
|
{
|
||||||
const uint32_t *const restrict rk = _aes._k.sw.ek;
|
const uint32_t *const restrict rk = _aes._k.sw.ek;
|
||||||
const uint32_t m8 = 0xff;
|
|
||||||
const uint32_t ctr0rk0 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[0]) ^rk[0];
|
const uint32_t ctr0rk0 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[0]) ^rk[0];
|
||||||
const uint32_t ctr1rk1 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[1]) ^rk[1];
|
const uint32_t ctr1rk1 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[1]) ^rk[1];
|
||||||
const uint32_t ctr2rk2 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[2]) ^rk[2];
|
const uint32_t ctr2rk2 = Utils::ntoh(reinterpret_cast<uint32_t *>(_ctr)[2]) ^rk[2];
|
||||||
const uint32_t m8_24 = 0xff000000;
|
const uint32_t m8 = 0x000000ff;
|
||||||
const uint32_t m8_16 = 0x00ff0000;
|
|
||||||
const uint32_t m8_8 = 0x0000ff00;
|
const uint32_t m8_8 = 0x0000ff00;
|
||||||
|
const uint32_t m8_16 = 0x00ff0000;
|
||||||
|
const uint32_t m8_24 = 0xff000000;
|
||||||
|
#ifdef ZT_AES_NEON
|
||||||
|
uint32x4_t k04050607 = { rk[4], rk[5], rk[6], rk[7] };
|
||||||
|
uint32x4_t k08091011 = { rk[8], rk[9], rk[10], rk[11] };
|
||||||
|
uint32x4_t k12131415 = { rk[12], rk[13], rk[14], rk[15] };
|
||||||
|
uint32x4_t k16171819 = { rk[16], rk[17], rk[18], rk[19] };
|
||||||
|
uint32x4_t k20212223 = { rk[20], rk[21], rk[22], rk[23] };
|
||||||
|
uint32x4_t k24252627 = { rk[24], rk[25], rk[26], rk[27] };
|
||||||
|
uint32x4_t k28293031 = { rk[28], rk[29], rk[30], rk[31] };
|
||||||
|
uint32x4_t k32333435 = { rk[32], rk[33], rk[34], rk[35] };
|
||||||
|
uint32x4_t k36373839 = { rk[36], rk[37], rk[38], rk[39] };
|
||||||
|
uint32x4_t k40414243 = { rk[40], rk[41], rk[42], rk[43] };
|
||||||
|
uint32x4_t k44454647 = { rk[44], rk[45], rk[46], rk[47] };
|
||||||
|
uint32x4_t k48495051 = { rk[48], rk[49], rk[50], rk[51] };
|
||||||
|
uint32x4_t k52535455 = { rk[52], rk[53], rk[54], rk[55] };
|
||||||
|
uint32x4_t k56575859 = { rk[56], rk[57], rk[58], rk[59] };
|
||||||
|
#endif
|
||||||
while (len >= 16) {
|
while (len >= 16) {
|
||||||
uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
|
uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
|
||||||
s0 = ctr0rk0;
|
s0 = ctr0rk0;
|
||||||
s1 = ctr1rk1;
|
s1 = ctr1rk1;
|
||||||
s2 = ctr2rk2;
|
s2 = ctr2rk2;
|
||||||
s3 = ctr++ ^ rk[3];
|
s3 = ctr++ ^ rk[3];
|
||||||
|
|
||||||
|
#ifdef ZT_AES_NEON
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k04050607, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k04050607, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k04050607, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k04050607, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k08091011, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k08091011, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k08091011, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k08091011, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k12131415, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k12131415, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k12131415, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k12131415, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k16171819, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k16171819, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k16171819, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k16171819, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k20212223, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k20212223, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k20212223, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k20212223, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k24252627, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k24252627, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k24252627, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k24252627, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k28293031, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k28293031, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k28293031, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k28293031, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k32333435, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k32333435, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k32333435, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k32333435, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k36373839, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k36373839, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k36373839, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k36373839, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k40414243, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k40414243, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k40414243, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k40414243, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k44454647, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k44454647, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k44454647, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k44454647, 3);
|
||||||
|
s0 = Te0[t0 >> 24U] ^ Te1[(t1 >> 16U) & m8] ^ Te2[(t2 >> 8U) & m8] ^ Te3[t3 & m8] ^ vgetq_lane_u32(k48495051, 0);
|
||||||
|
s1 = Te0[t1 >> 24U] ^ Te1[(t2 >> 16U) & m8] ^ Te2[(t3 >> 8U) & m8] ^ Te3[t0 & m8] ^ vgetq_lane_u32(k48495051, 1);
|
||||||
|
s2 = Te0[t2 >> 24U] ^ Te1[(t3 >> 16U) & m8] ^ Te2[(t0 >> 8U) & m8] ^ Te3[t1 & m8] ^ vgetq_lane_u32(k48495051, 2);
|
||||||
|
s3 = Te0[t3 >> 24U] ^ Te1[(t0 >> 16U) & m8] ^ Te2[(t1 >> 8U) & m8] ^ Te3[t2 & m8] ^ vgetq_lane_u32(k48495051, 3);
|
||||||
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ vgetq_lane_u32(k52535455, 0);
|
||||||
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ vgetq_lane_u32(k52535455, 1);
|
||||||
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ vgetq_lane_u32(k52535455, 2);
|
||||||
|
t3 = Te0[s3 >> 24U] ^ Te1[(s0 >> 16U) & m8] ^ Te2[(s1 >> 8U) & m8] ^ Te3[s2 & m8] ^ vgetq_lane_u32(k52535455, 3);
|
||||||
|
s0 = (Te2[(t0 >> 24U)] & m8_24) ^ (Te3[(t1 >> 16U) & m8] & m8_16) ^ (Te0[(t2 >> 8U) & m8] & m8_8) ^ (Te1[(t3) & m8] & m8) ^ vgetq_lane_u32(k56575859, 0);
|
||||||
|
s1 = (Te2[(t1 >> 24U)] & m8_24) ^ (Te3[(t2 >> 16U) & m8] & m8_16) ^ (Te0[(t3 >> 8U) & m8] & m8_8) ^ (Te1[(t0) & m8] & m8) ^ vgetq_lane_u32(k56575859, 1);
|
||||||
|
s2 = (Te2[(t2 >> 24U)] & m8_24) ^ (Te3[(t3 >> 16U) & m8] & m8_16) ^ (Te0[(t0 >> 8U) & m8] & m8_8) ^ (Te1[(t1) & m8] & m8) ^ vgetq_lane_u32(k56575859, 2);
|
||||||
|
s3 = (Te2[(t3 >> 24U)] & m8_24) ^ (Te3[(t0 >> 16U) & m8] & m8_16) ^ (Te0[(t1 >> 8U) & m8] & m8_8) ^ (Te1[(t2) & m8] & m8) ^ vgetq_lane_u32(k56575859, 3);
|
||||||
|
#endif
|
||||||
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ rk[4];
|
t0 = Te0[s0 >> 24U] ^ Te1[(s1 >> 16U) & m8] ^ Te2[(s2 >> 8U) & m8] ^ Te3[s3 & m8] ^ rk[4];
|
||||||
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ rk[5];
|
t1 = Te0[s1 >> 24U] ^ Te1[(s2 >> 16U) & m8] ^ Te2[(s3 >> 8U) & m8] ^ Te3[s0 & m8] ^ rk[5];
|
||||||
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ rk[6];
|
t2 = Te0[s2 >> 24U] ^ Te1[(s3 >> 16U) & m8] ^ Te2[(s0 >> 8U) & m8] ^ Te3[s1 & m8] ^ rk[6];
|
||||||
|
@ -1150,6 +1226,7 @@ void AES::CTR::crypt(const void *const input, unsigned int len) noexcept
|
||||||
in += 16;
|
in += 16;
|
||||||
}
|
}
|
||||||
reinterpret_cast<uint32_t *>(_ctr)[3] = Utils::hton(ctr);
|
reinterpret_cast<uint32_t *>(_ctr)[3] = Utils::hton(ctr);
|
||||||
|
}
|
||||||
|
|
||||||
// Any remaining input is placed in _out. This will be picked up and crypted
|
// Any remaining input is placed in _out. This will be picked up and crypted
|
||||||
// on subsequent calls to crypt() or finish() as it'll mean _len will not be
|
// on subsequent calls to crypt() or finish() as it'll mean _len will not be
|
||||||
|
|
Loading…
Add table
Reference in a new issue