1+ use super :: * ;
2+ use ed25519_dalek:: Signer as _;
3+ use ed25519:: signature:: Keypair as _;
4+
5+ #[ derive( Debug ) ]
6+ #[ derive( Clone ) ]
7+ #[ derive( PartialEq ) ]
8+ #[ derive( Eq ) ]
9+ #[ derive( derive_more:: Deref ) ]
10+ #[ derive( derive_more:: DerefMut ) ]
11+ pub struct SignedVerified {
12+ pk : PublicKey ,
13+ #[ deref]
14+ #[ deref_mut]
15+ content : Vec < u8 >
16+ }
17+
18+ impl SignedVerified {
19+ pub fn pk ( & self ) -> & PublicKey {
20+ & self . pk
21+ }
22+
23+ pub fn content ( & self ) -> & [ u8 ] {
24+ & self . content
25+ }
26+
27+ pub fn unpack ( self ) -> ( PublicKey , Unsigned ) {
28+ let mg: Unsigned = self . content . into ( ) ;
29+ ( self . pk , mg)
30+ }
31+ }
32+
33+ impl TryFrom < SignedUnverified > for SignedVerified {
34+ type Error = Box < dyn std:: error:: Error > ;
35+
36+ fn try_from ( value : SignedUnverified ) -> std:: result:: Result < Self , Self :: Error > {
37+ let ( sg, pk, mg) = value. unpack ( ) ;
38+
39+ sg. verify ( & mg, & pk) ?;
40+
41+ let Unsigned ( content) = mg;
42+ Ok ( Self {
43+ pk : pk. to_owned ( ) ,
44+ content
45+ } )
46+ }
47+ }
48+
49+ #[ derive( Debug ) ]
50+ #[ derive( Clone ) ]
51+ #[ derive( PartialEq ) ]
52+ #[ derive( Eq ) ]
53+ #[ derive( serde:: Serialize ) ]
54+ #[ derive( serde:: Deserialize ) ]
55+ #[ derive( derive_more:: Deref ) ]
56+ #[ derive( derive_more:: DerefMut ) ]
57+ #[ serde( try_from = "Vec<u8>" ) ]
58+ pub struct SignedUnverified ( Vec < u8 > ) ;
59+
60+ impl SignedUnverified {
61+ pub fn verify ( self ) -> Result < SignedVerified > {
62+ self . try_into ( )
63+ }
64+
65+ pub fn unpack ( self ) -> ( Signature , PublicKey , Unsigned ) {
66+ let Self ( mut bytes) = self ;
67+ let mut mgpk: Vec < _ > = bytes. split_off ( 64 ) ;
68+ let mg: Vec < _ > = mgpk. split_off ( 32 ) ;
69+ let mg: Unsigned = mg. try_into ( ) . expect ( "unsigned content slice is guaranteed to be non-empty via constructors" ) ;
70+ let pk: [ _ ; _] = mgpk. as_slice ( ) . try_into ( ) . expect ( "public key state corruption; must equal 32 bytes" ) ;
71+ let pk: PublicKey = pk. into ( ) ;
72+ let sg: [ _ ; _] = bytes. as_slice ( ) . try_into ( ) . expect ( "signature state corruption; remaining bytes must equal 64; guaranteed via constructors" ) ;
73+ let sg: Signature = sg. into ( ) ;
74+ ( sg, pk, mg)
75+ }
76+ }
77+
78+ impl From < ( & Unsigned , & SecretKey ) > for SignedUnverified {
79+ fn from ( value : ( & Unsigned , & SecretKey ) ) -> Self {
80+ let ( Unsigned ( mg) , SecretKey ( sk) ) = value;
81+ let sk: ed25519_dalek:: SigningKey = ed25519_dalek:: SigningKey :: from_bytes ( & sk) ;
82+ let pk: [ _ ; _] = sk. verifying_key ( ) . to_bytes ( ) ;
83+ let sg: ed25519_dalek:: Signature = sk. sign ( & mg) ;
84+ let sg: [ _ ; _] = sg. to_bytes ( ) ;
85+ let capacity: usize = 64 + 32 + mg. len ( ) ;
86+
87+ let mut bytes: Vec < _ > = Vec :: with_capacity ( capacity) ;
88+ bytes. extend_from_slice ( & sg) ;
89+ bytes. extend_from_slice ( & pk) ;
90+ bytes. extend_from_slice ( & mg) ;
91+
92+ Self ( bytes)
93+ }
94+ }
95+
96+ impl TryFrom < Vec < u8 > > for SignedUnverified {
97+ type Error = Box < dyn std:: error:: Error > ;
98+
99+ fn try_from ( value : Vec < u8 > ) -> std:: result:: Result < Self , Self :: Error > {
100+ if value. len ( ) <= 96 {
101+ return Err ( <Box < dyn std:: error:: Error > >:: from ( String :: from ( "signed message packet is too short" ) ) )
102+ }
103+ let content: & [ _ ] = & value[ 96 ..] ;
104+ if content. is_empty ( ) {
105+ return Err ( <Box < dyn std:: error:: Error > >:: from ( String :: from ( "signed message content cannot be empty" ) ) )
106+ }
107+ Ok ( Self ( value) )
108+ }
109+ }
110+
111+ #[ derive( Debug ) ]
112+ #[ derive( Clone ) ]
113+ #[ derive( PartialEq ) ]
114+ #[ derive( Eq ) ]
115+ #[ derive( serde:: Serialize ) ]
116+ #[ derive( serde:: Deserialize ) ]
117+ #[ derive( derive_more:: Deref ) ]
118+ #[ derive( derive_more:: DerefMut ) ]
119+ #[ serde( try_from = "Vec<u8>" ) ]
120+ pub struct Unsigned ( Vec < u8 > ) ;
121+
122+ impl Unsigned {
123+ pub fn sign ( & self , sk : & SecretKey ) -> SignedUnverified {
124+ ( self , sk) . into ( )
125+ }
126+ }
127+
128+ impl TryFrom < Vec < u8 > > for Unsigned {
129+ type Error = Box < dyn std:: error:: Error > ;
130+
131+ fn try_from ( value : Vec < u8 > ) -> std:: result:: Result < Self , Self :: Error > {
132+ if value. len ( ) == 0 {
133+ return Err ( <Box < dyn std:: error:: Error > >:: from ( String :: from ( "message too short" ) ) )
134+ }
135+ Ok ( Self ( value) )
136+ }
137+ }
138+
139+ #[ derive( Debug ) ]
140+ #[ derive( Clone ) ]
141+ #[ derive( PartialEq ) ]
142+ #[ derive( Eq ) ]
143+ #[ derive( derive_more:: From ) ]
144+ pub struct PublicKey ( [ u8 ; 32 ] ) ;
145+
146+ #[ derive( Debug ) ]
147+ #[ derive( Clone ) ]
148+ #[ derive( PartialEq ) ]
149+ #[ derive( Eq ) ]
150+ #[ derive( derive_more:: From ) ]
151+ pub struct SecretKey ( [ u8 ; 32 ] ) ;
152+
153+ #[ derive( Debug ) ]
154+ #[ derive( Clone ) ]
155+ #[ derive( PartialEq ) ]
156+ #[ derive( Eq ) ]
157+ #[ derive( derive_more:: From ) ]
158+ pub struct Signature ( [ u8 ; 64 ] ) ;
159+
160+ impl Signature {
161+ pub fn verify ( & self , mg : & [ u8 ] , pk : & PublicKey ) -> Result {
162+ let pk: ed25519_dalek:: VerifyingKey = ed25519_dalek:: VerifyingKey :: from_bytes ( & pk. 0 ) ?;
163+ let sg: ed25519_dalek:: Signature = ed25519_dalek:: Signature :: from_bytes ( & self . 0 ) ;
164+
165+ pk. verify ( mg, & sg)
166+ }
167+ }
168+
169+ #[ derive( Debug ) ]
170+ #[ derive( Clone ) ]
171+ #[ derive( PartialEq ) ]
172+ #[ derive( Eq ) ]
173+ #[ derive( derive_more:: From ) ]
174+ pub struct Pair ( ( PublicKey , SecretKey ) ) ;
175+
176+ impl Default for Pair {
177+ fn default ( ) -> Self {
178+ let sk: ed25519_dalek:: SigningKey = ed25519_dalek:: SigningKey :: generate ( & mut rand_core:: OsRng ) ;
179+ let vk: ed25519_dalek:: VerifyingKey = sk. verifying_key ( ) ;
180+ let vk: [ _ ; _] = vk. to_bytes ( ) ;
181+ let pk: PublicKey = PublicKey :: from ( vk) ;
182+ let sk: [ _ ; _] = sk. to_bytes ( ) ;
183+ let sk: SecretKey = SecretKey :: from ( sk) ;
184+
185+ Self :: from ( ( pk, sk) )
186+ }
187+ }
188+
189+ impl From < SecretKey > for Pair {
190+ fn from ( value : SecretKey ) -> Self {
191+ let SecretKey ( bytes) = value;
192+ let sk: ed25519_dalek:: SigningKey = ed25519_dalek:: SigningKey :: from_bytes ( & bytes) ;
193+ let vk: ed25519_dalek:: VerifyingKey = sk. verifying_key ( ) ;
194+ let vk: [ _ ; _] = vk. to_bytes ( ) ;
195+ let pk: PublicKey = PublicKey :: from ( vk) ;
196+ let sk: [ _ ; _] = sk. to_bytes ( ) ;
197+ let sk: SecretKey = SecretKey :: from ( sk) ;
198+
199+ Self :: from ( ( pk, sk) )
200+ }
201+ }
0 commit comments