|
@@ -169,61 +169,54 @@ impl DbSignatory {
|
|
|
|
|
|
#[async_trait::async_trait]
|
|
#[async_trait::async_trait]
|
|
impl Signatory for DbSignatory {
|
|
impl Signatory for DbSignatory {
|
|
- async fn blind_sign(&self, blinded_message: BlindedMessage) -> Result<BlindSignature, Error> {
|
|
|
|
- let BlindedMessage {
|
|
|
|
- amount,
|
|
|
|
- blinded_secret,
|
|
|
|
- keyset_id,
|
|
|
|
- ..
|
|
|
|
- } = blinded_message;
|
|
|
|
-
|
|
|
|
|
|
+ async fn blind_sign(
|
|
|
|
+ &self,
|
|
|
|
+ blinded_messages: Vec<BlindedMessage>,
|
|
|
|
+ ) -> Result<Vec<BlindSignature>, Error> {
|
|
let keysets = self.keysets.read().await;
|
|
let keysets = self.keysets.read().await;
|
|
- let (info, key) = keysets.get(&keyset_id).ok_or(Error::UnknownKeySet)?;
|
|
|
|
- if !info.active {
|
|
|
|
- return Err(Error::InactiveKeyset);
|
|
|
|
- }
|
|
|
|
|
|
+ blinded_messages
|
|
|
|
+ .into_iter()
|
|
|
|
+ .map(|blinded_message| {
|
|
|
|
+ let BlindedMessage {
|
|
|
|
+ amount,
|
|
|
|
+ blinded_secret,
|
|
|
|
+ keyset_id,
|
|
|
|
+ ..
|
|
|
|
+ } = blinded_message;
|
|
|
|
+
|
|
|
|
+ let (info, key) = keysets.get(&keyset_id).ok_or(Error::UnknownKeySet)?;
|
|
|
|
+ if !info.active {
|
|
|
|
+ return Err(Error::InactiveKeyset);
|
|
|
|
+ }
|
|
|
|
|
|
- let key_pair = key.keys.get(&amount).ok_or(Error::UnknownKeySet)?;
|
|
|
|
- let c = sign_message(&key_pair.secret_key, &blinded_secret)?;
|
|
|
|
|
|
+ let key_pair = key.keys.get(&amount).ok_or(Error::UnknownKeySet)?;
|
|
|
|
+ let c = sign_message(&key_pair.secret_key, &blinded_secret)?;
|
|
|
|
|
|
- let blinded_signature = BlindSignature::new(
|
|
|
|
- amount,
|
|
|
|
- c,
|
|
|
|
- keyset_id,
|
|
|
|
- &blinded_message.blinded_secret,
|
|
|
|
- key_pair.secret_key.clone(),
|
|
|
|
- )?;
|
|
|
|
|
|
+ let blinded_signature = BlindSignature::new(
|
|
|
|
+ amount,
|
|
|
|
+ c,
|
|
|
|
+ keyset_id,
|
|
|
|
+ &blinded_message.blinded_secret,
|
|
|
|
+ key_pair.secret_key.clone(),
|
|
|
|
+ )?;
|
|
|
|
|
|
- Ok(blinded_signature)
|
|
|
|
|
|
+ Ok(blinded_signature)
|
|
|
|
+ })
|
|
|
|
+ .collect()
|
|
}
|
|
}
|
|
|
|
|
|
- async fn verify_proof(&self, proof: Proof) -> Result<(), Error> {
|
|
|
|
|
|
+ async fn verify_proofs(&self, proofs: Vec<Proof>) -> Result<(), Error> {
|
|
let keysets = self.keysets.read().await;
|
|
let keysets = self.keysets.read().await;
|
|
- let (_, key) = keysets.get(&proof.keyset_id).ok_or(Error::UnknownKeySet)?;
|
|
|
|
- let key_pair = key.keys.get(&proof.amount).ok_or(Error::UnknownKeySet)?;
|
|
|
|
- verify_message(&key_pair.secret_key, proof.c, proof.secret.as_bytes())?;
|
|
|
|
-
|
|
|
|
- Ok(())
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- async fn auth_keysets(&self) -> Result<Option<Vec<SignatoryKeySet>>, Error> {
|
|
|
|
- let keyset_id = self
|
|
|
|
- .active_keysets
|
|
|
|
- .read()
|
|
|
|
- .await
|
|
|
|
- .get(&CurrencyUnit::Auth)
|
|
|
|
- .cloned()
|
|
|
|
- .ok_or(Error::NoActiveKeyset)?;
|
|
|
|
|
|
|
|
- let active_keyset = self
|
|
|
|
- .keysets
|
|
|
|
- .read()
|
|
|
|
- .await
|
|
|
|
- .get(&keyset_id)
|
|
|
|
- .ok_or(Error::UnknownKeySet)?
|
|
|
|
- .into();
|
|
|
|
-
|
|
|
|
- Ok(Some(vec![active_keyset]))
|
|
|
|
|
|
+ proofs
|
|
|
|
+ .into_iter()
|
|
|
|
+ .map(|proof| {
|
|
|
|
+ let (_, key) = keysets.get(&proof.keyset_id).ok_or(Error::UnknownKeySet)?;
|
|
|
|
+ let key_pair = key.keys.get(&proof.amount).ok_or(Error::UnknownKeySet)?;
|
|
|
|
+ verify_message(&key_pair.secret_key, proof.c, proof.secret.as_bytes())?;
|
|
|
|
+ Ok(())
|
|
|
|
+ })
|
|
|
|
+ .collect()
|
|
}
|
|
}
|
|
|
|
|
|
async fn keysets(&self) -> Result<Vec<SignatoryKeySet>, Error> {
|
|
async fn keysets(&self) -> Result<Vec<SignatoryKeySet>, Error> {
|
|
@@ -240,23 +233,19 @@ impl Signatory for DbSignatory {
|
|
/// Generate new keyset
|
|
/// Generate new keyset
|
|
#[tracing::instrument(skip(self))]
|
|
#[tracing::instrument(skip(self))]
|
|
async fn rotate_keyset(&self, args: RotateKeyArguments) -> Result<MintKeySetInfo, Error> {
|
|
async fn rotate_keyset(&self, args: RotateKeyArguments) -> Result<MintKeySetInfo, Error> {
|
|
- let path_index = if let Some(path_index) = args.derivation_path_index {
|
|
|
|
- path_index
|
|
|
|
- } else {
|
|
|
|
- let current_keyset_id = self
|
|
|
|
- .localstore
|
|
|
|
- .get_active_keyset_id(&args.unit)
|
|
|
|
- .await?
|
|
|
|
- .ok_or(Error::UnsupportedUnit)?;
|
|
|
|
-
|
|
|
|
- let keyset_info = self
|
|
|
|
- .localstore
|
|
|
|
- .get_keyset_info(¤t_keyset_id)
|
|
|
|
- .await?
|
|
|
|
- .ok_or(Error::UnknownKeySet)?;
|
|
|
|
-
|
|
|
|
- keyset_info.derivation_path_index.unwrap_or(1) + 1
|
|
|
|
- };
|
|
|
|
|
|
+ let current_keyset_id = self
|
|
|
|
+ .localstore
|
|
|
|
+ .get_active_keyset_id(&args.unit)
|
|
|
|
+ .await?
|
|
|
|
+ .ok_or(Error::UnsupportedUnit)?;
|
|
|
|
+
|
|
|
|
+ let keyset_info = self
|
|
|
|
+ .localstore
|
|
|
|
+ .get_keyset_info(¤t_keyset_id)
|
|
|
|
+ .await?
|
|
|
|
+ .ok_or(Error::UnknownKeySet)?;
|
|
|
|
+
|
|
|
|
+ let path_index = keyset_info.derivation_path_index.unwrap_or(1) + 1;
|
|
|
|
|
|
let derivation_path = match self.custom_paths.get(&args.unit) {
|
|
let derivation_path = match self.custom_paths.get(&args.unit) {
|
|
Some(path) => path.clone(),
|
|
Some(path) => path.clone(),
|