wampy
Version:
Amazingly fast, feature-rich, lightweight WAMP Javascript client (for browser and node.js)
1 lines • 3.1 kB
Source Map (JSON)
{"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"]}