{
  "version": 3,
  "sources": ["../src/index.ts"],
  "sourcesContent": ["import { webcrypto } from '@bicycle-codes/one-webcrypto'\nimport { fromString, type SupportedEncodings, toString } from 'uint8arrays'\nimport { get, set, delMany } from 'idb-keyval'\nimport {\n    RSA_ALGORITHM,\n    DEFAULT_RSA_SIZE,\n    DEFAULT_HASH_ALGORITHM,\n    RSA_SIGN_ALGORITHM,\n    DEFAULT_CHAR_SIZE,\n    DEFAULT_SYMM_ALGORITHM,\n    DEFAULT_SYMM_LENGTH,\n    AES_GCM,\n    DEFAULT_ENC_NAME,\n    DEFAULT_SIG_NAME,\n    IV_LENGTH,\n} from './constants.js'\nimport {\n    SymmKeyLength,\n    type SymmAlgorithm,\n    KeyUse,\n    type RsaSize,\n    HashAlg,\n    type DID,\n    type Msg,\n    type CharSize,\n    type SymmKey,\n} from './types.js'\nimport {\n    publicKeyToDid,\n    getPublicKeyAsArrayBuffer,\n    rsaOperations,\n    didToPublicKey,\n    importPublicKey,\n    toBase64,\n    isCryptoKey,\n    normalizeUnicodeToBuf,\n    importKey,\n    randomBuf,\n    joinBufs,\n    normalizeBase64ToBuf,\n    base64ToArrBuf,\n    sha256,\n    getPublicKeyAsUint8Array,\n    normalizeToBuf\n} from './util.js'\n\nexport { publicKeyToDid, getPublicKeyAsArrayBuffer }\nexport * from './constants.js'\n\nexport type { DID }\n\nexport { getPublicKeyAsUint8Array } from './util.js'\n\nexport type SerializedKeys = {\n    DID:DID;\n    publicEncryptKey:string;\n}\n\n/**\n * Expose RSA keys only for now, because we are\n * waiting for more browsers to support ECC.\n *\n * Create an instance with `Keys.create` b/c async.\n */\nexport class Keys {\n    private _encryptKey:CryptoKeyPair\n    private _signKey:CryptoKeyPair\n    static _instance  // a cache for indexedDB\n    persisted:boolean\n    ENCRYPTION_KEY_NAME:string = DEFAULT_ENC_NAME\n    SIGNING_KEY_NAME:string = DEFAULT_SIG_NAME\n    DID:DID\n    session:boolean  // in memory only?\n\n    constructor (opts:{\n        keys:{ encrypt:CryptoKeyPair, sign:CryptoKeyPair };\n        did:DID;\n        persisted:boolean;\n        session:boolean;  // in memory only?\n    }) {\n        const { keys } = opts\n        this._encryptKey = keys.encrypt\n        this._signKey = keys.sign\n        this.DID = opts.did\n        this.persisted = opts.persisted\n        this.session = opts.session ?? false\n        Keys._instance = this\n    }\n\n    get signKeypair ():CryptoKeyPair {\n        return {\n            privateKey: this.privateSignKey,\n            publicKey: this.publicSignKey\n        }\n    }\n\n    get encryptKeypair ():CryptoKeyPair {\n        return {\n            privateKey: this.privateEncryptKey,\n            publicKey: this.publicEncryptKey\n        }\n    }\n\n    get publicSignKey ():CryptoKey {\n        return this._signKey.publicKey\n    }\n\n    get privateSignKey ():CryptoKey {\n        return this._signKey.privateKey\n    }\n\n    get privateEncryptKey ():CryptoKey {\n        return this._encryptKey.privateKey\n    }\n\n    get publicEncryptKey ():CryptoKey {\n        return this._encryptKey.publicKey\n    }\n\n    get deviceName ():Promise<string> {\n        return Keys.deviceName(this.DID)\n    }\n\n    /**\n     * Delete the keys stored in indexedDB.\n     */\n    async delete ():Promise<void> {\n        await delMany([this.ENCRYPTION_KEY_NAME, this.SIGNING_KEY_NAME])\n        this.persisted = false\n    }\n\n    /**\n     * Get the public encryption key as a string.\n     *\n     * @param {SupportedEncodings} [format] Optional string format for\n     * `uint8arrays`. Defaults to base64.\n     * @returns {string} Return a string b/c mostly would use this for\n     * serializing the public encryption key.\n     */\n    getPublicEncryptKey = Object.assign(\n        async (format?:SupportedEncodings):Promise<string> => {\n            const { publicKey } = this._encryptKey\n            const spki = await webcrypto.subtle.exportKey(\n                'spki',\n                publicKey\n            )\n\n            return (format ?\n                toString(new Uint8Array(spki), format) :\n                toBase64(spki))\n        },\n\n        {\n            uint8Array: async ():Promise<Uint8Array> => {\n                const { publicKey } = this._encryptKey\n                const arr = await getPublicKeyAsUint8Array(publicKey)\n                return arr\n            }\n        }\n    )\n\n    /**\n     * Return a 32-character, DNS-friendly hash of the given DID.\n     *\n     * @param {DID} did a DID format string\n     * @returns {string} 32 character, base32 hash of the DID\n     */\n    static deviceName (did:DID):Promise<string> {\n        return getDeviceName(did)\n    }\n\n    /**\n     * Create a new `Keys` instance.\n     *\n     * @returns {Promise<Keys>}\n     */\n    static async create (\n        opts:{ session:boolean } = { session: false }\n    ):Promise<Keys> {\n        const encryptionKeypair = await makeRSAKeypair(\n            DEFAULT_RSA_SIZE,\n            DEFAULT_HASH_ALGORITHM,\n            KeyUse.Encrypt\n        )\n        const signingKeypair = await makeRSAKeypair(\n            DEFAULT_RSA_SIZE,\n            DEFAULT_HASH_ALGORITHM,\n            KeyUse.Sign\n        )\n\n        const { session } = opts\n        const publicSigningKey = await getPublicKeyAsArrayBuffer(signingKeypair)\n        const did = await publicKeyToDid(new Uint8Array(publicSigningKey), 'rsa')\n\n        const keys = new Keys({\n            keys: { encrypt: encryptionKeypair, sign: signingKeypair },\n            did,\n            persisted: false,\n            session\n        })\n\n        return keys\n    }\n\n    /**\n     * Save this keys instance to `indexedDB`.\n     */\n    async persist ():Promise<void> {\n        if (this.session) return\n\n        await Promise.all([\n            set(this.ENCRYPTION_KEY_NAME, this._encryptKey),\n            set(this.SIGNING_KEY_NAME, this._signKey)\n        ])\n\n        this.persisted = true\n    }\n\n    /**\n     * Return a 32-character, DNS friendly hash of the public signing key.\n     *\n     * @returns {Promise<string>}\n     */\n    async getDeviceName ():Promise<string> {\n        return Keys.deviceName(this.DID)\n    }\n\n    /**\n     * Restore some keys from indexedDB, or create a new keypair if it doesn't\n     * exist yet.\n     *\n     * @param {{ encryptionKeyName, signingKeyName }} opts Strings to use as\n     * keys in indexedDB.\n     * @returns {Promise<Keys>}\n     */\n    static async load (opts:Partial<{\n        encryptionKeyName:string,\n        signingKeyName:string,\n        session:boolean,\n    }> = {\n        encryptionKeyName: DEFAULT_ENC_NAME,\n        signingKeyName: DEFAULT_SIG_NAME,\n        session: false\n    }):Promise<InstanceType<typeof Keys>> {\n        if (Keys._instance) return Keys._instance  // cache\n\n        let persisted = true\n        let encKeys:CryptoKeyPair|undefined = await get(\n            opts.encryptionKeyName || DEFAULT_ENC_NAME\n        )\n        let signKeys:CryptoKeyPair|undefined = await get(\n            opts.signingKeyName || DEFAULT_SIG_NAME\n        )\n\n        if (!encKeys) {\n            persisted = false\n            encKeys = await makeRSAKeypair(\n                DEFAULT_RSA_SIZE,\n                DEFAULT_HASH_ALGORITHM,\n                KeyUse.Encrypt\n            )\n        }\n        if (!signKeys) {\n            persisted = false\n            signKeys = await makeRSAKeypair(\n                DEFAULT_RSA_SIZE,\n                DEFAULT_HASH_ALGORITHM,\n                KeyUse.Sign\n            )\n        }\n\n        const publicKey = await getPublicKeyAsArrayBuffer(signKeys)\n        const did = await publicKeyToDid(new Uint8Array(publicKey), 'rsa')\n\n        const keys = new Keys({\n            keys: { encrypt: encKeys, sign: signKeys },\n            did,\n            persisted,\n            session: opts.session ?? false\n        })\n\n        return keys\n    }\n\n    decrypt = Object.assign(\n        /**\n         * Expect the given cipher content to be the format returned by\n         * encryptTo`. That is, encrypted AES key + `iv` + encrypted content.\n         */\n        async (\n            msg:string|Uint8Array|ArrayBuffer,\n            keysize?:SymmKeyLength\n        ):Promise<Uint8Array> => {\n            const length = keysize || DEFAULT_SYMM_LENGTH\n            const cipherText = normalizeToBuf(msg, base64ToArrBuf)\n            const key = cipherText.slice(0, length)\n            const data = cipherText.slice(length)\n            const decryptedKey = await this.decryptKey(key)\n            const decryptedContent = await AES.decrypt(data, decryptedKey)\n            return decryptedContent\n        },\n\n        {\n            asString: async (msg:string, keysize?:SymmKeyLength):Promise<string> => {\n                const dec = await this.decrypt(msg, keysize)\n                return toString(dec)\n            }\n        }\n    )\n\n    sign = Object.assign(\n        /**\n         * Sign the message, and return the signature as a `Uint8Array`.\n         */\n        async (\n            msg:Msg,\n            charsize:CharSize = DEFAULT_CHAR_SIZE\n        ):Promise<Uint8Array> => {\n            const key = this._signKey\n            const sig = await rsaOperations.sign(\n                msg,\n                key.privateKey,\n                charsize\n            )\n\n            return new Uint8Array(sig)\n        },\n\n        {\n            /**\n             * Sign a message, return the signature as a base64 encoded string.\n             *\n             * @param {Msg} msg The message to sign\n             * @param {CharSize} [charsize] Character size\n             * @returns {Promise<string>}\n             */\n            asString: async (msg:Msg, charsize?:CharSize):Promise<string> => {\n                const sig = await this.sign(msg, charsize)\n                return toBase64(sig)\n            }\n        }\n    )\n\n    /**\n     * Decrypt the given encrypted AES key.\n     * Return the key as `Uint8Array`.\n     */\n    decryptKey = Object.assign(\n        async (key:string|Uint8Array|ArrayBuffer):Promise<Uint8Array> => {\n            const decrypted = await rsaOperations.decrypt(\n                key,\n                this.privateEncryptKey\n            )\n            return decrypted\n        },\n\n        {\n            /**\n             * Decrypt the given AES key, return the result as a string.\n             */\n            asString: async (\n                msg:string|Uint8Array,\n                format?:SupportedEncodings\n            ):Promise<string> => {\n                const decrypted = await rsaOperations.decrypt(\n                    msg,\n                    this.privateEncryptKey\n                )\n\n                return toString(decrypted, format)\n            }\n        }\n    )\n\n    /**\n     * Serialize this keys instance. Will return an object of\n     * { DID, publicEncryptionKey }, where DID is the public signature key,\n     * and `publicEncryptKey` is the encryption key, `base64` encoded.\n     * @returns {Promise<{ DID:DID, publicEncryptKey:string }>}\n     */\n    async toJson ():Promise<{ DID:DID; publicEncryptKey:string; }> {\n        const pubEnc = await this.getPublicEncryptKey()\n        const did = this.DID\n\n        return {\n            publicEncryptKey: pubEnc,\n            DID: did\n        }\n    }\n}\n\nasync function makeRSAKeypair (\n    size:RsaSize,\n    hashAlg:HashAlg,\n    use:KeyUse\n):Promise<CryptoKeyPair> {\n    if (!(Object.values(KeyUse).includes(use))) {\n        throw new Error('invalid key use')\n    }\n    const alg = use === KeyUse.Encrypt ? RSA_ALGORITHM : RSA_SIGN_ALGORITHM\n    const uses:KeyUsage[] = (use === KeyUse.Encrypt ?\n        ['encrypt', 'decrypt'] :\n        ['sign', 'verify'])\n\n    return webcrypto.subtle.generateKey({\n        name: alg,\n        modulusLength: size,\n        publicExponent: publicExponent(),\n        hash: { name: hashAlg }\n    }, false, uses)\n}\n\nfunction publicExponent ():Uint8Array {\n    return new Uint8Array([0x01, 0x00, 0x01])\n}\n\n/**\n * Check that the given signature is valid with the given message.\n */\nexport async function verify (\n    msg:string|Uint8Array,\n    sig:string|Uint8Array,\n    signingDid:DID\n):Promise<boolean> {\n    const _key = didToPublicKey(signingDid)\n    const key = await importPublicKey(\n        _key.publicKey.buffer,\n        HashAlg.SHA_256,\n        KeyUse.Sign\n    )\n\n    try {\n        const isOk = rsaOperations.verify(msg, sig, key)\n        return isOk\n    } catch (_err) {\n        return false\n    }\n}\n\n/**\n * Encrypt the given message to the given public key. If an AES key is not\n * provided, one will be created. Use an AES key to encrypt the given\n * content, then we encrypt the AES key to the given public key.\n *\n * @param {{ content, publicKey }} opts The content to encrypt and\n * public key to encrypt to\n * @param {SymmKey|Uint8Array|string} [aesKey] An optional AES key to encrypt\n * to the given public key\n * @returns {Promise<ArrayBuffer>} The encrypted AES key, concattenated with\n *   the encrypted content.\n */\nexport async function encryptTo (\n    opts:{\n        content:string|Uint8Array;\n        publicKey:CryptoKey|string;\n    },\n    aesKey?:SymmKey|Uint8Array|string,\n):Promise<ArrayBuffer> {\n    const { content, publicKey } = opts\n    const key = aesKey || await AES.create()\n    const encryptedContent = await AES.encrypt(\n        typeof content === 'string' ? fromString(content) : content,\n        typeof key === 'string' ? await AES.import(key) : key,\n    )\n    const encryptedKey = await encryptKeyTo({ key, publicKey })\n\n    return joinBufs(encryptedKey, encryptedContent)\n}\n\n/**\n * Encrypt the given AES key to the given public key. Return the encrypted AES\n * key concattenated with the cipher text.\n *\n * @param { content, publicKey } opts The content to encrypt and key to\n *   encrypt to.\n * @param {SymmKey|Uint8Array|string} [aesKey] Optional -- the AES key. One will\n *   be created if not passed in.\n * @returns {Promise<string>} The encrypted AES key concattenated with the\n *   cipher text.\n */\nencryptTo.asString = async function (\n    opts:{ content:string|Uint8Array; publicKey:CryptoKey|string },\n    aesKey?:SymmKey|Uint8Array|string\n):Promise<string> {\n    const { content, publicKey } = opts\n    const key = aesKey || await AES.create()\n    const encryptedContent = await AES.encrypt(\n        typeof content === 'string' ? fromString(content) : content,\n        typeof key === 'string' ? await AES.import(key) : key,\n        'arraybuffer'\n    )\n\n    const encryptedKey = await encryptKeyTo({ key, publicKey })\n    const joined = joinBufs(encryptedKey, encryptedContent)\n\n    return toString(new Uint8Array(joined), 'base64pad')\n}\n\nexport const AES = {\n    create (opts:{ alg:string, length:number } = {\n        alg: DEFAULT_SYMM_ALGORITHM,\n        length: DEFAULT_SYMM_LENGTH\n    }):Promise<CryptoKey> {\n        return webcrypto.subtle.generateKey({\n            name: opts.alg,\n            length: opts.length\n        }, true, ['encrypt', 'decrypt'])\n    },\n\n    export: Object.assign(\n        async (key:CryptoKey):Promise<Uint8Array> => {\n            const raw = await webcrypto.subtle.exportKey('raw', key)\n            return new Uint8Array(raw)\n        },\n\n        {\n            asString: async (key:CryptoKey, format?:SupportedEncodings) => {\n                const raw = await AES.export(key)\n                return format ? toString(raw, format) : toBase64(raw)\n            }\n        }\n    ),\n\n    import (key:Uint8Array|string):Promise<CryptoKey> {\n        return importAesKey(typeof key === 'string' ? base64ToArrBuf(key) : key)\n    },\n\n    async exportAsString (key:CryptoKey):Promise<string> {\n        const raw = await AES.export(key)\n        return toBase64(raw)\n    },\n\n    encrypt,\n\n    async decrypt (\n        encryptedData:Uint8Array|string|ArrayBuffer,\n        cryptoKey:CryptoKey|Uint8Array|ArrayBuffer,\n        iv?:Uint8Array\n    ):Promise<Uint8Array> {\n        const key = (isCryptoKey(cryptoKey) ?\n            cryptoKey :\n            await importAesKey(cryptoKey))\n\n        // the `iv` is prefixed to the cipher text\n        const decrypted = (iv ?\n            await webcrypto.subtle.decrypt(\n                {\n                    name: AES_GCM,\n                    iv\n                },\n                key,\n                (typeof encryptedData === 'string' ?\n                    fromString(encryptedData) :\n                    encryptedData)\n            ) :\n\n            await decryptBytes(encryptedData, key))\n\n        return new Uint8Array(decrypted)\n    },\n}\n\nexport async function encryptKeyTo ({ key, publicKey }:{\n    key:string|Uint8Array|CryptoKey;\n    publicKey:CryptoKey|Uint8Array|string;\n}, format:'arraybuffer'):Promise<ArrayBuffer>\n\nexport async function encryptKeyTo ({ key, publicKey }:{\n    key:string|Uint8Array|CryptoKey;\n    publicKey:CryptoKey|Uint8Array|string;\n}, format:'uint8array'):Promise<Uint8Array>\n\nexport async function encryptKeyTo ({ key, publicKey }:{\n    key:string|Uint8Array|CryptoKey;\n    publicKey:CryptoKey|Uint8Array|string;\n}, format?:undefined):Promise<Uint8Array>\n\n/**\n * Encrypt the given content to the given public key. This is RSA encryption,\n * and should be used only to encrypt AES keys.\n *\n * @param {{ content, publicKey }} params The content to encrypt, and public key\n * to encrypt it to.\n * @returns {Promise<Uint8Array>}\n */\nexport async function encryptKeyTo ({ key, publicKey }:{\n    key:string|Uint8Array|CryptoKey;\n    publicKey:CryptoKey|Uint8Array|string;\n}, format?:'uint8array'|'arraybuffer'):Promise<Uint8Array|ArrayBuffer> {\n    let _key:Uint8Array|string\n    if (key instanceof CryptoKey) {\n        _key = await AES.export(key)\n    } else {\n        _key = key\n    }\n\n    const buf = await rsaOperations.encrypt(_key, publicKey)\n    if (format && format === 'arraybuffer') return buf\n    return new Uint8Array(buf)\n}\n\nencryptKeyTo.asString = async function ({ key, publicKey }:{\n    key:string|Uint8Array|CryptoKey;\n    publicKey:CryptoKey|string|Uint8Array;\n}, format?:SupportedEncodings):Promise<string> {\n    const asArr = await encryptKeyTo({ key, publicKey })\n    return format ? toString(asArr, format) : toBase64(asArr)\n}\n\nfunction importAesKey (\n    key:Uint8Array|ArrayBuffer,\n    length?:number\n):Promise<CryptoKey> {\n    return webcrypto.subtle.importKey(\n        'raw',\n        key,\n        {\n            name: AES_GCM,\n            length: length || SymmKeyLength.B256,\n        },\n        true,\n        ['encrypt', 'decrypt']\n    )\n}\n\nasync function encryptBytes (\n    msg:Msg,\n    key:CryptoKey|string,\n    opts?:Partial<{ iv:ArrayBuffer, charsize:number }>\n):Promise<ArrayBuffer> {\n    const data = normalizeUnicodeToBuf(msg, opts?.charsize ?? DEFAULT_CHAR_SIZE)\n    const importedKey = typeof key === 'string' ?\n        await importKey(key, opts) :\n        key\n    const iv:ArrayBuffer = opts?.iv || randomBuf(IV_LENGTH)\n    const cipherBuf = await webcrypto.subtle.encrypt({\n        name: AES_GCM,\n        iv\n    }, importedKey, data)\n\n    return joinBufs(iv, cipherBuf)\n}\n\n/**\n * Decrypt the given message with the given key. We expect the `iv` to be\n * prefixed to the encrypted message.\n * @param msg The message to decrypt\n * @param key The key to decrypt with\n * @param opts Optional args for algorithm and stuff\n * @returns {Promise<ArrayBuffer>}\n */\nasync function decryptBytes (\n    msg:Msg,\n    key:CryptoKey|string,\n    opts?:Partial<{\n        alg:SymmAlgorithm;\n        length: SymmKeyLength;\n        iv: ArrayBuffer;\n    }>\n):Promise<ArrayBuffer> {\n    const cipherText = normalizeBase64ToBuf(msg)\n    const importedKey = typeof key === 'string' ?\n        await importKey(key, opts) :\n        key\n    // `iv` is prefixed to the cypher text\n    const iv = cipherText.slice(0, IV_LENGTH)\n    const cipherBytes = cipherText.slice(IV_LENGTH)\n    const msgBuff = await webcrypto.subtle.decrypt({\n        name: DEFAULT_SYMM_ALGORITHM,\n        iv\n    }, importedKey, cipherBytes)\n\n    return msgBuff\n}\n\nasync function encrypt (\n    data:Uint8Array,\n    cryptoKey:CryptoKey|Uint8Array,\n    format?:undefined,\n    iv?:Uint8Array\n):Promise<Uint8Array>\n\nasync function encrypt (\n    data:Uint8Array,\n    cryptoKey:CryptoKey|Uint8Array,\n    format:'uint8array',\n    iv?:Uint8Array\n):Promise<Uint8Array>\n\nasync function encrypt (\n    data:Uint8Array,\n    cryptoKey:CryptoKey|Uint8Array,\n    format:'arraybuffer',\n    iv?:Uint8Array\n):Promise<ArrayBuffer>\n\nasync function encrypt (\n    data:Uint8Array,\n    cryptoKey:CryptoKey|Uint8Array,\n    format?:'uint8array'|'arraybuffer',\n    iv?:Uint8Array\n):Promise<Uint8Array|ArrayBuffer> {\n    const key = (isCryptoKey(cryptoKey) ?\n        cryptoKey :\n        await importAesKey(cryptoKey)\n    )\n\n    // prefix the `iv` into the cipher text\n    const encrypted = (iv ?\n        await webcrypto.subtle.encrypt({ name: AES_GCM, iv }, key, data) :\n        await encryptBytes(data, key)\n    )\n\n    if (format && format === 'arraybuffer') return encrypted\n\n    return new Uint8Array(encrypted)\n}\n\nexport async function getDeviceName (did:DID|string) {\n    const hashedUsername = await sha256(\n        new TextEncoder().encode(did.normalize('NFD'))\n    )\n\n    return toString(hashedUsername, 'base32').slice(0, 32)\n}\n"],
  "mappings": "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",
  "names": ["import_util"]
}
