1+ #include < cassert>
2+ #include < chrono>
3+ #include < iostream>
4+ #include < memory>
5+ #include < random>
6+ #include < tfhe++.hpp>
7+
8+ int main (){
9+ using brP = TFHEpp::lvlh2param;
10+ using iksP = TFHEpp::lvl2hparam;
11+ std::random_device seed_gen;
12+ std::default_random_engine engine (seed_gen ());
13+ constexpr uint32_t plain_modulus = 1 <<(4 +1 );
14+ std::unique_ptr<TFHEpp::SecretKey> sk (new TFHEpp::SecretKey ());
15+ constexpr uint num_test = 1U <<8 ;
16+ // constexpr uint num_test = 1U<<4;
17+ std::vector<std::array<TFHEpp::TLWE<typename iksP::domainP>,2 >> cin (num_test);
18+
19+ for (int i = 0 ; i < num_test; i++){
20+ cin[i][0 ] = TFHEpp::tlweSymIntEncrypt<typename iksP::domainP, plain_modulus>(i&0xF , *sk);
21+ cin[i][1 ] = TFHEpp::tlweSymIntEncrypt<typename iksP::domainP, plain_modulus>((i>>4 ), *sk);
22+ }
23+ std::vector<std::array<TFHEpp::TLWE<typename brP::targetP>,2 >> cres (num_test);
24+ TFHEpp::EvalKey ek;
25+ ek.emplacebkfft <brP>(*sk);
26+ ek.emplaceiksk <iksP>(*sk);
27+ ek.emplaceahk <typename brP::targetP>(*sk);
28+
29+ std::chrono::system_clock::time_point start, end;
30+ start = std::chrono::system_clock::now ();
31+ for (int test = 0 ; test < num_test; test++) {
32+ std::cout<<" test: " << test << std::endl;
33+ TFHEpp::AESInvSbox<iksP,brP>(cres[test], cin[test], ek);
34+ }
35+
36+ end = std::chrono::system_clock::now ();
37+ double elapsed =
38+ std::chrono::duration_cast<std::chrono::milliseconds>(end - start)
39+ .count ();
40+ std::cout << elapsed / num_test << " ms" << std::endl;
41+ for (int i = 0 ; i < num_test; i++) {
42+ const uint8_t pres = (TFHEpp::tlweSymIntDecrypt<typename brP::targetP, plain_modulus>(cres[i][1 ], *sk)<<4 )+TFHEpp::tlweSymIntDecrypt<typename brP::targetP, plain_modulus>(cres[i][0 ], *sk);
43+ // std::cout << "test: " << i << " pres: " << (int)pres << " expected: " << (int)inv_sbox[i>>4][i&0xF] << std::endl;
44+ assert (pres == inv_sbox[i>>4 ][i&0xF ]);
45+ }
46+ std::cout << " Passed" << std::endl;
47+ }
0 commit comments