@@ -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} ;
@@ -15,8 +14,7 @@ use dns_sd::DNSService;
15
14
16
15
use librespot_core:: authentication:: Credentials ;
17
16
use librespot_core:: config:: ConnectConfig ;
18
- use librespot_core:: diffie_hellman:: { DH_GENERATOR , DH_PRIME } ;
19
- use librespot_core:: util;
17
+ use librespot_core:: diffie_hellman:: DHLocalKeys ;
20
18
21
19
use std:: borrow:: Cow ;
22
20
use std:: collections:: BTreeMap ;
@@ -34,8 +32,7 @@ struct Discovery(Arc<DiscoveryInner>);
34
32
struct DiscoveryInner {
35
33
config : ConnectConfig ,
36
34
device_id : String ,
37
- private_key : BigUint ,
38
- public_key : BigUint ,
35
+ keys : DHLocalKeys ,
39
36
tx : mpsc:: UnboundedSender < Credentials > ,
40
37
}
41
38
@@ -46,24 +43,18 @@ impl Discovery {
46
43
) -> ( Discovery , mpsc:: UnboundedReceiver < Credentials > ) {
47
44
let ( tx, rx) = mpsc:: unbounded_channel ( ) ;
48
45
49
- let key_data = util:: rand_vec ( & mut rand:: thread_rng ( ) , 95 ) ;
50
- let private_key = BigUint :: from_bytes_be ( & key_data) ;
51
- let public_key = util:: powm ( & DH_GENERATOR , & private_key, & DH_PRIME ) ;
52
-
53
46
let discovery = Discovery ( Arc :: new ( DiscoveryInner {
54
47
config,
55
48
device_id,
56
- private_key,
57
- public_key,
49
+ keys : DHLocalKeys :: random ( & mut rand:: thread_rng ( ) ) ,
58
50
tx,
59
51
} ) ) ;
60
52
61
53
( discovery, rx)
62
54
}
63
55
64
56
fn handle_get_info ( & self , _: BTreeMap < Cow < ' _ , str > , Cow < ' _ , str > > ) -> Response < hyper:: Body > {
65
- let public_key = self . 0 . public_key . to_bytes_be ( ) ;
66
- let public_key = base64:: encode ( & public_key) ;
57
+ let public_key = base64:: encode ( & self . 0 . keys . public_key ( ) ) ;
67
58
68
59
let result = json ! ( {
69
60
"status" : 101 ,
@@ -98,16 +89,16 @@ impl Discovery {
98
89
99
90
let encrypted_blob = base64:: decode ( encrypted_blob. as_bytes ( ) ) . unwrap ( ) ;
100
91
101
- let client_key = base64 :: decode ( client_key . as_bytes ( ) ) . unwrap ( ) ;
102
- let client_key = BigUint :: from_bytes_be ( & client_key ) ;
103
-
104
- let shared_key = util :: powm ( & client_key, & self . 0 . private_key , & DH_PRIME ) ;
92
+ let shared_key = self
93
+ . 0
94
+ . keys
95
+ . shared_secret ( & base64 :: decode ( client_key. as_bytes ( ) ) . unwrap ( ) ) ;
105
96
106
97
let iv = & encrypted_blob[ 0 ..16 ] ;
107
98
let encrypted = & encrypted_blob[ 16 ..encrypted_blob. len ( ) - 20 ] ;
108
99
let cksum = & encrypted_blob[ encrypted_blob. len ( ) - 20 ..encrypted_blob. len ( ) ] ;
109
100
110
- let base_key = Sha1 :: digest ( & shared_key. to_bytes_be ( ) ) ;
101
+ let base_key = Sha1 :: digest ( & shared_key) ;
111
102
let base_key = & base_key[ ..16 ] ;
112
103
113
104
let checksum_key = {
0 commit comments