diff --git a/common/cosmwasm-smart-contracts/contracts-common/src/signing/mod.rs b/common/cosmwasm-smart-contracts/contracts-common/src/signing/mod.rs index 1abf94457d..206152957b 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/src/signing/mod.rs +++ b/common/cosmwasm-smart-contracts/contracts-common/src/signing/mod.rs @@ -98,7 +98,7 @@ pub trait SigningPurpose { fn message_type() -> MessageType; } -#[derive(Serialize)] +#[derive(Serialize, Deserialize)] #[serde(transparent)] pub struct MessageType(String); @@ -137,15 +137,20 @@ impl SigningAlgorithm { pub struct SignableMessage { pub nonce: u32, pub algorithm: SigningAlgorithm, + pub message_type: MessageType, pub content: T, } -impl SignableMessage { +impl SignableMessage +where + T: SigningPurpose, +{ pub fn new(nonce: u32, content: T) -> Self { SignableMessage { nonce, algorithm: SigningAlgorithm::Ed25519, + message_type: T::message_type(), content, } } @@ -162,7 +167,10 @@ impl SignableMessage { to_vec(self) } - pub fn to_sha256_plaintext_digest(&self) -> StdResult> { + pub fn to_sha256_plaintext_digest(&self) -> StdResult> + where + T: Serialize, + { unimplemented!() } @@ -209,20 +217,24 @@ impl SignableMessage { #[derive(Serialize)] pub struct ContractMessageContent { - pub message_type: MessageType, pub sender: Addr, pub proxy: Option, pub funds: Vec, pub data: T, } -impl ContractMessageContent +impl SigningPurpose for ContractMessageContent where T: SigningPurpose, { + fn message_type() -> MessageType { + T::message_type() + } +} + +impl ContractMessageContent { pub fn new(sender: Addr, proxy: Option, funds: Vec, data: T) -> Self { ContractMessageContent { - message_type: T::message_type(), sender, proxy, funds, @@ -238,7 +250,6 @@ where }; ContractMessageContent { - message_type: T::message_type(), sender: signer, proxy, funds: info.funds, diff --git a/common/cosmwasm-smart-contracts/contracts-common/src/signing/verifier.rs b/common/cosmwasm-smart-contracts/contracts-common/src/signing/verifier.rs index 3bb82ccb5c..6663703d42 100644 --- a/common/cosmwasm-smart-contracts/contracts-common/src/signing/verifier.rs +++ b/common/cosmwasm-smart-contracts/contracts-common/src/signing/verifier.rs @@ -1,7 +1,7 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 -use crate::signing::{MessageSignature, SignableMessage, SigningAlgorithm}; +use crate::signing::{MessageSignature, SignableMessage, SigningAlgorithm, SigningPurpose}; use cosmwasm_std::{Api, StdError, VerificationError}; use serde::Serialize; use thiserror::Error; @@ -9,7 +9,7 @@ use thiserror::Error; pub trait Verifier { type Error: From; - fn verify_message( + fn verify_message( &self, message: SignableMessage, signature: MessageSignature, diff --git a/contracts/mixnet/src/support/tests/mod.rs b/contracts/mixnet/src/support/tests/mod.rs index 26b9639a05..71a2d96437 100644 --- a/contracts/mixnet/src/support/tests/mod.rs +++ b/contracts/mixnet/src/support/tests/mod.rs @@ -67,7 +67,7 @@ pub mod test_helpers { SignableMixNodeBondingMsg, }; use nym_contracts_common::signing::{ - ContractMessageContent, MessageSignature, SignableMessage, SigningAlgorithm, + ContractMessageContent, MessageSignature, SignableMessage, SigningAlgorithm, SigningPurpose, }; use nym_crypto::asymmetric::identity; use nym_crypto::asymmetric::identity::KeyPair; @@ -860,7 +860,7 @@ pub mod test_helpers { } } - pub fn ed25519_sign_message( + pub fn ed25519_sign_message( message: SignableMessage, private_key: &identity::PrivateKey, ) -> MessageSignature {