// Copyright 2022 - Nym Technologies SA // SPDX-License-Identifier: Apache-2.0 use cosmrs::AccountId; use getset::{CopyGetters, Getters}; use serde::{Deserialize, Serialize}; use coconut_interface::{ error::CoconutInterfaceError, Attribute, Base58, BlindSignRequest, Credential, VerificationKey, }; #[derive(Serialize, Deserialize, Getters, CopyGetters)] pub struct VerifyCredentialBody { #[getset(get = "pub")] credential: Credential, #[getset(get = "pub")] proposal_id: u64, #[getset(get = "pub")] gateway_cosmos_addr: AccountId, } impl VerifyCredentialBody { pub fn new( credential: Credential, proposal_id: u64, gateway_cosmos_addr: AccountId, ) -> VerifyCredentialBody { VerifyCredentialBody { credential, proposal_id, gateway_cosmos_addr, } } } #[derive(Debug, Serialize, Deserialize)] pub struct VerifyCredentialResponse { pub verification_result: bool, } impl VerifyCredentialResponse { pub fn new(verification_result: bool) -> Self { VerifyCredentialResponse { verification_result, } } } // All strings are base58 encoded representations of structs #[derive(Clone, Serialize, Deserialize, Debug, Getters, CopyGetters)] pub struct BlindSignRequestBody { #[getset(get = "pub")] blind_sign_request: BlindSignRequest, #[getset(get = "pub")] tx_hash: String, #[getset(get = "pub")] signature: String, public_attributes: Vec, #[getset(get = "pub")] public_attributes_plain: Vec, #[getset(get = "pub")] total_params: u32, } impl BlindSignRequestBody { pub fn new( blind_sign_request: &BlindSignRequest, tx_hash: String, signature: String, public_attributes: &[Attribute], public_attributes_plain: Vec, total_params: u32, ) -> BlindSignRequestBody { BlindSignRequestBody { blind_sign_request: blind_sign_request.clone(), tx_hash, signature, public_attributes: public_attributes .iter() .map(|attr| attr.to_bs58()) .collect(), public_attributes_plain, total_params, } } pub fn public_attributes(&self) -> Vec { self.public_attributes .iter() .map(|x| Attribute::try_from_bs58(x).unwrap()) .collect() } } #[derive(Debug, Serialize, Deserialize)] pub struct BlindedSignatureResponse { pub remote_key: [u8; 32], pub encrypted_signature: Vec, } impl BlindedSignatureResponse { pub fn new(encrypted_signature: Vec, remote_key: [u8; 32]) -> BlindedSignatureResponse { BlindedSignatureResponse { encrypted_signature, remote_key, } } pub fn to_base58_string(&self) -> String { bs58::encode(&self.to_bytes()).into_string() } pub fn from_base58_string>(val: I) -> Result { let bytes = bs58::decode(val).into_vec()?; Self::from_bytes(&bytes) } pub fn to_bytes(&self) -> Vec { let mut bytes = self.remote_key.to_vec(); bytes.extend_from_slice(&self.encrypted_signature); bytes } pub fn from_bytes(bytes: &[u8]) -> Result { if bytes.len() < 32 { return Err(CoconutInterfaceError::InvalidByteLength(bytes.len(), 32)); } let mut remote_key = [0u8; 32]; remote_key.copy_from_slice(&bytes[..32]); let encrypted_signature = bytes[32..].to_vec(); Ok(BlindedSignatureResponse { remote_key, encrypted_signature, }) } } #[derive(Serialize, Deserialize)] pub struct VerificationKeyResponse { pub key: VerificationKey, } impl VerificationKeyResponse { pub fn new(key: VerificationKey) -> VerificationKeyResponse { VerificationKeyResponse { key } } } #[derive(Serialize, Deserialize)] pub struct CosmosAddressResponse { pub addr: AccountId, } impl CosmosAddressResponse { pub fn new(addr: AccountId) -> CosmosAddressResponse { CosmosAddressResponse { addr } } }