Skip to content

Commit

Permalink
contrib/pgcrypto
Browse files Browse the repository at this point in the history
  • Loading branch information
samwillis committed Aug 22, 2024
1 parent d8ef285 commit 9bacbda
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 0 deletions.
16 changes: 16 additions & 0 deletions packages/pglite/src/contrib/pgcrypto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type {
Extension,
ExtensionSetupResult,
PGliteInterface,
} from '../interface'

const setup = async (_pg: PGliteInterface, _emscriptenOpts: any) => {
return {
bundlePath: new URL('../../release/pgcrypto.tar.gz', import.meta.url),
} satisfies ExtensionSetupResult
}

export const pgcrypto = {
name: 'pgcrypto',
setup,
} satisfies Extension
85 changes: 85 additions & 0 deletions packages/pglite/tests/contrib/pgcrypto.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
import { describe, it, expect } from 'vitest'
import { PGlite } from '../../dist/index.js'
import { pgcrypto } from '../../dist/contrib/pgcrypto.js'

describe('pg_pgcryptotrgm', () => {
it('digest', async () => {
const pg = new PGlite({
extensions: {
pgcrypto,
},
})

await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;')

const res = await pg.query(
"SELECT encode(digest(convert_to('test', 'UTF8'), 'sha1'), 'hex') as value;",
)
expect(res.rows[0].value, 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3')
})

it('hmac', async () => {
const pg = new PGlite({
extensions: {
pgcrypto,
},
})

await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;')

const res = await pg.query(
"SELECT encode(hmac(convert_to('test', 'UTF8'), convert_to('key', 'UTF8'), 'sha1'), 'hex') as value;",
)
expect(res.rows[0].value).toEqual(
'671f54ce0c540f78ffe1e26dcf9c2a047aea4fda',
)
})

it('crypt', async () => {
const pg = new PGlite({
extensions: {
pgcrypto,
},
})

await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;')

const res = await pg.query("SELECT crypt('test', gen_salt('bf')) as value;")
expect(res.rows[0].value.length).toEqual(60)
})

it('gen_salt', async () => {
const pg = new PGlite({
extensions: {
pgcrypto,
},
})

await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;')

const res = await pg.query("SELECT gen_salt('bf') as value;")
expect(res.rows[0].value.length).toEqual(29)
})

it('pgp_sym_encrypt and pgp_sym_decrypt', async () => {
const pg = new PGlite({
extensions: {
pgcrypto,
},
})

await pg.exec('CREATE EXTENSION IF NOT EXISTS pgcrypto;')

const res = await pg.query(
"SELECT pgp_sym_encrypt('test', 'key') as value;",
)
const encrypted = res.rows[0].value

const res2 = await pg.query("SELECT pgp_sym_decrypt($1, 'key') as value;", [
encrypted,
])
expect(res2.rows[0].value).toEqual('test')
})
})

// TODO: pgp_pub_encrypt and pgp_pub_decrypt

0 comments on commit 9bacbda

Please sign in to comment.