Skip to main content

iota_types/
multisig.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5pub use enum_dispatch::enum_dispatch;
6use iota_sdk_crypto::{Verifier, multisig::MultisigVerifier};
7pub use iota_sdk_types::crypto::{
8    BitmapUnit, MultisigAggregatedSignature as MultiSig, MultisigCommittee as MultiSigPublicKey,
9    MultisigMember, MultisigMemberSignature, ThresholdUnit, WeightUnit,
10};
11use iota_sdk_types::{Address, crypto::IntentMessage};
12use serde::Serialize;
13
14use crate::{
15    error::IotaError,
16    signature::{AuthenticatorTrait, VerifyParams},
17};
18
19#[cfg(test)]
20#[path = "unit_tests/multisig_tests.rs"]
21mod multisig_tests;
22
23impl AuthenticatorTrait for MultiSig {
24    fn verify_claims<T>(
25        &self,
26        intent_message: &IntentMessage<T>,
27        multisig_address: Address,
28        verify_params: &VerifyParams,
29    ) -> Result<(), IotaError>
30    where
31        T: Serialize,
32    {
33        let digest = intent_message.signing_digest();
34        let verifier = MultisigVerifier::new()
35            .with_address(multisig_address)
36            .with_accept_passkey_in_multisig(verify_params.accept_passkey_in_multisig)
37            .with_additional_multisig_checks(verify_params.additional_multisig_checks);
38
39        verifier
40            .verify(&*digest, self)
41            .map_err(|e| IotaError::InvalidSignature {
42                error: format!("Invalid multisig: {e}"),
43            })
44    }
45}