scanner: Include SHA256 hash in scan results
This commit is contained in:
parent
d084cb116f
commit
5e3eaba5f8
|
@ -219,6 +219,15 @@ version = "0.1.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
|
checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "block-buffer"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
|
||||||
|
dependencies = [
|
||||||
|
"generic-array",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bstr"
|
name = "bstr"
|
||||||
version = "0.2.16"
|
version = "0.2.16"
|
||||||
|
@ -649,6 +658,15 @@ dependencies = [
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "cpufeatures"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "crc"
|
name = "crc"
|
||||||
version = "1.8.1"
|
version = "1.8.1"
|
||||||
|
@ -1040,6 +1058,15 @@ version = "2.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
|
checksum = "524cbf6897b527295dff137cec09ecf3a05f4fddffd7dfcd1585403449e74198"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "digest"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
|
||||||
|
dependencies = [
|
||||||
|
"generic-array",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dirs"
|
name = "dirs"
|
||||||
version = "3.0.2"
|
version = "3.0.2"
|
||||||
|
@ -1458,6 +1485,16 @@ dependencies = [
|
||||||
"cfg-if 0.1.10",
|
"cfg-if 0.1.10",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "generic-array"
|
||||||
|
version = "0.14.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
|
||||||
|
dependencies = [
|
||||||
|
"typenum",
|
||||||
|
"version_check",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "getrandom"
|
name = "getrandom"
|
||||||
version = "0.2.3"
|
version = "0.2.3"
|
||||||
|
@ -1978,9 +2015,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.98"
|
version = "0.2.101"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
|
checksum = "3cb00336871be5ed2c8ed44b60ae9959dc5b9f08539422ed43f09e34ecaeba21"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libflate"
|
name = "libflate"
|
||||||
|
@ -2567,6 +2604,12 @@ version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
|
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "opaque-debug"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "openssl-probe"
|
name = "openssl-probe"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
|
@ -3183,6 +3226,7 @@ dependencies = [
|
||||||
"rayon",
|
"rayon",
|
||||||
"ruffle_core",
|
"ruffle_core",
|
||||||
"serde",
|
"serde",
|
||||||
|
"sha2",
|
||||||
"swf",
|
"swf",
|
||||||
"walkdir",
|
"walkdir",
|
||||||
]
|
]
|
||||||
|
@ -3336,6 +3380,19 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sha2"
|
||||||
|
version = "0.9.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa"
|
||||||
|
dependencies = [
|
||||||
|
"block-buffer",
|
||||||
|
"cfg-if 1.0.0",
|
||||||
|
"cpufeatures",
|
||||||
|
"digest",
|
||||||
|
"opaque-debug",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "shlex"
|
name = "shlex"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
|
@ -3763,6 +3820,12 @@ version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc"
|
checksum = "3e5d7cd7ab3e47dda6e56542f4bbf3824c15234958c6e1bd6aaa347e93499fdc"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "typenum"
|
||||||
|
version = "1.14.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-bidi"
|
name = "unicode-bidi"
|
||||||
version = "0.3.5"
|
version = "0.3.5"
|
||||||
|
|
|
@ -18,3 +18,4 @@ path-slash = "0.1.4"
|
||||||
swf = { path = "../swf" }
|
swf = { path = "../swf" }
|
||||||
rayon = "1.5.1"
|
rayon = "1.5.1"
|
||||||
crossbeam-channel = "0.5"
|
crossbeam-channel = "0.5"
|
||||||
|
sha2 = "0.9.8"
|
|
@ -13,6 +13,7 @@ use ruffle_core::backend::video::NullVideoBackend;
|
||||||
use ruffle_core::swf::{decompress_swf, parse_swf};
|
use ruffle_core::swf::{decompress_swf, parse_swf};
|
||||||
use ruffle_core::tag_utils::SwfMovie;
|
use ruffle_core::tag_utils::SwfMovie;
|
||||||
use ruffle_core::Player;
|
use ruffle_core::Player;
|
||||||
|
use sha2::{Digest, Sha256};
|
||||||
use swf::{FileAttributes, Tag};
|
use swf::{FileAttributes, Tag};
|
||||||
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -87,6 +88,7 @@ pub fn execute_report_main(execute_report_opt: ExecuteReportOpt) -> Result<(), s
|
||||||
|
|
||||||
let mut file_result = FileResults {
|
let mut file_result = FileResults {
|
||||||
progress: Progress::Nothing,
|
progress: Progress::Nothing,
|
||||||
|
hash: vec![],
|
||||||
testing_time: start.elapsed().as_millis(),
|
testing_time: start.elapsed().as_millis(),
|
||||||
name,
|
name,
|
||||||
error: None,
|
error: None,
|
||||||
|
@ -106,6 +108,10 @@ pub fn execute_report_main(execute_report_opt: ExecuteReportOpt) -> Result<(), s
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut hash = Sha256::new();
|
||||||
|
hash.update(&data[..]);
|
||||||
|
|
||||||
|
file_result.hash = hash.finalize().to_vec();
|
||||||
file_result.progress = Progress::Read;
|
file_result.progress = Progress::Read;
|
||||||
checkpoint(&mut file_result, &start, &mut writer)?;
|
checkpoint(&mut file_result, &start, &mut writer)?;
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,11 @@
|
||||||
//!
|
//!
|
||||||
//! The `FileResults` type in this module is used to report results of a scan.
|
//! The `FileResults` type in this module is used to report results of a scan.
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::de::{Error as DesError, Unexpected, Visitor};
|
||||||
|
use serde::ser::Error as SerError;
|
||||||
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
|
use std::fmt;
|
||||||
|
use std::fmt::Write;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub enum AvmType {
|
pub enum AvmType {
|
||||||
|
@ -28,8 +32,62 @@ pub enum Progress {
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub struct FileResults {
|
pub struct FileResults {
|
||||||
pub name: String,
|
pub name: String,
|
||||||
|
|
||||||
|
#[serde(serialize_with = "into_hex", deserialize_with = "from_hex")]
|
||||||
|
pub hash: Vec<u8>,
|
||||||
pub progress: Progress,
|
pub progress: Progress,
|
||||||
pub testing_time: u128,
|
pub testing_time: u128,
|
||||||
pub error: Option<String>,
|
pub error: Option<String>,
|
||||||
pub vm_type: Option<AvmType>,
|
pub vm_type: Option<AvmType>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Formats data as capital hex
|
||||||
|
fn into_hex<S>(hash: &[u8], s: S) -> Result<S::Ok, S::Error>
|
||||||
|
where
|
||||||
|
S: Serializer,
|
||||||
|
{
|
||||||
|
let mut out = String::with_capacity(2 * hash.len());
|
||||||
|
for byte in hash {
|
||||||
|
write!(out, "{:02X}", byte).map_err(|e| SerError::custom(e.to_string()))?;
|
||||||
|
}
|
||||||
|
|
||||||
|
s.serialize_str(&out)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parses hex strings into data
|
||||||
|
fn from_hex<'de, D>(d: D) -> Result<Vec<u8>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
struct HexVisitor();
|
||||||
|
|
||||||
|
impl Visitor<'_> for HexVisitor {
|
||||||
|
type Value = Vec<u8>;
|
||||||
|
|
||||||
|
fn expecting(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "A string of hex digits with even length")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
|
||||||
|
where
|
||||||
|
E: DesError,
|
||||||
|
{
|
||||||
|
let mut result = Vec::with_capacity(v.len() / 2);
|
||||||
|
|
||||||
|
for i in (0..v.len()).step_by(2) {
|
||||||
|
result.push(
|
||||||
|
u8::from_str_radix(
|
||||||
|
v.get(i..i + 2)
|
||||||
|
.ok_or_else(|| DesError::invalid_length(v.len(), &self))?,
|
||||||
|
16,
|
||||||
|
)
|
||||||
|
.map_err(|_| DesError::invalid_value(Unexpected::Str(v), &self))?,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
d.deserialize_str(HexVisitor())
|
||||||
|
}
|
||||||
|
|
|
@ -41,6 +41,7 @@ pub fn scan_file<P: AsRef<OsStr>>(exec_path: P, file: DirEntry, name: String) ->
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
let mut file_results = FileResults {
|
let mut file_results = FileResults {
|
||||||
name,
|
name,
|
||||||
|
hash: vec![],
|
||||||
progress: Progress::Nothing,
|
progress: Progress::Nothing,
|
||||||
testing_time: start.elapsed().as_millis(),
|
testing_time: start.elapsed().as_millis(),
|
||||||
error: None,
|
error: None,
|
||||||
|
@ -109,6 +110,7 @@ pub fn scan_main(opt: ScanOpt) -> Result<(), std::io::Error> {
|
||||||
|
|
||||||
writer.write_record(&[
|
writer.write_record(&[
|
||||||
"Filename",
|
"Filename",
|
||||||
|
"SHA256 Hash",
|
||||||
"Progress",
|
"Progress",
|
||||||
"Test Duration",
|
"Test Duration",
|
||||||
"Error",
|
"Error",
|
||||||
|
|
Loading…
Reference in New Issue