Skip to content

Commit f8257f2

Browse files
authored
Merge pull request #127 from cipherstash/fix/check-encrypted-search-terms-are-not-null
fix: make eql_v2.compare robust against null search terms
2 parents 3e82074 + 739e186 commit f8257f2

File tree

10 files changed

+54
-320
lines changed

10 files changed

+54
-320
lines changed

src/blake3/functions.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ AS $$
1414
RETURN NULL;
1515
END IF;
1616

17-
IF NOT (val ? 'b3') THEN
17+
IF NOT eql_v2.has_blake3(val) THEN
1818
RAISE 'Expected a blake3 index (b3) value in json: %', val;
1919
END IF;
2020

@@ -44,7 +44,7 @@ CREATE FUNCTION eql_v2.has_blake3(val jsonb)
4444
IMMUTABLE STRICT PARALLEL SAFE
4545
AS $$
4646
BEGIN
47-
RETURN val ? 'b3';
47+
RETURN val ->> 'b3' IS NOT NULL;
4848
END;
4949
$$ LANGUAGE plpgsql;
5050

src/bloom_filter/functions.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ AS $$
1212
RETURN NULL;
1313
END IF;
1414

15-
IF val ? 'bf' THEN
15+
IF eql_v2.has_bloom_filter(val) THEN
1616
RETURN ARRAY(SELECT jsonb_array_elements(val->'bf'))::eql_v2.bloom_filter;
1717
END IF;
1818

@@ -38,7 +38,7 @@ CREATE FUNCTION eql_v2.has_bloom_filter(val jsonb)
3838
IMMUTABLE STRICT PARALLEL SAFE
3939
AS $$
4040
BEGIN
41-
RETURN val ? 'bf';
41+
RETURN val ->> 'bf' IS NOT NULL;
4242
END;
4343
$$ LANGUAGE plpgsql;
4444

src/encrypted/aggregates_test.sql

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -48,48 +48,3 @@ DO $$
4848
ASSERT ((SELECT enc_int FROM agg_test WHERE plain_int = 5) = (SELECT eql_v2.max(enc_int) FROM agg_test));
4949
END;
5050
$$ LANGUAGE plpgsql;
51-
52-
-- insert data without "ob" (ore index value)
53-
INSERT INTO agg_test (plain_int, enc_int) VALUES
54-
(
55-
3,
56-
'{"c": "mBbLa7Cm?&jvpfcv1d3hep>s)76qzUbwUky&M&C<M-e2q^@e798gqWcAb{9a>3mjDG_os-_y0MRaMGl@&p#AOuusN|3Lu=mBCcg_V{&<LbY)~;X>N2hzy", "i": {"c": "encrypted_int4", "t": "encrypted"}, "k": "ct", "bf": null, "v": 2}'::jsonb::eql_v2_encrypted
57-
);
58-
59-
-- run exceptional case
60-
DO $$
61-
DECLARE
62-
error_message text;
63-
BEGIN
64-
-- min enc_int raises exception
65-
SELECT eql_v2.min(enc_int) FROM agg_test;
66-
EXCEPTION
67-
WHEN others THEN
68-
error_message := SQLERRM;
69-
70-
IF error_message LIKE '%' || 'Expected an ore index (ob) value in json' || '%' THEN
71-
ASSERT true;
72-
ELSE
73-
RAISE EXCEPTION 'Unexpected exception: %', error_message;
74-
END IF;
75-
END;
76-
$$ LANGUAGE plpgsql;
77-
78-
-- run exceptional case
79-
DO $$
80-
DECLARE
81-
error_message text;
82-
BEGIN
83-
-- max enc_int raises exception
84-
SELECT eql_v2.max(enc_int) FROM agg_test;
85-
EXCEPTION
86-
WHEN others THEN
87-
error_message := SQLERRM;
88-
89-
IF error_message LIKE '%' || 'Expected an ore index (ob) value in json' || '%' THEN
90-
ASSERT true;
91-
ELSE
92-
RAISE EXCEPTION 'Unexpected exception: %', error_message;
93-
END IF;
94-
END;
95-
$$ LANGUAGE plpgsql;

src/hmac_256/functions.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ AS $$
1212
RETURN NULL;
1313
END IF;
1414

15-
IF val ? 'hm' THEN
15+
IF eql_v2.has_hmac_256(val) THEN
1616
RETURN val->>'hm';
1717
END IF;
1818
RAISE 'Expected a hmac_256 index (hm) value in json: %', val;
@@ -25,7 +25,7 @@ CREATE FUNCTION eql_v2.has_hmac_256(val jsonb)
2525
IMMUTABLE STRICT PARALLEL SAFE
2626
AS $$
2727
BEGIN
28-
RETURN val ? 'hm';
28+
RETURN val ->> 'hm' IS NOT NULL;
2929
END;
3030
$$ LANGUAGE plpgsql;
3131

src/operators/compare_test.sql

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,4 +163,45 @@ DO $$
163163
ASSERT eql_v2.compare(c, b) = 1;
164164
ASSERT eql_v2.compare(c, a) = 1;
165165
END;
166-
$$ LANGUAGE plpgsql;
166+
$$ LANGUAGE plpgsql;
167+
168+
169+
--
170+
-- Compare hmac_256 when record has a `null` index of higher precedence
171+
-- TEST COVERAGE FOR BUG FIX
172+
--
173+
-- ORE Block indexes `ob` are used in compare before hmac_256 indexes.
174+
-- If the index term is null `{"ob": null}` it should not be used
175+
-- Comparing two `null` values is evaluated as equality and hilarity ensues
176+
--
177+
178+
DO $$
179+
DECLARE
180+
a eql_v2_encrypted;
181+
b eql_v2_encrypted;
182+
c eql_v2_encrypted;
183+
BEGIN
184+
-- generate with `hm` index
185+
a := create_encrypted_json(1, 'hm');
186+
-- append `null` index
187+
a := '{"ob": null}'::jsonb || a::jsonb;
188+
189+
b := create_encrypted_json(2, 'hm');
190+
b := '{"ob": null}'::jsonb || b::jsonb;
191+
192+
c := create_encrypted_json(3, 'hm');
193+
c := '{"ob": null}'::jsonb || c::jsonb;
194+
195+
ASSERT eql_v2.compare(a, a) = 0;
196+
ASSERT eql_v2.compare(a, b) = -1;
197+
ASSERT eql_v2.compare(a, c) = -1;
198+
199+
ASSERT eql_v2.compare(b, b) = 0;
200+
ASSERT eql_v2.compare(b, a) = 1;
201+
ASSERT eql_v2.compare(b, c) = -1;
202+
203+
ASSERT eql_v2.compare(c, c) = 0;
204+
ASSERT eql_v2.compare(c, b) = 1;
205+
ASSERT eql_v2.compare(c, a) = 1;
206+
END;
207+
$$ LANGUAGE plpgsql;

src/ore_block_u64_8_256/functions.sql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ AS $$
5757
RETURN NULL;
5858
END IF;
5959

60-
IF val ? 'ob' THEN
60+
IF eql_v2.has_ore_block_u64_8_256(val) THEN
6161
RETURN eql_v2.jsonb_array_to_ore_block_u64_8_256(val->'ob');
6262
END IF;
6363
RAISE 'Expected an ore index (ob) value in json: %', val;
@@ -85,7 +85,7 @@ CREATE FUNCTION eql_v2.has_ore_block_u64_8_256(val jsonb)
8585
IMMUTABLE STRICT PARALLEL SAFE
8686
AS $$
8787
BEGIN
88-
RETURN val ? 'ob';
88+
RETURN val ->> 'ob' IS NOT NULL;
8989
END;
9090
$$ LANGUAGE plpgsql;
9191

src/ore_cllw_u64_8/functions.sql

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,10 @@ AS $$
1717
RETURN NULL;
1818
END IF;
1919

20-
IF NOT (val ? 'ocf') THEN
20+
IF NOT (eql_v2.has_ore_cllw_u64_8(val)) THEN
2121
RAISE 'Expected a ore_cllw_u64_8 index (ocf) value in json: %', val;
2222
END IF;
2323

24-
IF val->>'ocf' IS NULL THEN
25-
RETURN NULL;
26-
END IF;
27-
2824
RETURN ROW(decode(val->>'ocf', 'hex'));
2925
END;
3026
$$ LANGUAGE plpgsql;
@@ -47,7 +43,7 @@ CREATE FUNCTION eql_v2.has_ore_cllw_u64_8(val jsonb)
4743
IMMUTABLE STRICT PARALLEL SAFE
4844
AS $$
4945
BEGIN
50-
RETURN val ? 'ocf';
46+
RETURN val ->> 'ocf' IS NOT NULL;
5147
END;
5248
$$ LANGUAGE plpgsql;
5349

src/ore_cllw_u64_8/operator_class.sql.skip

Lines changed: 0 additions & 20 deletions
This file was deleted.

0 commit comments

Comments
 (0)