-
Notifications
You must be signed in to change notification settings - Fork 38
Expand file tree
/
Copy pathtest.sql
More file actions
137 lines (95 loc) · 5.09 KB
/
test.sql
File metadata and controls
137 lines (95 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
\set ECHO none
\set QUIET 1
\pset format unaligned
\pset tuples_only true
\pset pager
\set ON_ERROR_ROLLBACK 1
-- \set ON_ERROR_STOP true
\set QUIET 1
CREATE EXTENSION pgtap;
CREATE EXTENSION pgsodium;
BEGIN;
SELECT plan(26);
SELECT lives_ok($$SELECT randombytes_random()$$, 'randombytes_random');
SELECT lives_ok($$SELECT randombytes_uniform(10)$$, 'randombytes_uniform');
SELECT lives_ok($$SELECT randombytes_buf(10)$$, 'randombytes_buf');
SELECT crypto_secretbox_keygen() boxkey \gset
SELECT crypto_secretbox_noncegen() secretboxnonce \gset
SELECT crypto_secretbox('bob is your uncle', :'secretboxnonce', :'boxkey') secretbox \gset
SELECT is(crypto_secretbox_open(:'secretbox', :'secretboxnonce', :'boxkey'),
'bob is your uncle', 'secretbox_open');
SELECT crypto_auth_keygen() authkey \gset
SELECT crypto_auth('bob is your uncle', :'authkey') auth_mac \gset
SELECT ok(crypto_auth_verify(:'auth_mac', 'bob is your uncle', :'authkey'),
'crypto_auth_verify');
SELECT ok(not crypto_auth_verify('bad mac', 'bob is your uncle', :'authkey'),
'crypto_auth_verify bad mac');
SELECT ok(not crypto_auth_verify(:'auth_mac', 'bob is your uncle', 'bad key'),
'crypto_auth_verify bad key');
SELECT is(crypto_generichash('bob is your uncle'),
'\x6c80c5f772572423c3910a9561710313e4b6e74abc0d65f577a8ac1583673657',
'crypto_generichash');
SELECT is(crypto_generichash('bob is your uncle', NULL),
'\x6c80c5f772572423c3910a9561710313e4b6e74abc0d65f577a8ac1583673657',
'crypto_generichash NULL key');
SELECT is(crypto_generichash('bob is your uncle', 'super sekret key'),
'\xe8e9e180d918ea9afe0bf44d1945ec356b2b6845e9a4c31acc6c02d826036e41',
'crypto_generichash with key');
SELECT is(crypto_shorthash('bob is your uncle', 'super sekret key'),
'\xe080614efb824a15',
'crypto_shorthash');
SELECT crypto_box_noncegen() boxnonce \gset
SELECT public, secret FROM crypto_box_new_keypair() \gset bob_
SELECT public, secret FROM crypto_box_new_keypair() \gset alice_
SELECT crypto_box('bob is your uncle', :'boxnonce', :'bob_public', :'alice_secret') box \gset
SELECT is(crypto_box_open(:'box', :'boxnonce', :'alice_public', :'bob_secret'),
'bob is your uncle', 'crypto_box_open');
SELECT crypto_box_seal('bob is your uncle', :'bob_public') sealed \gset
SELECT is(crypto_box_seal_open(:'sealed', :'bob_public', :'bob_secret'),
'bob is your uncle', 'crypto_box_seal/open');
SELECT public, secret FROM crypto_sign_new_keypair() \gset sign_
SELECT crypto_sign('bob is your uncle', :'sign_secret') signed \gset
SELECT is(crypto_sign_open(:'signed', :'sign_public'),
'bob is your uncle', 'crypto_sign/open');
-- We will sign our previously generated sealed box
SELECT crypto_sign_detached(:'sealed', :'sign_secret') detached \gset
SELECT is(crypto_sign_verify_detached(:'detached', :'sealed', :'sign_public'),
true, 'crypto_sign_detached/verify');
SELECT is(crypto_sign_verify_detached(:'detached', 'xyzzy', :'sign_public'),
false, 'crypto_sign_detached/verify (incorrect message)');
SELECT lives_ok($$SELECT crypto_pwhash_saltgen()$$, 'crypto_pwhash_saltgen');
SELECT is(crypto_pwhash('Correct Horse Battery Staple', '\xccfe2b51d426f88f6f8f18c24635616b'),
'\x77d029a9b3035c88f186ed0f69f58386ad0bd5252851b4e89f0d7057b5081342',
'crypto_pwhash');
SELECT ok(crypto_pwhash_str_verify(crypto_pwhash_str('Correct Horse Battery Staple'),
'Correct Horse Battery Staple'),
'crypto_pwhash_str_verify');
-- this pattern below is an example of how to turn off query logging
-- of secrets via session variables.
SET LOCAL log_statement = 'none';
SET LOCAL app.bob_secret = :'bob_secret';
SET LOCAL app.alice_secret = :'alice_secret';
RESET log_statement;
SELECT crypto_box('bob is your uncle', :'boxnonce', :'bob_public',
current_setting('app.alice_secret')::bytea) box \gset
SELECT is(crypto_box_open(:'box', :'boxnonce', :'alice_public',
current_setting('app.bob_secret')::bytea),
'bob is your uncle', 'crypto_box_open');
SELECT crypto_kdf_keygen() kdfkey \gset
SELECT length(crypto_kdf_derive_from_key(64, 1, '__auth__', :'kdfkey')) kdfsubkeylen \gset
SELECT is(:kdfsubkeylen, 64, '64 byte derived subkey');
SELECT length(crypto_kdf_derive_from_key(32, 1, '__auth__', :'kdfkey')) kdfsubkeylen \gset
SELECT is(:kdfsubkeylen, 32, '32 byte derived subkey');
SELECT is(crypto_kdf_derive_from_key(32, 2, '__auth__', :'kdfkey'),
crypto_kdf_derive_from_key(32, 2, '__auth__', :'kdfkey'), 'subkeys are deterministic.');
SELECT throws_ok($$crypto_kdf_derive_from_key(32, 2, '__aut__', :'kdfkey')$$,
'kdf context not 8 bytes');
-- test relocatable schema
CREATE SCHEMA pgsodium;
DROP EXTENSION IF EXISTS pgsodium;
CREATE EXTENSION pgsodium WITH SCHEMA pgsodium;
SELECT lives_ok($$SELECT pgsodium.randombytes_random()$$, 'randombytes_random');
SELECT lives_ok($$SELECT pgsodium.randombytes_uniform(10)$$, 'randombytes_uniform');
SELECT lives_ok($$SELECT pgsodium.randombytes_buf(10)$$, 'randombytes_buf');
SELECT * FROM finish();
ROLLBACK;