Skip to content

Commit 280d6a3

Browse files
committed
ARM AES support
1 parent e59724e commit 280d6a3

File tree

9 files changed

+476
-320
lines changed

9 files changed

+476
-320
lines changed

CMakePresets.json

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
"cacheVariables": {
9999
"CMAKE_BUILD_TYPE": "RelWithDebInfo",
100100
"LIBOTE_STD_VER": "20",
101+
"ENABLE_PORTABLE_AES": true,
101102
"ENABLE_GMP": false,
102103
"ENABLE_ALL_OT": true,
103104
"ENABLE_RELIC": false,

frontend/benchmark.h

+84
Original file line numberDiff line numberDiff line change
@@ -606,4 +606,88 @@ namespace osuCrypto
606606
std::cout << "ENABLE_Silent_VOLE = false" << std::endl;
607607
#endif
608608
}
609+
610+
611+
void AESBenchmark(const oc::CLP& cmd)
612+
{
613+
u64 n = roundUpTo(cmd.getOr("n", 1ull << cmd.getOr("nn", 20)), 8);
614+
u64 t =cmd.getOr("t", 10);
615+
using AES_ = AES;// details::AES<details::AESTypes::Portable>;
616+
617+
auto unroll8 = [](AES_& aes, block* __restrict s)
618+
{
619+
block b[8];
620+
b[0] = AES_::firstFn(s[0], aes.mRoundKey[0]);
621+
b[1] = AES_::firstFn(s[1], aes.mRoundKey[0]);
622+
b[2] = AES_::firstFn(s[2], aes.mRoundKey[0]);
623+
b[3] = AES_::firstFn(s[3], aes.mRoundKey[0]);
624+
b[4] = AES_::firstFn(s[4], aes.mRoundKey[0]);
625+
b[5] = AES_::firstFn(s[5], aes.mRoundKey[0]);
626+
b[6] = AES_::firstFn(s[6], aes.mRoundKey[0]);
627+
b[7] = AES_::firstFn(s[7], aes.mRoundKey[0]);
628+
629+
for (u64 i = 1; i < 9; ++i)
630+
{
631+
b[0] = AES_::roundFn(b[0], aes.mRoundKey[i]);
632+
b[1] = AES_::roundFn(b[1], aes.mRoundKey[i]);
633+
b[2] = AES_::roundFn(b[2], aes.mRoundKey[i]);
634+
b[3] = AES_::roundFn(b[3], aes.mRoundKey[i]);
635+
b[4] = AES_::roundFn(b[4], aes.mRoundKey[i]);
636+
b[5] = AES_::roundFn(b[5], aes.mRoundKey[i]);
637+
b[6] = AES_::roundFn(b[6], aes.mRoundKey[i]);
638+
b[7] = AES_::roundFn(b[7], aes.mRoundKey[i]);
639+
}
640+
641+
642+
b[0] = AES_::penultimateFn(b[0], aes.mRoundKey[9]);
643+
b[1] = AES_::penultimateFn(b[1], aes.mRoundKey[9]);
644+
b[2] = AES_::penultimateFn(b[2], aes.mRoundKey[9]);
645+
b[3] = AES_::penultimateFn(b[3], aes.mRoundKey[9]);
646+
b[4] = AES_::penultimateFn(b[4], aes.mRoundKey[9]);
647+
b[5] = AES_::penultimateFn(b[5], aes.mRoundKey[9]);
648+
b[6] = AES_::penultimateFn(b[6], aes.mRoundKey[9]);
649+
b[7] = AES_::penultimateFn(b[7], aes.mRoundKey[9]);
650+
s[0] = AES_::finalFn(b[0], aes.mRoundKey[10]);
651+
s[1] = AES_::finalFn(b[1], aes.mRoundKey[10]);
652+
s[2] = AES_::finalFn(b[2], aes.mRoundKey[10]);
653+
s[3] = AES_::finalFn(b[3], aes.mRoundKey[10]);
654+
s[4] = AES_::finalFn(b[4], aes.mRoundKey[10]);
655+
s[5] = AES_::finalFn(b[5], aes.mRoundKey[10]);
656+
s[6] = AES_::finalFn(b[6], aes.mRoundKey[10]);
657+
s[7] = AES_::finalFn(b[7], aes.mRoundKey[10]);
658+
659+
};
660+
661+
oc::AlignedUnVector<block> x(n);
662+
auto n8 = n / 8;
663+
AES_ aes(block(42352345, 3245345234676534));
664+
Timer timer;
665+
timer.setTimePoint("begin");
666+
for (u64 tt = 0; tt < t; ++tt)
667+
{
668+
for (u64 i = 0; i < n; i += 8)
669+
{
670+
unroll8(aes, x.data() + i);
671+
}
672+
timer.setTimePoint("unroll");
673+
}
674+
675+
for (u64 tt = 0; tt < t; ++tt)
676+
{
677+
for (u64 i = 0; i < n; i += 8)
678+
{
679+
aes.ecbEncBlocks<8>(x.data() + i, x.data() + i);
680+
}
681+
timer.setTimePoint("aes <>");
682+
}
683+
684+
for (u64 tt = 0; tt < t; ++tt)
685+
{
686+
aes.ecbEncBlocks(x, x);
687+
timer.setTimePoint("aes ");
688+
}
689+
690+
std::cout << timer << std::endl;
691+
692+
}
609693
}

frontend/main.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ int main(int argc, char** argv)
117117
ExConvCodeOldBench(cmd);
118118
else if (cmd.isSet("tungsten"))
119119
TungstenCodeBench(cmd);
120+
else if (cmd.isSet("aes"))
121+
AESBenchmark(cmd);
120122

121123
return 0;
122124
}

libOTe/NChooseOne/Kkrt/KkrtNcoOtReceiver.h

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include <vector>
1616
#include <cryptoTools/Crypto/AES.h>
1717
#include <cryptoTools/Common/Timer.h>
18+
#include <cryptoTools/Crypto/MultiKeyAES.h>
1819

1920
#ifdef GetMessage
2021
#undef GetMessage

libOTe/NChooseOne/Kkrt/KkrtNcoOtSender.h

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include <cryptoTools/Common/Timer.h>
1919
#include <cryptoTools/Network/Channel.h>
20+
#include <cryptoTools/Crypto/MultiKeyAES.h>
2021

2122
#include <array>
2223
#include <vector>

libOTe/TwoChooseOne/Kos/KosOtExtReceiver.h

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <cryptoTools/Crypto/PRNG.h>
1515
#include <cryptoTools/Common/Timer.h>
1616
#include "libOTe/Tools/Coproto.h"
17+
#include <cryptoTools/Crypto/MultiKeyAES.h>
1718

1819
namespace osuCrypto
1920
{

libOTe/TwoChooseOne/Kos/KosOtExtSender.h

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <cryptoTools/Common/Timer.h>
1515
#include <cryptoTools/Crypto/PRNG.h>
1616
#include <array>
17+
#include <cryptoTools/Crypto/MultiKeyAES.h>
1718

1819
namespace osuCrypto {
1920

0 commit comments

Comments
 (0)