diff --git a/src/extension/background-script/CryptoServices/getMyProveBio.ts b/src/extension/background-script/CryptoServices/getMyProveBio.ts index b76e16cd14f..692d4bb1ece 100644 --- a/src/extension/background-script/CryptoServices/getMyProveBio.ts +++ b/src/extension/background-script/CryptoServices/getMyProveBio.ts @@ -8,6 +8,6 @@ export async function getMyProveBio(whoAmI: PersonIdentifier): Promise { const compressedX = getNetworkWorker(others.network).publicKeyDecoder(bio) if (!compressedX) return false - const key = decompressSecp256k1Key(compressedX) + const key = decompressSecp256k1Key(compressedX, 'public') let publicKey: CryptoKey try { publicKey = await import_ECDH_256k1_Key(key) diff --git a/src/utils/mnemonic-code/index.ts b/src/utils/mnemonic-code/index.ts index f4ac1593b26..b63386e2d0c 100644 --- a/src/utils/mnemonic-code/index.ts +++ b/src/utils/mnemonic-code/index.ts @@ -41,7 +41,7 @@ export async function recover_ECDH_256k1_KeyPair_ByMnemonicWord(mnemonicWord: st } function HDKeyToJwk(hdk: wallet.HDKey): JsonWebKey { - const jwk = decompressSecp256k1Key(encodeArrayBuffer(hdk.publicKey)) + const jwk = decompressSecp256k1Key(encodeArrayBuffer(hdk.publicKey), 'public') jwk.d = hdk.privateKey ? Convert.ToBase64Url(hdk.privateKey) : undefined return jwk } diff --git a/src/utils/type-transform/BackupFileShortRepresentation.ts b/src/utils/type-transform/BackupFileShortRepresentation.ts index cba0248e4a4..9db1ac3333f 100644 --- a/src/utils/type-transform/BackupFileShortRepresentation.ts +++ b/src/utils/type-transform/BackupFileShortRepresentation.ts @@ -25,8 +25,8 @@ export function compressBackupFile(file: BackupJSONFileLatest): string { userId, nickname, localKey.k, - compressSecp256k1Key(publicKey), - compressSecp256k1Key(privateKey), + compressSecp256k1Key(publicKey, 'public'), + compressSecp256k1Key(privateKey, 'private'), grantedHostPermissions.join(';'), ].join('🤔') } @@ -60,8 +60,8 @@ export function decompressBackupFile(short: string): BackupJSONFileLatest { }, network, nickname, - privateKey: decompressSecp256k1Key(privateKey), - publicKey: decompressSecp256k1Key(publicKey), + privateKey: decompressSecp256k1Key(privateKey, 'private'), + publicKey: decompressSecp256k1Key(publicKey, 'public'), userId, }, ], diff --git a/src/utils/type-transform/SECP256k1-Compression.ts b/src/utils/type-transform/SECP256k1-Compression.ts index d6f1bd35914..7373994f788 100644 --- a/src/utils/type-transform/SECP256k1-Compression.ts +++ b/src/utils/type-transform/SECP256k1-Compression.ts @@ -27,12 +27,15 @@ function decompressSecp256k1Point(point: ArrayBuffer): { x: string; y: string } return { x: Convert.ToBase64Url(x), y: Convert.ToBase64Url(y) } } -export function compressSecp256k1Key(key: JsonWebKey): string { +export function compressSecp256k1Key(key: JsonWebKey, type: 'public' | 'private'): string { + if (type === 'private' && !key.d) throw new Error('Private key does not contain secret') const arr = compressSecp256k1Point(key.x!, key.y!) - return encodeArrayBuffer(arr) + return encodeArrayBuffer(arr) + (type === 'private' ? '🙈' + key.d! : '') } -export function decompressSecp256k1Key(compressed: string): JsonWebKey { - const arr = decodeArrayBuffer(compressed) +export function decompressSecp256k1Key(compressed: string, type: 'public' | 'private'): JsonWebKey { + const [compressedPublic, privateKey] = compressed.split('🙈') + if (type === 'private' && privateKey.length < 1) throw new Error('Private key does not contain secret') + const arr = decodeArrayBuffer(compressedPublic) const key = decompressSecp256k1Point(arr) return { crv: 'K-256', @@ -41,5 +44,6 @@ export function decompressSecp256k1Key(compressed: string): JsonWebKey { y: key.y, key_ops: ['deriveKey'], kty: 'EC', + d: type === 'private' ? privateKey : undefined, } }