@shutter-network/shutter-sdk
Version:
TypeScript SDK for interacting with the Shutter crypto library, providing encryption, decryption, and utilities.
1 lines • 21.7 kB
Source Map (JSON)
{"version":3,"sources":["../src/crypto/crypto.ts","../src/crypto/get-blst.ts","../src/crypto/blst/types.ts"],"sourcesContent":["import { hexToBytes, keccak256, bytesToBigInt, bytesToHex, numberToBytes } from 'viem';\nimport pkg from 'lodash';\nconst { zip } = pkg;\nimport { Blst, P1, P2, PT } from './blst/types';\nimport { getBlst } from './get-blst';\n\ndeclare global {\n interface Window {\n blst: any;\n }\n}\n\nconst blsSubgroupOrderBytes = [\n 0x73, 0xed, 0xa7, 0x53, 0x29, 0x9d, 0x7d, 0x48, 0x33, 0x39, 0xd8, 0x08, 0x09, 0xa1, 0xd8, 0x05,\n 0x53, 0xbd, 0xa4, 0x02, 0xff, 0xfe, 0x5b, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01,\n];\n\nconst blsSubgroupOrder = bytesToBigInt(Uint8Array.from(blsSubgroupOrderBytes));\n\nexport async function encryptData(\n msgHex: `0x${string}`,\n identityPreimageHex: `0x${string}`,\n eonKeyHex: `0x${string}`,\n sigmaHex: `0x${string}`,\n) {\n await ensureBlstInitialized();\n const identity = await computeIdentityP1(identityPreimageHex);\n const eonKey = await computeEonKeyP2(eonKeyHex);\n const encryptedMessage = await encrypt(msgHex, identity, eonKey, sigmaHex);\n const encodedData = encodeEncryptedMessage(encryptedMessage);\n return encodedData;\n}\n\nexport async function computeIdentityP1(preimage: `0x${string}`): Promise<P1> {\n const blst = await getBlst()\n const preimageBytes = hexToBytes(('0x1' + preimage.slice(2)) as `0x${string}`);\n const identity = new blst.P1().hash_to(\n preimageBytes,\n 'SHUTTER_V01_BLS12381G1_XMD:SHA-256_SSWU_RO_',\n null,\n );\n return identity;\n}\n\nasync function computeEonKeyP2(eonKeyHex: `0x${string}`): Promise<P2> {\n const blst = await getBlst()\n const eonKey = new blst.P2(hexToBytes(eonKeyHex));\n return eonKey;\n}\n\nasync function encrypt(msgHex: `0x${string}`, identity: P1, eonKey: P2, sigmaHex: `0x${string}`) {\n const r = computeR(sigmaHex.slice(2), msgHex.slice(2));\n const c1 = await computeC1(r);\n const c2 = await computeC2(sigmaHex, r, identity, eonKey);\n const c3 = computeC3(\n padAndSplit(hexToBytes(msgHex as `0x${string}`)),\n hexToBytes(sigmaHex as `0x${string}`),\n );\n\n return {\n VersionId: 0x3,\n c1: c1,\n c2: c2,\n c3: c3,\n };\n}\n\nexport function encodeEncryptedMessage(encryptedMessage: any): `0x${string}` {\n const c1Length = 96;\n const c2Length = 32;\n const c3Length = encryptedMessage.c3.length * 32;\n\n const totalLength = 1 + c1Length + c2Length + c3Length;\n const bytes = new Uint8Array(totalLength);\n\n bytes[0] = encryptedMessage.VersionId;\n bytes.set(encryptedMessage.c1, 1);\n bytes.set(encryptedMessage.c2, 1 + c1Length);\n encryptedMessage.c3.forEach((block: ArrayLike<number>, i: number) => {\n const offset = 1 + c1Length + c2Length + 32 * i;\n bytes.set(block, offset);\n });\n\n return bytesToHex(bytes);\n}\n\nexport async function decodeEncryptedMessage(encryptedMessage: any) {\n const blst = await getBlst()\n const bytes = hexToBytes(encryptedMessage);\n if (bytes[0] !== 0x3) {\n throw \"Invalid version\";\n }\n const c1 = new blst.P2_Affine(bytes.slice(1, 96 + 1));\n const c2 = bytes.slice(96 + 1, 96 + 1 + 32);\n const c3 = bytes.slice(96 + 1 + 32);\n\n return {\n VersionId: 0x3,\n c1: c1,\n c2: c2,\n c3: c3,\n };\n}\n\nexport async function decrypt(encryptedMessageHex: any, epochSecretKeyHex: any) {\n const blst = await getBlst()\n await ensureBlstInitialized()\n const decodedMessage = await decodeEncryptedMessage(encryptedMessageHex);\n const p = new blst.PT(decodedMessage.c1, new blst.P1_Affine(hexToBytes(epochSecretKeyHex)));\n const key = hash2(p);\n const sigma = xorBlocks(decodedMessage.c2, key);\n const blockCount = decodedMessage.c3.length / 32;\n const decryptedBlocks = new Uint8Array(decodedMessage.c3.length);\n const keys = computeBlockKeys(sigma, blockCount);\n for (let i = 0; i < blockCount; i++) {\n const block = decodedMessage.c3.slice(i * 32, (i + 1) * 32);\n const decryptedBlock = xorBlocks(block, keys[i]);\n decryptedBlocks.set(decryptedBlock, i * 32);\n }\n return bytesToHex(unpad(decryptedBlocks));\n}\n\nasync function ensureBlstInitialized(): Promise<void> {\n const blst = await getBlst()\n return new Promise((resolve) => {\n if (blst.calledRun) {\n console.log(\"BLST already initialized\");\n resolve();\n } else {\n console.log(\"Waiting for BLST runtime to initialize...\");\n blst.onRuntimeInitialized = () => {\n console.log(\"BLST runtime initialized.\");\n resolve();\n };\n }\n });\n}\n\n//======================================\nfunction computeR(sigmaHex: string, msgHex: string): bigint {\n const preimage = sigmaHex + msgHex;\n return hash3(preimage);\n}\n\nasync function computeC1(r: bigint) {\n const blst = await getBlst()\n const scalar = new blst.Scalar().from_bendian(numberToBytes(r)).to_lendian();\n const c1 = blst.P2.generator().mult(scalar).compress();\n return c1;\n}\n\nasync function computeC2(sigmaHex: string, r: bigint, identity: P1, eonKey: P2): Promise<any> {\n const blst = await getBlst()\n const p: PT = new blst.PT(identity, eonKey);\n const preimage = await GTExp(p, r);\n const key = hash2(preimage);\n const result = xorBlocks(hexToBytes(sigmaHex as `0x${string}`), key);\n return result;\n}\n\nfunction computeC3(messageBlocks: Uint8Array[], sigma: Uint8Array): Uint8Array[] {\n const keys = computeBlockKeys(sigma, messageBlocks.length);\n\n return zip(keys, messageBlocks).map(([key, block]) => {\n if (key === undefined || block === undefined) {\n throw new Error('Key or block is undefined');\n }\n return xorBlocks(key, block);\n });\n}\n\n\n//======================================\nfunction hash2(p: PT): Uint8Array {\n const finalExp = p.final_exp().to_bendian();\n const result = new Uint8Array(finalExp.length + 1);\n result[0] = 0x2;\n result.set(finalExp, 1);\n return keccak256(result, 'bytes');\n}\n\nfunction hash3(bytesHex: string): bigint {\n const preimage = hexToBytes(('0x3' + bytesHex) as `0x${string}`);\n const hash = keccak256(preimage, 'bytes');\n const bigIntHash = bytesToBigInt(hash);\n const result = bigIntHash % blsSubgroupOrder;\n return result;\n}\n\nfunction hash4(bytes: Uint8Array): Uint8Array {\n const preimage = new Uint8Array(bytes.length + 1);\n preimage[0] = 0x4;\n preimage.set(bytes, 1);\n const hash = keccak256(preimage, 'bytes');\n return hash;\n}\n\n//======================================\nfunction xorBlocks(x: Uint8Array, y: Uint8Array): Uint8Array {\n if (x.length !== y.length) {\n throw new Error('Both byte arrays must be of the same length.');\n }\n\n const result = new Uint8Array(x.length);\n for (let i = 0; i < x.length; i++) {\n result[i] = x[i] ^ y[i];\n }\n return result;\n}\n\nfunction computeBlockKeys(sigma: Uint8Array, n: number): Uint8Array[] {\n return Array.from({ length: n }, (_, x) => {\n const suffix = Buffer.alloc(4);\n suffix.writeUInt32BE(x, 0);\n let suffixLength = 4;\n for (let i = 0; i < 3; i++) {\n if (suffix[i] !== 0) break;\n suffixLength--;\n }\n const effectiveSuffix = Buffer.from(suffix.slice(4 - suffixLength));\n const preimage = Buffer.concat([sigma, effectiveSuffix]);\n return hash4(preimage);\n });\n}\n\nfunction padAndSplit(bytes: Uint8Array): Uint8Array[] {\n const blockSize = 32;\n const paddingLength = blockSize - (bytes.length % blockSize);\n const padded = new Uint8Array(bytes.length + paddingLength);\n padded.set(bytes);\n padded.fill(paddingLength, bytes.length);\n const result: Uint8Array[] = [];\n for (let i = 0; i < padded.length; i += blockSize) {\n result.push(padded.slice(i, i + blockSize));\n }\n return result;\n}\n\nfunction unpad(bytes: Uint8Array): Uint8Array {\n const paddingLength = bytes.at(-1);\n if (paddingLength == undefined || paddingLength == 0 || paddingLength > 32 || paddingLength > bytes.length) {\n throw `Invalid padding length: ${paddingLength}`;\n }\n return bytes.slice(0, bytes.length - paddingLength);\n}\n\nasync function GTExp(x: PT, exp: bigint): Promise<PT> {\n const blst = await getBlst()\n const a: PT = x;\n const acc: PT = blst.PT.one();\n\n while (exp > BigInt(0)) {\n if (exp & BigInt(1)) {\n acc.mul(a);\n }\n a.sqr();\n exp >>= BigInt(1);\n }\n\n return acc;\n}","import { isBrowser, isNode } from \"browser-or-node\";\n\nexport let getBlst: () => Promise<any>;\n\nif (isBrowser) {\n getBlst = async () => {\n if (!window.blst) {\n const script = document.createElement('script');\n script.src = '/node_modules/@shutter-network/shutter-sdk/dist/blst.js';\n\n await new Promise((resolve, reject) => {\n script.onload = resolve;\n script.onerror = () => reject(new Error(\"Failed to load BLST\"));\n document.head.appendChild(script);\n });\n\n if (!window.blst) {\n throw new Error(\"BLST failed to initialize after loading\");\n }\n }\n return window.blst;\n };\n} else if (isNode) {\n getBlst = () => import('./blst/blst').then(module => module.default);\n} else {\n throw new Error(\"platform not supported.\");\n}","export interface Blst {\n SecretKey: SecretKeyConstructor;\n Scalar: ScalarConstructor;\n P1_Affine: P1_AffineConstructor;\n P2_Affine: P2_AffineConstructor;\n P1: P1Constructor;\n P2: P2Constructor;\n PT: PTConstructor;\n Pairing: PairingConstructor;\n G1(): P1;\n G2(): P2;\n}\n\n// blst.hpp types\n\ntype bytes = Uint8Array;\ntype scalar = Scalar | bigint | bytes;\ntype binary_string = string | bytes;\n\n// SecretKey\n\nexport interface SecretKeyConstructor {\n new(): SecretKey;\n}\n\nexport interface SecretKey {\n keygen(IKM: binary_string, info?: string): void;\n derive_master_eip2333(IKM: binary_string): void;\n derive_child_eip2333(SK: SecretKey, child_index: number): void;\n from_bendian(_32: bytes): void;\n from_lendian(_32: bytes): void;\n to_bendian(): bytes;\n to_lendian(): bytes;\n}\n\n// Scalar\n\nexport interface ScalarConstructor {\n new(): Scalar;\n new(le: bytes): Scalar;\n new(msg: binary_string, DST?: string): Scalar;\n}\n\nexport interface Scalar {\n hash_to(msg: binary_string, DST?: string): this;\n dup(): Scalar;\n from_bendian(be: bytes): this;\n from_lendian(le: bytes): this;\n to_bendian(): bytes;\n to_lendian(): bytes;\n add(s: this | SecretKey): this;\n sub(s: this): this;\n mul(s: this): this;\n inverse(): this;\n}\n\n// P1\n\nexport interface P1_AffineConstructor {\n new(): P1_Affine;\n new(_48_or_96: bytes): P1_Affine;\n new(jacobian: P1): P1_Affine;\n}\n\nexport interface P1_Affine {\n dup(): P1_Affine;\n to_jacobian(): P1;\n serialize(): bytes;\n compress(): bytes;\n on_curve(): boolean;\n in_group(): boolean;\n is_inf(): boolean;\n is_equal(p: P1_Affine): boolean;\n core_verify(\n pk: P2_Affine,\n hash_or_encode: boolean,\n msg: binary_string,\n DST?: string,\n aug?: bytes,\n ): BLST_ERROR;\n}\n\nexport interface P1Constructor {\n new(): P1;\n new(sk: SecretKey): P1;\n new(_48_or_96: bytes): P1;\n new(affine: P1_Affine): P1;\n generator(): P1;\n}\n\nexport interface P1 {\n dup(): P1;\n to_affine(): P1_Affine;\n serialize(): bytes;\n compress(): bytes;\n on_curve(): boolean;\n in_group(): boolean;\n is_inf(): boolean;\n is_equal(p: P1): boolean;\n aggregate(affine: P1_Affine): void;\n sign_with(sk: SecretKey): this;\n hash_to(msg: binary_string, DST?: string, aug?: bytes): this;\n encode_to(msg: binary_string, DST?: string, aug?: bytes): this;\n mult(scalar: scalar): this;\n cneg(flag: boolean): this;\n neg(): this;\n add(a: this): this;\n add(a: P1_Affine): this;\n dbl(): this;\n}\n\n// P2\n\nexport interface P2_AffineConstructor {\n new(): P2_Affine;\n new(_96_or_192: bytes): P2_Affine;\n new(jacobian: P2): P2_Affine;\n}\n\nexport interface P2_Affine {\n dup(): P2_Affine;\n to_jacobian(): P2;\n serialize(): bytes;\n compress(): bytes;\n on_curve(): boolean;\n in_group(): boolean;\n is_inf(): boolean;\n is_equal(p: P2_Affine): boolean;\n core_verify(\n pk: P1_Affine,\n hash_or_encode: boolean,\n msg: binary_string,\n DST?: string,\n aug?: bytes,\n ): BLST_ERROR;\n}\n\nexport interface P2Constructor {\n new(): P2;\n new(sk: SecretKey): P2;\n new(_96_192: bytes): P2;\n new(affine: P2_Affine): P2;\n generator(): P2;\n}\n\nexport interface P2 {\n dup(): P2;\n to_affine(): P2_Affine;\n serialize(): bytes;\n compress(): bytes;\n on_curve(): boolean;\n in_group(): boolean;\n is_inf(): boolean;\n is_equal(p: P2): boolean;\n aggregate(affine: P2_Affine): void;\n sign_with(sk: SecretKey): this;\n hash_to(msg: binary_string, DST?: string, aug?: bytes): this;\n encode_to(msg: binary_string, DST?: string, aug?: bytes): this;\n mult(scalar: scalar): this;\n cneg(flag: boolean): this;\n neg(): this;\n add(a: this): this;\n add(a: P2_Affine): this;\n dbl(): this;\n}\n\n// PT\n\nexport interface PTConstructor {\n new(p: P1_Affine): PT;\n new(q: P2_Affine): PT;\n new(q: P2_Affine | P2, p: P1_Affine | P1): PT;\n new(p: P1_Affine | P1, q: P2_Affine | P2): PT;\n one(): PT;\n}\n\nexport interface PT {\n dup(): PT;\n is_one(): boolean;\n is_equal(p: PT): boolean;\n sqr(): this;\n mul(p: PT): this;\n final_exp(): this;\n in_group(): boolean;\n to_bendian(): bytes;\n}\n\n// Pairing\n\nexport interface PairingConstructor {\n new(hash_or_encode: boolean, DST: string): Pairing;\n}\n\nexport interface Pairing {\n aggregate(pk: P1_Affine, sig: P2_Affine, msg: binary_string, aug?: bytes): BLST_ERROR;\n aggregate(pk: P2_Affine, sig: P1_Affine, msg: binary_string, aug?: bytes): BLST_ERROR;\n mul_n_aggregate(\n pk: P1_Affine,\n sig: P2_Affine,\n scalar: scalar,\n msg: binary_string,\n aug?: bytes,\n ): BLST_ERROR;\n mul_n_aggregate(\n pk: P2_Affine,\n sig: P1_Affine,\n scalar: scalar,\n msg: binary_string,\n aug?: bytes,\n ): BLST_ERROR;\n commit(): void;\n merge(ctx: Pairing): BLST_ERROR;\n finalverify(sig?: PT): boolean;\n raw_aggregate(q: P2_Affine, p: P1_Affine): void;\n as_fp12(): PT;\n}\n\n// Misc\n\nexport enum BLST_ERROR {\n BLST_SUCCESS = 0,\n BLST_BAD_ENCODING = 1,\n BLST_POINT_NOT_ON_CURVE = 2,\n BLST_POINT_NOT_IN_GROUP = 3,\n BLST_AGGR_TYPE_MISMATCH = 4,\n BLST_VERIFY_FAIL = 5,\n BLST_PK_IS_INFINITY = 6,\n BLST_BAD_SCALAR = 7,\n}"],"mappings":"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","names":["BLST_ERROR"]}