chore: sdgb 1.40 stopped service
This commit is contained in:
@@ -9,36 +9,7 @@ use flate2::write::{ZlibDecoder, ZlibEncoder};
|
|||||||
use spdlog::debug;
|
use spdlog::debug;
|
||||||
|
|
||||||
use crate::error::ApiError;
|
use crate::error::ApiError;
|
||||||
use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_40, Sdgb1_50};
|
use crate::title::{MaiVersion, MaiVersionExt, Sdgb1_50};
|
||||||
|
|
||||||
impl MaiVersionExt for Sdgb1_40 {
|
|
||||||
fn decode(mut data: impl AsMut<[u8]>) -> Result<Vec<u8>, ApiError> {
|
|
||||||
let mut decompressed = decompress(data.as_mut());
|
|
||||||
if decompressed.is_empty() {
|
|
||||||
return Err(ApiError::EmptyResponse);
|
|
||||||
}
|
|
||||||
|
|
||||||
let orig_len = decompressed.len();
|
|
||||||
|
|
||||||
let remain = 16 - decompressed.len() % 16;
|
|
||||||
|
|
||||||
if
|
|
||||||
// weird but nessacary for Rust Pkcs7
|
|
||||||
remain != 16 {
|
|
||||||
decompressed.resize(remain + orig_len, remain as _);
|
|
||||||
}
|
|
||||||
|
|
||||||
let unpad_size = decrypt(&mut decompressed, Self::AES_KEY, Self::AES_IV)?.len();
|
|
||||||
decompressed.truncate(unpad_size);
|
|
||||||
Ok(decompressed)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn encode(data: impl AsRef<[u8]>) -> Result<Vec<u8>, ApiError> {
|
|
||||||
let enc = encrypt(data, Self::AES_KEY, Self::AES_IV)?;
|
|
||||||
let compressed = compress(enc)?;
|
|
||||||
Ok(compressed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MaiVersionExt for Sdgb1_50 {
|
impl MaiVersionExt for Sdgb1_50 {
|
||||||
fn decode(mut data: impl AsMut<[u8]>) -> Result<Vec<u8>, ApiError> {
|
fn decode(mut data: impl AsMut<[u8]>) -> Result<Vec<u8>, ApiError> {
|
||||||
@@ -110,21 +81,6 @@ mod _tests {
|
|||||||
|
|
||||||
use crate::title::{Sdgb1_50, encryption::*};
|
use crate::title::{Sdgb1_50, encryption::*};
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_sdgb_140_dec_enc() -> Result<(), ApiError> {
|
|
||||||
let data = [
|
|
||||||
120_u8, 156, 171, 77, 91, 233, 184, 108, 2, 71, 125, 142, 118, 135, 112, 181, 85, 217,
|
|
||||||
239, 243, 159, 153, 248, 98, 159, 185, 63, 43, 173, 106, 221, 115, 104, 105, 221, 107,
|
|
||||||
0, 241, 176, 16, 37,
|
|
||||||
];
|
|
||||||
|
|
||||||
let dec = Sdgb1_40::decode(data)?;
|
|
||||||
assert_eq!(dec, br#"{"result":"Pong"}"#);
|
|
||||||
let enc = Sdgb1_40::encode(dec)?;
|
|
||||||
assert_eq!(enc, data);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_sdgb_150_dec_enc() -> Result<(), ApiError> {
|
fn test_sdgb_150_dec_enc() -> Result<(), ApiError> {
|
||||||
let data = [
|
let data = [
|
||||||
|
|||||||
@@ -117,16 +117,8 @@ pub trait MaiVersionExt: MaiVersion {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Sdgb1_40;
|
|
||||||
pub struct Sdgb1_50;
|
pub struct Sdgb1_50;
|
||||||
|
|
||||||
impl MaiVersion for Sdgb1_40 {
|
|
||||||
const AES_KEY: &[u8; 32] = b"n7bx6:@Fg_:2;5E89Phy7AyIcpxEQ:R@";
|
|
||||||
const AES_IV: &[u8; 16] = b";;KjR1C3hgB1ovXa";
|
|
||||||
const OBFUSECATE_SUFFIX: &str = "MaimaiChnBEs2D5vW";
|
|
||||||
|
|
||||||
const VERSION: &str = "1.40";
|
|
||||||
}
|
|
||||||
impl MaiVersion for Sdgb1_50 {
|
impl MaiVersion for Sdgb1_50 {
|
||||||
const AES_KEY: &[u8; 32] = b"a>32bVP7v<63BVLkY[xM>daZ1s9MBP<R";
|
const AES_KEY: &[u8; 32] = b"a>32bVP7v<63BVLkY[xM>daZ1s9MBP<R";
|
||||||
const AES_IV: &[u8; 16] = b"d6xHIKq]1J]Dt^ue";
|
const AES_IV: &[u8; 16] = b"d6xHIKq]1J]Dt^ue";
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ use sdgb_api::{
|
|||||||
auth_lite::{SDGB, SDHJ, delivery_raw},
|
auth_lite::{SDGB, SDHJ, delivery_raw},
|
||||||
helper::MUSIC_DB,
|
helper::MUSIC_DB,
|
||||||
title::{
|
title::{
|
||||||
MaiVersionExt, Sdgb1_40, Sdgb1_50,
|
MaiVersionExt, Sdgb1_50,
|
||||||
methods::APIMethod,
|
methods::APIMethod,
|
||||||
model::{
|
model::{
|
||||||
DataVersion, DxCalculatedEntries, DxRatingNet, GetUserDataApi, GetUserDataApiResp,
|
DataVersion, DxCalculatedEntries, DxRatingNet, GetUserDataApi, GetUserDataApiResp,
|
||||||
@@ -167,14 +167,6 @@ async fn main() -> Result<(), Box<dyn snafu::Error>> {
|
|||||||
human_readable_display(preview, human_readable)?;
|
human_readable_display(preview, human_readable)?;
|
||||||
}
|
}
|
||||||
commands::Commands::Ping => {
|
commands::Commands::Ping => {
|
||||||
let decoded: PingResp = Sdgb1_40::request(
|
|
||||||
&client,
|
|
||||||
APIMethod::Ping,
|
|
||||||
"",
|
|
||||||
Ping {}, // note: must not be `Ping`, or serde_json serializes to nothing
|
|
||||||
)
|
|
||||||
.await?;
|
|
||||||
info!("sdgb 1.40 resp: {decoded}");
|
|
||||||
let decoded: PingResp =
|
let decoded: PingResp =
|
||||||
Sdgb1_50::request(&client, APIMethod::Ping, "", Ping {}).await?;
|
Sdgb1_50::request(&client, APIMethod::Ping, "", Ping {}).await?;
|
||||||
info!("sdgb 1.50 resp: {decoded}");
|
info!("sdgb 1.50 resp: {decoded}");
|
||||||
|
|||||||
Reference in New Issue
Block a user