@@ -4,12 +4,13 @@ SseFilterMsk SseFilter::msk_gen(const CharVec& key){
44 // Create the msk instance.
55 SseFilterMsk msk;
66
7+ msk.counter = 0 ;
78 msk.prf = std::make_unique<PRF>(key);
89
910 return msk;
1011}
1112
12- CharMat SseFilter::enc (const SseFilterMsk& msk, const Vec& x){
13+ CharMat SseFilter::enc (SseFilterMsk& msk, const Vec& x){
1314 // Create the object to hold ct.
1415 CharMat ct;
1516
@@ -18,43 +19,64 @@ CharMat SseFilter::enc(const SseFilterMsk& msk, const Vec& x){
1819 using T = std::decay_t <decltype (input_x)>;
1920 if constexpr (std::is_same_v<T, IntVec>){
2021 for (const auto & each_x : input_x)
21- ct.push_back (msk.prf ->digest (Helper::int_to_char_vec (each_x)));
22+ ct.push_back (msk.prf ->digest (
23+ Helper::str_to_char_vec (std::to_string (each_x) + std::to_string (msk.counter ))
24+ ));
2225 }
2326 else if (std::is_same_v<T, StrVec>){
2427 for (const auto & each_x : input_x)
25- ct.push_back (msk.prf ->digest (Helper::str_to_char_vec (each_x)));
28+ ct.push_back (msk.prf ->digest (
29+ Helper::str_to_char_vec (each_x + std::to_string (msk.counter ))
30+ ));
2631 }
2732 else throw std::invalid_argument (" The input type is not supported." );
2833 }, x);
2934
35+ // Increment the counter.
36+ ++msk.counter ;
37+
3038 return ct;
3139}
3240
33- CharVec SseFilter::keygen (const SseFilterMsk& msk, const Vec& y){
41+ CharMat SseFilter::keygen (const SseFilterMsk& msk, const Vec& y, const int row ){
3442 // Create the object to hold sk.
35- CharVec sk;
43+ CharMat sk;
3644
3745 // Make convert each input to CharVec and digest.
38- std::visit ([&sk, &msk](auto && input_y){
46+ std::visit ([&sk, &msk, row ](auto && input_y){
3947 using T = std::decay_t <decltype (input_y)>;
4048 if constexpr (std::is_same_v<T, IntVec>){
41- sk = msk.prf ->digest (Helper::int_to_char_vec (input_y[0 ]));
42- for (int i = 1 ; i < input_y.size (); ++i){
43- CharVec temp = msk.prf ->digest (Helper::int_to_char_vec (input_y[i]));
44- std::transform (
45- sk.begin (), sk.end (), temp.begin (), sk.begin (),
46- [](const unsigned char a, const unsigned char b){ return a ^ b; }
47- );
49+ for (int i = 0 ; i < row; ++i){
50+ sk.push_back (msk.prf ->digest (
51+ Helper::str_to_char_vec (std::to_string (input_y[0 ]) + std::to_string (i))
52+ ));
53+
54+ for (int j = 1 ; j < input_y.size (); ++j){
55+ CharVec temp = msk.prf ->digest (
56+ Helper::str_to_char_vec (std::to_string (input_y[j]) + std::to_string (i))
57+ );
58+ std::transform (
59+ sk.back ().begin (), sk.back ().end (), temp.begin (), sk.back ().begin (),
60+ [](const unsigned char a, const unsigned char b){ return a ^ b; }
61+ );
62+ }
4863 }
4964 }
5065 else if (std::is_same_v<T, StrVec>){
51- sk = msk.prf ->digest (Helper::str_to_char_vec (input_y[0 ]));
52- for (int i = 1 ; i < input_y.size (); ++i){
53- CharVec temp = msk.prf ->digest (Helper::str_to_char_vec (input_y[i]));
54- std::transform (
55- sk.begin (), sk.end (), temp.begin (), sk.begin (),
56- [](const unsigned char a, const unsigned char b){ return a ^ b; }
57- );
66+ for (int i = 0 ; i < row; ++i){
67+ sk.push_back (msk.prf ->digest (
68+ Helper::str_to_char_vec (input_y[0 ] + std::to_string (i))
69+ ));
70+
71+ for (int j = 1 ; j < input_y.size (); ++j){
72+ CharVec temp = msk.prf ->digest (
73+ Helper::str_to_char_vec (input_y[j] + std::to_string (i))
74+ );
75+ std::transform (
76+ sk.back ().begin (), sk.back ().end (), temp.begin (), sk.back ().begin (),
77+ [](const unsigned char a, const unsigned char b){ return a ^ b; }
78+ );
79+ }
5880 }
5981 }
6082 else throw std::invalid_argument (" The input type is not supported." );
@@ -63,6 +85,10 @@ CharVec SseFilter::keygen(const SseFilterMsk& msk, const Vec& y){
6385 return sk;
6486}
6587
66- bool SseFilter::dec (const CharMat& ct, const CharVec& sk){
67- return Helper::xor_char_vec (ct) == sk;
88+ bool SseFilter::dec (const CharMat& ct, const CharMat& sk){
89+ auto xor_ct = Helper::xor_char_vec (ct);
90+
91+ return std::any_of (sk.begin (), sk.end (), [&xor_ct](const auto & each_sk) {
92+ return xor_ct == each_sk;
93+ });
6894}
0 commit comments