Skip to content

Commit a352dca

Browse files
committed
update sse filter
1 parent 24c77f9 commit a352dca

File tree

3 files changed

+74
-31
lines changed

3 files changed

+74
-31
lines changed

include/sse_filter.hpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "crypto.hpp"
44

55
struct SseFilterMsk{
6+
int counter;
67
std::unique_ptr<PRF> prf;
78
};
89

@@ -21,23 +22,24 @@ class SseFilter{
2122
* @param x a vector of strings or integers.
2223
* @return the ciphertext.
2324
*/
24-
static CharMat enc(const SseFilterMsk& msk, const Vec& x);
25+
static CharMat enc(SseFilterMsk& msk, const Vec& x);
2526

2627
/**
2728
* Perform the Filter FE key generation.
2829
* @param msk the master secret key.
2930
* @param y a vector of strings or integers.
31+
* @param row the number of rows to select from.
3032
* @return the function key.
3133
*/
32-
static CharVec keygen(const SseFilterMsk& msk, const Vec& y);
34+
static CharMat keygen(const SseFilterMsk& msk, const Vec& y, int row);
3335

3436
/**
3537
* Perform the Filter FE decryption.
3638
* @param ct the ciphertext.
3739
* @param sk the function key.
3840
* @return a boolean indicating the result of Filter.
3941
*/
40-
static bool dec(const CharMat& ct, const CharVec& sk);
42+
static bool dec(const CharMat& ct, const CharMat& sk);
4143

4244
private:
4345
/// Make unique pointer for the PRF.

src/sse_filter.cpp

Lines changed: 48 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

test/test_sse_filter.cpp

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,50 @@
22
#include "sse_filter.hpp"
33

44
TEST(SseFilterTests, FilterTrue){
5-
const auto msk = SseFilter::msk_gen();
5+
auto msk = SseFilter::msk_gen();
66

77
const IntVec x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
88

99
const auto ct = SseFilter::enc(msk, x);
10-
const auto sk = SseFilter::keygen(msk, x);
10+
const auto sk = SseFilter::keygen(msk, x, 1);
1111

1212
EXPECT_TRUE(SseFilter::dec(ct, sk));
1313
}
1414

1515
TEST(SseFilterTests, FilterFalse){
16-
const auto msk = SseFilter::msk_gen();
16+
auto msk = SseFilter::msk_gen();
1717

1818
const IntVec x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
1919
const IntVec y = {100, 2, 3, 4, 5, 6, 7, 8, 9, 10};
2020

2121
const auto ct = SseFilter::enc(msk, x);
22-
const auto sk = SseFilter::keygen(msk, y);
22+
const auto sk = SseFilter::keygen(msk, y, 1);
2323

2424
EXPECT_FALSE(SseFilter::dec(ct, sk));
2525
}
2626

2727
TEST(SseFilterTests, FilterStrTrue){
28-
const auto msk = SseFilter::msk_gen();
28+
auto msk = SseFilter::msk_gen();
2929

3030
const StrVec x = {"ab", "b", "c", "d", "e", "f", "g", "h", "i", "test"};
3131

3232
const auto ct = SseFilter::enc(msk, x);
33-
const auto sk = SseFilter::keygen(msk, x);
33+
const auto sk = SseFilter::keygen(msk, x, 1);
3434

3535
EXPECT_TRUE(SseFilter::dec(ct, sk));
36+
}
37+
38+
TEST(SseFilterTests, FilterMultiEncTrue){
39+
auto msk = SseFilter::msk_gen();
40+
41+
const IntVec x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
42+
const IntVec y = {2, 2, 3, 4, 5, 6, 7, 8, 9, 10};
43+
const IntVec z = {3, 2, 3, 4, 5, 6, 7, 8, 9, 10};
44+
45+
const auto ctx = SseFilter::enc(msk, x);
46+
const auto cty = SseFilter::enc(msk, y);
47+
const auto ctz = SseFilter::enc(msk, z);
48+
const auto sk = SseFilter::keygen(msk, z, 3);
49+
50+
EXPECT_TRUE(SseFilter::dec(ctz, sk));
3651
}

0 commit comments

Comments
 (0)