1
1
CREATE EXTENSION IF NOT EXISTS pgcrypto;
2
2
3
- CREATE TYPE ore_64_8_v1_term AS (
4
- bytes bytea
5
- );
6
-
7
- CREATE TYPE ore_64_8_v1 AS (
8
- terms ore_64_8_v1_term[]
9
- );
3
+ CREATE DOMAIN ore_64_8_index_v1 AS bytea [];
10
4
11
- DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a ore_64_8_v1_term , b ore_64_8_v1_term );
5
+ DROP FUNCTION IF EXISTS compare_ore_64_8_v1_term(a bytea , b bytea );
12
6
13
- CREATE FUNCTION compare_ore_64_8_v1_term (a ore_64_8_v1_term , b ore_64_8_v1_term ) returns integer AS $$
7
+ CREATE FUNCTION compare_ore_64_8_v1_term (a bytea , b bytea ) returns integer AS $$
14
8
DECLARE
15
9
eq boolean := true;
16
10
unequal_block smallint := 0 ;
@@ -35,7 +29,7 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
35
29
RETURN 1 ;
36
30
END IF;
37
31
38
- IF bit_length(a . bytes ) != bit_length(b . bytes ) THEN
32
+ IF bit_length(a) != bit_length(b) THEN
39
33
RAISE EXCEPTION ' Ciphertexts are different lengths' ;
40
34
END IF;
41
35
@@ -47,8 +41,8 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
47
41
-- * We are not worrying about timing attacks here; don't fret about
48
42
-- the OR or !=.
49
43
IF
50
- substr(a . bytes , 1 + block, 1 ) != substr(b . bytes , 1 + block, 1 )
51
- OR substr(a . bytes , 9 + left_block_size * block, left_block_size) != substr(b . bytes , 9 + left_block_size * BLOCK, left_block_size)
44
+ substr(a, 1 + block, 1 ) != substr(b, 1 + block, 1 )
45
+ OR substr(a, 9 + left_block_size * block, left_block_size) != substr(b, 9 + left_block_size * BLOCK, left_block_size)
52
46
THEN
53
47
-- set the first unequal block we find
54
48
IF eq THEN
@@ -63,20 +57,20 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
63
57
END IF;
64
58
65
59
-- Hash key is the IV from the right CT of b
66
- hash_key := substr(b . bytes , right_offset + 1 , 16 );
60
+ hash_key := substr(b, right_offset + 1 , 16 );
67
61
68
62
-- first right block is at right offset + nonce_size (ordinally indexed)
69
- target_block := substr(b . bytes , right_offset + 17 + (unequal_block * right_block_size), right_block_size);
63
+ target_block := substr(b, right_offset + 17 + (unequal_block * right_block_size), right_block_size);
70
64
71
65
indicator := (
72
66
get_bit(
73
67
encrypt(
74
- substr(a . bytes , 9 + (left_block_size * unequal_block), left_block_size),
68
+ substr(a, 9 + (left_block_size * unequal_block), left_block_size),
75
69
hash_key,
76
70
' aes-ecb'
77
71
),
78
72
0
79
- ) + get_bit(target_block, get_byte(a . bytes , unequal_block))) % 2 ;
73
+ ) + get_bit(target_block, get_byte(a, unequal_block))) % 2 ;
80
74
81
75
IF indicator = 1 THEN
82
76
RETURN 1 ::integer ;
@@ -87,169 +81,34 @@ CREATE FUNCTION compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term)
87
81
$$ LANGUAGE plpgsql;
88
82
89
83
90
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_eq(a ore_64_8_v1_term, b ore_64_8_v1_term);
91
-
92
- CREATE FUNCTION ore_64_8_v1_term_eq (a ore_64_8_v1_term, b ore_64_8_v1_term)
93
- RETURNS boolean AS $$
94
- SELECT compare_ore_64_8_v1_term(a, b) = 0
95
- $$ LANGUAGE SQL;
96
-
97
-
98
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_neq(a ore_64_8_v1_term, b ore_64_8_v1_term);
99
-
100
- CREATE FUNCTION ore_64_8_v1_term_neq (a ore_64_8_v1_term, b ore_64_8_v1_term)
101
- RETURNS boolean AS $$
102
- SELECT compare_ore_64_8_v1_term(a, b) <> 0
103
- $$ LANGUAGE SQL;
104
-
105
-
106
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_lt(a ore_64_8_v1_term, b ore_64_8_v1_term);
107
-
108
- CREATE FUNCTION ore_64_8_v1_term_lt (a ore_64_8_v1_term, b ore_64_8_v1_term)
109
- RETURNS boolean AS $$
110
- SELECT compare_ore_64_8_v1_term(a, b) = - 1
111
- $$ LANGUAGE SQL;
112
-
113
-
114
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_lte(a ore_64_8_v1_term, b ore_64_8_v1_term);
115
-
116
- CREATE FUNCTION ore_64_8_v1_term_lte (a ore_64_8_v1_term, b ore_64_8_v1_term)
117
- RETURNS boolean AS $$
118
- SELECT compare_ore_64_8_v1_term(a, b) != 1
119
- $$ LANGUAGE SQL;
120
-
121
-
122
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_gt(a ore_64_8_v1_term, b ore_64_8_v1_term);
123
-
124
- CREATE FUNCTION ore_64_8_v1_term_gt (a ore_64_8_v1_term, b ore_64_8_v1_term)
125
- RETURNS boolean AS $$
126
- SELECT compare_ore_64_8_v1_term(a, b) = 1
127
- $$ LANGUAGE SQL;
128
-
129
-
130
- DROP FUNCTION IF EXISTS ore_64_8_v1_term_gte(a ore_64_8_v1_term, b ore_64_8_v1_term);
131
-
132
- CREATE FUNCTION ore_64_8_v1_term_gte (a ore_64_8_v1_term, b ore_64_8_v1_term)
133
- RETURNS boolean AS $$
134
- SELECT compare_ore_64_8_v1_term(a, b) != - 1
135
- $$ LANGUAGE SQL;
136
-
137
-
138
- DROP OPERATOR IF EXISTS = (ore_64_8_v1_term, ore_64_8_v1_term);
139
-
140
- CREATE OPERATOR = (
141
- PROCEDURE= " ore_64_8_v1_term_eq" ,
142
- LEFTARG= ore_64_8_v1_term,
143
- RIGHTARG= ore_64_8_v1_term,
144
- NEGATOR = <> ,
145
- RESTRICT = eqsel,
146
- JOIN = eqjoinsel,
147
- HASHES,
148
- MERGES
149
- );
150
-
151
-
152
- DROP OPERATOR IF EXISTS <> (ore_64_8_v1_term, ore_64_8_v1_term);
153
-
154
- CREATE OPERATOR <> (
155
- PROCEDURE= " ore_64_8_v1_term_neq" ,
156
- LEFTARG= ore_64_8_v1_term,
157
- RIGHTARG= ore_64_8_v1_term,
158
- NEGATOR = = ,
159
- RESTRICT = eqsel,
160
- JOIN = eqjoinsel,
161
- HASHES,
162
- MERGES
163
- );
164
-
165
- DROP OPERATOR IF EXISTS > (ore_64_8_v1_term, ore_64_8_v1_term);
166
-
167
- CREATE OPERATOR > (
168
- PROCEDURE= " ore_64_8_v1_term_gt" ,
169
- LEFTARG= ore_64_8_v1_term,
170
- RIGHTARG= ore_64_8_v1_term,
171
- COMMUTATOR = < ,
172
- NEGATOR = <= ,
173
- RESTRICT = scalargtsel,
174
- JOIN = scalargtjoinsel
175
- );
176
-
177
- DROP OPERATOR IF EXISTS < (ore_64_8_v1_term, ore_64_8_v1_term);
178
-
179
- CREATE OPERATOR < (
180
- PROCEDURE= " ore_64_8_v1_term_lt" ,
181
- LEFTARG= ore_64_8_v1_term,
182
- RIGHTARG= ore_64_8_v1_term,
183
- COMMUTATOR = > ,
184
- NEGATOR = >= ,
185
- RESTRICT = scalarltsel,
186
- JOIN = scalarltjoinsel
187
- );
188
-
189
- DROP OPERATOR IF EXISTS <= (ore_64_8_v1_term, ore_64_8_v1_term);
190
-
191
- CREATE OPERATOR <= (
192
- PROCEDURE= " ore_64_8_v1_term_lte" ,
193
- LEFTARG= ore_64_8_v1_term,
194
- RIGHTARG= ore_64_8_v1_term,
195
- COMMUTATOR = >= ,
196
- NEGATOR = > ,
197
- RESTRICT = scalarlesel,
198
- JOIN = scalarlejoinsel
199
- );
200
-
201
- DROP OPERATOR IF EXISTS >= (ore_64_8_v1_term, ore_64_8_v1_term);
202
-
203
- CREATE OPERATOR >= (
204
- PROCEDURE= " ore_64_8_v1_term_gte" ,
205
- LEFTARG= ore_64_8_v1_term,
206
- RIGHTARG= ore_64_8_v1_term,
207
- COMMUTATOR = <= ,
208
- NEGATOR = < ,
209
- RESTRICT = scalarlesel,
210
- JOIN = scalarlejoinsel
211
- );
212
-
213
- DROP OPERATOR FAMILY IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
214
-
215
- CREATE OPERATOR FAMILY ore_64_8_v1_term_btree_ops USING btree;
216
-
217
-
218
- DROP OPERATOR CLASS IF EXISTS ore_64_8_v1_term_btree_ops USING btree;
219
-
220
- CREATE OPERATOR CLASS ore_64_8_v1_term_btree_ops DEFAULT FOR TYPE ore_64_8_v1_term USING btree FAMILY ore_64_8_v1_term_btree_ops AS
221
- OPERATOR 1 < ,
222
- OPERATOR 2 <= ,
223
- OPERATOR 3 = ,
224
- OPERATOR 4 >= ,
225
- OPERATOR 5 > ,
226
- FUNCTION 1 compare_ore_64_8_v1_term(a ore_64_8_v1_term, b ore_64_8_v1_term);
227
-
228
84
-- Compare the "head" of each array and recurse if necessary
229
85
-- This function assumes an empty string is "less than" everything else
230
86
-- so if a is empty we return -1, if be is empty and a isn't, we return 1.
231
87
-- If both are empty we return 0. This cases probably isn't necessary as equality
232
88
-- doesn't always make sense but it's here for completeness.
233
89
-- If both are non-empty, we compare the first element. If they are equal
234
90
-- we need to consider the next block so we recurse, otherwise we return the comparison result.
235
- DROP FUNCTION IF EXISTS compare_ore_array(a ore_64_8_v1_term[], b ore_64_8_v1_term[]);
236
91
237
- CREATE FUNCTION compare_ore_array (a ore_64_8_v1_term[], b ore_64_8_v1_term[])
92
+
93
+ CREATE FUNCTION compare_ore_array (a ore_64_8_index_v1, b ore_64_8_index_v1)
238
94
RETURNS integer AS $$
239
95
DECLARE
240
96
cmp_result integer ;
241
97
BEGIN
242
98
IF (array_length(a, 1 ) = 0 OR a IS NULL ) AND (array_length(b, 1 ) = 0 OR b IS NULL ) THEN
243
99
RETURN 0 ;
244
100
END IF;
101
+
245
102
IF array_length(a, 1 ) = 0 OR a IS NULL THEN
246
103
RETURN - 1 ;
247
104
END IF;
105
+
248
106
IF array_length(b, 1 ) = 0 OR a IS NULL THEN
249
107
RETURN 1 ;
250
108
END IF;
251
109
252
110
cmp_result := compare_ore_64_8_v1_term(a[1 ], b[1 ]);
111
+
253
112
IF cmp_result = 0 THEN
254
113
-- Removes the first element in the array, and calls this fn again to compare the next element/s in the array.
255
114
RETURN compare_ore_array(a[2 :array_length(a,1 )], b[2 :array_length(b,1 )]);
@@ -260,68 +119,68 @@ RETURNS integer AS $$
260
119
$$ LANGUAGE plpgsql;
261
120
262
121
-- This function uses lexicographic comparison
263
- DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_v1 , b ore_64_8_v1 );
122
+ DROP FUNCTION IF EXISTS compare_ore_64_8_v1(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
264
123
265
- CREATE FUNCTION compare_ore_64_8_v1 (a ore_64_8_v1 , b ore_64_8_v1 )
124
+ CREATE FUNCTION compare_ore_64_8_v1 (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
266
125
RETURNS integer AS $$
267
- DECLARE
268
- cmp_result integer ;
269
126
BEGIN
270
127
-- Recursively compare blocks bailing as soon as we can make a decision
271
- RETURN compare_ore_array(a . terms , b . terms );
128
+ RETURN compare_ore_array(a, b);
272
129
END
273
130
$$ LANGUAGE plpgsql;
274
131
275
132
276
- DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_v1 , b ore_64_8_v1 );
133
+ DROP FUNCTION IF EXISTS ore_64_8_v1_eq(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
277
134
278
- CREATE FUNCTION ore_64_8_v1_eq (a ore_64_8_v1 , b ore_64_8_v1 )
135
+ CREATE FUNCTION ore_64_8_v1_eq (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
279
136
RETURNS boolean AS $$
280
137
SELECT compare_ore_64_8_v1(a, b) = 0
281
138
$$ LANGUAGE SQL;
282
139
283
140
284
- DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_v1 , b ore_64_8_v1 );
141
+ DROP FUNCTION IF EXISTS ore_64_8_v1_neq(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
285
142
286
- CREATE FUNCTION ore_64_8_v1_neq (a ore_64_8_v1 , b ore_64_8_v1 )
143
+ CREATE FUNCTION ore_64_8_v1_neq (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
287
144
RETURNS boolean AS $$
288
145
SELECT compare_ore_64_8_v1(a, b) <> 0
289
146
$$ LANGUAGE SQL;
290
147
291
148
292
- DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_v1 , b ore_64_8_v1 );
149
+ DROP FUNCTION IF EXISTS ore_64_8_v1_lt(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
293
150
294
- CREATE FUNCTION ore_64_8_v1_lt (a ore_64_8_v1 , b ore_64_8_v1 )
151
+ CREATE FUNCTION ore_64_8_v1_lt (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
295
152
RETURNS boolean AS $$
296
153
SELECT compare_ore_64_8_v1(a, b) = - 1
297
154
$$ LANGUAGE SQL;
298
155
299
156
300
- DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_v1 , b ore_64_8_v1 );
157
+ DROP FUNCTION IF EXISTS ore_64_8_v1_lte(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
301
158
302
- CREATE FUNCTION ore_64_8_v1_lte (a ore_64_8_v1 , b ore_64_8_v1 )
159
+ CREATE FUNCTION ore_64_8_v1_lte (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
303
160
RETURNS boolean AS $$
304
161
SELECT compare_ore_64_8_v1(a, b) != 1
305
162
$$ LANGUAGE SQL;
306
163
307
164
308
- DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_v1 , b ore_64_8_v1 );
165
+ DROP FUNCTION IF EXISTS ore_64_8_v1_gt(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
309
166
310
- CREATE FUNCTION ore_64_8_v1_gt (a ore_64_8_v1 , b ore_64_8_v1 )
167
+ CREATE FUNCTION ore_64_8_v1_gt (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
311
168
RETURNS boolean AS $$
312
- SELECT compare_ore_64_8_v1(a, b) = 1
313
- $$ LANGUAGE SQL;
169
+ BEGIN
170
+ SELECT compare_ore_64_8_v1(a, b) = 1 ;
171
+ END;
172
+ $$ LANGUAGE plpgsql;
314
173
315
174
316
- DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_v1 , b ore_64_8_v1 );
175
+ DROP FUNCTION IF EXISTS ore_64_8_v1_gte(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
317
176
318
- CREATE FUNCTION ore_64_8_v1_gte (a ore_64_8_v1 , b ore_64_8_v1 )
177
+ CREATE FUNCTION ore_64_8_v1_gte (a ore_64_8_index_v1 , b ore_64_8_index_v1 )
319
178
RETURNS boolean AS $$
320
179
SELECT compare_ore_64_8_v1(a, b) != - 1
321
180
$$ LANGUAGE SQL;
322
181
323
182
324
- DROP OPERATOR IF EXISTS = (ore_64_8_v1, ore_64_8_v1 );
183
+ DROP OPERATOR IF EXISTS = (ore_64_8_index_v1, ore_64_8_index_v1 );
325
184
326
185
CREATE OPERATOR = (
327
186
PROCEDURE= " ore_64_8_v1_eq" ,
@@ -335,7 +194,7 @@ CREATE OPERATOR = (
335
194
);
336
195
337
196
338
- DROP OPERATOR IF EXISTS <> (ore_64_8_v1, ore_64_8_v1 );
197
+ DROP OPERATOR IF EXISTS <> (ore_64_8_index_v1, ore_64_8_index_v1 );
339
198
340
199
CREATE OPERATOR <> (
341
200
PROCEDURE= " ore_64_8_v1_neq" ,
@@ -348,7 +207,7 @@ CREATE OPERATOR <> (
348
207
MERGES
349
208
);
350
209
351
- DROP OPERATOR IF EXISTS > (ore_64_8_v1, ore_64_8_v1 );
210
+ DROP OPERATOR IF EXISTS > (ore_64_8_index_v1, ore_64_8_index_v1 );
352
211
353
212
CREATE OPERATOR > (
354
213
PROCEDURE= " ore_64_8_v1_gt" ,
@@ -361,7 +220,7 @@ CREATE OPERATOR > (
361
220
);
362
221
363
222
364
- DROP OPERATOR IF EXISTS < (ore_64_8_v1, ore_64_8_v1 );
223
+ DROP OPERATOR IF EXISTS < (ore_64_8_index_v1, ore_64_8_index_v1 );
365
224
366
225
CREATE OPERATOR < (
367
226
PROCEDURE= " ore_64_8_v1_lt" ,
@@ -374,7 +233,7 @@ CREATE OPERATOR < (
374
233
);
375
234
376
235
377
- DROP OPERATOR IF EXISTS <= (ore_64_8_v1, ore_64_8_v1 );
236
+ DROP OPERATOR IF EXISTS <= (ore_64_8_index_v1, ore_64_8_index_v1 );
378
237
379
238
CREATE OPERATOR <= (
380
239
PROCEDURE= " ore_64_8_v1_lte" ,
@@ -387,7 +246,7 @@ CREATE OPERATOR <= (
387
246
);
388
247
389
248
390
- DROP OPERATOR IF EXISTS >= (ore_64_8_v1, ore_64_8_v1 );
249
+ DROP OPERATOR IF EXISTS >= (ore_64_8_index_v1, ore_64_8_index_v1 );
391
250
392
251
CREATE OPERATOR >= (
393
252
PROCEDURE= " ore_64_8_v1_gte" ,
@@ -413,4 +272,4 @@ CREATE OPERATOR CLASS ore_64_8_v1_btree_ops DEFAULT FOR TYPE ore_64_8_v1 USING b
413
272
OPERATOR 3 = ,
414
273
OPERATOR 4 >= ,
415
274
OPERATOR 5 > ,
416
- FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_v1 , b ore_64_8_v1 );
275
+ FUNCTION 1 compare_ore_64_8_v1(a ore_64_8_index_v1 , b ore_64_8_index_v1 );
0 commit comments