@@ -5,7 +5,6 @@ use futures_core::Stream;
5
5
use hmac:: { Hmac , Mac , NewMac } ;
6
6
use hyper:: service:: { make_service_fn, service_fn} ;
7
7
use hyper:: { Body , Method , Request , Response , StatusCode } ;
8
- use num_bigint:: BigUint ;
9
8
use serde_json:: json;
10
9
use sha1:: { Digest , Sha1 } ;
11
10
use tokio:: sync:: { mpsc, oneshot} ;
@@ -18,8 +17,7 @@ use libmdns;
18
17
19
18
use librespot_core:: authentication:: Credentials ;
20
19
use librespot_core:: config:: ConnectConfig ;
21
- use librespot_core:: diffie_hellman:: { DH_GENERATOR , DH_PRIME } ;
22
- use librespot_core:: util;
20
+ use librespot_core:: diffie_hellman:: DHLocalKeys ;
23
21
24
22
use std:: borrow:: Cow ;
25
23
use std:: collections:: BTreeMap ;
@@ -37,8 +35,7 @@ struct Discovery(Arc<DiscoveryInner>);
37
35
struct DiscoveryInner {
38
36
config : ConnectConfig ,
39
37
device_id : String ,
40
- private_key : BigUint ,
41
- public_key : BigUint ,
38
+ keys : DHLocalKeys ,
42
39
tx : mpsc:: UnboundedSender < Credentials > ,
43
40
}
44
41
@@ -49,24 +46,18 @@ impl Discovery {
49
46
) -> ( Discovery , mpsc:: UnboundedReceiver < Credentials > ) {
50
47
let ( tx, rx) = mpsc:: unbounded_channel ( ) ;
51
48
52
- let key_data = util:: rand_vec ( & mut rand:: thread_rng ( ) , 95 ) ;
53
- let private_key = BigUint :: from_bytes_be ( & key_data) ;
54
- let public_key = util:: powm ( & DH_GENERATOR , & private_key, & DH_PRIME ) ;
55
-
56
49
let discovery = Discovery ( Arc :: new ( DiscoveryInner {
57
50
config : config,
58
51
device_id : device_id,
59
- private_key : private_key,
60
- public_key : public_key,
52
+ keys : DHLocalKeys :: random ( & mut rand:: thread_rng ( ) ) ,
61
53
tx : tx,
62
54
} ) ) ;
63
55
64
56
( discovery, rx)
65
57
}
66
58
67
59
fn handle_get_info ( & self , _: BTreeMap < Cow < ' _ , str > , Cow < ' _ , str > > ) -> Response < hyper:: Body > {
68
- let public_key = self . 0 . public_key . to_bytes_be ( ) ;
69
- let public_key = base64:: encode ( & public_key) ;
60
+ let public_key = base64:: encode ( & self . 0 . keys . public_key ( ) ) ;
70
61
71
62
let result = json ! ( {
72
63
"status" : 101 ,
@@ -101,16 +92,16 @@ impl Discovery {
101
92
102
93
let encrypted_blob = base64:: decode ( encrypted_blob. as_bytes ( ) ) . unwrap ( ) ;
103
94
104
- let client_key = base64 :: decode ( client_key . as_bytes ( ) ) . unwrap ( ) ;
105
- let client_key = BigUint :: from_bytes_be ( & client_key ) ;
106
-
107
- let shared_key = util :: powm ( & client_key, & self . 0 . private_key , & DH_PRIME ) ;
95
+ let shared_key = self
96
+ . 0
97
+ . keys
98
+ . shared_secret ( & base64 :: decode ( client_key. as_bytes ( ) ) . unwrap ( ) ) ;
108
99
109
100
let iv = & encrypted_blob[ 0 ..16 ] ;
110
101
let encrypted = & encrypted_blob[ 16 ..encrypted_blob. len ( ) - 20 ] ;
111
102
let cksum = & encrypted_blob[ encrypted_blob. len ( ) - 20 ..encrypted_blob. len ( ) ] ;
112
103
113
- let base_key = Sha1 :: digest ( & shared_key. to_bytes_be ( ) ) ;
104
+ let base_key = Sha1 :: digest ( & shared_key) ;
114
105
let base_key = & base_key[ ..16 ] ;
115
106
116
107
let checksum_key = {
0 commit comments