{
  "version": 3,
  "sources": ["../../src/sodium/ecc.ts"],
  "sourcesContent": ["import libsodium from 'libsodium-wrappers'\nimport * as u from 'uint8arrays'\nimport type { LockKey, JSONValue, DID } from '../types.js'\nimport {\n    generateEntropy,\n    fromString,\n    asBufferOrString,\n    toString,\n    stringify,\n    publicKeyToDid\n} from '../util.js'\nimport { didToPublicKey } from '../index.js'\n\nexport { stringify, publicKeyToDid }\n\nconst CURRENT_LOCK_KEY_FORMAT_VERSION = 1\n\nexport function importPublicKey (key:string):Uint8Array {\n    return fromString(key)\n}\n\n/**\n * Convert a DID format string to a public key instance.\n */\nexport async function importDid (did:DID):Promise<Uint8Array> {\n    const parsed = didToPublicKey(did)\n    const pubKey = parsed.publicKey\n    return pubKey\n}\n\n/**\n * Create a new keypair.\n */\nexport async function create ():Promise<LockKey> {\n    const keys = await deriveLockKey()\n    return keys\n}\n\nasync function deriveLockKey (iv?:Uint8Array):Promise<LockKey> {\n    await libsodium.ready\n    const sodium = libsodium\n\n    const IV_BYTE_LENGTH = sodium.crypto_sign_SEEDBYTES\n    if (!iv) {\n        iv = generateEntropy(sodium, IV_BYTE_LENGTH)\n    }\n\n    try {\n        const ed25519KeyPair = sodium.crypto_sign_seed_keypair(iv)\n\n        return {\n            keyFormatVersion: CURRENT_LOCK_KEY_FORMAT_VERSION,\n            iv,\n            publicKey: ed25519KeyPair.publicKey,\n            privateKey: ed25519KeyPair.privateKey,\n            encPK: sodium.crypto_sign_ed25519_pk_to_curve25519(\n                ed25519KeyPair.publicKey,\n            ),\n            encSK: sodium.crypto_sign_ed25519_sk_to_curve25519(\n                ed25519KeyPair.privateKey,\n            ),\n        }\n    } catch (err) {\n        throw new Error('Encryption/decryption key derivation failed.', {\n            cause: err,\n        })\n    }\n}\n\n/**\n * Verify a given signature and message.\n */\nexport async function verify (\n    data:string|Uint8Array,\n    sig:string|Uint8Array,\n    keys:{ publicKey:Uint8Array|string }\n):Promise<boolean> {\n    await libsodium.ready\n    const sodium = libsodium\n\n    try {\n        const pubKey = (typeof keys.publicKey === 'string' ?\n            fromString(keys.publicKey) :\n            keys.publicKey)\n\n        const isOk = sodium.crypto_sign_verify_detached(\n            typeof sig === 'string' ? fromString(sig) : sig,\n            data,\n            pubKey\n        )\n\n        return isOk\n    } catch (_err) {\n        return false\n    }\n}\n\nexport async function sign (data:string|Uint8Array, key:LockKey):Promise<string>\n\nexport async function sign (data:string|Uint8Array, key:LockKey, opts:{\n    format:'raw'\n}):Promise<Uint8Array>\n\nexport async function sign (data:string|Uint8Array, key:LockKey, opts:{\n    format:'string'\n}):Promise<string>\n\n/**\n * Sign the given data.\n *\n * Async to match the webcrypto API.\n *\n * @param data The data to sign.\n * @param key The keys to use\n * @param opts Can specify 'raw' as `outputFormat`, which will return\n * a `Uint8Array` instead of a string.\n * @returns {Promise<string|Uint8Array>} String or binary, depending on `opts`\n */\nexport async function sign (\n    data:string|Uint8Array,\n    key:LockKey,\n    opts:{\n        format:'string'|'raw'\n    } = { format: 'string' }\n):Promise<string|Uint8Array> {\n    const outputFormat = opts.format\n    await libsodium.ready\n    const sodium = libsodium\n\n    const sig = sodium.crypto_sign_detached(\n        data,\n        key.privateKey\n    )\n\n    return outputFormat === 'string' ? toString(sig) : sig\n}\n\nexport async function encrypt (data:JSONValue, lockKey:LockKey):Promise<string>\nexport async function encrypt (data:JSONValue, lockKey:LockKey, { outputFormat }:{\n    outputFormat:'string'\n}):Promise<string>\nexport async function encrypt (data:JSONValue, lockKey, { outputFormat }:{\n    outputFormat:'raw'\n}):Promise<Uint8Array>\n\nexport async function encrypt (\n    data:JSONValue,\n    lockKey:LockKey,\n    opts:{\n        outputFormat:'string'|'raw';\n    } = { outputFormat: 'string' }\n):Promise<string|Uint8Array> {\n    await libsodium.ready\n    const sodium = libsodium\n    const { outputFormat } = opts\n\n    if (data == null) {\n        throw new Error('Non-empty data required.')\n    }\n\n    try {\n        const dataBuffer = asBufferOrString(data)\n        const encData = sodium.crypto_box_seal(dataBuffer, lockKey.encPK)\n\n        const output = (outputFormat.toLowerCase() === 'string') ?\n            toString(encData) :\n            encData\n\n        return output\n    } catch (err) {\n        throw new Error('Data encryption failed.', { cause: err })\n    }\n}\n\n/**\n * If called with { parseJSON: false }, will return\n * a string.\n *\n * If called with { outputFormat: 'raw' }, will return\n * a Uint8Array.\n */\nexport async function decrypt (\n    data:string|Uint8Array,\n    lockKey:LockKey,\n    { outputFormat }:{\n        outputFormat:'raw';\n    }\n):Promise<Uint8Array>\nexport async function decrypt (\n    data:string|Uint8Array,\n    lockKey:LockKey,\n    opts?:{\n        outputFormat:'utf8',\n    }\n):Promise<string>\n\nexport async function decrypt (\n    data:string|Uint8Array,\n    lockKey:LockKey,\n    opts:{ outputFormat?:'utf8'|'raw' } = {\n        outputFormat: 'utf8'\n    }\n):Promise<string|Uint8Array|JSONValue> {\n    await libsodium.ready\n    const sodium = libsodium\n    const outputFormat = opts.outputFormat || 'utf8'\n\n    const dataBuffer = sodium.crypto_box_seal_open(\n        typeof data === 'string' ? fromString(data) : data,\n        lockKey.encPK,\n        lockKey.encSK\n    )\n\n    if (outputFormat === 'utf8') {\n        const decodedData = u.toString(dataBuffer, 'utf-8')\n        return decodedData\n    }\n\n    return dataBuffer\n}\n"],
  "mappings": "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",
  "names": ["libsodium"]
}
