Skip to main content

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