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