9e8f550e6d
* Add placeholder client for implementing coconut interactions * Add db for persistance * Add nymd client * Add new coconut-bandwidth contract * Call deposit function * Introduce error handling * Call the old flow of getting a signature * List available tx hashes * Add signed req in body * Save signature received * Add event generation * Checks in validator-api * Fail with error instead of panic in validator-api route * Fix contract address and small bug * Add file db for storing previous signatures * Encrypt and store data in validator-api * Decrypt the received signature * Remove tx hashes after getting credentials * Small listing changes in client * Change response so that it easier to serialize * Error message is sent to client for display * Remove already signed error and return the previous sig * Merge signature with deposit data in client * Entrypoint for getting the encrypted signature * Refactor blinding stuff so that it can be backed up * Backed up the blind sign request * Client can re-request the encrypted signature shares * Update crypto features * Fix clippy * Activate instantiate test and remove unused code * Add tx tests * Add verification key endpoint test * Voucher consistency test * Test for some errors and a race condition on blind signing * Refactor and add client trait for enabling better testing env * Test some more of blind sign * Finished testing all extract_encryption_key paths * Split into function test and endpoint test * Test for correct signature * Test for state functions * Remove print * Test blind_sign endpoint * Test for cached signature endpoint * Stricter types in voucher * Rename signature with partial_bandwidth_credential * Extra route levels * Length check and remove some unused code from coconut interface * Renamed coconut-bandwidth common crate * Renamed verification_key to identity_key * Use const instead of hardcoded values * Use type aliases for crypto algorithms * Remove unused mods, until needed * Remove unneeded unwrap * Fix some coconut issues that were blocking the wasm client build * Move from sled to existing sql database * Update tests for new db type * Fix wasm for coconut too * Remove sled from dependencies
184 lines
5.0 KiB
Rust
184 lines
5.0 KiB
Rust
// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
pub mod error;
|
|
|
|
use getset::{CopyGetters, Getters};
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
use error::CoconutInterfaceError;
|
|
|
|
pub use nymcoconut::*;
|
|
|
|
#[derive(Serialize, Deserialize, Getters, CopyGetters, Clone)]
|
|
pub struct Credential {
|
|
#[getset(get = "pub")]
|
|
n_params: u32,
|
|
#[getset(get = "pub")]
|
|
theta: Theta,
|
|
public_attributes: Vec<Vec<u8>>,
|
|
#[getset(get = "pub")]
|
|
signature: Signature,
|
|
}
|
|
impl Credential {
|
|
pub fn new(
|
|
n_params: u32,
|
|
theta: Theta,
|
|
public_attributes: Vec<Vec<u8>>,
|
|
signature: &Signature,
|
|
) -> Credential {
|
|
Credential {
|
|
n_params,
|
|
theta,
|
|
public_attributes,
|
|
signature: *signature,
|
|
}
|
|
}
|
|
|
|
pub fn public_attributes(&self) -> Vec<Vec<u8>> {
|
|
self.public_attributes.clone()
|
|
}
|
|
|
|
pub fn verify(&self, verification_key: &VerificationKey) -> bool {
|
|
let params = Parameters::new(self.n_params).unwrap();
|
|
let public_attributes = self
|
|
.public_attributes
|
|
.iter()
|
|
.map(hash_to_scalar)
|
|
.collect::<Vec<Attribute>>();
|
|
nymcoconut::verify_credential(¶ms, verification_key, &self.theta, &public_attributes)
|
|
}
|
|
}
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Getters, CopyGetters)]
|
|
pub struct VerifyCredentialBody {
|
|
#[getset(get = "pub")]
|
|
n_params: u32,
|
|
#[getset(get = "pub")]
|
|
theta: Theta,
|
|
public_attributes: Vec<String>,
|
|
}
|
|
|
|
impl VerifyCredentialBody {
|
|
pub fn new(
|
|
n_params: u32,
|
|
theta: &Theta,
|
|
public_attributes: &[Attribute],
|
|
) -> VerifyCredentialBody {
|
|
VerifyCredentialBody {
|
|
n_params,
|
|
theta: theta.clone(),
|
|
public_attributes: public_attributes
|
|
.iter()
|
|
.map(|attr| attr.to_bs58())
|
|
.collect(),
|
|
}
|
|
}
|
|
|
|
pub fn public_attributes(&self) -> Vec<Attribute> {
|
|
self.public_attributes
|
|
.iter()
|
|
.map(|x| Attribute::try_from_bs58(x).unwrap())
|
|
.collect()
|
|
}
|
|
}
|
|
// 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<String>,
|
|
#[getset(get = "pub")]
|
|
public_attributes_plain: Vec<String>,
|
|
#[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<String>,
|
|
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<Attribute> {
|
|
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<u8>,
|
|
}
|
|
|
|
impl BlindedSignatureResponse {
|
|
pub fn new(encrypted_signature: Vec<u8>, 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<I: AsRef<[u8]>>(val: I) -> Result<Self, CoconutInterfaceError> {
|
|
let bytes = bs58::decode(val).into_vec()?;
|
|
Self::from_bytes(&bytes)
|
|
}
|
|
|
|
pub fn to_bytes(&self) -> Vec<u8> {
|
|
let mut bytes = self.remote_key.to_vec();
|
|
bytes.extend_from_slice(&self.encrypted_signature);
|
|
bytes
|
|
}
|
|
|
|
pub fn from_bytes(bytes: &[u8]) -> Result<Self, CoconutInterfaceError> {
|
|
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 }
|
|
}
|
|
}
|