Skip to content

Key Derivation functions in the Crypto DuckDB extension

Function category

Key Derivation

4 functions

crypto_argon2

Scalar function Key Derivation
Signature
crypto_argon2( variant: VARCHAR, password: BLOB | VARCHAR, salt: BLOB | VARCHAR, iterations: BIGINT, memory_kib: BIGINT, parallelism: BIGINT, length: BIGINT ) → BLOB
Arguments (Positional)
Argument variant Type VARCHAR Mode Positional Description
Argument password Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument salt Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument iterations Type BIGINT Mode Positional Description
Argument memory_kib Type BIGINT Mode Positional Description
Argument parallelism Type BIGINT Mode Positional Description
Argument length Type BIGINT Mode Positional Description
Description
1 Argon2id with 2 iterations, 64 MiB and 4 lanes
SELECT lower(to_hex(crypto_argon2('argon2id', 'password', 'somesalt', 2, 65536, 4, 32))) AS hash;

Output

hash
1a9677b0afe81fda7b548895e7a1bfeb8668ffc19a530e37e088a668fab1c02a
2 A small, fast configuration for tests
SELECT lower(to_hex(crypto_argon2('argon2id', '', 'somesalt', 1, 64, 1, 16))) AS hash;

Output

hash
83b7ea15e3a517fe0455cbe091d0931c

crypto_hkdf

Scalar function Key Derivation
Signature
crypto_hkdf( algorithm: VARCHAR, key: BLOB | VARCHAR, salt: BLOB | VARCHAR, info: BLOB | VARCHAR, length: BIGINT ) → BLOB
Arguments (Positional)
Argument algorithm Type VARCHAR Mode Positional Description
Argument key Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument salt Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument info Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument length Type BIGINT Mode Positional Description
Description
1 RFC 5869 test case 1
SELECT lower(to_hex(crypto_hkdf('sha2-256',
         unhex('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'),
         unhex('000102030405060708090a0b0c'),
         unhex('f0f1f2f3f4f5f6f7f8f9'),
         42))) AS okm;

Output

okm
3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865
2 RFC 5869 test case 3: empty salt and info
SELECT lower(to_hex(crypto_hkdf('sha2-256', unhex('0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b'), '', '', 42))) AS okm;

Output

okm
8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8

crypto_pbkdf2

Scalar function Key Derivation
Signature
crypto_pbkdf2( algorithm: VARCHAR, password: BLOB | VARCHAR, salt: BLOB | VARCHAR, iterations: BIGINT, length: BIGINT ) → BLOB
Arguments (Positional)
Argument algorithm Type VARCHAR Mode Positional Description
Argument password Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument salt Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument iterations Type BIGINT Mode Positional Description
Argument length Type BIGINT Mode Positional Description
Description
1 RFC 6070 test vector (PBKDF2-HMAC-SHA1, 4096 iterations)
SELECT lower(to_hex(crypto_pbkdf2('sha1', 'password', 'salt', 4096, 20))) AS dk;

Output

dk
4b007901b765489abead49d926f721d065a429c1
2 PBKDF2-HMAC-SHA256, 40-byte output
SELECT lower(to_hex(crypto_pbkdf2('sha2-256', 'passwordPASSWORDpassword', 'saltSALTsaltSALTsaltSALTsaltSALTsalt', 4096, 40))) AS dk;

Output

dk
348c89dbcbd32b2f32d814b8116e84cf2b17347ebc1800181c4e2a1fb8dd53e1c635518c7dac47e9

crypto_scrypt

Scalar function Key Derivation
Signature
crypto_scrypt( password: BLOB | VARCHAR, salt: BLOB | VARCHAR, n: BIGINT, r: BIGINT, p: BIGINT, length: BIGINT ) → BLOB
Arguments (Positional)
Argument password Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument salt Type BLOB | VARCHAR
2 concrete types
BLOBVARCHAR
Mode Positional Description
Argument n Type BIGINT Mode Positional Description
Argument r Type BIGINT Mode Positional Description
Argument p Type BIGINT Mode Positional Description
Argument length Type BIGINT Mode Positional Description
Description
1 RFC 7914 test vector (n = 1024, r = 8, p = 16)
SELECT lower(to_hex(crypto_scrypt('password', 'NaCl', 1024, 8, 16, 64))) AS dk;

Output

dk
fdbabe1c9d3472007856e7190d01e9fe7c6ad7cbc8237830e77376634b3731622eaf30d92e22a3886ff109279d9830dac727afb94a83ee6d8360cbdfa2cc0640