mirror of
https://github.com/librespot-org/librespot.git
synced 2024-11-08 16:45:43 +00:00
Prevent a few potential panics
This commit is contained in:
parent
e51f475a00
commit
9b6e02fa0d
4 changed files with 15 additions and 3 deletions
|
@ -418,7 +418,7 @@ pub(super) async fn audio_file_fetch(
|
||||||
None => break,
|
None => break,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data = file_data_rx.recv() => {
|
data = file_data_rx.recv() => {
|
||||||
match data {
|
match data {
|
||||||
Some(data) => {
|
Some(data) => {
|
||||||
if fetch.handle_file_data(data)? == ControlFlow::Break {
|
if fetch.handle_file_data(data)? == ControlFlow::Break {
|
||||||
|
|
|
@ -15,6 +15,8 @@ use crate::{protocol::authentication::AuthenticationType, Error};
|
||||||
pub enum AuthenticationError {
|
pub enum AuthenticationError {
|
||||||
#[error("unknown authentication type {0}")]
|
#[error("unknown authentication type {0}")]
|
||||||
AuthType(u32),
|
AuthType(u32),
|
||||||
|
#[error("invalid key")]
|
||||||
|
Key,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<AuthenticationError> for Error {
|
impl From<AuthenticationError> for Error {
|
||||||
|
@ -90,6 +92,10 @@ impl Credentials {
|
||||||
|
|
||||||
let key = {
|
let key = {
|
||||||
let mut key = [0u8; 24];
|
let mut key = [0u8; 24];
|
||||||
|
if key.len() < 20 {
|
||||||
|
return Err(AuthenticationError::Key.into());
|
||||||
|
}
|
||||||
|
|
||||||
pbkdf2::<Hmac<Sha1>>(&secret, username.as_bytes(), 0x100, &mut key[0..20]);
|
pbkdf2::<Hmac<Sha1>>(&secret, username.as_bytes(), 0x100, &mut key[0..20]);
|
||||||
|
|
||||||
let hash = &Sha1::digest(&key[..20]);
|
let hash = &Sha1::digest(&key[..20]);
|
||||||
|
|
|
@ -448,6 +448,7 @@ async fn connect(
|
||||||
e = keep_flushing(&mut ws_tx) => {
|
e = keep_flushing(&mut ws_tx) => {
|
||||||
break Err(e)
|
break Err(e)
|
||||||
}
|
}
|
||||||
|
else => (),
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -107,9 +107,14 @@ impl RequestHandler {
|
||||||
let client_key = base64::decode(client_key.as_bytes())?;
|
let client_key = base64::decode(client_key.as_bytes())?;
|
||||||
let shared_key = self.keys.shared_secret(&client_key);
|
let shared_key = self.keys.shared_secret(&client_key);
|
||||||
|
|
||||||
|
let encrypted_blob_len = encrypted_blob.len();
|
||||||
|
if encrypted_blob_len < 16 {
|
||||||
|
return Err(DiscoveryError::HmacError(encrypted_blob.to_vec()).into());
|
||||||
|
}
|
||||||
|
|
||||||
let iv = &encrypted_blob[0..16];
|
let iv = &encrypted_blob[0..16];
|
||||||
let encrypted = &encrypted_blob[16..encrypted_blob.len() - 20];
|
let encrypted = &encrypted_blob[16..encrypted_blob_len - 20];
|
||||||
let cksum = &encrypted_blob[encrypted_blob.len() - 20..encrypted_blob.len()];
|
let cksum = &encrypted_blob[encrypted_blob_len - 20..encrypted_blob_len];
|
||||||
|
|
||||||
let base_key = Sha1::digest(&shared_key);
|
let base_key = Sha1::digest(&shared_key);
|
||||||
let base_key = &base_key[..16];
|
let base_key = &base_key[..16];
|
||||||
|
|
Loading…
Reference in a new issue