wip
This commit is contained in:
parent
48817d1df8
commit
9b1ecd1b42
1 changed files with 117 additions and 0 deletions
117
apk_frauder/src/data_descriptor.rs
Normal file
117
apk_frauder/src/data_descriptor.rs
Normal file
|
|
@ -0,0 +1,117 @@
|
||||||
|
use crate::Signature;
|
||||||
|
use androscalpel_serializer::{ReadSeek, Result, Serializable};
|
||||||
|
use std::io::{SeekFrom, Write};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub enum DataDescriptor {
|
||||||
|
Zip32(DataDescriptor32),
|
||||||
|
Zip64(DataDescriptor64),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// DataDescriptor for 32bit zip format.
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub struct DataDescriptor32 {
|
||||||
|
// signature: Option<Signature(0x08074b50)>
|
||||||
|
pub crc_32: u32,
|
||||||
|
pub compressed_size: u32,
|
||||||
|
pub uncompressed_size: u32,
|
||||||
|
/// For reproducibility. This should be true when writting a zip, but can be false when
|
||||||
|
/// reading one. If we want to stick to the original, we need to keep this information.
|
||||||
|
pub use_signature: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// DataDescriptor for 64bit zip format.
|
||||||
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
pub struct DataDescriptor64 {
|
||||||
|
// signature: Option<Signature(0x08074b50)>
|
||||||
|
pub crc_32: u32,
|
||||||
|
pub compressed_size: u64,
|
||||||
|
pub uncompressed_size: u64,
|
||||||
|
/// For reproducibility. This should be true when writting a zip, but can be false when
|
||||||
|
/// reading one. If we want to stick to the original, we need to keep this information.
|
||||||
|
pub use_signature: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DataDescriptor32 {
|
||||||
|
const SIGNATURE: Signature = Signature(0x02014b50);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for DataDescriptor32 {
|
||||||
|
fn serialize(&self, output: &mut dyn Write) -> Result<()> {
|
||||||
|
if self.use_signature {
|
||||||
|
Self::SIGNATURE.serialize(output)?;
|
||||||
|
}
|
||||||
|
self.crc_32.serialize(output)?;
|
||||||
|
self.compressed_size.serialize(output)?;
|
||||||
|
self.uncompressed_size.serialize(output)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize(input: &mut dyn ReadSeek) -> Result<Self> {
|
||||||
|
let pos = input.stream_position().unwrap(); //TODO
|
||||||
|
let signature = Signature::deserialize(input)?;
|
||||||
|
let use_signature = if signature != Self::SIGNATURE {
|
||||||
|
input.seek(SeekFrom::Start(pos)).unwrap(); //TODO
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
};
|
||||||
|
let crc_32 = u32::deserialize(input)?;
|
||||||
|
let compressed_size = u32::deserialize(input)?;
|
||||||
|
let uncompressed_size = u32::deserialize(input)?;
|
||||||
|
Ok(Self {
|
||||||
|
crc_32,
|
||||||
|
compressed_size,
|
||||||
|
uncompressed_size,
|
||||||
|
use_signature,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fn size(&self) -> usize {
|
||||||
|
12 + if self.use_signature {
|
||||||
|
Self::SIGNATURE.size()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DataDescriptor64 {
|
||||||
|
const SIGNATURE: Signature = Signature(0x02014b50);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Serializable for DataDescriptor64 {
|
||||||
|
fn serialize(&self, output: &mut dyn Write) -> Result<()> {
|
||||||
|
if self.use_signature {
|
||||||
|
Self::SIGNATURE.serialize(output)?;
|
||||||
|
}
|
||||||
|
self.crc_32.serialize(output)?;
|
||||||
|
self.compressed_size.serialize(output)?;
|
||||||
|
self.uncompressed_size.serialize(output)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn deserialize(input: &mut dyn ReadSeek) -> Result<Self> {
|
||||||
|
let pos = input.stream_position().unwrap(); //TODO
|
||||||
|
let signature = Signature::deserialize(input)?;
|
||||||
|
let use_signature = if signature != Self::SIGNATURE {
|
||||||
|
input.seek(SeekFrom::Start(pos)).unwrap(); //TODO
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
};
|
||||||
|
let crc_32 = u32::deserialize(input)?;
|
||||||
|
let compressed_size = u64::deserialize(input)?;
|
||||||
|
let uncompressed_size = u64::deserialize(input)?;
|
||||||
|
Ok(Self {
|
||||||
|
crc_32,
|
||||||
|
compressed_size,
|
||||||
|
uncompressed_size,
|
||||||
|
use_signature,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
fn size(&self) -> usize {
|
||||||
|
20 + if self.use_signature {
|
||||||
|
Self::SIGNATURE.size()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue