From 2b55288c2313907763a18abb0877773aa9272014 Mon Sep 17 00:00:00 2001 From: Michal Date: Tue, 28 May 2024 15:02:04 +0100 Subject: [PATCH 01/13] WIP --- apps/wallet-mobile/package.json | 2 + .../src/features/Discover/common/helpers.ts | 2 +- .../cardano/{ => cip30}/cip30.test.ts | 31 +++++- .../cardano/{ => cip30}/cip30.ts | 32 ++++--- .../yoroi-wallets/cardano/cip30/helpers.ts | 95 +++++++++++++++++++ .../cardano/common/signatureUtils.ts | 2 +- yarn.lock | 43 +++------ 7 files changed, 161 insertions(+), 46 deletions(-) rename apps/wallet-mobile/src/yoroi-wallets/cardano/{ => cip30}/cip30.test.ts (75%) rename apps/wallet-mobile/src/yoroi-wallets/cardano/{ => cip30}/cip30.ts (92%) create mode 100644 apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 877a68d992..4c25ff69c2 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -108,6 +108,8 @@ "@formatjs/intl-relativetimeformat": "^11.2.1", "@gorhom/bottom-sheet": "^4", "@ledgerhq/react-native-hw-transport-ble": "6.27.3", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", "@react-native-async-storage/async-storage": "^1.19.3", "@react-native-community/clipboard": "^1.5.1", "@react-native-community/datetimepicker": "^7.1.0", diff --git a/apps/wallet-mobile/src/features/Discover/common/helpers.ts b/apps/wallet-mobile/src/features/Discover/common/helpers.ts index 1888190952..64e660bc9e 100644 --- a/apps/wallet-mobile/src/features/Discover/common/helpers.ts +++ b/apps/wallet-mobile/src/features/Discover/common/helpers.ts @@ -2,7 +2,7 @@ import {connectionStorageMaker, dappConnectorApiMaker, dappConnectorMaker, Resol import {DappConnector} from '@yoroi/dapp-connector' import {App} from '@yoroi/types' -import {cip30ExtensionMaker} from '../../../yoroi-wallets/cardano/cip30' +import {cip30ExtensionMaker} from '../../../yoroi-wallets/cardano/cip30/cip30' import {YoroiWallet} from '../../../yoroi-wallets/cardano/types' export const validUrl = (url: string) => { diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts similarity index 75% rename from apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.test.ts rename to apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index 0610a492d5..65ede6be0a 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -1,7 +1,8 @@ -import {mocks} from '../mocks' -import {getMasterKeyFromMnemonic} from './byron/util' +import {mocks} from '../../mocks' +import {getMasterKeyFromMnemonic} from '../byron/util' import {cip30ExtensionMaker} from './cip30' -import {YoroiWallet} from './types' +import {YoroiWallet} from '../types' +import {Addresses} from '../chain' describe('cip30ExtensionMaker', () => { it('should support submitTx', async () => { @@ -76,9 +77,31 @@ describe('cip30ExtensionMaker', () => { it('should support signTx', async () => { const cip30 = cip30ExtensionMaker(mocks.wallet) - const result = await cip30.signTx(await getMasterKeyFromMnemonic(mnemonic), txCbor, true) + const rootKey = await getMasterKeyFromMnemonic(mnemonic) + const result = await cip30.signTx(rootKey, txCbor, true) expect(result).toBeDefined() }) + + it('should support signData', async () => { + const cip30 = cip30ExtensionMaker({ + ...mocks.wallet, + get externalAddresses(): Addresses { + return [ + 'addr_test1qrg0x4sx2wfd3l26zqs658u8vyg8qz4dzqw0zke45lpy0vkr3y3kdut55a40jff00qmg74686vz44v6k363md06qkq0qzplc3l', + ] + }, + }) + const rootKey = await getMasterKeyFromMnemonic(mnemonic) + const address = + 'addr_test1qrg0x4sx2wfd3l26zqs658u8vyg8qz4dzqw0zke45lpy0vkr3y3kdut55a40jff00qmg74686vz44v6k363md06qkq0qzplc3l' + const data = 'hello' + const result = await cip30.signData(rootKey, address, data) + expect(result).toEqual({ + key: '00d0f356065392d8fd5a1021aa1f876110700aad101cf15b35a7c247b2c3892366f174a76af9252f78368f5747d3055ab3568ea3b6bf40b01e', + signature: + 'cc273ddc49feed05551cc891c1b6bbc86974e63a4974812525929453beb7e917420fade369e5220c739acf43f50314a6cc3805d310dde9ac7f43b8de4489fc01', + }) + }) }) const mnemonic = [ diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts similarity index 92% rename from apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.ts rename to apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 63d3aa4827..7b1a39f803 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -9,15 +9,16 @@ import {BigNumber} from 'bignumber.js' import {Buffer} from 'buffer' import _ from 'lodash' -import {RawUtxo, YoroiUnsignedTx} from '../types' -import {asQuantity, Utxos} from '../utils' -import {Cardano, CardanoMobile} from '../wallets' -import {toAssetNameHex, toPolicyId} from './api' -import {getTransactionSigners} from './common/signatureUtils' -import {Pagination, YoroiWallet} from './types' -import {createRawTxSigningKey, identifierToCardanoAsset} from './utils' -import {collateralConfig, findCollateralCandidates, utxosMaker} from './utxoManager/utxos' -import {wrappedCsl} from './wrappedCsl' +import {RawUtxo, YoroiUnsignedTx} from '../../types' +import {asQuantity, Utxos} from '../../utils' +import {Cardano, CardanoMobile} from '../../wallets' +import {toAssetNameHex, toPolicyId} from '../api' +import {getDerivationPathForAddress, getTransactionSigners} from '../common/signatureUtils' +import {Pagination, YoroiWallet} from '../types' +import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' +import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' +import {wrappedCsl} from '../wrappedCsl' +import {signBip32} from './helpers' export const cip30ExtensionMaker = (wallet: YoroiWallet) => { return new CIP30Extension(wallet) @@ -127,13 +128,20 @@ class CIP30Extension { return txId } - async signData(_rootKey: string, address: string, _payload: string): Promise<{signature: string; key: string}> { + async signData(rootKey: string, address: string, payload: string): Promise<{signature: string; key: string}> { const {csl, release} = getCSL() try { const normalisedAddress = await normalizeToAddress(csl, address) const bech32Address = await normalisedAddress?.toBech32(undefined) - if (!bech32Address) throw new Error('Invalid wallet state') - throw new Error('Not implemented') + if (!bech32Address) throw new Error('Invalid address') + const path = getDerivationPathForAddress(bech32Address, this.wallet, false) + const signingKey = await createRawTxSigningKey(rootKey, path) + const payloadInBytes = Buffer.from(payload, 'hex') + const signingKeyBytes = await signingKey.asBytes() + const signature = signBip32(payloadInBytes, signingKeyBytes) + const key = await normalisedAddress?.toHex() + if (!key) throw new Error('Invalid key') + return {signature: Buffer.from(signature).toString('hex'), key} } finally { release() } diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts new file mode 100644 index 0000000000..2a2409eb9d --- /dev/null +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts @@ -0,0 +1,95 @@ +import {ed25519} from '@noble/curves/ed25519' +import {sha512} from '@noble/hashes/sha512' +import assert from 'assert' + +type Bytes = Uint8Array + +export function addMul8(a: Bytes, b: Bytes): Bytes { + assert(a.length === 32 && b.length === 32) + return add256(a, _bytes(BigInt.asUintN(227, _scalar(b) << 3n))) +} + +export function add256(a: Bytes, b: Bytes): Bytes { + assert(a.length === 32 && b.length === 32) + const t = new Uint8Array(32) + let c = 0 + for (let i = 0; i < 32; i++) { + const x = a[i] + b[i] + c + t[i] = x + c = x >>> 8 + } + return t +} + +export function baseMultiply(x: Bytes): Bytes { + assert(x.length === 32 || x.length === 64) + return ed25519.ExtendedPoint.BASE.multiply(_scalar(x) % ed25519.CURVE.n).toRawBytes() +} + +export function pointAdd(a: Bytes, b: Bytes): Bytes { + const m = baseMultiply(addMul8(new Uint8Array(32), b)) + const p = ed25519.ExtendedPoint.fromAffine(_decodePoint(a)) + const q = ed25519.ExtendedPoint.fromAffine(_decodePoint(m)) + return _encodePoint(p.add(q)) +} + +export function signBip32(message: Bytes, secretKey: Bytes) { + const h = sha512(message) + const p = baseMultiply(h) + const s = _scalar(sha512(new Uint8Array([...p, ...baseMultiply(secretKey), ...message]))) + return new Uint8Array([...p, ..._bytes((_scalar(h) + s * _scalar(secretKey)) % ed25519.CURVE.n)]) +} + +interface Point { + readonly x: bigint + readonly y: bigint +} + +function _encodePoint(point: Point): Bytes { + const t = new Uint8Array(32) + t.set(_bytes(point.y)) + if (point.x & 1n) t[31] |= 128 + return t +} + +function _decodePoint(point: Bytes): Point { + const p = new Uint8Array(point) + p[31] &= 127 + const y = _scalar(p) + return _pointFromY(y, point[31] >= 128) +} + +function _pointFromY(y: bigint, odd: boolean): Point { + const c = ed25519.CURVE + const f = c.Fp + const s = f.sqr(y) + const a = f.sub(s, 1n) + const b = f.sub(f.mul(s, BigInt(c.d)), BigInt(c.a)) + const m = f.mul(a, f.inv(b)) + if (!m) { + assert(!odd) + return {x: 0n, y} + } + const x = f.sqrt(m) + assert(!f.sub(f.sqr(x), m)) + if (!!(x & 1n) !== odd) return {x: f.neg(x), y} + return {x, y} +} + +function _scalar(x: Bytes): bigint { + assert(x.length === 32 || x.length === 64) + let t = 0n + for (let i = x.length - 1; i >= 0; i--) t = (t << 8n) + BigInt(x[i]) + return t +} + +function _bytes(x: bigint): Bytes { + assert(x === BigInt.asUintN(256, x)) + const t = new Uint8Array(32) + let v = x + for (let i = 0; i < 32; i++) { + t[i] = Number(v & 255n) + v >>= 8n + } + return t +} diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/common/signatureUtils.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/common/signatureUtils.ts index 430a5abe34..6abacd4abc 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/common/signatureUtils.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/common/signatureUtils.ts @@ -92,7 +92,7 @@ const arePathsEqual = (path1: number[], path2: number[]) => { return path1.every((value, index) => value === path2[index]) && path1.length === path2.length } -const getDerivationPathForAddress = (address: string, wallet: YoroiWallet, partial = false) => { +export const getDerivationPathForAddress = (address: string, wallet: YoroiWallet, partial = false) => { const internalIndex = wallet.internalAddresses.indexOf(address) const externalIndex = wallet.externalAddresses.indexOf(address) const purpose = isHaskellShelley(wallet.walletImplementationId) diff --git a/yarn.lock b/yarn.lock index 13e0f8bfc0..5a7a6fc7a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3662,6 +3662,18 @@ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== +"@noble/curves@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" + integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== + dependencies: + "@noble/hashes" "1.4.0" + +"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" + integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== + "@noble/hashes@^1.2.0", "@noble/hashes@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" @@ -21044,16 +21056,7 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -21166,7 +21169,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -21194,13 +21197,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -22813,7 +22809,7 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -22849,15 +22845,6 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From 759881c378c7373e4f2732631b4e4c765b4a576c Mon Sep 17 00:00:00 2001 From: Michal Date: Fri, 31 May 2024 12:05:27 +0100 Subject: [PATCH 02/13] WIP --- apps/wallet-mobile/package.json | 1 + .../yoroi-wallets/cardano/cip30/cip30.test.ts | 65 ++++++--- .../src/yoroi-wallets/cardano/cip30/cip30.ts | 9 +- yarn.lock | 127 +++++++++++++++++- 4 files changed, 178 insertions(+), 24 deletions(-) diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 4c25ff69c2..647304d471 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -91,6 +91,7 @@ }, "dependencies": { "@amplitude/analytics-react-native": "1.3.1", + "@cardano-foundation/cardano-verify-datasignature": "^1.0.11", "@cardano-foundation/ledgerjs-hw-app-cardano": "^6.0.0", "@emurgo/cip14-js": "^3.0.1", "@emurgo/cip4-js": "1.0.7", diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index 65ede6be0a..4db4702f0e 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -3,6 +3,8 @@ import {getMasterKeyFromMnemonic} from '../byron/util' import {cip30ExtensionMaker} from './cip30' import {YoroiWallet} from '../types' import {Addresses} from '../chain' +import verifySignature from '@cardano-foundation/cardano-verify-datasignature' +import {wrappedCsl} from '../wrappedCsl' describe('cip30ExtensionMaker', () => { it('should support submitTx', async () => { @@ -83,24 +85,57 @@ describe('cip30ExtensionMaker', () => { }) it('should support signData', async () => { - const cip30 = cip30ExtensionMaker({ - ...mocks.wallet, - get externalAddresses(): Addresses { - return [ - 'addr_test1qrg0x4sx2wfd3l26zqs658u8vyg8qz4dzqw0zke45lpy0vkr3y3kdut55a40jff00qmg74686vz44v6k363md06qkq0qzplc3l', - ] - }, - }) + const csl = wrappedCsl().csl + const rootKey = await getMasterKeyFromMnemonic(mnemonic) + const message = 'Hello' const address = - 'addr_test1qrg0x4sx2wfd3l26zqs658u8vyg8qz4dzqw0zke45lpy0vkr3y3kdut55a40jff00qmg74686vz44v6k363md06qkq0qzplc3l' - const data = 'hello' - const result = await cip30.signData(rootKey, address, data) - expect(result).toEqual({ - key: '00d0f356065392d8fd5a1021aa1f876110700aad101cf15b35a7c247b2c3892366f174a76af9252f78368f5747d3055ab3568ea3b6bf40b01e', + '01260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40' + const addressBech32 = + 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' + console.log('addressBech32', addressBech32) + + const key = 'a4010103272006215820be6a4d7e9789dd7458049c971ad783107e7f041c6f1f542b4530d63d5fe5afb1' + const signature = + '845846a201276761646472657373583901260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40a166686173686564f44548656c6c6f58400b6a6aac7a95656ab241bf4dedec8b5ca0d4893747093f3382223b1d2e869de1b6b9809f0b974536b1191b6e193cf4ec5dc506b21b52e6bc5d352f04c60bf30d' + + // console.log('bech32', addressBech32) + + const cip30 = cip30ExtensionMaker(mocks.wallet) + + const result = await cip30.signData(rootKey, addressBech32, message) + expect(result).toEqual({key, signature}) + expect(verifySignature(result.signature, result.key)).toBe(true) + }) + + it('should support signData 2', async () => { + const csl = wrappedCsl().csl + const privateKeyCBOR = + 'c831be0c2d612bd23c9c6b5313c169fbbf2973cc8227a6377101f76fffb1985d72ed1e556348bf7383435ebf14e8d0570ef03e1c584e21be81476806a12a05b5d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' + const pub = + '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' + + const expected = { signature: - 'cc273ddc49feed05551cc891c1b6bbc86974e63a4974812525929453beb7e917420fade369e5220c739acf43f50314a6cc3805d310dde9ac7f43b8de4489fc01', - }) + '84584da30127045820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d15977466761646472657373581d603469016f543d8510a7e01fa92533c22b83913fb4501e806d964ef8bca166686173686564f44877686174657665725840bd4d761706730739c168f06450de0d3636cbb6367bb9bae1525616b312db9764736c6b6fb79c130e0288fb460b98dedf86cba5914e193e34f9b38f4f48080108', + key: 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', + } + + console.log('privateKeyCBOR', privateKeyCBOR) + const privateKey = await csl.Bip32PrivateKey.fromBytes(Buffer.from(privateKeyCBOR, 'hex')) + console.log('privateKey', privateKey) + const rootKey = Buffer.from(await privateKey.asBytes()).toString('hex') + console.log('rootKey', rootKey) + + const addressBech32 = await csl.PublicKey.fromHex(pub).then((address) => address.toBech32()) + + console.log('addressBech32', addressBech32) + const message = 'whatever' + + const cip30 = cip30ExtensionMaker(mocks.wallet) + + const result = await cip30.signData(rootKey, addressBech32, message) + expect(result).toEqual(expected) }) }) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 7b1a39f803..c7efe83d95 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -13,7 +13,7 @@ import {RawUtxo, YoroiUnsignedTx} from '../../types' import {asQuantity, Utxos} from '../../utils' import {Cardano, CardanoMobile} from '../../wallets' import {toAssetNameHex, toPolicyId} from '../api' -import {getDerivationPathForAddress, getTransactionSigners} from '../common/signatureUtils' +import {getDerivationPathForAddress, getTransactionSigners, harden} from '../common/signatureUtils' import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' @@ -134,12 +134,13 @@ class CIP30Extension { const normalisedAddress = await normalizeToAddress(csl, address) const bech32Address = await normalisedAddress?.toBech32(undefined) if (!bech32Address) throw new Error('Invalid address') - const path = getDerivationPathForAddress(bech32Address, this.wallet, false) + const path = [harden(1852), harden(1815), harden(0), 0, 0] + console.log('path', path) const signingKey = await createRawTxSigningKey(rootKey, path) - const payloadInBytes = Buffer.from(payload, 'hex') + const payloadInBytes = Uint8Array.from(Buffer.from(payload, 'utf-8')) const signingKeyBytes = await signingKey.asBytes() const signature = signBip32(payloadInBytes, signingKeyBytes) - const key = await normalisedAddress?.toHex() + const key = await (await signingKey.toPublic())?.toHex() if (!key) throw new Error('Invalid key') return {signature: Buffer.from(signature).toString('hex'), key} } finally { diff --git a/yarn.lock b/yarn.lock index 5a7a6fc7a2..eb72c03bba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1761,6 +1761,17 @@ deepmerge "^3.2.0" hoist-non-react-statics "^3.3.0" +"@cardano-foundation/cardano-verify-datasignature@^1.0.11": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@cardano-foundation/cardano-verify-datasignature/-/cardano-verify-datasignature-1.0.11.tgz#2565d1e3152d4a22956f12a7f3829684707374ad" + integrity sha512-e1hCWmVxtVJVPeXYB7RLaQXm4VRV5okv2aww0+690oFbKLVvqtpFI61CtYomwC+lrYAl2DBSG3xuCvQiv7hxqQ== + dependencies: + "@stricahq/bip32ed25519" "^1.0.4" + "@stricahq/cbors" "^1.0.2" + "@stricahq/cip08" "^1.0.4" + "@stricahq/typhonjs" "^1.2.8" + blakejs "^1.2.1" + "@cardano-foundation/ledgerjs-hw-app-cardano@^5.0.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-5.1.0.tgz#69b94f7c5055bdb19aa719ff277fa5f683d11067" @@ -5518,6 +5529,58 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" +"@stricahq/bip32ed25519@^1.0.3", "@stricahq/bip32ed25519@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@stricahq/bip32ed25519/-/bip32ed25519-1.0.4.tgz#e4e9356073e35b6c2d12e4fabcefef4d50487065" + integrity sha512-b+4+aTRF9QY19auN4oBmZxv/7lJIBPBfAIU9wOTzc9Wxb0ifWpVcM4qt+qZuRNlMQofSlSa6lUet6CwaNyDEuA== + dependencies: + blakejs "^1.1.1" + bn.js "^5.2.0" + buffer "^6.0.3" + chai "^4.3.4" + elliptic "6.5.4" + hash.js "^1.1.7" + pbkdf2 "^3.1.2" + +"@stricahq/cbors@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@stricahq/cbors/-/cbors-1.0.2.tgz#e9085601b29bc04741e4e66c3f0fd207117e9f95" + integrity sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww== + dependencies: + bignumber.js "^9.0.2" + buffer "^6.0.3" + +"@stricahq/cbors@^1.0.0", "@stricahq/cbors@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@stricahq/cbors/-/cbors-1.0.3.tgz#ece966fef370919d5bf69a0ecabb4df23676ae34" + integrity sha512-FlV5DaQtTeSSgkC9S4CiO167+x1t6uSNixQ32QMWIMG7+/LhOtzv4GPf4qJR6z7C31mzx+mRlf86dJt9lfBeVw== + dependencies: + bignumber.js "^9.0.2" + buffer "^6.0.3" + +"@stricahq/cip08@^1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@stricahq/cip08/-/cip08-1.0.4.tgz#55ed7eb3fef86d36b2717a65ced4ece3b328aa22" + integrity sha512-kRlZYVXUx4JrjTSVk/IslhRDCsKmwzg4PPo0MJpvthTM6laqFNvQBVRpYus/lqWTnekdRHjlB/xDvvOVjQTm1w== + dependencies: + "@stricahq/bip32ed25519" "^1.0.3" + "@stricahq/cbors" "^1.0.0" + blakejs "^1.1.1" + buffer "^6.0.3" + +"@stricahq/typhonjs@^1.2.8": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@stricahq/typhonjs/-/typhonjs-1.2.8.tgz#71a616b75e2a632d8766916b41ca34d6f9125102" + integrity sha512-JPr5N8KZ/ipTPemhqieFgmibnnXT/E+EtrROCJ78IvBwZx1FpAxpLRMA7vf142IfXz9ZYREc1l9KQzKq2xaAbw== + dependencies: + "@stricahq/cbors" "1.0.2" + bech32 "^2.0.0" + bignumber.js "^9.0.1" + blakejs "^1.2.1" + bs58 "^5.0.0" + buffer "^6.0.3" + lodash "^4.17.21" + "@szmarczak/http-timer@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" @@ -7548,6 +7611,11 @@ base-x@^3.0.2, base-x@^3.0.5, base-x@^3.0.6: dependencies: safe-buffer "^5.0.1" +base-x@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" + integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== + base64-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -7613,6 +7681,11 @@ bignumber.js@^9.0.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== +bignumber.js@^9.0.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -7704,6 +7777,11 @@ blake2b@^2.1.4: blake2b-wasm "^2.4.0" nanoassert "^2.0.0" +blakejs@^1.1.1, blakejs@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== + bluebird@^3.5.4, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -7719,7 +7797,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -7959,6 +8037,13 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" +bs58@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" + integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== + dependencies: + base-x "^4.0.0" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -8321,6 +8406,19 @@ chacha@2.1.0: optionalDependencies: chacha-native "^2.0.0" +chai@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" + integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.0.8" + chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -8408,6 +8506,13 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + child-process-promise@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" @@ -9726,7 +9831,7 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -deep-eql@^4.1.2: +deep-eql@^4.1.2, deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -10281,7 +10386,7 @@ electron-to-chromium@^1.4.431: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== -elliptic@^6.5.3: +elliptic@6.5.4, elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -12077,6 +12182,11 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -12663,7 +12773,7 @@ hash-wasm@^4.9.0: resolved "https://registry.yarnpkg.com/hash-wasm/-/hash-wasm-4.9.0.tgz#7e9dcc9f7d6bd0cc802f2a58f24edce999744206" integrity sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w== -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -15840,6 +15950,13 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + lowercase-keys@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" @@ -18193,7 +18310,7 @@ pbkdf2@3.0.8: dependencies: create-hmac "^1.1.2" -pbkdf2@^3.0.3, pbkdf2@^3.0.9: +pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== From d0fb893bae7f0a19d2dc2674120b7e811e02c26b Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 3 Jun 2024 15:32:10 +0100 Subject: [PATCH 03/13] WIP --- .../yoroi-wallets/cardano/cip30/cip30.test.ts | 83 +++++++++++-------- .../src/yoroi-wallets/cardano/cip30/cip30.ts | 2 +- 2 files changed, 48 insertions(+), 37 deletions(-) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index 4db4702f0e..f2aadd0219 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -1,9 +1,9 @@ +import verifySignature from '@cardano-foundation/cardano-verify-datasignature' + import {mocks} from '../../mocks' import {getMasterKeyFromMnemonic} from '../byron/util' -import {cip30ExtensionMaker} from './cip30' import {YoroiWallet} from '../types' -import {Addresses} from '../chain' -import verifySignature from '@cardano-foundation/cardano-verify-datasignature' +import {cip30ExtensionMaker} from './cip30' import {wrappedCsl} from '../wrappedCsl' describe('cip30ExtensionMaker', () => { @@ -85,12 +85,9 @@ describe('cip30ExtensionMaker', () => { }) it('should support signData', async () => { - const csl = wrappedCsl().csl - const rootKey = await getMasterKeyFromMnemonic(mnemonic) + const {csl} = wrappedCsl() const message = 'Hello' - const address = - '01260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40' const addressBech32 = 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' console.log('addressBech32', addressBech32) @@ -104,39 +101,53 @@ describe('cip30ExtensionMaker', () => { const cip30 = cip30ExtensionMaker(mocks.wallet) const result = await cip30.signData(rootKey, addressBech32, message) - expect(result).toEqual({key, signature}) - expect(verifySignature(result.signature, result.key)).toBe(true) - }) + // expect(result).toEqual({key, signature}) + const pub = await csl..fromHex( + '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c', + ) - it('should support signData 2', async () => { - const csl = wrappedCsl().csl - const privateKeyCBOR = - 'c831be0c2d612bd23c9c6b5313c169fbbf2973cc8227a6377101f76fffb1985d72ed1e556348bf7383435ebf14e8d0570ef03e1c584e21be81476806a12a05b5d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' - const pub = - '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' + pub. - const expected = { - signature: + const address = await pub.toBech32() + expect( + verifySignature( '84584da30127045820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d15977466761646472657373581d603469016f543d8510a7e01fa92533c22b83913fb4501e806d964ef8bca166686173686564f44877686174657665725840bd4d761706730739c168f06450de0d3636cbb6367bb9bae1525616b312db9764736c6b6fb79c130e0288fb460b98dedf86cba5914e193e34f9b38f4f48080108', - key: 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', - } - - console.log('privateKeyCBOR', privateKeyCBOR) - const privateKey = await csl.Bip32PrivateKey.fromBytes(Buffer.from(privateKeyCBOR, 'hex')) - console.log('privateKey', privateKey) - const rootKey = Buffer.from(await privateKey.asBytes()).toString('hex') - console.log('rootKey', rootKey) - - const addressBech32 = await csl.PublicKey.fromHex(pub).then((address) => address.toBech32()) - - console.log('addressBech32', addressBech32) - const message = 'whatever' - - const cip30 = cip30ExtensionMaker(mocks.wallet) - - const result = await cip30.signData(rootKey, addressBech32, message) - expect(result).toEqual(expected) + 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', + 'whatever', + address, + ), + ).toBe(true) }) + + // it('should support signData 2', async () => { + // const csl = wrappedCsl().csl + // const privateKeyCBOR = + // 'c831be0c2d612bd23c9c6b5313c169fbbf2973cc8227a6377101f76fffb1985d72ed1e556348bf7383435ebf14e8d0570ef03e1c584e21be81476806a12a05b5d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' + // const pub = + // '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' + // + // const expected = { + // signature: + // '84584da30127045820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d15977466761646472657373581d603469016f543d8510a7e01fa92533c22b83913fb4501e806d964ef8bca166686173686564f44877686174657665725840bd4d761706730739c168f06450de0d3636cbb6367bb9bae1525616b312db9764736c6b6fb79c130e0288fb460b98dedf86cba5914e193e34f9b38f4f48080108', + // key: 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', + // } + // + // console.log('privateKeyCBOR', privateKeyCBOR) + // const privateKey = await csl.Bip32PrivateKey.fromBytes(Buffer.from(privateKeyCBOR, 'hex')) + // console.log('privateKey', privateKey) + // const rootKey = Buffer.from(await privateKey.asBytes()).toString('hex') + // console.log('rootKey', rootKey) + // + // const addressBech32 = await csl.PublicKey.fromHex(pub).then((address) => address.toBech32()) + // + // console.log('addressBech32', addressBech32) + // const message = 'whatever' + // + // const cip30 = cip30ExtensionMaker(mocks.wallet) + // + // const result = await cip30.signData(rootKey, addressBech32, message) + // expect(result).toEqual(expected) + // }) }) const mnemonic = [ diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index c7efe83d95..d89e2fa372 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -13,7 +13,7 @@ import {RawUtxo, YoroiUnsignedTx} from '../../types' import {asQuantity, Utxos} from '../../utils' import {Cardano, CardanoMobile} from '../../wallets' import {toAssetNameHex, toPolicyId} from '../api' -import {getDerivationPathForAddress, getTransactionSigners, harden} from '../common/signatureUtils' +import {getTransactionSigners, harden} from '../common/signatureUtils' import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' From f352e2bbc5799ba4ac7de081cf4dbdcf316a92ae Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 3 Jun 2024 18:06:21 +0100 Subject: [PATCH 04/13] Add msl-mobile-bridge --- apps/wallet-mobile/ios/Podfile.lock | 6 +++ apps/wallet-mobile/package.json | 3 ++ .../yoroi-wallets/cardano/cip30/cip30.test.ts | 30 +++---------- .../src/yoroi-wallets/cardano/cip30/cip30.ts | 45 +++++++++++++++---- yarn.lock | 42 +++++++++++++++++ 5 files changed, 93 insertions(+), 33 deletions(-) diff --git a/apps/wallet-mobile/ios/Podfile.lock b/apps/wallet-mobile/ios/Podfile.lock index 8efec1c935..90756df23e 100644 --- a/apps/wallet-mobile/ios/Podfile.lock +++ b/apps/wallet-mobile/ios/Podfile.lock @@ -354,6 +354,8 @@ PODS: - React-Core - react-native-haskell-shelley (6.0.0-alpha.9): - React + - react-native-message_signing-library (1.0.1): + - React - react-native-mmkv (2.11.0): - MMKV (>= 1.2.13) - React-Core @@ -588,6 +590,7 @@ DEPENDENCIES: - react-native-ble-plx (from `../../../node_modules/react-native-ble-plx`) - react-native-config (from `../../../node_modules/react-native-config`) - "react-native-haskell-shelley (from `../../../node_modules/@emurgo/csl-mobile-bridge`)" + - "react-native-message_signing-library (from `../../../node_modules/@emurgo/msl-mobile-bridge`)" - react-native-mmkv (from `../../../node_modules/react-native-mmkv`) - react-native-pager-view (from `../../../node_modules/react-native-pager-view`) - react-native-quick-base64 (from `../../../node_modules/react-native-quick-base64`) @@ -738,6 +741,8 @@ EXTERNAL SOURCES: :path: "../../../node_modules/react-native-config" react-native-haskell-shelley: :path: "../../../node_modules/@emurgo/csl-mobile-bridge" + react-native-message_signing-library: + :path: "../../../node_modules/@emurgo/msl-mobile-bridge" react-native-mmkv: :path: "../../../node_modules/react-native-mmkv" react-native-pager-view: @@ -872,6 +877,7 @@ SPEC CHECKSUMS: react-native-ble-plx: f10240444452dfb2d2a13a0e4f58d7783e92d76e react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-haskell-shelley: 4015aef14eca3ecf5e8d8718e8d1b47cdcf60f84 + react-native-message_signing-library: 70b9e51c7ff9990979d605be8c8028eb7fce9569 react-native-mmkv: e97c0c79403fb94577e5d902ab1ebd42b0715b43 react-native-pager-view: 0ccb8bf60e2ebd38b1f3669fa3650ecce81db2df react-native-quick-base64: 62290829c619fbabca4c41cfec75ae759d08fc1c diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 5eec0f6573..5167c38457 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -97,7 +97,9 @@ "@emurgo/cip4-js": "1.0.7", "@emurgo/cross-csl-core": "4.4.0", "@emurgo/cross-csl-mobile": "4.4.0", + "@emurgo/cross-msl-mobile": "^1.0.0", "@emurgo/csl-mobile-bridge": "6.0.0-alpha.9", + "@emurgo/msl-mobile-bridge": "^1.0.1", "@emurgo/react-native-blockies-svg": "^0.0.2", "@emurgo/react-native-hid": "^5.15.6", "@emurgo/yoroi-lib": "0.15.4-alpha.7", @@ -220,6 +222,7 @@ "@babel/runtime": "^7.20.0", "@emurgo/cardano-serialization-lib-nodejs": "12.0.0-alpha.28", "@emurgo/cross-csl-nodejs": "4.4.0", + "@emurgo/cross-msl-nodejs": "^1.0.0", "@formatjs/cli": "^6.1.0", "@formatjs/ts-transformer": "^3.13.0", "@react-navigation/devtools": "^6.0.13", diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index f2aadd0219..ae94879708 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -1,10 +1,9 @@ -import verifySignature from '@cardano-foundation/cardano-verify-datasignature' - import {mocks} from '../../mocks' import {getMasterKeyFromMnemonic} from '../byron/util' import {YoroiWallet} from '../types' import {cip30ExtensionMaker} from './cip30' import {wrappedCsl} from '../wrappedCsl' +import verifySignature from '@cardano-foundation/cardano-verify-datasignature' describe('cip30ExtensionMaker', () => { it('should support submitTx', async () => { @@ -87,36 +86,19 @@ describe('cip30ExtensionMaker', () => { it('should support signData', async () => { const rootKey = await getMasterKeyFromMnemonic(mnemonic) const {csl} = wrappedCsl() - const message = 'Hello' + const message = 'whatever' const addressBech32 = 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' - console.log('addressBech32', addressBech32) - - const key = 'a4010103272006215820be6a4d7e9789dd7458049c971ad783107e7f041c6f1f542b4530d63d5fe5afb1' - const signature = - '845846a201276761646472657373583901260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40a166686173686564f44548656c6c6f58400b6a6aac7a95656ab241bf4dedec8b5ca0d4893747093f3382223b1d2e869de1b6b9809f0b974536b1191b6e193cf4ec5dc506b21b52e6bc5d352f04c60bf30d' + // console.log('addressBech32', addressBech32) // console.log('bech32', addressBech32) const cip30 = cip30ExtensionMaker(mocks.wallet) const result = await cip30.signData(rootKey, addressBech32, message) - // expect(result).toEqual({key, signature}) - const pub = await csl..fromHex( - '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c', - ) - - pub. - - const address = await pub.toBech32() - expect( - verifySignature( - '84584da30127045820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d15977466761646472657373581d603469016f543d8510a7e01fa92533c22b83913fb4501e806d964ef8bca166686173686564f44877686174657665725840bd4d761706730739c168f06450de0d3636cbb6367bb9bae1525616b312db9764736c6b6fb79c130e0288fb460b98dedf86cba5914e193e34f9b38f4f48080108', - 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', - 'whatever', - address, - ), - ).toBe(true) + console.log('result', result) + expect(result.key).toHaveLength(84) + expect(verifySignature(result.signature, result.key, message)).toEqual(true) }) // it('should support signData 2', async () => { diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index d89e2fa372..7f8def5b1f 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -1,5 +1,5 @@ import * as CSL from '@emurgo/cross-csl-core' -import {WasmModuleProxy} from '@emurgo/cross-csl-core' +import {PrivateKey, WasmModuleProxy} from '@emurgo/cross-csl-core' import {RemoteUnspentOutput, signRawTransaction, UtxoAsset} from '@emurgo/yoroi-lib' import {normalizeToAddress} from '@emurgo/yoroi-lib/dist/internals/utils/addresses' import {parseTokenList} from '@emurgo/yoroi-lib/dist/internals/utils/assets' @@ -18,7 +18,9 @@ import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' import {wrappedCsl} from '../wrappedCsl' -import {signBip32} from './helpers' +import {init} from '@emurgo/cross-msl-nodejs' + +const MSL = init('msl') export const cip30ExtensionMaker = (wallet: YoroiWallet) => { return new CIP30Extension(wallet) @@ -131,18 +133,30 @@ class CIP30Extension { async signData(rootKey: string, address: string, payload: string): Promise<{signature: string; key: string}> { const {csl, release} = getCSL() try { + const payloadInBytes = Buffer.from(payload, 'utf-8') + const normalisedAddress = await normalizeToAddress(csl, address) const bech32Address = await normalisedAddress?.toBech32(undefined) if (!bech32Address) throw new Error('Invalid address') + const path = [harden(1852), harden(1815), harden(0), 0, 0] - console.log('path', path) const signingKey = await createRawTxSigningKey(rootKey, path) - const payloadInBytes = Uint8Array.from(Buffer.from(payload, 'utf-8')) - const signingKeyBytes = await signingKey.asBytes() - const signature = signBip32(payloadInBytes, signingKeyBytes) - const key = await (await signingKey.toPublic())?.toHex() - if (!key) throw new Error('Invalid key') - return {signature: Buffer.from(signature).toString('hex'), key} + const coseSign1 = await cip8Sign(Buffer.from(address, 'hex'), signingKey, payloadInBytes) + const key = await MSL.COSEKey.new(await MSL.Label.fromKeyType(MSL.KeyType.OKP)) + await key.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) + await key.setHeader( + await MSL.Label.newInt(await MSL.Int.newNegative(await MSL.BigNum.fromStr('1'))), + await MSL.CBORValue.newInt(await MSL.Int.newI32(6)), + ) + await key.setHeader( + await MSL.Label.newInt(await MSL.Int.newNegative(await MSL.BigNum.fromStr('2'))), + await MSL.CBORValue.newBytes(await (await signingKey.toPublic()).asBytes()), + ) + + return { + signature: Buffer.from(await coseSign1.toBytes()).toString('hex'), + key: Buffer.from(await key.toBytes()).toString('hex'), + } } finally { release() } @@ -370,3 +384,16 @@ const getAmountsFromValue = async (csl: WasmModuleProxy, value: string, primaryT } return amounts } + +export const cip8Sign = async (address: Buffer, signKey: PrivateKey, payload: Buffer) => { + const protectedHeader = await MSL.HeaderMap.new() + await protectedHeader.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) + await protectedHeader.setHeader(await MSL.Label.newText('address'), await MSL.CBORValue.newBytes(address)) + const protectedSerialized = await MSL.ProtectedHeaderMap.new(protectedHeader) + const unprotected = await MSL.HeaderMap.new() + const headers = await MSL.Headers.new(protectedSerialized, unprotected) + const builder = await MSL.COSESign1Builder.new(headers, payload, false) + const toSign = await (await builder.makeDataToSign()).toBytes() + const signedSigStruct = await (await signKey.sign(toSign)).toBytes() + return builder.build(signedSigStruct) +} diff --git a/yarn.lock b/yarn.lock index eb72c03bba..fed18cc462 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2065,6 +2065,11 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@emurgo/cardano-message-signing-nodejs@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emurgo/cardano-message-signing-nodejs/-/cardano-message-signing-nodejs-1.0.1.tgz#b2fa1f7541055a6c4b8e805492b1a9362bea5835" + integrity sha512-PoKh1tQnJX18f8iEr8Jk1KXxKCn9eqaSslMI1pyOJvYRJhQVDLCh0+9YReufjp0oFJIY1ShcrR+4/WnECVZUKQ== + "@emurgo/cardano-serialization-lib-nodejs@12.0.0-alpha.26": version "12.0.0-alpha.26" resolved "https://registry.yarnpkg.com/@emurgo/cardano-serialization-lib-nodejs/-/cardano-serialization-lib-nodejs-12.0.0-alpha.26.tgz#4e5fea7ba6d72888e21c5a9bea6bcff367834a4b" @@ -2122,6 +2127,36 @@ "@emurgo/cardano-serialization-lib-nodejs" "12.0.0-alpha.26" "@emurgo/cross-csl-core" "4.4.0" +"@emurgo/cross-msl-core@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emurgo/cross-msl-core/-/cross-msl-core-1.0.0.tgz#f66ec9491362e9d60c7c6142875af849ca788c98" + integrity sha512-X98tmVLYSpcLggky3R7iuvb9no/LdoPCR8YXH/CjVj4U5YoR9/6Xf2PQOxSQCBCeExHZ7fDo+gefwoSX6yRjow== + dependencies: + "@cardano-foundation/ledgerjs-hw-app-cardano" "^5.0.0" + "@types/mocha" "^9.1.1" + axios "^0.24.0" + bech32 "^2.0.0" + bignumber.js "^9.0.1" + blake2b "^2.1.4" + hash-wasm "^4.9.0" + mocha "^10.0.0" + +"@emurgo/cross-msl-mobile@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emurgo/cross-msl-mobile/-/cross-msl-mobile-1.0.0.tgz#677434190af90ed43fac46dd6c4c331ec0a0bcce" + integrity sha512-pHMc6P0TjskUAmeI52BId+w253M0EceolnN2m8xdFdqMw4FmrrdpLbfP4uqACHWiM3Vy419SzSczv1r/BHqCNw== + dependencies: + "@emurgo/cross-msl-core" "1.0.0" + "@emurgo/msl-mobile-bridge" "1.0.1" + +"@emurgo/cross-msl-nodejs@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emurgo/cross-msl-nodejs/-/cross-msl-nodejs-1.0.0.tgz#3079042d10c9b4d723fe7e77fc9c85559e8c3ee5" + integrity sha512-M2qxS8fo6SSddUXSjnjDNQY1Of/Ro+3a2HUZhTcvN/RRa3JLKU36i3YUqSpMhTxHN0GwCM6QCE7LddpZthpJeA== + dependencies: + "@emurgo/cardano-message-signing-nodejs" "1.0.1" + "@emurgo/cross-msl-core" "1.0.0" + "@emurgo/csl-mobile-bridge@6.0.0-alpha.7": version "6.0.0-alpha.7" resolved "https://registry.yarnpkg.com/@emurgo/csl-mobile-bridge/-/csl-mobile-bridge-6.0.0-alpha.7.tgz#63349d0f2e70d568ce628849c8d8b085892531aa" @@ -2136,6 +2171,13 @@ dependencies: base-64 "0.1.0" +"@emurgo/msl-mobile-bridge@1.0.1", "@emurgo/msl-mobile-bridge@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@emurgo/msl-mobile-bridge/-/msl-mobile-bridge-1.0.1.tgz#4a912e182118dc4462e90cbfda5ebedf6048b4e6" + integrity sha512-ed0KobdbEmNParq33pTkYOMWrF8kMP6R3HdIPDy/YycwW9nvvWlWhlpUR4wKDjM3qQzhE/rN6gb/dG8rwWa4IQ== + dependencies: + base-64 "0.1.0" + "@emurgo/react-native-blockies-svg@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@emurgo/react-native-blockies-svg/-/react-native-blockies-svg-0.0.2.tgz#afe2ce2776b0c6430ce3bc9a94ceb4f9fcb302f9" From 7ce5e5734a3427db66449c5ca466a8a9af2e51db Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 3 Jun 2024 18:37:46 +0100 Subject: [PATCH 05/13] WIP --- apps/wallet-mobile/jestSetup.ts | 4 +++- .../src/yoroi-wallets/cardano/cip30/cip30.test.ts | 6 +++--- apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/wallet-mobile/jestSetup.ts b/apps/wallet-mobile/jestSetup.ts index fc6ef21b1d..2b8ed0ccc9 100644 --- a/apps/wallet-mobile/jestSetup.ts +++ b/apps/wallet-mobile/jestSetup.ts @@ -16,6 +16,9 @@ jest.mock('react-native-ble-plx', () => ({})) jest.mock('@react-native-async-storage/async-storage', () => require('@react-native-async-storage/async-storage/jest/async-storage-mock'), ) + +jest.mock('@emurgo/cross-msl-mobile', () => require('@emurgo/cross-msl-nodejs')) + jest.mock('react-native-keychain', () => ({ resetGenericPassword: jest.fn(), })) @@ -57,4 +60,3 @@ jest.mock('react-native-localize', () => ({ usesAutoDateAndTime: () => true, usesAutoTimeZone: () => true, })) - diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index ae94879708..b1dc001f6b 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -1,9 +1,9 @@ +import verifySignature from '@cardano-foundation/cardano-verify-datasignature' + import {mocks} from '../../mocks' import {getMasterKeyFromMnemonic} from '../byron/util' import {YoroiWallet} from '../types' import {cip30ExtensionMaker} from './cip30' -import {wrappedCsl} from '../wrappedCsl' -import verifySignature from '@cardano-foundation/cardano-verify-datasignature' describe('cip30ExtensionMaker', () => { it('should support submitTx', async () => { @@ -85,7 +85,7 @@ describe('cip30ExtensionMaker', () => { it('should support signData', async () => { const rootKey = await getMasterKeyFromMnemonic(mnemonic) - const {csl} = wrappedCsl() + // const {csl} = wrappedCsl() const message = 'whatever' const addressBech32 = 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 7f8def5b1f..e85216a37e 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -1,5 +1,6 @@ import * as CSL from '@emurgo/cross-csl-core' import {PrivateKey, WasmModuleProxy} from '@emurgo/cross-csl-core' +import {init} from '@emurgo/cross-msl-mobile' import {RemoteUnspentOutput, signRawTransaction, UtxoAsset} from '@emurgo/yoroi-lib' import {normalizeToAddress} from '@emurgo/yoroi-lib/dist/internals/utils/addresses' import {parseTokenList} from '@emurgo/yoroi-lib/dist/internals/utils/assets' @@ -18,7 +19,6 @@ import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' import {wrappedCsl} from '../wrappedCsl' -import {init} from '@emurgo/cross-msl-nodejs' const MSL = init('msl') From b16f4c43af43712f1f1f1ecea42e65f239810c68 Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 3 Jun 2024 18:45:14 +0100 Subject: [PATCH 06/13] Remove unused libs --- apps/wallet-mobile/package.json | 2 -- yarn.lock | 12 ------------ 2 files changed, 14 deletions(-) diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 5167c38457..8292e33bab 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -111,8 +111,6 @@ "@formatjs/intl-relativetimeformat": "^11.2.1", "@gorhom/bottom-sheet": "^4", "@ledgerhq/react-native-hw-transport-ble": "6.27.3", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", "@react-native-async-storage/async-storage": "^1.19.3", "@react-native-community/clipboard": "^1.5.1", "@react-native-community/datetimepicker": "^7.1.0", diff --git a/yarn.lock b/yarn.lock index fed18cc462..304d214b61 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3715,18 +3715,6 @@ resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz#ea6d23ade78a325f7a52750aab1526b02b628c29" integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== -"@noble/curves@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/hashes@1.4.0", "@noble/hashes@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - "@noble/hashes@^1.2.0", "@noble/hashes@^1.3.2": version "1.3.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.2.tgz#6f26dbc8fbc7205873ce3cee2f690eba0d421b39" From 80ed94821ee2b6b8988d3a9a92c48b3151d28073 Mon Sep 17 00:00:00 2001 From: Michal Date: Mon, 3 Jun 2024 18:58:14 +0100 Subject: [PATCH 07/13] Remove unused file --- .../yoroi-wallets/cardano/cip30/helpers.ts | 95 ------------------- 1 file changed, 95 deletions(-) delete mode 100644 apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts deleted file mode 100644 index 2a2409eb9d..0000000000 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/helpers.ts +++ /dev/null @@ -1,95 +0,0 @@ -import {ed25519} from '@noble/curves/ed25519' -import {sha512} from '@noble/hashes/sha512' -import assert from 'assert' - -type Bytes = Uint8Array - -export function addMul8(a: Bytes, b: Bytes): Bytes { - assert(a.length === 32 && b.length === 32) - return add256(a, _bytes(BigInt.asUintN(227, _scalar(b) << 3n))) -} - -export function add256(a: Bytes, b: Bytes): Bytes { - assert(a.length === 32 && b.length === 32) - const t = new Uint8Array(32) - let c = 0 - for (let i = 0; i < 32; i++) { - const x = a[i] + b[i] + c - t[i] = x - c = x >>> 8 - } - return t -} - -export function baseMultiply(x: Bytes): Bytes { - assert(x.length === 32 || x.length === 64) - return ed25519.ExtendedPoint.BASE.multiply(_scalar(x) % ed25519.CURVE.n).toRawBytes() -} - -export function pointAdd(a: Bytes, b: Bytes): Bytes { - const m = baseMultiply(addMul8(new Uint8Array(32), b)) - const p = ed25519.ExtendedPoint.fromAffine(_decodePoint(a)) - const q = ed25519.ExtendedPoint.fromAffine(_decodePoint(m)) - return _encodePoint(p.add(q)) -} - -export function signBip32(message: Bytes, secretKey: Bytes) { - const h = sha512(message) - const p = baseMultiply(h) - const s = _scalar(sha512(new Uint8Array([...p, ...baseMultiply(secretKey), ...message]))) - return new Uint8Array([...p, ..._bytes((_scalar(h) + s * _scalar(secretKey)) % ed25519.CURVE.n)]) -} - -interface Point { - readonly x: bigint - readonly y: bigint -} - -function _encodePoint(point: Point): Bytes { - const t = new Uint8Array(32) - t.set(_bytes(point.y)) - if (point.x & 1n) t[31] |= 128 - return t -} - -function _decodePoint(point: Bytes): Point { - const p = new Uint8Array(point) - p[31] &= 127 - const y = _scalar(p) - return _pointFromY(y, point[31] >= 128) -} - -function _pointFromY(y: bigint, odd: boolean): Point { - const c = ed25519.CURVE - const f = c.Fp - const s = f.sqr(y) - const a = f.sub(s, 1n) - const b = f.sub(f.mul(s, BigInt(c.d)), BigInt(c.a)) - const m = f.mul(a, f.inv(b)) - if (!m) { - assert(!odd) - return {x: 0n, y} - } - const x = f.sqrt(m) - assert(!f.sub(f.sqr(x), m)) - if (!!(x & 1n) !== odd) return {x: f.neg(x), y} - return {x, y} -} - -function _scalar(x: Bytes): bigint { - assert(x.length === 32 || x.length === 64) - let t = 0n - for (let i = x.length - 1; i >= 0; i--) t = (t << 8n) + BigInt(x[i]) - return t -} - -function _bytes(x: bigint): Bytes { - assert(x === BigInt.asUintN(256, x)) - const t = new Uint8Array(32) - let v = x - for (let i = 0; i < 32; i++) { - t[i] = Number(v & 255n) - v >>= 8n - } - return t -} From 8622e86a653e3889c781252bd94ce3b84a8d2d0f Mon Sep 17 00:00:00 2001 From: Michal Date: Tue, 4 Jun 2024 21:14:42 +0100 Subject: [PATCH 08/13] Refactor --- apps/wallet-mobile/package.json | 1 - .../yoroi-wallets/cardano/cip30/cip30.test.ts | 46 +------ .../src/yoroi-wallets/cardano/cip30/cip30.ts | 16 +-- .../src/yoroi-wallets/cardano/cip8/cip8.ts | 18 +++ yarn.lock | 127 +----------------- 5 files changed, 31 insertions(+), 177 deletions(-) create mode 100644 apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index 8292e33bab..e674b9be16 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -91,7 +91,6 @@ }, "dependencies": { "@amplitude/analytics-react-native": "1.3.1", - "@cardano-foundation/cardano-verify-datasignature": "^1.0.11", "@cardano-foundation/ledgerjs-hw-app-cardano": "^6.0.0", "@emurgo/cip14-js": "^3.0.1", "@emurgo/cip4-js": "1.0.7", diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index b1dc001f6b..5cbb7ffcf3 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -1,5 +1,3 @@ -import verifySignature from '@cardano-foundation/cardano-verify-datasignature' - import {mocks} from '../../mocks' import {getMasterKeyFromMnemonic} from '../byron/util' import {YoroiWallet} from '../types' @@ -85,51 +83,19 @@ describe('cip30ExtensionMaker', () => { it('should support signData', async () => { const rootKey = await getMasterKeyFromMnemonic(mnemonic) - // const {csl} = wrappedCsl() const message = 'whatever' const addressBech32 = 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' - // console.log('addressBech32', addressBech32) - - // console.log('bech32', addressBech32) const cip30 = cip30ExtensionMaker(mocks.wallet) - const result = await cip30.signData(rootKey, addressBech32, message) - console.log('result', result) - expect(result.key).toHaveLength(84) - expect(verifySignature(result.signature, result.key, message)).toEqual(true) - }) - // it('should support signData 2', async () => { - // const csl = wrappedCsl().csl - // const privateKeyCBOR = - // 'c831be0c2d612bd23c9c6b5313c169fbbf2973cc8227a6377101f76fffb1985d72ed1e556348bf7383435ebf14e8d0570ef03e1c584e21be81476806a12a05b5d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' - // const pub = - // '3e08cf0e6eac6cf54f26ecf07de4e615dc970ca7ec551b0d39d21d9ce1b34c15d8b562dd58d6b89756299854f5545ac5d3a6592f1b5b1ebb4993d0c3d35f7c3c' - // - // const expected = { - // signature: - // '84584da30127045820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d15977466761646472657373581d603469016f543d8510a7e01fa92533c22b83913fb4501e806d964ef8bca166686173686564f44877686174657665725840bd4d761706730739c168f06450de0d3636cbb6367bb9bae1525616b312db9764736c6b6fb79c130e0288fb460b98dedf86cba5914e193e34f9b38f4f48080108', - // key: 'a4010103272006215820294f305e91ab3988fc22110083fdd29d59911250f232343c3da8d263d1597746', - // } - // - // console.log('privateKeyCBOR', privateKeyCBOR) - // const privateKey = await csl.Bip32PrivateKey.fromBytes(Buffer.from(privateKeyCBOR, 'hex')) - // console.log('privateKey', privateKey) - // const rootKey = Buffer.from(await privateKey.asBytes()).toString('hex') - // console.log('rootKey', rootKey) - // - // const addressBech32 = await csl.PublicKey.fromHex(pub).then((address) => address.toBech32()) - // - // console.log('addressBech32', addressBech32) - // const message = 'whatever' - // - // const cip30 = cip30ExtensionMaker(mocks.wallet) - // - // const result = await cip30.signData(rootKey, addressBech32, message) - // expect(result).toEqual(expected) - // }) + expect(result).toEqual({ + signature: + '844da20127676164647265737341ada166686173686564f448776861746576657258403b3d212ee8cfafaa52def7352aca719d4c0ef14adcd220019f5d9ff6d7b44d0095831cb412ecfd2ecb71036e2311b6177645e0fd8a4fb282c76814a6e20cb80d', + key: 'a4010103272006215820be6a4d7e9789dd7458049c971ad783107e7f041c6f1f542b4530d63d5fe5afb1', + }) + }) }) const mnemonic = [ diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index e85216a37e..3983f11698 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -19,6 +19,7 @@ import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' import {wrappedCsl} from '../wrappedCsl' +import * as cip8 from '../cip8/cip8' const MSL = init('msl') @@ -141,7 +142,7 @@ class CIP30Extension { const path = [harden(1852), harden(1815), harden(0), 0, 0] const signingKey = await createRawTxSigningKey(rootKey, path) - const coseSign1 = await cip8Sign(Buffer.from(address, 'hex'), signingKey, payloadInBytes) + const coseSign1 = await cip8.sign(Buffer.from(address, 'hex'), signingKey, payloadInBytes) const key = await MSL.COSEKey.new(await MSL.Label.fromKeyType(MSL.KeyType.OKP)) await key.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) await key.setHeader( @@ -384,16 +385,3 @@ const getAmountsFromValue = async (csl: WasmModuleProxy, value: string, primaryT } return amounts } - -export const cip8Sign = async (address: Buffer, signKey: PrivateKey, payload: Buffer) => { - const protectedHeader = await MSL.HeaderMap.new() - await protectedHeader.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) - await protectedHeader.setHeader(await MSL.Label.newText('address'), await MSL.CBORValue.newBytes(address)) - const protectedSerialized = await MSL.ProtectedHeaderMap.new(protectedHeader) - const unprotected = await MSL.HeaderMap.new() - const headers = await MSL.Headers.new(protectedSerialized, unprotected) - const builder = await MSL.COSESign1Builder.new(headers, payload, false) - const toSign = await (await builder.makeDataToSign()).toBytes() - const signedSigStruct = await (await signKey.sign(toSign)).toBytes() - return builder.build(signedSigStruct) -} diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts new file mode 100644 index 0000000000..4c214197b2 --- /dev/null +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts @@ -0,0 +1,18 @@ +import {Buffer} from 'buffer' +import {PrivateKey} from '@emurgo/cross-csl-core' +import {init} from '@emurgo/cross-msl-mobile' + +const MSL = init('cip8') + +export const sign = async (address: Buffer, signKey: PrivateKey, payload: Buffer) => { + const protectedHeader = await MSL.HeaderMap.new() + await protectedHeader.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) + await protectedHeader.setHeader(await MSL.Label.newText('address'), await MSL.CBORValue.newBytes(address)) + const protectedSerialized = await MSL.ProtectedHeaderMap.new(protectedHeader) + const unprotected = await MSL.HeaderMap.new() + const headers = await MSL.Headers.new(protectedSerialized, unprotected) + const builder = await MSL.COSESign1Builder.new(headers, payload, false) + const toSign = await (await builder.makeDataToSign()).toBytes() + const signedSigStruct = await (await signKey.sign(toSign)).toBytes() + return builder.build(signedSigStruct) +} diff --git a/yarn.lock b/yarn.lock index 304d214b61..eeae30f472 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1761,17 +1761,6 @@ deepmerge "^3.2.0" hoist-non-react-statics "^3.3.0" -"@cardano-foundation/cardano-verify-datasignature@^1.0.11": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@cardano-foundation/cardano-verify-datasignature/-/cardano-verify-datasignature-1.0.11.tgz#2565d1e3152d4a22956f12a7f3829684707374ad" - integrity sha512-e1hCWmVxtVJVPeXYB7RLaQXm4VRV5okv2aww0+690oFbKLVvqtpFI61CtYomwC+lrYAl2DBSG3xuCvQiv7hxqQ== - dependencies: - "@stricahq/bip32ed25519" "^1.0.4" - "@stricahq/cbors" "^1.0.2" - "@stricahq/cip08" "^1.0.4" - "@stricahq/typhonjs" "^1.2.8" - blakejs "^1.2.1" - "@cardano-foundation/ledgerjs-hw-app-cardano@^5.0.0": version "5.1.0" resolved "https://registry.yarnpkg.com/@cardano-foundation/ledgerjs-hw-app-cardano/-/ledgerjs-hw-app-cardano-5.1.0.tgz#69b94f7c5055bdb19aa719ff277fa5f683d11067" @@ -5559,58 +5548,6 @@ regenerator-runtime "^0.13.7" resolve-from "^5.0.0" -"@stricahq/bip32ed25519@^1.0.3", "@stricahq/bip32ed25519@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@stricahq/bip32ed25519/-/bip32ed25519-1.0.4.tgz#e4e9356073e35b6c2d12e4fabcefef4d50487065" - integrity sha512-b+4+aTRF9QY19auN4oBmZxv/7lJIBPBfAIU9wOTzc9Wxb0ifWpVcM4qt+qZuRNlMQofSlSa6lUet6CwaNyDEuA== - dependencies: - blakejs "^1.1.1" - bn.js "^5.2.0" - buffer "^6.0.3" - chai "^4.3.4" - elliptic "6.5.4" - hash.js "^1.1.7" - pbkdf2 "^3.1.2" - -"@stricahq/cbors@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@stricahq/cbors/-/cbors-1.0.2.tgz#e9085601b29bc04741e4e66c3f0fd207117e9f95" - integrity sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww== - dependencies: - bignumber.js "^9.0.2" - buffer "^6.0.3" - -"@stricahq/cbors@^1.0.0", "@stricahq/cbors@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@stricahq/cbors/-/cbors-1.0.3.tgz#ece966fef370919d5bf69a0ecabb4df23676ae34" - integrity sha512-FlV5DaQtTeSSgkC9S4CiO167+x1t6uSNixQ32QMWIMG7+/LhOtzv4GPf4qJR6z7C31mzx+mRlf86dJt9lfBeVw== - dependencies: - bignumber.js "^9.0.2" - buffer "^6.0.3" - -"@stricahq/cip08@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@stricahq/cip08/-/cip08-1.0.4.tgz#55ed7eb3fef86d36b2717a65ced4ece3b328aa22" - integrity sha512-kRlZYVXUx4JrjTSVk/IslhRDCsKmwzg4PPo0MJpvthTM6laqFNvQBVRpYus/lqWTnekdRHjlB/xDvvOVjQTm1w== - dependencies: - "@stricahq/bip32ed25519" "^1.0.3" - "@stricahq/cbors" "^1.0.0" - blakejs "^1.1.1" - buffer "^6.0.3" - -"@stricahq/typhonjs@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@stricahq/typhonjs/-/typhonjs-1.2.8.tgz#71a616b75e2a632d8766916b41ca34d6f9125102" - integrity sha512-JPr5N8KZ/ipTPemhqieFgmibnnXT/E+EtrROCJ78IvBwZx1FpAxpLRMA7vf142IfXz9ZYREc1l9KQzKq2xaAbw== - dependencies: - "@stricahq/cbors" "1.0.2" - bech32 "^2.0.0" - bignumber.js "^9.0.1" - blakejs "^1.2.1" - bs58 "^5.0.0" - buffer "^6.0.3" - lodash "^4.17.21" - "@szmarczak/http-timer@^5.0.1": version "5.0.1" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" @@ -7641,11 +7578,6 @@ base-x@^3.0.2, base-x@^3.0.5, base-x@^3.0.6: dependencies: safe-buffer "^5.0.1" -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - base64-arraybuffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" @@ -7711,11 +7643,6 @@ bignumber.js@^9.0.1: resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.1.tgz#c4df7dc496bd849d4c9464344c1aa74228b4dac6" integrity sha512-pHm4LsMJ6lzgNGVfZHjMoO8sdoRhOzOH4MLmY65Jg70bpxCKu5iOHNJyfF6OyvYw7t8Fpf35RuzUyqnQsj8Vig== -bignumber.js@^9.0.2: - version "9.1.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" - integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== - binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -7807,11 +7734,6 @@ blake2b@^2.1.4: blake2b-wasm "^2.4.0" nanoassert "^2.0.0" -blakejs@^1.1.1, blakejs@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - bluebird@^3.5.4, bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" @@ -7827,7 +7749,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.2.0: +bn.js@^5.0.0, bn.js@^5.1.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== @@ -8067,13 +7989,6 @@ bs58@^4.0.1: dependencies: base-x "^3.0.2" -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -8436,19 +8351,6 @@ chacha@2.1.0: optionalDependencies: chacha-native "^2.0.0" -chai@^4.3.4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.3" - deep-eql "^4.1.3" - get-func-name "^2.0.2" - loupe "^2.3.6" - pathval "^1.1.1" - type-detect "^4.0.8" - chai@^4.3.7: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" @@ -8536,13 +8438,6 @@ check-error@^1.0.2: resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -check-error@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" - integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== - dependencies: - get-func-name "^2.0.2" - child-process-promise@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/child-process-promise/-/child-process-promise-2.2.1.tgz#4730a11ef610fad450b8f223c79d31d7bdad8074" @@ -9861,7 +9756,7 @@ dedent@^1.0.0: resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.1.tgz#4f3fc94c8b711e9bb2800d185cd6ad20f2a90aff" integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== -deep-eql@^4.1.2, deep-eql@^4.1.3: +deep-eql@^4.1.2: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -10416,7 +10311,7 @@ electron-to-chromium@^1.4.431: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz#3fdc7b4f97d628ac6b51e8b4b385befb362fe343" integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== -elliptic@6.5.4, elliptic@^6.5.3: +elliptic@^6.5.3: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -12212,11 +12107,6 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-func-name@^2.0.1, get-func-name@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" - integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" @@ -12803,7 +12693,7 @@ hash-wasm@^4.9.0: resolved "https://registry.yarnpkg.com/hash-wasm/-/hash-wasm-4.9.0.tgz#7e9dcc9f7d6bd0cc802f2a58f24edce999744206" integrity sha512-7SW7ejyfnRxuOc7ptQHSf4LDoZaWOivfzqw+5rpcQku0nHfmicPKE51ra9BiRLAmT8+gGLestr1XroUkqdjL6w== -hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: +hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -15980,13 +15870,6 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" -loupe@^2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" - integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== - dependencies: - get-func-name "^2.0.1" - lowercase-keys@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" @@ -18340,7 +18223,7 @@ pbkdf2@3.0.8: dependencies: create-hmac "^1.1.2" -pbkdf2@^3.0.3, pbkdf2@^3.0.9, pbkdf2@^3.1.2: +pbkdf2@^3.0.3, pbkdf2@^3.0.9: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== From 0d699845b5a94dd1909af2cef5d89cc533eb17e3 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 5 Jun 2024 11:01:37 +0100 Subject: [PATCH 09/13] Fix imports --- .../src/yoroi-wallets/cardano/cip30/cip30.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 2dd7881d6b..5bc1b27592 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -10,22 +10,20 @@ import {BigNumber} from 'bignumber.js' import {Buffer} from 'buffer' import _ from 'lodash' -import {RawUtxo, YoroiSignedTx, YoroiUnsignedTx} from '../types' -import {asQuantity, Utxos} from '../utils' -import {Cardano, CardanoMobile} from '../wallets' -import {toAssetNameHex, toPolicyId} from './api' -import {getTransactionSigners, harden} from './common/signatureUtils' -import {Pagination, YoroiWallet} from './types' -import {createRawTxSigningKey, identifierToCardanoAsset} from './utils' -import {collateralConfig, findCollateralCandidates, utxosMaker} from './utxoManager/utxos' +import {RawUtxo, YoroiSignedTx, YoroiUnsignedTx} from '../../types' +import {asQuantity, Utxos} from '../../utils' +import {Cardano, CardanoMobile} from '../../wallets' +import {toAssetNameHex, toPolicyId} from '../api' +import {getTransactionSigners, harden} from '../common/signatureUtils' +import {Pagination, YoroiWallet} from '../types' +import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' +import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' import {wrappedCsl} from '../wrappedCsl' - import * as cip8 from '../cip8/cip8' const MSL = init('msl') - export const cip30ExtensionMaker = (wallet: YoroiWallet) => { return new CIP30Extension(wallet) } From 6f5c16d16ca6224e9353c661b493c5ab74eb27b3 Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 5 Jun 2024 11:27:56 +0100 Subject: [PATCH 10/13] Fix lint --- apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts | 5 ++--- apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 5bc1b27592..37faded0c9 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -1,5 +1,5 @@ import * as CSL from '@emurgo/cross-csl-core' -import {PrivateKey, WasmModuleProxy} from '@emurgo/cross-csl-core' +import {WasmModuleProxy} from '@emurgo/cross-csl-core' import {init} from '@emurgo/cross-msl-mobile' import {RemoteUnspentOutput, signRawTransaction, UtxoAsset} from '@emurgo/yoroi-lib' import {normalizeToAddress} from '@emurgo/yoroi-lib/dist/internals/utils/addresses' @@ -14,14 +14,13 @@ import {RawUtxo, YoroiSignedTx, YoroiUnsignedTx} from '../../types' import {asQuantity, Utxos} from '../../utils' import {Cardano, CardanoMobile} from '../../wallets' import {toAssetNameHex, toPolicyId} from '../api' +import * as cip8 from '../cip8/cip8' import {getTransactionSigners, harden} from '../common/signatureUtils' import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' import {wrappedCsl} from '../wrappedCsl' -import * as cip8 from '../cip8/cip8' - const MSL = init('msl') export const cip30ExtensionMaker = (wallet: YoroiWallet) => { diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts index 4c214197b2..8f9f56885f 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.ts @@ -1,6 +1,6 @@ -import {Buffer} from 'buffer' import {PrivateKey} from '@emurgo/cross-csl-core' import {init} from '@emurgo/cross-msl-mobile' +import {Buffer} from 'buffer' const MSL = init('cip8') From 8a7f5aff8e649893070fbb6e683d0c24d8ecd43c Mon Sep 17 00:00:00 2001 From: Michal Date: Wed, 5 Jun 2024 11:47:15 +0100 Subject: [PATCH 11/13] Add tests --- .../yoroi-wallets/cardano/cip30/cip30.test.ts | 2 +- .../src/yoroi-wallets/cardano/cip30/cip30.ts | 12 +++---- .../yoroi-wallets/cardano/cip8/cip8.test.ts | 35 +++++++++++++++++++ 3 files changed, 41 insertions(+), 8 deletions(-) create mode 100644 apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts index 5cbb7ffcf3..ac06e57f80 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.test.ts @@ -92,7 +92,7 @@ describe('cip30ExtensionMaker', () => { expect(result).toEqual({ signature: - '844da20127676164647265737341ada166686173686564f448776861746576657258403b3d212ee8cfafaa52def7352aca719d4c0ef14adcd220019f5d9ff6d7b44d0095831cb412ecfd2ecb71036e2311b6177645e0fd8a4fb282c76814a6e20cb80d', + '845846a201276761646472657373583901260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40a166686173686564f448776861746576657258406a16fcb9cc6c3f7d83fdd623e8896d4b81c0ef6a9fb68d916794e2e4c3c0766666b485f71c6f1f56241cb30905cc18618c7e95721dba3e91bcd9918f51e8b90a', key: 'a4010103272006215820be6a4d7e9789dd7458049c971ad783107e7f041c6f1f542b4530d63d5fe5afb1', }) }) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts index 37faded0c9..d41cbf06ee 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip30/cip30.ts @@ -15,11 +15,11 @@ import {asQuantity, Utxos} from '../../utils' import {Cardano, CardanoMobile} from '../../wallets' import {toAssetNameHex, toPolicyId} from '../api' import * as cip8 from '../cip8/cip8' -import {getTransactionSigners, harden} from '../common/signatureUtils' +import {getDerivationPathForAddress, getTransactionSigners} from '../common/signatureUtils' import {Pagination, YoroiWallet} from '../types' import {createRawTxSigningKey, identifierToCardanoAsset} from '../utils' import {collateralConfig, findCollateralCandidates, utxosMaker} from '../utxoManager/utxos' -import {wrappedCsl} from '../wrappedCsl' +import {wrappedCsl as getCSL} from '../wrappedCsl' const MSL = init('msl') @@ -27,8 +27,6 @@ export const cip30ExtensionMaker = (wallet: YoroiWallet) => { return new CIP30Extension(wallet) } -const getCSL = () => wrappedCsl() - const copy = async Promise}>( creator: {fromHex: (hex: string) => Promise}, value: T, @@ -140,11 +138,11 @@ class CIP30Extension { const normalisedAddress = await normalizeToAddress(csl, address) const bech32Address = await normalisedAddress?.toBech32(undefined) - if (!bech32Address) throw new Error('Invalid address') + if (!bech32Address || !normalisedAddress) throw new Error('Invalid address') - const path = [harden(1852), harden(1815), harden(0), 0, 0] + const path = getDerivationPathForAddress(bech32Address, this.wallet, true) const signingKey = await createRawTxSigningKey(rootKey, path) - const coseSign1 = await cip8.sign(Buffer.from(address, 'hex'), signingKey, payloadInBytes) + const coseSign1 = await cip8.sign(Buffer.from(await normalisedAddress.toHex(), 'hex'), signingKey, payloadInBytes) const key = await MSL.COSEKey.new(await MSL.Label.fromKeyType(MSL.KeyType.OKP)) await key.setAlgorithmId(await MSL.Label.fromAlgorithmId(MSL.AlgorithmId.EdDSA)) await key.setHeader( diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts new file mode 100644 index 0000000000..89a2d49385 --- /dev/null +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts @@ -0,0 +1,35 @@ +import * as cip8 from './cip8' +import {Buffer} from 'buffer' +import {wrappedCsl} from '../wrappedCsl' +import {normalizeToAddress} from '@emurgo/yoroi-lib/dist/internals/utils/addresses' +import assert from 'assert' +import {getMasterKeyFromMnemonic} from '../byron/util' +import {harden} from '../common/signatureUtils' +import {createRawTxSigningKey} from '../utils' + +describe('CIP8', () => { + it('should support signing', async () => { + const {csl} = wrappedCsl() + const bech32 = + 'addr1qynqc23tpx4dqps6xgqy9s2l3xz5fxu734wwmzj9uddn0h2z6epfcukqmswgwwfruxh7gaddv9x0d5awccwahnhwleqqc4zkh4' + const payload = 'whatever' + const rootKey = await getMasterKeyFromMnemonic(mnemonic) + const path = [harden(1852), harden(1815), harden(0), 0, 0] + const signingKey = await createRawTxSigningKey(rootKey, path) + + const payloadInBytes = Buffer.from(payload, 'utf-8') + const normalisedAddress = await normalizeToAddress(csl, bech32) + assert(normalisedAddress != null) + const coseSign1 = await cip8.sign(Buffer.from(await normalisedAddress.toHex(), 'hex'), signingKey, payloadInBytes) + const signature = Buffer.from(await coseSign1.toBytes()).toString('hex') + expect(signature).toEqual( + '845846a201276761646472657373583901260c2a2b09aad0061a320042c15f8985449b9e8d5ced8a45e35b37dd42d6429c72c0dc1c873923e1afe475ad614cf6d3aec61ddbceeefe40a166686173686564f448776861746576657258406a16fcb9cc6c3f7d83fdd623e8896d4b81c0ef6a9fb68d916794e2e4c3c0766666b485f71c6f1f56241cb30905cc18618c7e95721dba3e91bcd9918f51e8b90a', + ) + }) +}) + +const mnemonic = [ + 'dry balcony arctic what garbage sort', + 'cart shine egg lamp manual bottom', + 'slide assault bus', +].join(' ') From 9988464f65e4c0a52e8b785cfd41161d31ec2ef5 Mon Sep 17 00:00:00 2001 From: Michal Date: Thu, 6 Jun 2024 10:11:30 +0100 Subject: [PATCH 12/13] Sort imports --- .../src/yoroi-wallets/cardano/cip8/cip8.test.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts index 89a2d49385..46512b6d83 100644 --- a/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts +++ b/apps/wallet-mobile/src/yoroi-wallets/cardano/cip8/cip8.test.ts @@ -1,11 +1,12 @@ -import * as cip8 from './cip8' -import {Buffer} from 'buffer' -import {wrappedCsl} from '../wrappedCsl' import {normalizeToAddress} from '@emurgo/yoroi-lib/dist/internals/utils/addresses' import assert from 'assert' +import {Buffer} from 'buffer' + import {getMasterKeyFromMnemonic} from '../byron/util' import {harden} from '../common/signatureUtils' import {createRawTxSigningKey} from '../utils' +import {wrappedCsl} from '../wrappedCsl' +import * as cip8 from './cip8' describe('CIP8', () => { it('should support signing', async () => { From 759b64df387e493c215f3fb1572fe767e2fa4b59 Mon Sep 17 00:00:00 2001 From: Michal Date: Fri, 7 Jun 2024 10:10:20 +0100 Subject: [PATCH 13/13] Update MSL --- apps/wallet-mobile/ios/Podfile.lock | 4 ++-- apps/wallet-mobile/package.json | 2 +- yarn.lock | 9 ++++++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/wallet-mobile/ios/Podfile.lock b/apps/wallet-mobile/ios/Podfile.lock index 90756df23e..4a95e284f1 100644 --- a/apps/wallet-mobile/ios/Podfile.lock +++ b/apps/wallet-mobile/ios/Podfile.lock @@ -354,7 +354,7 @@ PODS: - React-Core - react-native-haskell-shelley (6.0.0-alpha.9): - React - - react-native-message_signing-library (1.0.1): + - react-native-message_signing-library (1.0.2): - React - react-native-mmkv (2.11.0): - MMKV (>= 1.2.13) @@ -877,7 +877,7 @@ SPEC CHECKSUMS: react-native-ble-plx: f10240444452dfb2d2a13a0e4f58d7783e92d76e react-native-config: 86038147314e2e6d10ea9972022aa171e6b1d4d8 react-native-haskell-shelley: 4015aef14eca3ecf5e8d8718e8d1b47cdcf60f84 - react-native-message_signing-library: 70b9e51c7ff9990979d605be8c8028eb7fce9569 + react-native-message_signing-library: e81294a3cd40d74d3d83f0a1de72aa319238f09a react-native-mmkv: e97c0c79403fb94577e5d902ab1ebd42b0715b43 react-native-pager-view: 0ccb8bf60e2ebd38b1f3669fa3650ecce81db2df react-native-quick-base64: 62290829c619fbabca4c41cfec75ae759d08fc1c diff --git a/apps/wallet-mobile/package.json b/apps/wallet-mobile/package.json index e674b9be16..524881bf21 100644 --- a/apps/wallet-mobile/package.json +++ b/apps/wallet-mobile/package.json @@ -98,7 +98,7 @@ "@emurgo/cross-csl-mobile": "4.4.0", "@emurgo/cross-msl-mobile": "^1.0.0", "@emurgo/csl-mobile-bridge": "6.0.0-alpha.9", - "@emurgo/msl-mobile-bridge": "^1.0.1", + "@emurgo/msl-mobile-bridge": "^1.0.2", "@emurgo/react-native-blockies-svg": "^0.0.2", "@emurgo/react-native-hid": "^5.15.6", "@emurgo/yoroi-lib": "0.15.4-alpha.7", diff --git a/yarn.lock b/yarn.lock index eeae30f472..dd6999af1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2160,13 +2160,20 @@ dependencies: base-64 "0.1.0" -"@emurgo/msl-mobile-bridge@1.0.1", "@emurgo/msl-mobile-bridge@^1.0.1": +"@emurgo/msl-mobile-bridge@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@emurgo/msl-mobile-bridge/-/msl-mobile-bridge-1.0.1.tgz#4a912e182118dc4462e90cbfda5ebedf6048b4e6" integrity sha512-ed0KobdbEmNParq33pTkYOMWrF8kMP6R3HdIPDy/YycwW9nvvWlWhlpUR4wKDjM3qQzhE/rN6gb/dG8rwWa4IQ== dependencies: base-64 "0.1.0" +"@emurgo/msl-mobile-bridge@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@emurgo/msl-mobile-bridge/-/msl-mobile-bridge-1.0.2.tgz#3241ff5728a7b34b890641843b36c62b6876d09f" + integrity sha512-RQ+X8ovF09jPr3xwG1XVAr/O2YFVZFDGALbLPMEjszvSw12Su3FNgLGvMwXfSvL9T/csR0BF1NqkGauJONedmw== + dependencies: + base-64 "0.1.0" + "@emurgo/react-native-blockies-svg@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@emurgo/react-native-blockies-svg/-/react-native-blockies-svg-0.0.2.tgz#afe2ce2776b0c6430ce3bc9a94ceb4f9fcb302f9"