8
8
9
9
//! Key Exchange group implementation for Curve25519
10
10
11
- use curve25519_dalek:: constants:: X25519_BASEPOINT ;
12
11
use curve25519_dalek:: montgomery:: MontgomeryPoint ;
13
- use curve25519_dalek:: scalar:: Scalar ;
12
+ use curve25519_dalek:: scalar:: { self , Scalar } ;
14
13
use curve25519_dalek:: traits:: Identity ;
15
14
use digest:: core_api:: BlockSizeUser ;
16
15
use digest:: { FixedOutput , HashMarker , OutputSizeUser } ;
@@ -29,7 +28,7 @@ pub struct Curve25519;
29
28
impl KeGroup for Curve25519 {
30
29
type Pk = MontgomeryPoint ;
31
30
type PkLen = U32 ;
32
- type Sk = Scalar ;
31
+ type Sk = [ u8 ; 32 ] ;
33
32
type SkLen = U32 ;
34
33
35
34
fn serialize_pk ( pk : Self :: Pk ) -> GenericArray < u8 , Self :: PkLen > {
@@ -50,9 +49,9 @@ impl KeGroup for Curve25519 {
50
49
// Sample 32 random bytes and then clamp, as described in https://cr.yp.to/ecdh.html
51
50
let mut scalar_bytes = [ 0u8 ; 32 ] ;
52
51
rng. fill_bytes ( & mut scalar_bytes) ;
53
- let scalar = Scalar :: from_bits_clamped ( scalar_bytes) ;
52
+ let scalar = scalar :: clamp_integer ( scalar_bytes) ;
54
53
55
- if scalar != Scalar :: ZERO {
54
+ if scalar != Scalar :: ZERO . to_bytes ( ) {
56
55
break scalar;
57
56
}
58
57
}
@@ -73,34 +72,34 @@ impl KeGroup for Curve25519 {
73
72
<CS :: Hash as OutputSizeUser >:: OutputSize :
74
73
IsLess < U256 > + IsLessOrEqual < <CS :: Hash as BlockSizeUser >:: BlockSize > ,
75
74
{
76
- Ok ( Scalar :: from_bits_clamped ( seed. into ( ) ) )
75
+ Ok ( scalar :: clamp_integer ( seed. into ( ) ) )
77
76
}
78
77
79
78
fn is_zero_scalar ( scalar : Self :: Sk ) -> subtle:: Choice {
80
- scalar. ct_eq ( & Scalar :: ZERO )
79
+ scalar. ct_eq ( & Scalar :: ZERO . to_bytes ( ) )
81
80
}
82
81
83
82
fn public_key ( sk : Self :: Sk ) -> Self :: Pk {
84
- X25519_BASEPOINT * sk
83
+ MontgomeryPoint :: mul_base_clamped ( sk )
85
84
}
86
85
87
86
fn diffie_hellman ( pk : Self :: Pk , sk : Self :: Sk ) -> GenericArray < u8 , Self :: PkLen > {
88
- Self :: serialize_pk ( sk * pk )
87
+ Self :: serialize_pk ( pk . mul_clamped ( sk ) )
89
88
}
90
89
91
90
fn serialize_sk ( sk : Self :: Sk ) -> GenericArray < u8 , Self :: SkLen > {
92
- sk. to_bytes ( ) . into ( )
91
+ sk. into ( )
93
92
}
94
93
95
94
fn deserialize_sk ( bytes : & [ u8 ] ) -> Result < Self :: Sk , InternalError > {
96
95
bytes
97
96
. try_into ( )
98
97
. ok ( )
99
98
. and_then ( |bytes| {
100
- let scalar = Scalar :: from_bits_clamped ( bytes) ;
101
- ( scalar. as_bytes ( ) == & bytes) . then_some ( scalar)
99
+ let scalar = scalar :: clamp_integer ( bytes) ;
100
+ ( scalar == bytes) . then_some ( scalar)
102
101
} )
103
- . filter ( |scalar| scalar != & Scalar :: ZERO )
102
+ . filter ( |scalar| scalar != & Scalar :: ZERO . to_bytes ( ) )
104
103
. ok_or ( InternalError :: PointError )
105
104
}
106
105
}
0 commit comments