{
  "version": 3,
  "sources": ["../../src/ecc/webcrypto.ts"],
  "sourcesContent": ["import { webcrypto } from '@bicycle-codes/one-webcrypto'\nimport * as uint8arrays from 'uint8arrays'\nimport { magicBytes, didToPublicKey } from '../index.js'\nimport {\n    BASE58_DID_PREFIX,\n    DEFAULT_CHAR_SIZE,\n    DEFAULT_HASH_ALGORITHM,\n    ECC_SIGN_ALGORITHM,\n    ECC_ENCRYPT_ALGORITHM,\n    DEFAULT_ECC_CURVE,\n    DEFAULT_SYMM_ALGORITHM,\n    DEFAULT_SYMM_LEN,\n} from '../constants.js'\nimport { checkValidKeyUse } from '../errors.js'\nimport type {\n    Msg,\n    PrivateKey,\n    CharSize,\n    HashAlg,\n    PublicKey,\n    SymmKeyLength,\n    SymmKey,\n    SymmAlg,\n    DID\n} from '../types.js'\nimport {\n    KeyUse,\n    EccCurve\n} from '../types.js'\nimport * as aes from '../aes/webcrypto.js'\nimport {\n    normalizeUnicodeToBuf,\n    normalizeBase64ToBuf,\n    arrBufToBase64,\n    base64ToArrBuf,\n} from '../util.js'\n\n/**\n * Create a new keypair.\n */\nexport async function create (\n    use:KeyUse,\n    curve:EccCurve = EccCurve.P_256,\n):Promise<CryptoKeyPair> {\n    checkValidKeyUse(use)\n    const alg = (use === KeyUse.Encrypt ?\n        ECC_ENCRYPT_ALGORITHM :\n        ECC_SIGN_ALGORITHM)\n    const uses:KeyUsage[] = (use === KeyUse.Encrypt ?\n        ['deriveKey', 'deriveBits'] :\n        ['sign', 'verify'])\n\n    return webcrypto.subtle.generateKey(\n        { name: alg, namedCurve: curve },\n        false,\n        uses\n    )\n}\n\nexport async function sign (\n    msg:Msg,\n    privateKey:PrivateKey,\n    { format }?:{ format: 'base64' },\n    charSize?:CharSize,\n    hashAlg?:HashAlg,\n):Promise<string>\n\nexport async function sign (\n    msg:Msg,\n    privateKey:PrivateKey,\n    { format }:{ format: 'raw' },\n    charSize?:CharSize,\n    hashAlg?:HashAlg,\n):Promise<ArrayBuffer>\n\n/**\n * Sign the given message. Return the signature as an `ArrayBuffer`.\n */\nexport async function sign (\n    msg:Msg,\n    privateKey:PrivateKey,\n    { format }:{ format: 'base64'|'raw' } = { format: 'base64' },\n    charSize:CharSize = DEFAULT_CHAR_SIZE,\n    hashAlg:HashAlg = DEFAULT_HASH_ALGORITHM,\n):Promise<ArrayBuffer|string> {\n    const sig = await webcrypto.subtle.sign(\n        { name: ECC_SIGN_ALGORITHM, hash: { name: hashAlg } },\n        privateKey,\n        normalizeUnicodeToBuf(msg, charSize)\n    )\n\n    if (format === 'base64') {\n        return arrBufToBase64(sig)\n    }\n\n    return sig\n}\n\n/**\n * Verify the given signature.\n */\nexport async function verify (\n    msg:Msg,\n    sig:string|Uint8Array|ArrayBuffer,\n    publicKey:string|PublicKey,\n    charSize:CharSize = DEFAULT_CHAR_SIZE,\n    curve:EccCurve = DEFAULT_ECC_CURVE,\n    hashAlg: HashAlg = DEFAULT_HASH_ALGORITHM\n):Promise<boolean> {\n    return webcrypto.subtle.verify(\n        { name: ECC_SIGN_ALGORITHM, hash: { name: hashAlg } },\n        (typeof publicKey === 'string'\n            ? await importPublicKey(publicKey, curve, KeyUse.Sign)\n            : publicKey),\n        normalizeBase64ToBuf(sig),\n        normalizeUnicodeToBuf(msg, charSize)\n    )\n}\n\n// return Uint8Array given 'raw' format\nexport async function encrypt (\n    msg:Msg,\n    privateKey:PrivateKey,\n    publicKey:string | PublicKey,\n    { format }:{ format:'raw' },\n    charSize?:CharSize,\n    curve?:EccCurve,\n    opts?:Partial<{\n        alg:SymmAlg\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>\n):Promise<Uint8Array>\n\n// return a string otherwise\nexport async function encrypt (\n    msg:Msg,\n    privateKey:PrivateKey,\n    publicKey:string | PublicKey,\n    { format }?,\n    charSize?:CharSize,\n    curve?:EccCurve,\n    opts?:Partial<{\n        alg:SymmAlg\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>\n):Promise<string>\n\n/**\n * Encrypt the given message.\n */\nexport async function encrypt (\n    msg:Msg,\n    privateKey:PrivateKey,\n    publicKey:string|PublicKey,  // <-- base64 or key\n    { format }:{ format: 'base64'|'raw' } = { format: 'base64' },\n    charSize:CharSize = DEFAULT_CHAR_SIZE,\n    curve:EccCurve = DEFAULT_ECC_CURVE,\n    opts?:Partial<{\n        alg:SymmAlg\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>\n):Promise<Uint8Array|string> {\n    const importedPublicKey = (typeof publicKey === 'string' ?\n        await importPublicKey(publicKey, curve, KeyUse.Encrypt) :\n        publicKey)\n\n    const cipherKey = await getSharedKey(privateKey, importedPublicKey, opts)\n    const encrypted = await aes.encryptBytes(\n        normalizeUnicodeToBuf(msg, charSize),\n        cipherKey,\n        opts\n    )\n\n    return (format === 'raw' ?\n        new Uint8Array(encrypted) :\n        arrBufToBase64(encrypted))\n}\n\n/**\n * Decrypt the given message\n */\nexport async function decrypt (\n    msg:Msg,\n    privateKey:PrivateKey,\n    publicKey:string|PublicKey,\n    curve:EccCurve = DEFAULT_ECC_CURVE,\n    opts?:Partial<{\n        alg:'AES-GCM'|'AES-CBC'|'AES-CTR'\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>\n):Promise<string> {\n    const importedPublicKey = typeof publicKey === 'string'\n        ? await importPublicKey(publicKey, curve, KeyUse.Encrypt)\n        : publicKey\n\n    const cipherKey = await getSharedKey(privateKey, importedPublicKey, opts)\n    return aes.decrypt(msg, cipherKey, opts)\n}\n\nexport async function exportPublicKey (\n    key:PublicKey,\n):Promise<Uint8Array>\n\nexport async function exportPublicKey (\n    publicKey:PublicKey,\n    opts:{ format:'string' }\n):Promise<string>\n\n/**\n * Get the public key as a Uint8Array by default, or a base64 string.\n */\nexport async function exportPublicKey (\n    key:PublicKey,\n    opts:{ format:'string'|'raw' } = { format: 'raw' }\n):Promise<string|Uint8Array> {\n    const raw = await webcrypto.subtle.exportKey('raw', key)\n    if (opts.format === 'raw') {\n        return new Uint8Array(raw)\n    }\n\n    return arrBufToBase64(raw)\n}\n\nexport async function getSharedKey (\n    privateKey:PrivateKey,\n    publicKey:PublicKey,\n    opts?:Partial<{\n        alg:'AES-GCM'|'AES-CBC'|'AES-CTR'\n        length:SymmKeyLength\n        iv:ArrayBuffer\n    }>\n):Promise<SymmKey> {\n    return webcrypto.subtle.deriveKey(\n        { name: ECC_ENCRYPT_ALGORITHM, public: publicKey },\n        privateKey,\n        {\n            name: opts?.alg || DEFAULT_SYMM_ALGORITHM,\n            length: opts?.length || DEFAULT_SYMM_LEN\n        },\n        false,\n        ['encrypt', 'decrypt']\n    )\n}\n\nexport default {\n    sign,\n    verify,\n    encrypt,\n    exportPublicKey,\n    getSharedKey,\n    importPublicKey\n}\n\nexport function importPublicKey (\n    base64Key:string|Uint8Array,\n    curve:EccCurve = DEFAULT_ECC_CURVE,\n    use:KeyUse = KeyUse.Sign\n):Promise<PublicKey> {\n    checkValidKeyUse(use)\n    const alg = use === KeyUse.Encrypt ?\n        ECC_ENCRYPT_ALGORITHM :\n        ECC_SIGN_ALGORITHM\n    const uses:KeyUsage[] = (use === KeyUse.Encrypt ? [] : ['verify'])\n    const buf = (typeof base64Key === 'string' ?\n        base64ToArrBuf(base64Key) :\n        base64Key)\n\n    return webcrypto.subtle.importKey(\n        'raw',\n        buf,\n        { name: alg, namedCurve: curve },\n        true,\n        uses\n    )\n}\n\n/**\n * Convert a DID format string to a public key instance.\n */\nexport async function importDid (did:DID):Promise<PublicKey> {\n    const parsed = didToPublicKey(did)\n    const pubKey = await importPublicKey(parsed.publicKey)\n    return pubKey\n}\n\n/**\n * Convert an ed25519 public key to a DID format string.\n */\nexport async function publicKeyToDid (\n    publicKey:Uint8Array|PublicKey\n):Promise<DID> {\n    if (publicKey instanceof CryptoKey) {\n        publicKey = await exportPublicKey(publicKey)\n    }\n\n    const prefix = magicBytes.ed25519\n    const prefixedBuf = uint8arrays.concat([prefix, publicKey])\n\n    return (BASE58_DID_PREFIX +\n        uint8arrays.toString(prefixedBuf, 'base58btc')) as DID\n}\n\n/**\n * Verify the given string and signature with the given DID.\n */\nexport async function verifyWithDid (\n    msg:string,\n    sig:string,\n    did:DID\n):Promise<boolean> {\n    try {\n        const key = didToPublicKey(did).publicKey\n        const imported = await importPublicKey(key)\n        const isOk = await verify(msg, sig, imported)\n        return isOk\n    } catch (_err) {\n        return false\n    }\n}\n"],
  "mappings": "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",
  "names": []
}
