mirror of
https://github.com/lifegpc/libtlg-rs.git
synced 2026-06-20 02:44:32 +08:00
Add support more signature Fix #1
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -1,2 +1,5 @@
|
||||
target/
|
||||
.vscode/
|
||||
*.tlg
|
||||
*.png
|
||||
*.tags
|
||||
|
||||
4
Cargo.lock
generated
4
Cargo.lock
generated
@@ -164,7 +164,7 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "libtlg-rs"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
dependencies = [
|
||||
"lazy_static",
|
||||
"overf",
|
||||
@@ -253,7 +253,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tlg"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"libtlg-rs",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "libtlg-rs"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
description = "Rust version of libtlg"
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
|
||||
@@ -32,6 +32,9 @@ pub fn is_valid_tlg(data: &[u8]) -> bool {
|
||||
data.starts_with(b"TLG0.0\x00sds\x1a")
|
||||
|| data.starts_with(b"TLG5.0\x00raw\x1a")
|
||||
|| data.starts_with(b"TLG6.0\x00raw\x1a")
|
||||
|| data.starts_with(b"XXXYYY\x00raw\x1a")
|
||||
|| data.starts_with(b"XXXZZZ\x00raw\x1a")
|
||||
|| data.starts_with(b"JKMXE8\x00raw\x1a")
|
||||
}
|
||||
|
||||
/// Check if it's a valid TLG.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
use crate::stream::ReadExt;
|
||||
use crate::stream::*;
|
||||
use crate::tvpgl::*;
|
||||
use crate::*;
|
||||
use overf::wrapping;
|
||||
@@ -328,12 +328,28 @@ fn load_tlg6<T: Read + Seek>(src: &mut T) -> Result<Tlg> {
|
||||
}
|
||||
|
||||
fn internal_load_tlg<T: Read + Seek>(src: &mut T) -> Result<Tlg> {
|
||||
let offset = src.stream_position()?;
|
||||
let mut mark = [0; 11];
|
||||
src.read_exact(&mut mark)?;
|
||||
if &mark == b"TLG5.0\x00raw\x1a" {
|
||||
load_tlg5(src)
|
||||
} else if &mark == b"TLG6.0\x00raw\x1a" {
|
||||
load_tlg6(src)
|
||||
} else if &mark == b"XXXYYY\x00raw\x1a" {
|
||||
let mut stream = XorStream::new(src);
|
||||
stream.set_key(offset + 0xC, 0xAB);
|
||||
stream.set_key(offset + 0x10, 0xAC);
|
||||
load_tlg5(&mut stream)
|
||||
} else if &mark == b"XXXZZZ\x00raw\x1a" {
|
||||
let mut stream = XorStream::new(src);
|
||||
stream.set_key(offset + 0xF, 0xAB);
|
||||
stream.set_key(offset + 0x13, 0xAC);
|
||||
load_tlg6(&mut stream)
|
||||
} else if &mark == b"JKMXE8\x00raw\x1a" {
|
||||
let mut stream = XorStream::new(src);
|
||||
stream.set_key(offset + 0xC, 0x1A);
|
||||
stream.set_key(offset + 0x10, 0x1C);
|
||||
load_tlg5(&mut stream)
|
||||
} else {
|
||||
Err(TlgError::InvalidFormat)
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
use std::io::Read;
|
||||
use std::collections::HashMap;
|
||||
#[cfg(feature = "encode")]
|
||||
use std::io::Write;
|
||||
use std::io::{Read, Seek, SeekFrom};
|
||||
|
||||
pub trait ReadExt {
|
||||
fn read_u32(&mut self) -> std::io::Result<u32>;
|
||||
@@ -37,3 +38,49 @@ impl<W: Write> WriteExt for W {
|
||||
self.write_all(&[value])
|
||||
}
|
||||
}
|
||||
|
||||
pub struct XorStream<R: Read + Seek> {
|
||||
inner: R,
|
||||
keys: HashMap<u64, u8>,
|
||||
}
|
||||
|
||||
impl<R: Read + Seek> XorStream<R> {
|
||||
pub fn new(inner: R) -> Self {
|
||||
Self {
|
||||
inner,
|
||||
keys: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn set_key(&mut self, offset: u64, key: u8) {
|
||||
self.keys.insert(offset, key);
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Read + Seek> Read for XorStream<R> {
|
||||
fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
|
||||
let pos = self.inner.stream_position()?;
|
||||
let bytes_read = self.inner.read(buf)?;
|
||||
for i in 0..bytes_read {
|
||||
if let Some(key) = self.keys.get(&(pos + i as u64)) {
|
||||
buf[i] ^= *key;
|
||||
}
|
||||
}
|
||||
Ok(bytes_read)
|
||||
}
|
||||
}
|
||||
|
||||
impl<R: Read + Seek> Seek for XorStream<R> {
|
||||
fn seek(&mut self, pos: SeekFrom) -> std::io::Result<u64> {
|
||||
self.inner.seek(pos)
|
||||
}
|
||||
fn rewind(&mut self) -> std::io::Result<()> {
|
||||
self.inner.rewind()
|
||||
}
|
||||
fn seek_relative(&mut self, offset: i64) -> std::io::Result<()> {
|
||||
self.inner.seek_relative(offset)
|
||||
}
|
||||
fn stream_position(&mut self) -> std::io::Result<u64> {
|
||||
self.inner.stream_position()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "tlg"
|
||||
version = "0.2.3"
|
||||
version = "0.2.4"
|
||||
description = "Tools to process TLG image file."
|
||||
edition = "2024"
|
||||
license = "MIT"
|
||||
|
||||
Reference in New Issue
Block a user