mirror of
https://github.com/Grasscutters/Cultivation.git
synced 2026-02-04 09:25:16 +01:00
Merge pull request #42 from Seeker14491/cpp-fix
Don't throw C++ exceptions into Rust
This commit is contained in:
11
src-tauri/Cargo.lock
generated
11
src-tauri/Cargo.lock
generated
@@ -719,7 +719,6 @@ dependencies = [
|
||||
"http",
|
||||
"hudsucker",
|
||||
"is_elevated",
|
||||
"libloading",
|
||||
"once_cell",
|
||||
"open",
|
||||
"rcgen",
|
||||
@@ -1887,16 +1886,6 @@ dependencies = [
|
||||
"pkg-config",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libloading"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "efbc0f03f9a775e9f6aed295c6a1ba2253c5757a9e03d55c6caa46a681abcddd"
|
||||
dependencies = [
|
||||
"cfg-if 1.0.0",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "line-wrap"
|
||||
version = "0.1.1"
|
||||
|
||||
@@ -56,7 +56,6 @@ futures-util = "0.3.14"
|
||||
rcgen = { version = "0.9", features = ["x509-parser"] }
|
||||
|
||||
# metadata stuff
|
||||
libloading = "0.7"
|
||||
regex = "1"
|
||||
|
||||
# other
|
||||
|
||||
Binary file not shown.
@@ -53,7 +53,7 @@ bool gen_global_metadata_key(uint8_t* src, size_t srcn) {
|
||||
return true;
|
||||
}
|
||||
|
||||
extern "C" void decrypt_global_metadata(uint8_t *data, size_t size) {
|
||||
void decrypt_global_metadata_inner(uint8_t *data, size_t size) {
|
||||
uint8_t longkey[0xB00];
|
||||
uint8_t longkeyp[0xB0];
|
||||
uint8_t shortkey[16];
|
||||
@@ -87,7 +87,16 @@ extern "C" void decrypt_global_metadata(uint8_t *data, size_t size) {
|
||||
recrypt_global_metadata_header_string_literals(data, size, literal_dec_key);
|
||||
}
|
||||
|
||||
extern "C" void encrypt_global_metadata(uint8_t* data, size_t size) {
|
||||
extern "C" int decrypt_global_metadata(uint8_t *data, size_t size) {
|
||||
try {
|
||||
decrypt_global_metadata_inner(data, size);
|
||||
return 0;
|
||||
} catch (...) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
void encrypt_global_metadata_inner(uint8_t* data, size_t size) {
|
||||
uint8_t literal_dec_key[0x5000];
|
||||
|
||||
gen_global_metadata_key(data + size - 0x4000, 0x4000);
|
||||
@@ -126,3 +135,12 @@ extern "C" void encrypt_global_metadata(uint8_t* data, size_t size) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" int encrypt_global_metadata(uint8_t* data, size_t size) {
|
||||
try {
|
||||
encrypt_global_metadata_inner(data, size);
|
||||
return 0;
|
||||
} catch (...) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
|
||||
extern "C" void decrypt_global_metadata(uint8_t *data, size_t size);
|
||||
extern "C" void encrypt_global_metadata(uint8_t *data, size_t size);
|
||||
extern "C" int decrypt_global_metadata(uint8_t *data, size_t size);
|
||||
extern "C" int encrypt_global_metadata(uint8_t *data, size_t size);
|
||||
|
||||
#endif //METADATA_H
|
||||
|
||||
@@ -4,29 +4,10 @@ use std::fs::OpenOptions;
|
||||
use std::io::Read;
|
||||
use std::io::Write;
|
||||
|
||||
// For these two functions, a non-zero return value indicates failure.
|
||||
extern "C" {
|
||||
fn decrypt_global_metadata(data: *mut u8, size: u64);
|
||||
fn encrypt_global_metadata(data: *mut u8, size: u64);
|
||||
}
|
||||
|
||||
fn dll_decrypt_global_metadata(
|
||||
data: *mut u8,
|
||||
size: u64,
|
||||
) -> Result<bool, Box<dyn std::error::Error>> {
|
||||
unsafe {
|
||||
decrypt_global_metadata(data, size);
|
||||
Ok(true)
|
||||
}
|
||||
}
|
||||
|
||||
fn dll_encrypt_global_metadata(
|
||||
data: *mut u8,
|
||||
size: u64,
|
||||
) -> Result<bool, Box<dyn std::error::Error>> {
|
||||
unsafe {
|
||||
encrypt_global_metadata(data, size);
|
||||
Ok(true)
|
||||
}
|
||||
fn decrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||
fn encrypt_global_metadata(data: *mut u8, size: usize) -> i32;
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
@@ -89,15 +70,13 @@ fn decrypt_metadata(file_path: &str) -> Vec<u8> {
|
||||
}
|
||||
|
||||
// Decrypt metadata file
|
||||
match dll_decrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) {
|
||||
Ok(_) => {
|
||||
println!("Successfully decrypted global-metadata");
|
||||
data
|
||||
}
|
||||
Err(e) => {
|
||||
println!("Failed to decrypt global-metadata: {}", e);
|
||||
Vec::new()
|
||||
}
|
||||
let success = unsafe { decrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||
if success {
|
||||
println!("Successfully decrypted global-metadata");
|
||||
data
|
||||
} else {
|
||||
println!("Failed to decrypt global-metadata");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -150,15 +129,13 @@ fn replace_rsa_key(old_data: &str, to_replace: &str, file_name: &str) -> String
|
||||
|
||||
fn encrypt_metadata(old_data: &[u8]) -> Vec<u8> {
|
||||
let mut data = old_data.to_vec();
|
||||
match dll_encrypt_global_metadata(data.as_mut_ptr(), data.len().try_into().unwrap()) {
|
||||
Ok(_) => {
|
||||
println!("Successfully encrypted global-metadata");
|
||||
data
|
||||
}
|
||||
Err(e) => {
|
||||
println!("Failed to encrypt global-metadata: {}", e);
|
||||
Vec::new()
|
||||
}
|
||||
let success = unsafe { encrypt_global_metadata(data.as_mut_ptr(), data.len()) } == 0;
|
||||
if success {
|
||||
println!("Successfully encrypted global-metadata");
|
||||
data
|
||||
} else {
|
||||
println!("Failed to encrypt global-metadata");
|
||||
Vec::new()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
"providerShortName": null,
|
||||
"signingIdentity": null
|
||||
},
|
||||
"resources": ["lang/*.json", "keys/*", "./mhycrypto.dll"],
|
||||
"resources": ["lang/*.json", "keys/*"],
|
||||
"targets": "all",
|
||||
"windows": {
|
||||
"allowDowngrades": false,
|
||||
|
||||
Reference in New Issue
Block a user