Skip to content

Commit c8aa048

Browse files
committed
wip
1 parent 71c86bb commit c8aa048

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2888
-302
lines changed

src/blake3/functions.sql

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
-- REQUIRE: src/schema.sql
2+
-- REQUIRE: src/mac/types.sql
3+
4+
5+
-- extracts ste_vec index from a jsonb value
6+
DROP FUNCTION IF EXISTS eql_v1.blake3(val jsonb);
7+
8+
-- extracts blake3 index from a jsonb value
9+
DROP FUNCTION IF EXISTS eql_v1.blake3(val jsonb);
10+
11+
CREATE FUNCTION eql_v1.blake3(val jsonb)
12+
RETURNS eql_v1.blake3
13+
IMMUTABLE STRICT PARALLEL SAFE
14+
AS $$
15+
BEGIN
16+
17+
IF NOT (val ? 'b') NULL THEN
18+
RAISE 'Expected a blake3 index (b) value in json: %', val;
19+
END IF;
20+
21+
IF val->>'b' IS NULL THEN
22+
RETURN NULL;
23+
END IF;
24+
25+
RETURN val->>'b';
26+
END;
27+
$$ LANGUAGE plpgsql;
28+
29+
30+
-- extracts blake3 index from an eql_v1_encrypted value
31+
DROP FUNCTION IF EXISTS eql_v1.blake3(val eql_v1_encrypted);
32+
33+
CREATE FUNCTION eql_v1.blake3(val eql_v1_encrypted)
34+
RETURNS eql_v1.blake3
35+
IMMUTABLE STRICT PARALLEL SAFE
36+
AS $$
37+
BEGIN
38+
RETURN (SELECT eql_v1.blake3(val.data));
39+
END;
40+
$$ LANGUAGE plpgsql;

src/blake3/types.sql

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
-- REQUIRE: src/schema.sql
2+
3+
DROP DOMAIN IF EXISTS eql_v1.blake3;
4+
CREATE DOMAIN eql_v1.blake3 AS text;

src/common.sql

+48
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,54 @@
22
-- REQUIRE: src/schema.sql
33

44

5+
-- Constant time comparison of 2 bytea values
6+
DROP FUNCTION IF EXISTS eql_v1.bytea_eq(a bytea, b bytea);
7+
8+
CREATE FUNCTION eql_v1.bytea_eq(a bytea, b bytea) RETURNS boolean AS $$
9+
DECLARE
10+
result boolean;
11+
differing bytea;
12+
BEGIN
13+
14+
-- Check if the bytea values are the same length
15+
IF LENGTH(a) != LENGTH(b) THEN
16+
RETURN false;
17+
END IF;
18+
19+
-- Compare each byte in the bytea values
20+
result := true;
21+
FOR i IN 1..LENGTH(a) LOOP
22+
IF SUBSTRING(a FROM i FOR 1) != SUBSTRING(b FROM i FOR 1) THEN
23+
result := result AND false;
24+
END IF;
25+
END LOOP;
26+
27+
RETURN result;
28+
END;
29+
$$ LANGUAGE plpgsql;
30+
31+
32+
DROP FUNCTION IF EXISTS eql_v1.jsonb_array_to_bytea_array(val jsonb);
33+
34+
-- Casts a jsonb array of hex-encoded strings to an array of bytea.
35+
CREATE FUNCTION eql_v1.jsonb_array_to_bytea_array(val jsonb)
36+
RETURNS bytea[] AS $$
37+
DECLARE
38+
terms_arr bytea[];
39+
BEGIN
40+
IF jsonb_typeof(val) = 'null' THEN
41+
RETURN NULL;
42+
END IF;
43+
44+
SELECT array_agg(decode(value::text, 'hex')::bytea)
45+
INTO terms_arr
46+
FROM jsonb_array_elements_text(val) AS value;
47+
48+
RETURN terms_arr;
49+
END;
50+
$$ LANGUAGE plpgsql;
51+
52+
553

654
--
755
-- Convenience function to log a message

src/encrypted/functions.sql

+12
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,18 @@ AS $$
1818
END;
1919
$$ LANGUAGE plpgsql;
2020

21+
DROP FUNCTION IF EXISTS eql_v1.ciphertext(val eql_v1_encrypted);
22+
23+
CREATE FUNCTION eql_v1.ciphertext(val eql_v1_encrypted)
24+
RETURNS text
25+
IMMUTABLE STRICT PARALLEL SAFE
26+
AS $$
27+
BEGIN
28+
RETURN eql_v1.ciphertext(val.data);
29+
END;
30+
$$ LANGUAGE plpgsql;
31+
32+
2133

2234
DROP FUNCTION IF EXISTS eql_v1.to_jsonb(val eql_v1_encrypted);
2335

src/jsonb/functions.sql

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
-- REQUIRE: src/schema.sql
2+
-- REQUIRE: src/ore-cllw/types.sql
3+
4+
5+
--
6+
-- TODO not sure about the wrapping here
7+
-- should there be an error?
8+
CREATE FUNCTION eql_v1.ste_vec(val jsonb)
9+
RETURNS jsonb
10+
IMMUTABLE STRICT PARALLEL SAFE
11+
AS $$
12+
BEGIN
13+
IF val ? 'sv' THEN
14+
RETURN val->'sv';
15+
ELSE
16+
RETURN jsonb_build_array(val);
17+
END IF;
18+
-- RAISE 'Expected a structured vec index (sv) value in json: %', val;
19+
END;
20+
$$ LANGUAGE plpgsql;
21+
22+
23+
-- extracts ste_vec index from an eql_v1_encrypted value
24+
DROP FUNCTION IF EXISTS eql_v1.ste_vec(val eql_v1_encrypted);
25+
26+
CREATE FUNCTION eql_v1.ste_vec(val eql_v1_encrypted)
27+
RETURNS jsonb
28+
IMMUTABLE STRICT PARALLEL SAFE
29+
AS $$
30+
BEGIN
31+
RETURN (SELECT eql_v1.ste_vec(val.data));
32+
END;
33+
$$ LANGUAGE plpgsql;
34+
35+
36+
37+
38+
DROP FUNCTION IF EXISTS eql_v1.selector(val jsonb);
39+
40+
CREATE FUNCTION eql_v1.selector(val jsonb)
41+
RETURNS text
42+
IMMUTABLE STRICT PARALLEL SAFE
43+
AS $$
44+
BEGIN
45+
IF val ? 's' THEN
46+
RETURN val->>'s';
47+
END IF;
48+
RAISE 'Expected a selector index (s) value in json: %', val;
49+
END;
50+
$$ LANGUAGE plpgsql;
51+
52+
53+
-- extracts ste_vec index from an eql_v1_encrypted value
54+
DROP FUNCTION IF EXISTS eql_v1.selector(val eql_v1_encrypted);
55+
56+
CREATE FUNCTION eql_v1.selector(val eql_v1_encrypted)
57+
RETURNS text
58+
IMMUTABLE STRICT PARALLEL SAFE
59+
AS $$
60+
BEGIN
61+
RETURN (SELECT eql_v1.selector(val.data));
62+
END;
63+
$$ LANGUAGE plpgsql;
64+

src/match/functions_test.sql

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
DO $$
44
BEGIN
5+
6+
7+
58
PERFORM assert_result(
69
'Extract match index term from encrypted',
710
'SELECT eql_v1.match(''{"m": []}''::jsonb)');

src/operators/->.sql

+30-55
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,48 @@
11

2+
-- REQUIRE: src/schema.sql
23
-- REQUIRE: src/encrypted/types.sql
34
-- REQUIRE: src/encrypted/functions.sql
45

56

6-
7+
--
8+
-- The -> operator returns an encrypted matching the selector
9+
-- Encypted JSON is a StructredVec.
10+
-- The index term is an array of encrypteds each with ciphertext, selector and an ore cllw index term
11+
-- {
12+
-- "sv": [ {"c": "", "s": "", "oc": "" } ]
13+
-- }
14+
--
715
DROP OPERATOR IF EXISTS -> (eql_v1_encrypted, text);
16+
817
DROP FUNCTION IF EXISTS eql_v1."->"(e eql_v1_encrypted, selector text);
918

10-
--
11-
-- Returns
12-
--
1319
CREATE FUNCTION eql_v1."->"(e eql_v1_encrypted, selector text)
1420
RETURNS eql_v1_encrypted
1521
IMMUTABLE STRICT PARALLEL SAFE
1622
AS $$
17-
-- DECLARE
18-
-- j jsonb;
19-
-- found: text;
20-
-- ignored: text;
23+
DECLARE
24+
vec jsonb;
25+
found text;
26+
ignored text;
2127
BEGIN
28+
-- Parent StructuredVec data
29+
vec := eql_v1.ste_vec(e.data);
2230

23-
-- j := e->'j';
24-
-- PERFORM eql_v1.log(j);
31+
RETURN (
32+
SELECT ROW(elem)
33+
FROM jsonb_array_elements(vec) AS elem
34+
WHERE eql_v1.selector(elem) = selector
35+
LIMIT 1
36+
);
2537

26-
-- FOR i IN 1..jsonb_array_length(j, 1) LOOP
27-
-- -- -- The ELSE part is to help ensure constant time operation.
28-
-- -- -- The result is thrown away.
29-
-- IF j[i]->'s' = selector THEN
30-
-- found := j[i]->'c';
38+
--
39+
-- Constant time version
40+
--
41+
-- FOR i IN 0..jsonb_array_length(vec) LOOP
42+
-- IF vec->i->>'s' = selector THEN
43+
-- found := eql_v1.ciphertext(vec->i);
3144
-- ELSE
32-
-- ignored := j[i]->'c';
45+
-- ignored := eql_v1.ciphertext(vec->i);
3346
-- END IF;
3447
-- END LOOP;
3548

@@ -39,52 +52,14 @@ AS $$
3952
-- RETURN NULL;
4053
-- END IF;
4154

42-
RETURN (
43-
SELECT elem::eql_v1_encrypted
44-
FROM jsonb_array_elements(e.data->'j') AS elem
45-
WHERE elem->>'s' = selector
46-
LIMIT 1
47-
);
48-
4955
END;
5056
$$ LANGUAGE plpgsql;
5157

5258

59+
5360
CREATE OPERATOR ->(
5461
FUNCTION=eql_v1."->",
5562
LEFTARG=eql_v1_encrypted,
5663
RIGHTARG=text
5764
);
5865

59-
60-
-- ste_vec_index := eql_v1.ste_vec(col);
61-
62-
-- IF ste_vec_index IS NULL THEN
63-
-- RETURN NULL;
64-
-- END IF;
65-
66-
-- target_selector := selector->>'svs';
67-
68-
-- FOR i IN 1..array_length(ste_vec_index.entries, 1) LOOP
69-
-- -- The ELSE part is to help ensure constant time operation.
70-
-- -- The result is thrown away.
71-
-- IF ste_vec_index.entries[i].tokenized_selector = target_selector THEN
72-
-- found := ste_vec_index.entries[i].ciphertext;
73-
-- ELSE
74-
-- ignored := ste_vec_index.entries[i].ciphertext;
75-
-- END IF;
76-
-- END LOOP;
77-
78-
-- IF found IS NOT NULL THEN
79-
-- RETURN jsonb_build_object(
80-
-- 'k', 'ct',
81-
-- 'c', found,
82-
-- 'o', NULL,
83-
-- 'm', NULL,
84-
-- 'u', NULL,
85-
-- 'i', col->'i',
86-
-- 'v', 1
87-
-- );
88-
-- ELSE
89-
-- RETURN NULL;
90-
-- END IF;

src/operators/->>.sql

+26-19
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
-- REQUIRE: src/schema.sql
12
-- REQUIRE: src/encrypted/types.sql
23
-- REQUIRE: src/encrypted/functions.sql
34

45

5-
66
DROP OPERATOR IF EXISTS ->> (eql_v1_encrypted, text);
77
DROP FUNCTION IF EXISTS eql_v1."->>"(e eql_v1_encrypted, selector text);
88

@@ -11,22 +11,34 @@ CREATE FUNCTION eql_v1."->>"(e eql_v1_encrypted, selector text)
1111
IMMUTABLE STRICT PARALLEL SAFE
1212
AS $$
1313
DECLARE
14-
j jsonb;
14+
vec jsonb;
1515
found text;
1616
ignored text;
1717
BEGIN
18-
-- j := e.data->'j';
19-
-- -- PERFORM eql_v1.log(j::text);
20-
-- PERFORM eql_v1.log('jsonb_array_length(j)');
21-
-- PERFORM eql_v1.log(jsonb_array_length(j)::text);
22-
23-
-- FOR i IN 0..jsonb_array_length(j) LOOP
24-
-- -- The ELSE part is to help ensure constant time operation.
25-
-- -- The result is thrown away.
26-
-- IF j[i]->>'s' = selector THEN
27-
-- found := eql_v1.ciphertext(j->i);
18+
-- Parent StructuredVec data
19+
vec := eql_v1.ste_vec(e.data);
20+
21+
-- IF e.data ? 'sv' THEN
22+
-- vec := eql_v1.ste_vec(e.data);
23+
-- ELSE
24+
-- vec := jsonb_build_array(e.data);
25+
-- END IF;
26+
27+
RETURN (
28+
SELECT elem::text
29+
FROM jsonb_array_elements(vec) AS elem
30+
WHERE eql_v1.selector(elem) = selector
31+
LIMIT 1
32+
);
33+
34+
--
35+
-- Constant time version
36+
--
37+
-- FOR i IN 0..jsonb_array_length(vec) LOOP
38+
-- IF vec->i->>'s' = selector THEN
39+
-- found := eql_v1.ciphertext(vec->i);
2840
-- ELSE
29-
-- ignored := eql_v1.ciphertext(j->i);
41+
-- ignored := eql_v1.ciphertext(vec->i);
3042
-- END IF;
3143
-- END LOOP;
3244

@@ -35,12 +47,7 @@ AS $$
3547
-- ELSE
3648
-- RETURN NULL;
3749
-- END IF;
38-
RETURN (
39-
SELECT eql_v1.ciphertext(elem)
40-
FROM jsonb_array_elements(e.data->'j') AS elem
41-
WHERE elem->>'s' = selector
42-
LIMIT 1
43-
);
50+
4451
END;
4552
$$ LANGUAGE plpgsql;
4653

0 commit comments

Comments
 (0)