diff --git a/packages/mesh-common/package.json b/packages/mesh-common/package.json index 9a0e376e..3b9ddee7 100644 --- a/packages/mesh-common/package.json +++ b/packages/mesh-common/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/common", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-contract/package.json b/packages/mesh-contract/package.json index 695ec660..edf5ba10 100644 --- a/packages/mesh-contract/package.json +++ b/packages/mesh-contract/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/contract", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-core-csl/package.json b/packages/mesh-core-csl/package.json index d0e13070..820c0186 100644 --- a/packages/mesh-core-csl/package.json +++ b/packages/mesh-core-csl/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/core-csl", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-core-cst/package.json b/packages/mesh-core-cst/package.json index fdd8c182..0d755bf0 100644 --- a/packages/mesh-core-cst/package.json +++ b/packages/mesh-core-cst/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/core-cst", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", @@ -56,4 +56,4 @@ "blockchain", "sdk" ] -} +} \ No newline at end of file diff --git a/packages/mesh-core-cst/src/index.ts b/packages/mesh-core-cst/src/index.ts index 250c62be..87ab5ab1 100644 --- a/packages/mesh-core-cst/src/index.ts +++ b/packages/mesh-core-cst/src/index.ts @@ -1,19 +1,10 @@ import { Cardano, Serialization } from "@cardano-sdk/core"; -import { - getCoseKeyFromPublicKey, - getPublicKeyFromCoseKey, - StricaBip32PrivateKey, - StricaBip32PublicKey, - StricaCoseSign1, - StricaPrivateKey, - StricaPublicKey, -} from "./stricahq"; - export * from "./types"; export * from "./message-signing"; export * from "./resolvers"; export * from "./serializer"; +export * from "./stricahq"; export * from "./utils"; export * as CardanoSDKUtil from "@cardano-sdk/util"; @@ -21,13 +12,3 @@ export * as Crypto from "@cardano-sdk/crypto"; export * as CardanoSDK from "@cardano-sdk/core"; export { Cardano, Serialization }; - -export { - StricaPrivateKey, - StricaPublicKey, - StricaBip32PrivateKey, - StricaBip32PublicKey, - StricaCoseSign1, - getPublicKeyFromCoseKey, - getCoseKeyFromPublicKey, -}; diff --git a/packages/mesh-core-cst/src/message-signing/check-signature.ts b/packages/mesh-core-cst/src/message-signing/check-signature.ts new file mode 100644 index 00000000..c19bb2bd --- /dev/null +++ b/packages/mesh-core-cst/src/message-signing/check-signature.ts @@ -0,0 +1,22 @@ +import { DataSignature } from "@meshsdk/common"; + +import { CoseSign1, getPublicKeyFromCoseKey } from "./cose-sign1"; + +export const checkSignature = ( + data: string, + { key, signature }: DataSignature, +) => { + const builder = CoseSign1.fromCbor(signature); + + if (builder.getPayload() === null) { + return false; + } + + if (Buffer.from(data, "hex").compare(builder.getPayload()!) !== 0) { + return false; + } + + return builder.verifySignature({ + publicKeyBuffer: getPublicKeyFromCoseKey(key), + }); +}; diff --git a/packages/mesh-core-cst/src/stricahq/coseSign1.ts b/packages/mesh-core-cst/src/message-signing/cose-sign1.ts similarity index 86% rename from packages/mesh-core-cst/src/stricahq/coseSign1.ts rename to packages/mesh-core-cst/src/message-signing/cose-sign1.ts index 453b00aa..bea32759 100644 --- a/packages/mesh-core-cst/src/stricahq/coseSign1.ts +++ b/packages/mesh-core-cst/src/message-signing/cose-sign1.ts @@ -1,8 +1,8 @@ import { Buffer } from "buffer"; -import { PublicKey } from "@stricahq/bip32ed25519"; -import { Decoder, Encoder } from "@stricahq/cbors"; import { blake2b } from "blakejs"; +import { StricaDecoder, StricaEncoder, StricaPublicKey } from "../stricahq"; + class CoseSign1 { private protectedMap: Map; @@ -30,7 +30,7 @@ class CoseSign1 { } static fromCbor(cbor: string) { - const decoded = Decoder.decode(Buffer.from(cbor, "hex")); + const decoded = StricaDecoder.decode(Buffer.from(cbor, "hex")); if (!(decoded.value instanceof Array)) throw Error("Invalid CBOR"); if (decoded.value.length !== 4) throw Error("Invalid COSE_SIGN1"); @@ -39,7 +39,7 @@ class CoseSign1 { // Decode and Set ProtectedMap const protectedSerialized = decoded.value[0]; try { - protectedMap = Decoder.decode(protectedSerialized).value; + protectedMap = StricaDecoder.decode(protectedSerialized).value; if (!(protectedMap instanceof Map)) { throw Error(); } @@ -69,7 +69,7 @@ class CoseSign1 { let protectedSerialized = Buffer.alloc(0); if (this.protectedMap.size !== 0) { - protectedSerialized = Encoder.encode(this.protectedMap); + protectedSerialized = StricaEncoder.encode(this.protectedMap); } const structure = [ @@ -79,7 +79,7 @@ class CoseSign1 { this.payload, ]; - return Encoder.encode(structure); + return StricaEncoder.encode(structure); } buildMessage(signature: Buffer): Buffer { @@ -87,7 +87,7 @@ class CoseSign1 { let protectedSerialized = Buffer.alloc(0); if (this.protectedMap.size !== 0) { - protectedSerialized = Encoder.encode(this.protectedMap); + protectedSerialized = StricaEncoder.encode(this.protectedMap); } const coseSign1 = [ @@ -97,7 +97,7 @@ class CoseSign1 { this.signature, ]; - return Encoder.encode(coseSign1); + return StricaEncoder.encode(coseSign1); } verifySignature({ @@ -114,7 +114,7 @@ class CoseSign1 { if (!publicKeyBuffer) throw Error("Public key not found"); if (!this.signature) throw Error("Signature not found"); - const publicKey = new PublicKey(publicKeyBuffer); + const publicKey = new StricaPublicKey(publicKeyBuffer); return publicKey.verify( this.signature, @@ -155,7 +155,7 @@ class CoseSign1 { } const getPublicKeyFromCoseKey = (cbor: string): Buffer => { - const decodedCoseKey = Decoder.decode(Buffer.from(cbor, "hex")); + const decodedCoseKey = StricaDecoder.decode(Buffer.from(cbor, "hex")); const publicKeyBuffer = decodedCoseKey.value.get(-2); if (publicKeyBuffer) { @@ -171,7 +171,7 @@ const getCoseKeyFromPublicKey = (cbor: string): Buffer => { coseKeyMap.set(3, -8); coseKeyMap.set(6, -2); coseKeyMap.set(-2, Buffer.from(cbor, "hex")); - return Encoder.encode(coseKeyMap); + return StricaEncoder.encode(coseKeyMap); }; export { CoseSign1, getPublicKeyFromCoseKey, getCoseKeyFromPublicKey }; diff --git a/packages/mesh-core-cst/src/message-signing/generate-nonce.ts b/packages/mesh-core-cst/src/message-signing/generate-nonce.ts new file mode 100644 index 00000000..88e99600 --- /dev/null +++ b/packages/mesh-core-cst/src/message-signing/generate-nonce.ts @@ -0,0 +1,14 @@ +import { customAlphabet } from "nanoid"; + +import { stringToHex } from "@meshsdk/common"; + +export const generateNonce = (label = "", length = 32) => { + if (length <= 0 || length > 2048) { + throw new Error("Length must be bewteen 1 and 2048"); + } + const randomString = customAlphabet( + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", + ); + const payload = randomString(length); + return stringToHex(`${label}${payload}`); +}; diff --git a/packages/mesh-core-cst/src/message-signing/index.ts b/packages/mesh-core-cst/src/message-signing/index.ts index 50b6d0b0..0a9c402f 100644 --- a/packages/mesh-core-cst/src/message-signing/index.ts +++ b/packages/mesh-core-cst/src/message-signing/index.ts @@ -1,71 +1,4 @@ -import { customAlphabet } from "nanoid"; - -import { DataSignature, stringToHex } from "@meshsdk/common"; - -import { - getCoseKeyFromPublicKey, - getPublicKeyFromCoseKey, - Signer, - StricaCoseSign1, -} from "../"; - -export const signData = (data: string, signer: Signer): DataSignature => { - const payload = Buffer.from(data, "hex"); - const publicKey = signer.key.toPublicKey().toBytes(); - - const protectedMap = new Map(); - // Set protected headers as per CIP08 - // Set Algorthm used by Cardano keys - protectedMap.set(1, -8); - // Set PublicKey - protectedMap.set(4, publicKey); - // Set Address - protectedMap.set("address", Buffer.from(signer.address.toBytes(), "hex")); - - const coseSign1Builder = new StricaCoseSign1({ - protectedMap, - unProtectedMap: new Map(), - payload: payload, - }); - - const signature = signer.key.sign(coseSign1Builder.createSigStructure()); - - const coseSignature = coseSign1Builder - .buildMessage(signature) - .toString("hex"); - - return { - key: getCoseKeyFromPublicKey(publicKey.toString("hex")).toString("hex"), - signature: coseSignature, - }; -}; - -export const checkSignature = ( - data: string, - { key, signature }: DataSignature, -) => { - const builder = StricaCoseSign1.fromCbor(signature); - - if (builder.getPayload() === null) { - return false; - } - - if (Buffer.from(data, "hex").compare(builder.getPayload()!) !== 0) { - return false; - } - - return builder.verifySignature({ - publicKeyBuffer: getPublicKeyFromCoseKey(key), - }); -}; - -export const generateNonce = (label = "", length = 32) => { - if (length <= 0 || length > 2048) { - throw new Error("Length must be bewteen 1 and 2048"); - } - const randomString = customAlphabet( - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", - ); - const payload = randomString(length); - return stringToHex(`${label}${payload}`); -}; +export * from "./check-signature"; +export * from "./cose-sign1"; +export * from "./generate-nonce"; +export * from "./sign-data"; diff --git a/packages/mesh-core-cst/src/message-signing/sign-data.ts b/packages/mesh-core-cst/src/message-signing/sign-data.ts new file mode 100644 index 00000000..71eac874 --- /dev/null +++ b/packages/mesh-core-cst/src/message-signing/sign-data.ts @@ -0,0 +1,35 @@ +import { DataSignature } from "@meshsdk/common"; + +import { Signer } from "../types"; +import { CoseSign1, getCoseKeyFromPublicKey } from "./cose-sign1"; + +export const signData = (data: string, signer: Signer): DataSignature => { + const payload = Buffer.from(data, "hex"); + const publicKey = signer.key.toPublicKey().toBytes(); + + const protectedMap = new Map(); + // Set protected headers as per CIP08 + // Set Algorthm used by Cardano keys + protectedMap.set(1, -8); + // Set PublicKey + protectedMap.set(4, publicKey); + // Set Address + protectedMap.set("address", Buffer.from(signer.address.toBytes(), "hex")); + + const coseSign1Builder = new CoseSign1({ + protectedMap, + unProtectedMap: new Map(), + payload: payload, + }); + + const signature = signer.key.sign(coseSign1Builder.createSigStructure()); + + const coseSignature = coseSign1Builder + .buildMessage(signature) + .toString("hex"); + + return { + key: getCoseKeyFromPublicKey(publicKey.toString("hex")).toString("hex"), + signature: coseSignature, + }; +}; diff --git a/packages/mesh-core-cst/src/stricahq/bip32ed25519/index.ts b/packages/mesh-core-cst/src/stricahq/bip32ed25519/index.ts new file mode 100644 index 00000000..e60b94cc --- /dev/null +++ b/packages/mesh-core-cst/src/stricahq/bip32ed25519/index.ts @@ -0,0 +1,12 @@ +import strica from "@stricahq/bip32ed25519"; + +import { PrivateKey } from "./privateKey"; + +const { PublicKey, Bip32PrivateKey, Bip32PublicKey } = strica; + +export { + PrivateKey as StricaPrivateKey, + PublicKey as StricaPublicKey, + Bip32PrivateKey as StricaBip32PrivateKey, + Bip32PublicKey as StricaBip32PublicKey, +}; diff --git a/packages/mesh-core-cst/src/stricahq/privateKey.ts b/packages/mesh-core-cst/src/stricahq/bip32ed25519/privateKey.ts similarity index 100% rename from packages/mesh-core-cst/src/stricahq/privateKey.ts rename to packages/mesh-core-cst/src/stricahq/bip32ed25519/privateKey.ts diff --git a/packages/mesh-core-cst/src/stricahq/cbors/index.ts b/packages/mesh-core-cst/src/stricahq/cbors/index.ts new file mode 100644 index 00000000..7c1754f8 --- /dev/null +++ b/packages/mesh-core-cst/src/stricahq/cbors/index.ts @@ -0,0 +1,5 @@ +import strica from "@stricahq/cbors"; + +const { Encoder, Decoder } = strica; + +export { Encoder as StricaEncoder, Decoder as StricaDecoder }; diff --git a/packages/mesh-core-cst/src/stricahq/index.ts b/packages/mesh-core-cst/src/stricahq/index.ts index 490c9773..870dd9c3 100644 --- a/packages/mesh-core-cst/src/stricahq/index.ts +++ b/packages/mesh-core-cst/src/stricahq/index.ts @@ -1,20 +1,2 @@ -import strica from "@stricahq/bip32ed25519"; - -import { - CoseSign1, - getCoseKeyFromPublicKey, - getPublicKeyFromCoseKey, -} from "./coseSign1"; -import { PrivateKey } from "./privateKey"; - -const { PublicKey, Bip32PrivateKey, Bip32PublicKey } = strica; - -export { - PrivateKey as StricaPrivateKey, - PublicKey as StricaPublicKey, - Bip32PrivateKey as StricaBip32PrivateKey, - Bip32PublicKey as StricaBip32PublicKey, - CoseSign1 as StricaCoseSign1, - getPublicKeyFromCoseKey, - getCoseKeyFromPublicKey, -}; +export * from "./bip32ed25519"; +export * from "./cbors"; diff --git a/packages/mesh-core-cst/test/message-signing.test.ts b/packages/mesh-core-cst/test/message-signing.test.ts index ec32db6f..f7f5ed5a 100644 --- a/packages/mesh-core-cst/test/message-signing.test.ts +++ b/packages/mesh-core-cst/test/message-signing.test.ts @@ -18,15 +18,4 @@ describe("MessageSigning", () => { const result = checkSignature(config.nonce, config.signature); expect(result).toBe(true); }); - it("checkSignature2", () => { - const data = - "stake_test1up64x8a7re5tz856zrdmch0c38k74y3jt2zmwk9mh7rntkgs6zxjp"; - const dataSignature = { - signature: - "84582aa201276761646472657373581de075531fbe1e68b11e9a10dbbc5df889edea92325a85b758bbbf8735d9a166686173686564f4583a5369676e20746f206c6f67696e20696e20746f204d6573683a20564569743130766d554f3645794539364e4f48634c4b5239576253435856695158404e77094ec3320fb253ca0f4844206e58a1e96ead1a00adc2c15c9e2364c5199061422b31e7bbf580c737f029fdcf93d4b7c7a6c221a9dab93e34114c3d15fc06", - key: "a40101032720062158201220e6aa326f24f12d644a1011dad9d138965c84566d2b7e20b79db7cf2aa73f", - }; - const result = checkSignature(data, dataSignature); - expect(result).toBe(true); - }); }); diff --git a/packages/mesh-core/package.json b/packages/mesh-core/package.json index 07a568d7..77b9290d 100644 --- a/packages/mesh-core/package.json +++ b/packages/mesh-core/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/core", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-provider/package.json b/packages/mesh-provider/package.json index 46b3268e..e0c7bbfd 100644 --- a/packages/mesh-provider/package.json +++ b/packages/mesh-provider/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/provider", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-react/package.json b/packages/mesh-react/package.json index 03fb6d7b..9694ec2e 100644 --- a/packages/mesh-react/package.json +++ b/packages/mesh-react/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/react", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-transaction/package.json b/packages/mesh-transaction/package.json index 0c27ed40..02974b24 100644 --- a/packages/mesh-transaction/package.json +++ b/packages/mesh-transaction/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/transaction", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js", diff --git a/packages/mesh-wallet/package.json b/packages/mesh-wallet/package.json index 89e49df3..6902e7ce 100644 --- a/packages/mesh-wallet/package.json +++ b/packages/mesh-wallet/package.json @@ -1,6 +1,6 @@ { "name": "@meshsdk/wallet", - "version": "1.6.3", + "version": "1.6.4", "description": "", "main": "./dist/index.cjs", "module": "./dist/index.js",