3
3
4
4
use crate :: high_level:: contexts:: EncryptionContext ;
5
5
use crate :: high_level:: utils:: make_rekey_factor;
6
- use crate :: internal:: arithmetic:: { GroupElement , ScalarNonZero , G } ;
6
+ use crate :: internal:: arithmetic:: { GroupElement , ScalarNonZero , ScalarTraits , G } ;
7
7
use derive_more:: { Deref , From } ;
8
8
use rand_core:: { CryptoRng , RngCore } ;
9
- use serde:: { Deserialize , Serialize } ;
9
+ use serde:: de:: { Error , Visitor } ;
10
+ use serde:: { Deserialize , Deserializer , Serialize , Serializer } ;
11
+ use std:: fmt:: Formatter ;
10
12
11
13
/// A global public key associated with the [`GlobalSecretKey`] from which session keys are derived.
12
14
/// Can also be used to encrypt messages against, if no session key is available or using a session
@@ -21,9 +23,43 @@ pub struct GlobalSecretKey(pub(crate) ScalarNonZero);
21
23
#[ derive( Copy , Clone , Eq , PartialEq , Debug , Deref , From , Serialize , Deserialize ) ]
22
24
pub struct SessionPublicKey ( pub GroupElement ) ;
23
25
/// A session secret key used to decrypt messages with.
24
- #[ derive( Copy , Clone , Debug , From , Serialize , Deserialize ) ]
26
+ #[ derive( Copy , Clone , Debug , From ) ]
25
27
pub struct SessionSecretKey ( pub ( crate ) ScalarNonZero ) ;
26
28
29
+ impl Serialize for SessionSecretKey {
30
+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
31
+ where
32
+ S : Serializer ,
33
+ {
34
+ serializer. serialize_str ( self . 0 . encode_as_hex ( ) . as_str ( ) )
35
+ }
36
+ }
37
+ impl < ' de > Deserialize < ' de > for SessionSecretKey {
38
+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
39
+ where
40
+ D : Deserializer < ' de > ,
41
+ {
42
+ struct SessionSecretKeyVisitor ;
43
+ impl Visitor < ' _ > for SessionSecretKeyVisitor {
44
+ type Value = SessionSecretKey ;
45
+ fn expecting ( & self , formatter : & mut Formatter ) -> std:: fmt:: Result {
46
+ formatter. write_str ( "a hex encoded string representing a SessionSecretKey" )
47
+ }
48
+
49
+ fn visit_str < E > ( self , v : & str ) -> Result < Self :: Value , E >
50
+ where
51
+ E : Error ,
52
+ {
53
+ ScalarNonZero :: decode_from_hex ( v)
54
+ . map ( SessionSecretKey )
55
+ . ok_or ( E :: custom ( format ! ( "invalid hex encoded string: {}" , v) ) )
56
+ }
57
+ }
58
+
59
+ deserializer. deserialize_str ( SessionSecretKeyVisitor )
60
+ }
61
+ }
62
+
27
63
/// A trait for public keys, which can be encoded and decoded from byte arrays and hex strings.
28
64
pub trait PublicKey {
29
65
fn value ( & self ) -> & GroupElement ;
0 commit comments