Skip to content

Commit 26dc414

Browse files
committed
Encrypted JSONB operators and functions
1 parent 71c86bb commit 26dc414

Some content is hidden

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

58 files changed

+4076
-1603
lines changed

diagrams/overview-insert.drawio.svg

-457
This file was deleted.

diagrams/overview-select.drawio.svg

-552
This file was deleted.

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
@@ -19,6 +19,18 @@ AS $$
1919
$$ LANGUAGE plpgsql;
2020

2121

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

2436
CREATE FUNCTION eql_v1.to_jsonb(val eql_v1_encrypted)

0 commit comments

Comments
 (0)