{
  "version": 3,
  "sources": ["../src/util.ts"],
  "sourcesContent": ["import * as u from 'uint8arrays'\nimport type libsodium from 'libsodium-wrappers'\nimport { concat, toString as uToString } from 'uint8arrays'\nimport { webcrypto } from '@bicycle-codes/one-webcrypto'\nimport type { KeyAlgorithm, Msg, JSONValue, LockKey, DID } from './types.js'\nimport { CharSize } from './types.js'\nimport { InvalidMaxValue } from './errors.js'\nimport {\n    DEFAULT_CHAR_SIZE,\n    DEFAULT_ENTROPY_SIZE,\n    RSA_DID_PREFIX,\n    KEY_TYPE,\n    EDWARDS_DID_PREFIX,\n    BLS_DID_PREFIX,\n    BASE58_DID_PREFIX\n} from './constants.js'\n\nexport const normalizeToBuf = (\n    msg:Msg,\n    strConv:(str:string)=>ArrayBuffer\n):ArrayBuffer => {\n    if (typeof msg === 'string') {\n        return strConv(msg)\n    } else if (typeof msg === 'object' && msg.byteLength !== undefined) {\n        // this is the best runtime check I could find for ArrayBuffer/Uint8Array\n        const temp = new Uint8Array(msg)\n        return temp.buffer\n    } else {\n        throw new Error('Improper value. Must be a string, ArrayBuffer, Uint8Array')\n    }\n}\n\n/**\n * Export the public key from the given keypair as a Uint8Array.\n * @param {CryptoKeyPair} keys The keypair to export.\n * @returns {Promise<Uint8Array>} The public key as Uint8Array.\n */\nexport async function exportKey (keys:CryptoKeyPair):Promise<Uint8Array> {\n    return new Uint8Array(await webcrypto.subtle.exportKey(\n        'spki',\n        keys.publicKey\n    ))\n}\n\nexport function normalizeBase64ToBuf (msg:Msg):ArrayBuffer {\n    return normalizeToBuf(msg, base64ToArrBuf)\n}\n\nexport const normalizeUtf8ToBuf = (msg:Msg): ArrayBuffer => {\n    return normalizeToBuf(msg, (str) => strToArrBuf(str, CharSize.B8))\n}\n\nexport const normalizeUtf16ToBuf = (msg:Msg): ArrayBuffer => {\n    return normalizeToBuf(msg, (str) => strToArrBuf(str, CharSize.B16))\n}\n\nexport function normalizeUnicodeToBuf (\n    msg:Msg,\n    charSize:CharSize = DEFAULT_CHAR_SIZE\n) {\n    switch (charSize) {\n        case 8: return normalizeUtf8ToBuf(msg)\n        default: return normalizeUtf16ToBuf(msg)\n    }\n}\n\nexport function strToArrBuf (\n    str:string,\n    charSize:CharSize = DEFAULT_CHAR_SIZE\n):ArrayBuffer {\n    const view = charSize === 8 ?\n        new Uint8Array(str.length) :\n        new Uint16Array(str.length)\n\n    for (let i = 0, strLen = str.length; i < strLen; i++) {\n        view[i] = str.charCodeAt(i)\n    }\n\n    return view.buffer\n}\n\nexport function generateEntropy (\n    sodium:typeof libsodium,\n    size:number = DEFAULT_ENTROPY_SIZE\n):Uint8Array {\n    return sodium.randombytes_buf(size)\n}\n\nexport function randomBuf (\n    length:number,\n    { max }:{ max:number } = { max: 255 }\n):Uint8Array {\n    if (max < 1 || max > 255) {\n        throw InvalidMaxValue\n    }\n\n    const arr = new Uint8Array(length)\n\n    if (max === 255) {\n        webcrypto.getRandomValues(arr)\n        return arr\n    }\n\n    let index = 0\n    const interval = max + 1\n    const divisibleMax = Math.floor(256 / interval) * interval\n    const tmp = new Uint8Array(1)\n\n    while (index < arr.length) {\n        webcrypto.getRandomValues(tmp)\n        if (tmp[0] < divisibleMax) {\n            arr[index] = tmp[0] % interval\n            index++\n        }\n    }\n\n    return arr\n}\n\nexport function joinBufs (\n    fst:ArrayBuffer|Uint8Array,\n    snd:ArrayBuffer|Uint8Array\n):Uint8Array {\n    const view1 = new Uint8Array(fst)\n    const view2 = new Uint8Array(snd)\n    const joined = new Uint8Array(view1.length + view2.length)\n    joined.set(view1)\n    joined.set(view2, view1.length)\n    return joined\n}\n\nexport function arrBufToBase64 (buf:ArrayBuffer):string {\n    return u.toString(new Uint8Array(buf), 'base64pad')\n}\n\n/**\n * Convert Uint8Arrays to `base64pad` encoded strings.\n *\n * @param {Uint8Array} arr Input `Uint8Array`\n * @returns {string} `base64pad` encoded string\n */\nexport function toString (arr:Uint8Array) {\n    return u.toString(arr, 'base64pad')\n}\n\n/**\n * Convert a given string to an `ArrayBuffer`.\n *\n * @param {string} str input string\n * @returns {ArrayBuffer} Array buffer\n */\nexport function base64ToArrBuf (str:string):ArrayBuffer {\n    return u.fromString(str, 'base64pad').buffer\n}\n\nexport async function sha256 (\n    bytes:string|Uint8Array,\n    opts?:{ output:'string' }\n):Promise<string>\n\nexport async function sha256 (\n    bytes:string|Uint8Array,\n    opts:{ output:'bytes' }\n):Promise<Uint8Array>\n\n/**\n * Create a sha-256 hash of the given `Uint8Array`.\n * @param {Uint8Array|string} bytes The input bytes\n * @returns {Promise<Uint8Array>} A `Uint8Array`\n */\nexport async function sha256 (\n    bytes:Uint8Array|string,\n    opts:{ output:'string'|'bytes' } = { output: 'string' }\n):Promise<Uint8Array|string> {\n    let _bytes:Uint8Array\n    if (typeof bytes === 'string') {\n        _bytes = u.fromString(bytes)\n    } else {\n        _bytes = bytes\n    }\n\n    const hash = new Uint8Array(await webcrypto.subtle.digest('sha-256', _bytes))\n\n    if (opts.output === 'string') {\n        return toString(hash)\n    }\n\n    return hash\n}\n\nexport function isCryptoKeyPair (val:unknown):val is CryptoKeyPair {\n    return (\n        hasProp(((val! as CryptoKeyPair).publicKey), 'algorithm') &&\n        hasProp(val, 'publicKey')\n    )\n}\n\nexport function isCryptoKey (val:unknown):val is CryptoKey {\n    return (\n        hasProp(val, 'algorithm') &&\n        hasProp(val, 'extractable') &&\n        hasProp(val, 'type')\n    )\n}\n\nexport function hasProp<K extends PropertyKey> (\n    data:unknown,\n    prop:K\n):data is Record<K, unknown> {\n    return (typeof data === 'object' && data != null && prop in data)\n}\n\nexport function arrBufToStr (\n    buf:ArrayBuffer,\n    charSize:CharSize = DEFAULT_CHAR_SIZE\n):string {\n    const arr = charSize === 8 ? new Uint8Array(buf) : new Uint16Array(buf)\n    return Array.from(arr)\n        .map(b => String.fromCharCode(b))\n        .join('')\n}\n\nexport function publicExponent ():Uint8Array {\n    return new Uint8Array([0x01, 0x00, 0x01])\n}\n\n/**\n * Create a `Uint8Array` from a given `base64pad` encoded string.\n *\n * @param str `base64pad` encoded string\n * @returns {Uint8Array}\n */\nexport function fromString (str:string) {\n    return u.fromString(str, 'base64pad')\n}\n\n/**\n * Parse magic bytes on prefixed key-buffer to determine the\n * cryptosystem & the unprefixed key-buffer.\n */\nexport function parseMagicBytes (prefixedKey:ArrayBuffer) {\n    // RSA\n    if (hasPrefix(prefixedKey, RSA_DID_PREFIX)) {\n        return {\n            keyBuffer: prefixedKey.slice(RSA_DID_PREFIX.byteLength),\n            type: KEY_TYPE.RSA\n        }\n    // EDWARDS\n    } else if (hasPrefix(prefixedKey, EDWARDS_DID_PREFIX)) {\n        return {\n            keyBuffer: prefixedKey.slice(EDWARDS_DID_PREFIX.byteLength),\n            type: KEY_TYPE.Edwards\n        }\n    // BLS\n    } else if (hasPrefix(prefixedKey, BLS_DID_PREFIX)) {\n        return {\n            keyBuffer: prefixedKey.slice(BLS_DID_PREFIX.byteLength),\n            type: KEY_TYPE.BLS\n        }\n    }\n\n    throw new Error('Unsupported key algorithm. Try using RSA.')\n}\n\nfunction hasPrefix (prefixedKey:ArrayBuffer, prefix:ArrayBuffer) {\n    return arrayBuffersEqual(prefix, prefixedKey.slice(0, prefix.byteLength))\n}\n\nexport function arrayBuffersEqual (aBuf:ArrayBuffer, bBuf:ArrayBuffer):boolean {\n    const a = new Uint8Array(aBuf)\n    const b = new Uint8Array(bBuf)\n    return buffersEqual(a, b)\n}\n\nexport function buffersEqual (a:Uint8Array, b:Uint8Array):boolean {\n    if (a.length !== b.length) return false\n    for (let i = 0; i < a.length; i++) {\n        if (a[i] !== b[i]) return false\n    }\n    return true\n}\n\nexport function asBufferOrString (\n    data:Uint8Array|ArrayBuffer|string|JSONValue\n):Uint8Array|string {\n    if (data instanceof ArrayBuffer) {\n        return new Uint8Array(data)\n    }\n\n    if (isByteArray(data)) {\n        return (data as Uint8Array)\n    }\n\n    if (typeof data === 'object') {\n        // assume JSON serializable\n        return JSON.stringify(data)\n    }\n\n    // data must be a string\n    return String(data)\n}\n\nexport function isByteArray (val:unknown):boolean {\n    return (val instanceof Uint8Array && val.buffer instanceof ArrayBuffer)\n}\n\nexport function stringify (keys:LockKey):string {\n    return toString(keys.publicKey)\n    // => 'welOX9O96R6WH0S8cqqwMlPAJ3VwMgAZEnc1wa1MN70='\n}\n\nexport const magicBytes:Record<KeyAlgorithm, Uint8Array> = {\n    'bls12-381': new Uint8Array([0xea, 0x01]),\n    ed25519: new Uint8Array([0xed, 0x01]),\n    rsa: new Uint8Array([0x00, 0xf5, 0x02]),\n}\n\nexport const publicKeyToDid = {\n    ecc: function (publicKey:Uint8Array):DID {\n        const prefix = magicBytes.ed25519\n        const prefixedBuf = concat([prefix, publicKey])\n\n        return (BASE58_DID_PREFIX +\n            uToString(prefixedBuf, 'base58btc')) as DID\n    },\n\n    rsa: function (publicKey:Uint8Array) {\n        const prefix = magicBytes.rsa\n        const prefixedBuf = concat([prefix, publicKey])\n\n        return (BASE58_DID_PREFIX +\n            uToString(prefixedBuf, 'base58btc')) as DID\n    }\n}\n\nexport function didToPublicKey (did:DID):({\n    publicKey:Uint8Array,\n    type:'rsa'|'ed25519'|'bls12-381'\n}) {\n    if (!did.startsWith(BASE58_DID_PREFIX)) {\n        throw new Error(\n            'Please use a base58-encoded DID formatted `did:key:z...`')\n    }\n\n    const didWithoutPrefix = ('' + did.substring(BASE58_DID_PREFIX.length))\n    const magicalBuf = u.fromString(didWithoutPrefix, 'base58btc')\n    const { keyBuffer, type } = parseMagicBytes(magicalBuf.buffer)\n\n    return {\n        publicKey: new Uint8Array(keyBuffer),\n        type\n    }\n}\n"],
  "mappings": "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",
  "names": ["uToString"]
}
