{"version":3,"sources":["../../../../src/auth/cryptosign/wampy-cryptosign.ts"],"sourcesContent":["/**\n * Wampy.js Cryptosign-based Authentication plugin\n *\n * Copyright 2022 KSDaemon. Licensed under the MIT License.\n * See @license text at http://www.opensource.org/licenses/mit-license.php\n *\n */\n\nimport tweetnacl from 'tweetnacl';\nconst { sign: NaclSign } = tweetnacl;\n\n/**\n * Information required for Cryptosign signing.\n */\ninterface CryptosignInfo {\n    challenge: string;\n}\n\n/**\n * Converts a hexadecimal string to an array of bytes.\n */\nexport function hex2bytes(str: string): Uint8Array {\n    // Converting hex string to array of bytes\n    return new Uint8Array((str.match(/../g) as RegExpMatchArray).map(h => Number.parseInt(h, 16)));\n}\n\n/**\n * Converts an array of bytes to a hexadecimal string.\n */\nexport function bytes2hex(bytes: Uint8Array): string | null {\n    return bytes ? Array.from(bytes, function (byte: number) {\n            return ('0' + (byte & 0xFF).toString(16)).slice(-2);\n        }).join('') : null;\n}\n\n/**\n * Creates a signing function using the specified private key.\n */\nexport function sign(privateKey: string): (method: string, info: CryptosignInfo) => string {\n    const keyPair = privateKey.length === 64 ? NaclSign.keyPair.fromSeed(hex2bytes(privateKey)) :\n        NaclSign.keyPair.fromSecretKey(hex2bytes(privateKey));\n\n    /**\n     * Signs a challenge using the cryptosign method.\n     */\n    return function (method: string, info: CryptosignInfo): string {\n        if (method === 'cryptosign') {\n            if (!info.challenge) {\n                throw new Error('No challenge provided!');\n            }\n\n            const l = info.challenge.length;\n            if ((l % 2) !== 0) {\n                throw new Error('Expected challenge to be an even number of characters!');\n            }\n            const signature = NaclSign.detached(hex2bytes(info.challenge), keyPair.secretKey);\n\n            return bytes2hex(signature) + info.challenge;\n\n        } else {\n            throw new Error('Unknown authentication method requested!');\n        }\n    };\n}\n\nexport default sign;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,uBAAsB;AACtB,IAAM,EAAE,MAAM,SAAS,IAAI,iBAAAA;AAYpB,SAAS,UAAU,KAAyB;AAE/C,SAAO,IAAI,WAAY,IAAI,MAAM,KAAK,EAAuB,IAAI,OAAK,OAAO,SAAS,GAAG,EAAE,CAAC,CAAC;AACjG;AAKO,SAAS,UAAU,OAAkC;AACxD,SAAO,QAAQ,MAAM,KAAK,OAAO,SAAU,MAAc;AACjD,YAAQ,OAAO,OAAO,KAAM,SAAS,EAAE,GAAG,MAAM,EAAE;AAAA,EACtD,CAAC,EAAE,KAAK,EAAE,IAAI;AACtB;AAKO,SAAS,KAAK,YAAsE;AACvF,QAAM,UAAU,WAAW,WAAW,KAAK,SAAS,QAAQ,SAAS,UAAU,UAAU,CAAC,IACtF,SAAS,QAAQ,cAAc,UAAU,UAAU,CAAC;AAKxD,SAAO,SAAU,QAAgB,MAA8B;AAC3D,QAAI,WAAW,cAAc;AACzB,UAAI,CAAC,KAAK,WAAW;AACjB,cAAM,IAAI,MAAM,wBAAwB;AAAA,MAC5C;AAEA,YAAM,IAAI,KAAK,UAAU;AACzB,UAAK,IAAI,MAAO,GAAG;AACf,cAAM,IAAI,MAAM,wDAAwD;AAAA,MAC5E;AACA,YAAM,YAAY,SAAS,SAAS,UAAU,KAAK,SAAS,GAAG,QAAQ,SAAS;AAEhF,aAAO,UAAU,SAAS,IAAI,KAAK;AAAA,IAEvC,OAAO;AACH,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AAAA,EACJ;AACJ;AAEA,IAAO,2BAAQ;","names":["tweetnacl"]}