@dstanesc/o-o-o-o-o-o-o
Version:
O-O-O-O-O-O-O is a collection of content addressed persistent data structures
76 lines (69 loc) • 1.59 kB
text/typescript
import { Link } from './types'
interface Signer {
sign: (root: Link) => Promise<Uint8Array>
exportPublicKey: () => Promise<string>
}
const signerFactory = ({
subtle,
privateKey,
publicKey,
}: {
subtle: SubtleCrypto
privateKey: CryptoKey
publicKey: CryptoKey
}): Signer => {
const sign = async (root: Link): Promise<Uint8Array> => {
const buffer: ArrayBuffer = await subtle.sign(
{
name: 'RSA-PSS',
saltLength: 32,
},
privateKey,
root.bytes
)
return new Uint8Array(buffer)
}
const exportPublicKey = async (): Promise<string> => {
const exported = await subtle.exportKey('jwk', publicKey)
return JSON.stringify(exported)
}
return { sign, exportPublicKey }
}
const verify = async ({
subtle,
publicKey,
root,
signature,
}: {
subtle: SubtleCrypto
publicKey: CryptoKey
root: Link
signature: Uint8Array
}): Promise<boolean> => {
return await subtle.verify(
{
name: 'RSA-PSS',
saltLength: 32,
},
publicKey,
signature,
root.bytes
)
}
const importPublicKey = async ({
subtle,
key: keyString,
}: {
subtle: SubtleCrypto
key: string
}): Promise<CryptoKey> => {
const key = JSON.parse(keyString)
return await subtle.importKey(
'jwk',
key,
{ name: 'RSA-PSS', hash: 'SHA-256' },
true,
['verify']
)
}
export { signerFactory, Signer, verify, importPublicKey }