Add support more signature Fix #1

This commit is contained in:
2026-04-09 10:27:30 +08:00
parent 971a7c0d56
commit 57b016c238
7 changed files with 75 additions and 6 deletions

3
.gitignore vendored
View File

@@ -1,2 +1,5 @@
target/
.vscode/
*.tlg
*.png
*.tags

4
Cargo.lock generated
View File

@@ -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",

View File

@@ -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"

View File

@@ -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.

View File

@@ -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)
}

View File

@@ -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()
}
}

View File

@@ -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"