Skip to content

Commit 578d82b

Browse files
committed
Allow operators for jsonb on one side of encrypt
1 parent 0d1f086 commit 578d82b

File tree

5 files changed

+136
-34
lines changed

5 files changed

+136
-34
lines changed

sql/015-operators-unique.sql

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,44 @@ CREATE OPERATOR = (
2929
MERGES
3030
);
3131

32+
DROP OPERATOR IF EXISTS = (cs_encrypted_v1, jsonb);
33+
DROP FUNCTION IF EXISTS cs_encrypted_eq_v1(a cs_encrypted_v1, b jsonb);
34+
35+
CREATE FUNCTION cs_encrypted_eq_v1(a cs_encrypted_v1, b jsonb)
36+
RETURNS boolean AS $$
37+
SELECT cs_unique_v1(a) = cs_unique_v1(b);
38+
$$ LANGUAGE SQL;
39+
40+
CREATE OPERATOR = (
41+
PROCEDURE="cs_encrypted_eq_v1",
42+
LEFTARG=cs_encrypted_v1,
43+
RIGHTARG=jsonb,
44+
NEGATOR = <>,
45+
RESTRICT = eqsel,
46+
JOIN = eqjoinsel,
47+
HASHES,
48+
MERGES
49+
);
50+
51+
DROP OPERATOR IF EXISTS = (jsonb, cs_encrypted_v1);
52+
DROP FUNCTION IF EXISTS cs_encrypted_eq_v1(a jsonb, b cs_encrypted_v1);
53+
54+
CREATE FUNCTION cs_encrypted_eq_v1(a jsonb, b cs_encrypted_v1)
55+
RETURNS boolean AS $$
56+
SELECT cs_unique_v1(a) = cs_unique_v1(b);
57+
$$ LANGUAGE SQL;
58+
59+
CREATE OPERATOR = (
60+
PROCEDURE="cs_encrypted_eq_v1",
61+
LEFTARG=jsonb,
62+
RIGHTARG=cs_encrypted_v1,
63+
NEGATOR = <>,
64+
RESTRICT = eqsel,
65+
JOIN = eqjoinsel,
66+
HASHES,
67+
MERGES
68+
);
69+
3270

3371
DROP OPERATOR IF EXISTS = (cs_encrypted_v1, cs_unique_index_v1);
3472
DROP FUNCTION IF EXISTS cs_encrypted_eq_v1(a cs_encrypted_v1, b cs_unique_index_v1);
@@ -91,6 +129,47 @@ CREATE OPERATOR <> (
91129
MERGES
92130
);
93131

132+
133+
DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, jsonb);
134+
DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a cs_encrypted_v1, b jsonb);
135+
136+
CREATE FUNCTION cs_encrypted_neq_v1(a cs_encrypted_v1, b jsonb)
137+
RETURNS boolean AS $$
138+
SELECT cs_unique_v1(a) <> cs_unique_v1(b);
139+
$$ LANGUAGE SQL;
140+
141+
CREATE OPERATOR <> (
142+
PROCEDURE="cs_encrypted_neq_v1",
143+
LEFTARG=cs_encrypted_v1,
144+
RIGHTARG=jsonb,
145+
NEGATOR = =,
146+
RESTRICT = eqsel,
147+
JOIN = eqjoinsel,
148+
HASHES,
149+
MERGES
150+
);
151+
152+
153+
DROP OPERATOR IF EXISTS <> (jsonb, cs_encrypted_v1);
154+
DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a jsonb, b cs_encrypted_v1);
155+
156+
CREATE FUNCTION cs_encrypted_neq_v1(a jsonb, b cs_encrypted_v1)
157+
RETURNS boolean AS $$
158+
SELECT cs_unique_v1(a) <> cs_unique_v1(b);
159+
$$ LANGUAGE SQL;
160+
161+
CREATE OPERATOR <> (
162+
PROCEDURE="cs_encrypted_neq_v1",
163+
LEFTARG=jsonb,
164+
RIGHTARG=cs_encrypted_v1,
165+
NEGATOR = =,
166+
RESTRICT = eqsel,
167+
JOIN = eqjoinsel,
168+
HASHES,
169+
MERGES
170+
);
171+
172+
94173
DROP OPERATOR IF EXISTS <> (cs_encrypted_v1, cs_unique_index_v1);
95174
DROP FUNCTION IF EXISTS cs_encrypted_neq_v1(a cs_encrypted_v1, b cs_unique_index_v1);
96175

tasks/reset.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,7 @@
77

88
connection_url=postgresql://${CS_DATABASE__USERNAME:-$USER}:@localhost:$CS_DATABASE__PORT/$CS_DATABASE__NAME
99

10+
# Uninstall
11+
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f release/cipherstash-encrypt-uninstall.sql
12+
1013
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f release/cipherstash-encrypt.sql

tasks/test.sh

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,11 @@
1010

1111
connection_url=postgresql://${CS_DATABASE__USERNAME:-$USER}:@localhost:$CS_DATABASE__PORT/$CS_DATABASE__NAME
1212

13-
# tests
14-
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/core.sql
15-
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/core-functions.sql
16-
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/config.sql
17-
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/encryptindex.sql
13+
# # tests
14+
# PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/core.sql
15+
# PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/core-functions.sql
16+
# PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/config.sql
17+
# PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/encryptindex.sql
1818
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f tests/operators.sql
1919

20-
# Uninstall
21-
PGPASSWORD=$CS_DATABASE__PASSWORD psql $connection_url -f release/cipherstash-encrypt-uninstall.sql
2220

tests/config.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
--
77
-- Helper function for assertions
88
--
9-
DROP FUNCTION IF EXISTS _index_exists(text, text, text);
9+
DROP FUNCTION IF EXISTS _index_exists(text, text, text, text);
1010
CREATE FUNCTION _index_exists(table_name text, column_name text, index_name text, state text DEFAULT 'pending')
1111
RETURNS boolean
1212
LANGUAGE sql STRICT PARALLEL SAFE

tests/operators.sql

Lines changed: 48 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -88,17 +88,39 @@ DO $$
8888
$$ LANGUAGE plpgsql;
8989

9090

91+
9192
-- UNIQUE eq = OPERATORS
9293
DO $$
9394
BEGIN
9495
-- SANITY CHECK FOR UNIQUE payloads
9596
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE cs_unique_v1(name_encrypted) = cs_unique_v1('{"u":"unique-text"}')));
9697

98+
ASSERT (SELECT EXISTS (
99+
SELECT id FROM users WHERE name_encrypted = '{
100+
"v": 1,
101+
"k": "ct",
102+
"c": "ciphertext",
103+
"i": {
104+
"t": "users",
105+
"c": "name"
106+
},
107+
"u": "unique-text"
108+
}'::jsonb
109+
));
110+
97111
-- cs_encrypted_v1 = jsonb
98-
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = '{"u":"unique-text"}'::jsonb));
112+
ASSERT (SELECT EXISTS (
113+
SELECT id FROM users WHERE name_encrypted = '{"u": "unique-text"}'::jsonb
114+
));
115+
116+
-- jsonb = cs_encrypted_v1
117+
ASSERT (SELECT EXISTS (
118+
SELECT id FROM users WHERE '{"u": "unique-text"}'::jsonb = name_encrypted
119+
));
99120

100121
-- cs_encrypted_v1 = text
101122
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = 'unique-text'::text));
123+
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted = 'unique-text'::cs_unique_index_v1));
102124

103125
-- text = cs_encrypted_v1
104126
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE 'unique-text'::text = name_encrypted));
@@ -129,31 +151,31 @@ DO $$
129151
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != '{"u":"random-text"}'::jsonb));
130152
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> '{"u":"random-text"}'::jsonb));
131153

132-
-- cs_encrypted_v1 = text
133-
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != 'random-text'::text));
134-
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> 'random-text'::text));
135-
136-
-- cs_encrypted_v1 = cs_encrypted_v1
137-
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != '{
138-
"v": 1,
139-
"k": "ct",
140-
"c": "ciphertext",
141-
"i": {
142-
"t": "users",
143-
"c": "name"
144-
},
145-
"u": "random-text"
146-
}'::cs_encrypted_v1));
147-
ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> '{
148-
"v": 1,
149-
"k": "ct",
150-
"c": "ciphertext",
151-
"i": {
152-
"t": "users",
153-
"c": "name"
154-
},
155-
"u": "random-text"
156-
}'::cs_encrypted_v1));
154+
-- -- cs_encrypted_v1 = text
155+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != 'random-text'::text));
156+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> 'random-text'::text));
157+
158+
-- -- cs_encrypted_v1 = cs_encrypted_v1
159+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted != '{
160+
-- "v": 1,
161+
-- "k": "ct",
162+
-- "c": "ciphertext",
163+
-- "i": {
164+
-- "t": "users",
165+
-- "c": "name"
166+
-- },
167+
-- "u": "random-text"
168+
-- }'::cs_encrypted_v1));
169+
-- ASSERT (SELECT EXISTS (SELECT id FROM users WHERE name_encrypted <> '{
170+
-- "v": 1,
171+
-- "k": "ct",
172+
-- "c": "ciphertext",
173+
-- "i": {
174+
-- "t": "users",
175+
-- "c": "name"
176+
-- },
177+
-- "u": "random-text"
178+
-- }'::cs_encrypted_v1));
157179

158180

159181

0 commit comments

Comments
 (0)