sui_crypto/
lib.rs

1#![cfg_attr(doc_cfg, feature(doc_cfg))]
2
3use sui_sdk_types::PersonalMessage;
4use sui_sdk_types::Transaction;
5use sui_sdk_types::UserSignature;
6
7pub use signature::Error as SignatureError;
8pub use signature::Signer;
9pub use signature::Verifier;
10
11#[cfg(feature = "ed25519")]
12#[cfg_attr(doc_cfg, doc(cfg(feature = "ed25519")))]
13pub mod ed25519;
14
15#[allow(unused)]
16mod bls12381;
17
18#[cfg(feature = "secp256k1")]
19#[cfg_attr(doc_cfg, doc(cfg(feature = "secp256k1")))]
20pub mod secp256k1;
21
22#[cfg(feature = "secp256r1")]
23#[cfg_attr(doc_cfg, doc(cfg(feature = "secp256r1")))]
24pub mod secp256r1;
25
26#[cfg(feature = "passkey")]
27#[cfg_attr(doc_cfg, doc(cfg(feature = "passkey")))]
28pub mod passkey;
29
30#[cfg(feature = "zklogin")]
31#[cfg_attr(doc_cfg, doc(cfg(feature = "zklogin")))]
32pub mod zklogin;
33
34#[cfg(any(
35    feature = "ed25519",
36    feature = "secp256r1",
37    feature = "secp256k1",
38    feature = "zklogin"
39))]
40#[cfg_attr(
41    doc_cfg,
42    doc(cfg(any(
43        feature = "ed25519",
44        feature = "secp256r1",
45        feature = "secp256k1",
46        feature = "zklogin"
47    )))
48)]
49pub mod simple;
50
51#[cfg(any(
52    feature = "ed25519",
53    feature = "secp256r1",
54    feature = "secp256k1",
55    feature = "zklogin"
56))]
57#[cfg_attr(
58    doc_cfg,
59    doc(cfg(any(
60        feature = "ed25519",
61        feature = "secp256r1",
62        feature = "secp256k1",
63        feature = "zklogin"
64    )))
65)]
66pub mod multisig;
67
68#[cfg(any(
69    feature = "ed25519",
70    feature = "secp256r1",
71    feature = "secp256k1",
72    feature = "zklogin"
73))]
74#[cfg_attr(
75    doc_cfg,
76    doc(cfg(any(
77        feature = "ed25519",
78        feature = "secp256r1",
79        feature = "secp256k1",
80        feature = "zklogin"
81    )))
82)]
83#[doc(inline)]
84pub use multisig::UserSignatureVerifier;
85
86/// Interface for signing user transactions and messages in Sui
87///
88/// # Note
89///
90/// There is a blanket implementation of `SuiSigner` for all `T` where `T:
91/// `[`Signer`]`<`[`UserSignature`]`>` so it is generally recommended for a signer to implement
92/// `Signer<UserSignature>` and rely on the blanket implementation which handles the proper
93/// construction of the signing message.
94pub trait SuiSigner {
95    fn sign_transaction(&self, transaction: &Transaction) -> Result<UserSignature, SignatureError>;
96    fn sign_personal_message(
97        &self,
98        message: &PersonalMessage<'_>,
99    ) -> Result<UserSignature, SignatureError>;
100}
101
102impl<T: Signer<UserSignature>> SuiSigner for T {
103    fn sign_transaction(&self, transaction: &Transaction) -> Result<UserSignature, SignatureError> {
104        let msg = transaction.signing_digest();
105        self.try_sign(&msg)
106    }
107
108    fn sign_personal_message(
109        &self,
110        message: &PersonalMessage<'_>,
111    ) -> Result<UserSignature, SignatureError> {
112        let msg = message.signing_digest();
113        self.try_sign(&msg)
114    }
115}
116
117/// Interface for verifying user transactions and messages in Sui
118///
119/// # Note
120///
121/// There is a blanket implementation of `SuiVerifier` for all `T` where `T:
122/// `[`Verifier`]`<`[`UserSignature`]`>` so it is generally recommended for a signer to implement
123/// `Verifier<UserSignature>` and rely on the blanket implementation which handles the proper
124/// construction of the signing message.
125pub trait SuiVerifier {
126    fn verify_transaction(
127        &self,
128        transaction: &Transaction,
129        signature: &UserSignature,
130    ) -> Result<(), SignatureError>;
131    fn verify_personal_message(
132        &self,
133        message: &PersonalMessage<'_>,
134        signature: &UserSignature,
135    ) -> Result<(), SignatureError>;
136}
137
138impl<T: Verifier<UserSignature>> SuiVerifier for T {
139    fn verify_transaction(
140        &self,
141        transaction: &Transaction,
142        signature: &UserSignature,
143    ) -> Result<(), SignatureError> {
144        let message = transaction.signing_digest();
145        self.verify(&message, signature)
146    }
147
148    fn verify_personal_message(
149        &self,
150        message: &PersonalMessage<'_>,
151        signature: &UserSignature,
152    ) -> Result<(), SignatureError> {
153        let message = message.signing_digest();
154        self.verify(&message, signature)
155    }
156}