Skip to content

Commit 9964b46

Browse files
committed
Reuse librespot-core's Diffie Hellman in discovery
1 parent 173a363 commit 9964b46

File tree

3 files changed

+9
-20
lines changed

3 files changed

+9
-20
lines changed

Cargo.lock

-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

connect/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ futures-util = { version = "0.3", default_features = false }
1616
hmac = "0.10"
1717
hyper = { version = "0.14", features = ["server", "http1", "tcp"] }
1818
log = "0.4"
19-
num-bigint = "0.3"
2019
protobuf = "~2.14.0"
2120
rand = "0.8"
2221
serde = { version = "1.0", features = ["derive"] }

connect/src/discovery.rs

+9-18
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use futures_core::Stream;
55
use hmac::{Hmac, Mac, NewMac};
66
use hyper::service::{make_service_fn, service_fn};
77
use hyper::{Body, Method, Request, Response, StatusCode};
8-
use num_bigint::BigUint;
98
use serde_json::json;
109
use sha1::{Digest, Sha1};
1110
use tokio::sync::{mpsc, oneshot};
@@ -15,8 +14,7 @@ use dns_sd::DNSService;
1514

1615
use librespot_core::authentication::Credentials;
1716
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;
2018

2119
use std::borrow::Cow;
2220
use std::collections::BTreeMap;
@@ -34,8 +32,7 @@ struct Discovery(Arc<DiscoveryInner>);
3432
struct DiscoveryInner {
3533
config: ConnectConfig,
3634
device_id: String,
37-
private_key: BigUint,
38-
public_key: BigUint,
35+
keys: DHLocalKeys,
3936
tx: mpsc::UnboundedSender<Credentials>,
4037
}
4138

@@ -46,24 +43,18 @@ impl Discovery {
4643
) -> (Discovery, mpsc::UnboundedReceiver<Credentials>) {
4744
let (tx, rx) = mpsc::unbounded_channel();
4845

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-
5346
let discovery = Discovery(Arc::new(DiscoveryInner {
5447
config,
5548
device_id,
56-
private_key,
57-
public_key,
49+
keys: DHLocalKeys::random(&mut rand::thread_rng()),
5850
tx,
5951
}));
6052

6153
(discovery, rx)
6254
}
6355

6456
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());
6758

6859
let result = json!({
6960
"status": 101,
@@ -98,16 +89,16 @@ impl Discovery {
9889

9990
let encrypted_blob = base64::decode(encrypted_blob.as_bytes()).unwrap();
10091

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());
10596

10697
let iv = &encrypted_blob[0..16];
10798
let encrypted = &encrypted_blob[16..encrypted_blob.len() - 20];
10899
let cksum = &encrypted_blob[encrypted_blob.len() - 20..encrypted_blob.len()];
109100

110-
let base_key = Sha1::digest(&shared_key.to_bytes_be());
101+
let base_key = Sha1::digest(&shared_key);
111102
let base_key = &base_key[..16];
112103

113104
let checksum_key = {

0 commit comments

Comments
 (0)