Skip to content
This repository was archived by the owner on Jan 22, 2025. It is now read-only.

Commit 5b4ecb0

Browse files
authored
Presigner KeypairUtil implementer (#8269)
automerge
1 parent 28b1154 commit 5b4ecb0

1 file changed

Lines changed: 97 additions & 0 deletions

File tree

sdk/src/signature.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use std::{
1616
path::Path,
1717
str::FromStr,
1818
};
19+
use thiserror::Error;
1920

2021
#[derive(Debug, Default)]
2122
pub struct Keypair(ed25519_dalek::Keypair);
@@ -160,6 +161,60 @@ impl KeypairUtil for Keypair {
160161
}
161162
}
162163

164+
impl<T> PartialEq<T> for Keypair
165+
where
166+
T: KeypairUtil,
167+
{
168+
fn eq(&self, other: &T) -> bool {
169+
self.pubkey() == other.pubkey()
170+
}
171+
}
172+
173+
#[derive(Debug, Default)]
174+
pub struct Presigner {
175+
pubkey: Pubkey,
176+
signature: Signature,
177+
}
178+
179+
impl Presigner {
180+
#[allow(dead_code)]
181+
fn new(pubkey: &Pubkey, signature: &Signature) -> Self {
182+
Self {
183+
pubkey: *pubkey,
184+
signature: *signature,
185+
}
186+
}
187+
}
188+
189+
#[derive(Debug, Error, PartialEq)]
190+
enum PresignerError {
191+
#[error("pre-generated signature cannot verify data")]
192+
VerificationFailure,
193+
}
194+
195+
impl KeypairUtil for Presigner {
196+
fn try_pubkey(&self) -> Result<Pubkey, Box<dyn error::Error>> {
197+
Ok(self.pubkey)
198+
}
199+
200+
fn try_sign_message(&self, message: &[u8]) -> Result<Signature, Box<dyn error::Error>> {
201+
if self.signature.verify(self.pubkey.as_ref(), message) {
202+
Ok(self.signature)
203+
} else {
204+
Err(PresignerError::VerificationFailure.into())
205+
}
206+
}
207+
}
208+
209+
impl<T> PartialEq<T> for Presigner
210+
where
211+
T: KeypairUtil,
212+
{
213+
fn eq(&self, other: &T) -> bool {
214+
self.pubkey() == other.pubkey()
215+
}
216+
}
217+
163218
pub fn read_keypair<R: Read>(reader: &mut R) -> Result<Keypair, Box<dyn error::Error>> {
164219
let bytes: Vec<u8> = serde_json::from_reader(reader)?;
165220
let dalek_keypair = ed25519_dalek::Keypair::from_bytes(&bytes)
@@ -367,4 +422,46 @@ mod tests {
367422
keypair_from_seed_phrase_and_passphrase(mnemonic.phrase(), passphrase).unwrap();
368423
assert_eq!(keypair.pubkey(), expected_keypair.pubkey());
369424
}
425+
426+
#[test]
427+
fn test_keypair() {
428+
let keypair = keypair_from_seed(&[0u8; 32]).unwrap();
429+
let pubkey = keypair.pubkey();
430+
let data = [1u8];
431+
let sig = keypair.sign_message(&data);
432+
433+
// KeypairUtil
434+
assert_eq!(keypair.try_pubkey().unwrap(), pubkey);
435+
assert_eq!(keypair.pubkey(), pubkey);
436+
assert_eq!(keypair.try_sign_message(&data).unwrap(), sig);
437+
assert_eq!(keypair.sign_message(&data), sig);
438+
439+
// PartialEq
440+
let keypair2 = keypair_from_seed(&[0u8; 32]).unwrap();
441+
assert_eq!(keypair, keypair2);
442+
}
443+
444+
#[test]
445+
fn test_presigner() {
446+
let keypair = keypair_from_seed(&[0u8; 32]).unwrap();
447+
let pubkey = keypair.pubkey();
448+
let data = [1u8];
449+
let sig = keypair.sign_message(&data);
450+
451+
// KeypairUtil
452+
let presigner = Presigner::new(&pubkey, &sig);
453+
assert_eq!(presigner.try_pubkey().unwrap(), pubkey);
454+
assert_eq!(presigner.pubkey(), pubkey);
455+
assert_eq!(presigner.try_sign_message(&data).unwrap(), sig);
456+
assert_eq!(presigner.sign_message(&data), sig);
457+
let bad_data = [2u8];
458+
assert!(presigner.try_sign_message(&bad_data).is_err());
459+
assert_eq!(presigner.sign_message(&bad_data), Signature::default());
460+
461+
// PartialEq
462+
assert_eq!(presigner, keypair);
463+
assert_eq!(keypair, presigner);
464+
let presigner2 = Presigner::new(&pubkey, &sig);
465+
assert_eq!(presigner, presigner2);
466+
}
370467
}

0 commit comments

Comments
 (0)