@neuraiproject/neurai-message 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -8
- package/dist/NeuraiMessage.global.js +12837 -0
- package/dist/browser.mjs +12810 -0
- package/dist/index.cjs +2901 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +2890 -0
- package/dist/main.js +10421 -16548
- package/dist/module.js +10783 -16914
- package/dist/src/browser-shims.d.ts +1 -0
- package/dist/src/browser.d.ts +1 -0
- package/dist/src/core.d.ts +6 -0
- package/dist/src/global.d.ts +8 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/legacy-message.d.ts +6 -0
- package/index.ts +1 -256
- package/package.json +33 -19
- package/src/browser-shims.ts +9 -0
- package/src/browser.ts +1 -0
- package/src/core.ts +257 -0
- package/src/global.ts +15 -0
- package/src/index.ts +1 -0
- package/src/legacy-message.ts +140 -0
- package/{test.js → test.spec.js} +5 -7
- package/tsconfig.json +6 -3
- package/vitest.config.mjs +7 -0
- package/dist/main.js.map +0 -1
- package/dist/module.js.map +0 -1
- package/dist/types.d.ts +0 -8
- package/dist/types.d.ts.map +0 -1
package/dist/types.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** returns a base64 encoded string representation of the legacy signature */
|
|
2
|
-
export function sign(message: string, privateKey: Uint8Array, compressed?: boolean): any;
|
|
3
|
-
export function signPQMessage(message: string, privateKey: Uint8Array, publicKey: Uint8Array): string;
|
|
4
|
-
export function verifyLegacyMessage(message: string, address: string, signature: string | Uint8Array): any;
|
|
5
|
-
export function verifyPQMessage(message: string, address: string, signature: string | Uint8Array): any;
|
|
6
|
-
export function verifyMessage(message: string, address: string, signature: string | Uint8Array): any;
|
|
7
|
-
|
|
8
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"mappings":"AA0IA,6EAA6E;AAC7E,qBAAqB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,UAAO,OAS9E;AAED,8BACE,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,UAAU,UAetB;AAED,oCACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,UAAU,OAY/B;AAED,gCACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,UAAU,OAuD/B;AAED,8BACE,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,UAAU,OAK/B","sources":["index.ts"],"sourcesContent":["import { createHash } from \"crypto\";\nimport { bech32m } from \"bech32\";\nimport * as bitcoinMessage from \"bitcoinjs-message\";\nimport { ml_dsa44 } from \"@noble/post-quantum/ml-dsa.js\";\n\nconst MESSAGE_MAGIC = \"Neurai Signed Message:\\n\";\nconst PQ_MESSAGE_SIGNATURE_PREFIX = 0x35;\nconst PQ_SERIALIZED_PUBKEY_PREFIX = 0x05;\nconst PQ_PUBLIC_KEY_LENGTH = 1312;\nconst PQ_SERIALIZED_PUBKEY_LENGTH = 1 + PQ_PUBLIC_KEY_LENGTH;\nconst PQ_SIGNATURE_LENGTH = 2420;\nconst LEGACY_MESSAGE_PREFIX =\n String.fromCharCode(Buffer.byteLength(MESSAGE_MAGIC, \"utf8\")) +\n MESSAGE_MAGIC;\n\nfunction encodeCompactSize(value: number): Buffer {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\"CompactSize value must be a non-negative integer\");\n }\n\n if (value < 253) {\n return Buffer.from([value]);\n }\n\n if (value <= 0xffff) {\n const buffer = Buffer.alloc(3);\n buffer[0] = 0xfd;\n buffer.writeUInt16LE(value, 1);\n return buffer;\n }\n\n if (value <= 0xffffffff) {\n const buffer = Buffer.alloc(5);\n buffer[0] = 0xfe;\n buffer.writeUInt32LE(value, 1);\n return buffer;\n }\n\n throw new Error(\"CompactSize values above uint32 are not supported\");\n}\n\nfunction decodeCompactSize(buffer: Buffer, offset: number) {\n if (offset >= buffer.length) {\n throw new Error(\"Unexpected end of CompactSize data\");\n }\n\n const first = buffer[offset];\n if (first < 253) {\n return { value: first, offset: offset + 1 };\n }\n\n if (first === 0xfd) {\n if (offset + 3 > buffer.length) {\n throw new Error(\"Unexpected end of CompactSize uint16 data\");\n }\n return { value: buffer.readUInt16LE(offset + 1), offset: offset + 3 };\n }\n\n if (first === 0xfe) {\n if (offset + 5 > buffer.length) {\n throw new Error(\"Unexpected end of CompactSize uint32 data\");\n }\n return { value: buffer.readUInt32LE(offset + 1), offset: offset + 5 };\n }\n\n if (first === 0xff) {\n throw new Error(\"CompactSize uint64 is not supported\");\n }\n\n throw new Error(\"Invalid CompactSize prefix\");\n}\n\nfunction sha256(bytes: Uint8Array) {\n return createHash(\"sha256\").update(bytes).digest();\n}\n\nfunction hash256(bytes: Uint8Array) {\n return sha256(sha256(bytes));\n}\n\nfunction hash160(bytes: Uint8Array) {\n return createHash(\"ripemd160\").update(sha256(bytes)).digest();\n}\n\nfunction encodeMessageHash(message: string) {\n const messageBytes = Buffer.from(message, \"utf8\");\n const magicBytes = Buffer.from(MESSAGE_MAGIC, \"utf8\");\n const payload = Buffer.concat([\n encodeCompactSize(magicBytes.length),\n magicBytes,\n encodeCompactSize(messageBytes.length),\n messageBytes,\n ]);\n\n return hash256(payload);\n}\n\nfunction toSignatureBuffer(signature: string | Uint8Array) {\n return typeof signature === \"string\"\n ? Buffer.from(signature, \"base64\")\n : Buffer.from(signature);\n}\n\nfunction normalizePQPublicKey(publicKey: Uint8Array) {\n const buffer = Buffer.from(publicKey);\n\n if (\n buffer.length === PQ_SERIALIZED_PUBKEY_LENGTH &&\n buffer[0] === PQ_SERIALIZED_PUBKEY_PREFIX\n ) {\n return buffer;\n }\n\n if (buffer.length === PQ_PUBLIC_KEY_LENGTH) {\n return Buffer.concat([Buffer.from([PQ_SERIALIZED_PUBKEY_PREFIX]), buffer]);\n }\n\n throw new Error(\"Invalid PQ public key length\");\n}\n\nfunction isPQMessageSignature(signature: string | Uint8Array) {\n const buffer = toSignatureBuffer(signature);\n return buffer.length > 0 && buffer[0] === PQ_MESSAGE_SIGNATURE_PREFIX;\n}\n\nfunction decodePQAddress(address: string) {\n const decoded = bech32m.decode(address);\n if (decoded.words.length === 0) {\n throw new Error(\"Invalid bech32m address\");\n }\n\n return {\n prefix: decoded.prefix,\n version: decoded.words[0],\n program: Buffer.from(bech32m.fromWords(decoded.words.slice(1))),\n };\n}\n\n/** returns a base64 encoded string representation of the legacy signature */\nexport function sign(message: string, privateKey: Uint8Array, compressed = true) {\n const signature = bitcoinMessage.sign(\n message,\n Buffer.from(privateKey),\n compressed,\n LEGACY_MESSAGE_PREFIX\n );\n\n return signature.toString(\"base64\");\n}\n\nexport function signPQMessage(\n message: string,\n privateKey: Uint8Array,\n publicKey: Uint8Array\n) {\n const serializedPublicKey = normalizePQPublicKey(publicKey);\n const hash = encodeMessageHash(message);\n const pqSignature = Buffer.from(ml_dsa44.sign(hash, Buffer.from(privateKey)));\n\n const payload = Buffer.concat([\n Buffer.from([PQ_MESSAGE_SIGNATURE_PREFIX]),\n encodeCompactSize(serializedPublicKey.length),\n serializedPublicKey,\n encodeCompactSize(pqSignature.length),\n pqSignature,\n ]);\n\n return payload.toString(\"base64\");\n}\n\nexport function verifyLegacyMessage(\n message: string,\n address: string,\n signature: string | Uint8Array\n) {\n try {\n return bitcoinMessage.verify(\n message,\n address,\n toSignatureBuffer(signature),\n LEGACY_MESSAGE_PREFIX\n );\n } catch {\n return false;\n }\n}\n\nexport function verifyPQMessage(\n message: string,\n address: string,\n signature: string | Uint8Array\n) {\n try {\n const payload = toSignatureBuffer(signature);\n let offset = 0;\n\n if (payload[offset++] !== PQ_MESSAGE_SIGNATURE_PREFIX) {\n return false;\n }\n\n const publicKeyLength = decodeCompactSize(payload, offset);\n offset = publicKeyLength.offset;\n\n const serializedPublicKey = payload.subarray(\n offset,\n offset + publicKeyLength.value\n );\n offset += publicKeyLength.value;\n\n const signatureLength = decodeCompactSize(payload, offset);\n offset = signatureLength.offset;\n\n const pqSignature = payload.subarray(offset, offset + signatureLength.value);\n offset += signatureLength.value;\n\n if (offset !== payload.length) {\n return false;\n }\n\n if (\n serializedPublicKey.length !== PQ_SERIALIZED_PUBKEY_LENGTH ||\n serializedPublicKey[0] !== PQ_SERIALIZED_PUBKEY_PREFIX ||\n pqSignature.length !== PQ_SIGNATURE_LENGTH\n ) {\n return false;\n }\n\n const decodedAddress = decodePQAddress(address);\n if (decodedAddress.version !== 1 || decodedAddress.program.length !== 20) {\n return false;\n }\n\n const expectedProgram = hash160(serializedPublicKey);\n if (!expectedProgram.equals(decodedAddress.program)) {\n return false;\n }\n\n return ml_dsa44.verify(\n pqSignature,\n encodeMessageHash(message),\n serializedPublicKey.subarray(1)\n );\n } catch {\n return false;\n }\n}\n\nexport function verifyMessage(\n message: string,\n address: string,\n signature: string | Uint8Array\n) {\n return isPQMessageSignature(signature)\n ? verifyPQMessage(message, address, signature)\n : verifyLegacyMessage(message, address, signature);\n}\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|