@mysten/sui
Version:
Sui TypeScript API
1 lines • 7.52 kB
Source Map (JSON)
{"version":3,"file":"keypair.mjs","names":[],"sources":["../../../src/keypairs/ed25519/keypair.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toHex } from '@mysten/bcs';\nimport { ed25519 } from '@noble/curves/ed25519.js';\n\nimport {\n\tdecodeSuiPrivateKey,\n\tencodeSuiPrivateKey,\n\tKeypair,\n\tPRIVATE_KEY_SIZE,\n} from '../../cryptography/keypair.js';\nimport { isValidHardenedPath, mnemonicToSeedHex } from '../../cryptography/mnemonics.js';\nimport type { SignatureScheme } from '../../cryptography/signature-scheme.js';\nimport { derivePath } from './ed25519-hd-key.js';\nimport { Ed25519PublicKey } from './publickey.js';\n\nexport const DEFAULT_ED25519_DERIVATION_PATH = \"m/44'/784'/0'/0'/0'\";\n\n/**\n * Ed25519 Keypair data. The publickey is the 32-byte public key and\n * the secretkey is 64-byte, where the first 32 bytes is the secret\n * key and the last 32 bytes is the public key.\n */\nexport interface Ed25519KeypairData {\n\tpublicKey: Uint8Array;\n\tsecretKey: Uint8Array;\n}\n\n/**\n * An Ed25519 Keypair used for signing transactions.\n */\nexport class Ed25519Keypair extends Keypair {\n\tprivate keypair: Ed25519KeypairData;\n\n\t/**\n\t * Create a new Ed25519 keypair instance.\n\t * Generate random keypair if no {@link Ed25519Keypair} is provided.\n\t *\n\t * @param keypair Ed25519 keypair\n\t */\n\tconstructor(keypair?: Ed25519KeypairData) {\n\t\tsuper();\n\t\tif (keypair) {\n\t\t\tthis.keypair = {\n\t\t\t\tpublicKey: keypair.publicKey,\n\t\t\t\tsecretKey: keypair.secretKey.slice(0, 32),\n\t\t\t};\n\t\t} else {\n\t\t\tconst privateKey = ed25519.utils.randomSecretKey();\n\t\t\tthis.keypair = {\n\t\t\t\tpublicKey: ed25519.getPublicKey(privateKey),\n\t\t\t\tsecretKey: privateKey,\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Get the key scheme of the keypair ED25519\n\t */\n\tgetKeyScheme(): SignatureScheme {\n\t\treturn 'ED25519';\n\t}\n\n\t/**\n\t * Generate a new random Ed25519 keypair\n\t */\n\tstatic generate(): Ed25519Keypair {\n\t\tconst secretKey = ed25519.utils.randomSecretKey();\n\t\treturn new Ed25519Keypair({\n\t\t\tpublicKey: ed25519.getPublicKey(secretKey),\n\t\t\tsecretKey,\n\t\t});\n\t}\n\n\t/**\n\t * Create a Ed25519 keypair from a raw secret key byte array, also known as seed.\n\t * This is NOT the private scalar which is result of hashing and bit clamping of\n\t * the raw secret key.\n\t *\n\t * @throws error if the provided secret key is invalid and validation is not skipped.\n\t *\n\t * @param secretKey secret key as a byte array or Bech32 secret key string\n\t * @param options: skip secret key validation\n\t */\n\tstatic fromSecretKey(\n\t\tsecretKey: Uint8Array | string,\n\t\toptions?: { skipValidation?: boolean },\n\t): Ed25519Keypair {\n\t\tif (typeof secretKey === 'string') {\n\t\t\tconst decoded = decodeSuiPrivateKey(secretKey);\n\n\t\t\tif (decoded.scheme !== 'ED25519') {\n\t\t\t\tthrow new Error(`Expected a ED25519 keypair, got ${decoded.scheme}`);\n\t\t\t}\n\n\t\t\treturn this.fromSecretKey(decoded.secretKey, options);\n\t\t}\n\n\t\tconst secretKeyLength = secretKey.length;\n\t\tif (secretKeyLength !== PRIVATE_KEY_SIZE) {\n\t\t\tthrow new Error(\n\t\t\t\t`Wrong secretKey size. Expected ${PRIVATE_KEY_SIZE} bytes, got ${secretKeyLength}.`,\n\t\t\t);\n\t\t}\n\t\tconst keypair = {\n\t\t\tpublicKey: ed25519.getPublicKey(secretKey),\n\t\t\tsecretKey,\n\t\t};\n\n\t\tif (!options || !options.skipValidation) {\n\t\t\tconst encoder = new TextEncoder();\n\t\t\tconst signData = encoder.encode('sui validation');\n\t\t\tconst signature = ed25519.sign(signData, secretKey);\n\t\t\tif (!ed25519.verify(signature, signData, keypair.publicKey)) {\n\t\t\t\tthrow new Error('provided secretKey is invalid');\n\t\t\t}\n\t\t}\n\t\treturn new Ed25519Keypair(keypair);\n\t}\n\n\t/**\n\t * The public key for this Ed25519 keypair\n\t */\n\tgetPublicKey(): Ed25519PublicKey {\n\t\treturn new Ed25519PublicKey(this.keypair.publicKey);\n\t}\n\n\t/**\n\t * The Bech32 secret key string for this Ed25519 keypair\n\t */\n\tgetSecretKey(): string {\n\t\treturn encodeSuiPrivateKey(\n\t\t\tthis.keypair.secretKey.slice(0, PRIVATE_KEY_SIZE),\n\t\t\tthis.getKeyScheme(),\n\t\t);\n\t}\n\n\t/**\n\t * Return the signature for the provided data using Ed25519.\n\t */\n\tasync sign(data: Uint8Array) {\n\t\treturn ed25519.sign(data, this.keypair.secretKey) as Uint8Array<ArrayBuffer>;\n\t}\n\n\t/**\n\t * Derive Ed25519 keypair from mnemonics and path. The mnemonics must be normalized\n\t * and validated against the english wordlist.\n\t *\n\t * If path is none, it will default to m/44'/784'/0'/0'/0', otherwise the path must\n\t * be compliant to SLIP-0010 in form m/44'/784'/{account_index}'/{change_index}'/{address_index}'.\n\t */\n\tstatic deriveKeypair(mnemonics: string, path?: string): Ed25519Keypair {\n\t\tif (path == null) {\n\t\t\tpath = DEFAULT_ED25519_DERIVATION_PATH;\n\t\t}\n\t\tif (!isValidHardenedPath(path)) {\n\t\t\tthrow new Error('Invalid derivation path');\n\t\t}\n\t\tconst { key } = derivePath(path, mnemonicToSeedHex(mnemonics));\n\n\t\treturn Ed25519Keypair.fromSecretKey(key);\n\t}\n\n\t/**\n\t * Derive Ed25519 keypair from mnemonicSeed and path.\n\t *\n\t * If path is none, it will default to m/44'/784'/0'/0'/0', otherwise the path must\n\t * be compliant to SLIP-0010 in form m/44'/784'/{account_index}'/{change_index}'/{address_index}'.\n\t *\n\t * @param seed - The seed as a hex string or Uint8Array.\n\t */\n\tstatic deriveKeypairFromSeed(seed: string | Uint8Array, path?: string): Ed25519Keypair {\n\t\tif (path == null) {\n\t\t\tpath = DEFAULT_ED25519_DERIVATION_PATH;\n\t\t}\n\t\tif (!isValidHardenedPath(path)) {\n\t\t\tthrow new Error('Invalid derivation path');\n\t\t}\n\t\tconst seedHex = typeof seed === 'string' ? seed : toHex(seed);\n\t\tconst { key } = derivePath(path, seedHex);\n\n\t\treturn Ed25519Keypair.fromSecretKey(key);\n\t}\n}\n"],"mappings":";;;;;;;;AAiBA,MAAa,kCAAkC;;;;AAe/C,IAAa,iBAAb,MAAa,uBAAuB,QAAQ;;;;;;;CAS3C,YAAY,SAA8B;AACzC,SAAO;AACP,MAAI,QACH,MAAK,UAAU;GACd,WAAW,QAAQ;GACnB,WAAW,QAAQ,UAAU,MAAM,GAAG,GAAG;GACzC;OACK;GACN,MAAM,aAAa,QAAQ,MAAM,iBAAiB;AAClD,QAAK,UAAU;IACd,WAAW,QAAQ,aAAa,WAAW;IAC3C,WAAW;IACX;;;;;;CAOH,eAAgC;AAC/B,SAAO;;;;;CAMR,OAAO,WAA2B;EACjC,MAAM,YAAY,QAAQ,MAAM,iBAAiB;AACjD,SAAO,IAAI,eAAe;GACzB,WAAW,QAAQ,aAAa,UAAU;GAC1C;GACA,CAAC;;;;;;;;;;;;CAaH,OAAO,cACN,WACA,SACiB;AACjB,MAAI,OAAO,cAAc,UAAU;GAClC,MAAM,UAAU,oBAAoB,UAAU;AAE9C,OAAI,QAAQ,WAAW,UACtB,OAAM,IAAI,MAAM,mCAAmC,QAAQ,SAAS;AAGrE,UAAO,KAAK,cAAc,QAAQ,WAAW,QAAQ;;EAGtD,MAAM,kBAAkB,UAAU;AAClC,MAAI,oBAAoB,iBACvB,OAAM,IAAI,MACT,kCAAkC,iBAAiB,cAAc,gBAAgB,GACjF;EAEF,MAAM,UAAU;GACf,WAAW,QAAQ,aAAa,UAAU;GAC1C;GACA;AAED,MAAI,CAAC,WAAW,CAAC,QAAQ,gBAAgB;GAExC,MAAM,WADU,IAAI,aAAa,CACR,OAAO,iBAAiB;GACjD,MAAM,YAAY,QAAQ,KAAK,UAAU,UAAU;AACnD,OAAI,CAAC,QAAQ,OAAO,WAAW,UAAU,QAAQ,UAAU,CAC1D,OAAM,IAAI,MAAM,gCAAgC;;AAGlD,SAAO,IAAI,eAAe,QAAQ;;;;;CAMnC,eAAiC;AAChC,SAAO,IAAI,iBAAiB,KAAK,QAAQ,UAAU;;;;;CAMpD,eAAuB;AACtB,SAAO,oBACN,KAAK,QAAQ,UAAU,MAAM,GAAG,iBAAiB,EACjD,KAAK,cAAc,CACnB;;;;;CAMF,MAAM,KAAK,MAAkB;AAC5B,SAAO,QAAQ,KAAK,MAAM,KAAK,QAAQ,UAAU;;;;;;;;;CAUlD,OAAO,cAAc,WAAmB,MAA+B;AACtE,MAAI,QAAQ,KACX,QAAO;AAER,MAAI,CAAC,oBAAoB,KAAK,CAC7B,OAAM,IAAI,MAAM,0BAA0B;EAE3C,MAAM,EAAE,QAAQ,WAAW,MAAM,kBAAkB,UAAU,CAAC;AAE9D,SAAO,eAAe,cAAc,IAAI;;;;;;;;;;CAWzC,OAAO,sBAAsB,MAA2B,MAA+B;AACtF,MAAI,QAAQ,KACX,QAAO;AAER,MAAI,CAAC,oBAAoB,KAAK,CAC7B,OAAM,IAAI,MAAM,0BAA0B;EAE3C,MAAM,UAAU,OAAO,SAAS,WAAW,OAAO,MAAM,KAAK;EAC7D,MAAM,EAAE,QAAQ,WAAW,MAAM,QAAQ;AAEzC,SAAO,eAAe,cAAc,IAAI"}