diff --git a/app/src/main/rust/Cargo.toml b/app/src/main/rust/Cargo.toml index 2158f261d..88500f59f 100644 --- a/app/src/main/rust/Cargo.toml +++ b/app/src/main/rust/Cargo.toml @@ -18,7 +18,8 @@ once_cell = { default-features = false, version = "1.19" } serde_cbor = "0.11" serde = { version = "1.0", features = ["derive"] } sha1 = { version = "0.10", features = ["asm"] } -base16ct = { version = "0.2" } +base16ct = { version = "0.2", features = ["std"] } +anyhow = { version = "1.0" } [profile.release] panic = "abort" diff --git a/app/src/main/rust/src/hash/mod.rs b/app/src/main/rust/src/hash/mod.rs new file mode 100644 index 000000000..d7fcb3fc0 --- /dev/null +++ b/app/src/main/rust/src/hash/mod.rs @@ -0,0 +1 @@ +mod sha1; diff --git a/app/src/main/rust/src/hash/sha1.rs b/app/src/main/rust/src/hash/sha1.rs new file mode 100644 index 000000000..2256d4edf --- /dev/null +++ b/app/src/main/rust/src/hash/sha1.rs @@ -0,0 +1,35 @@ +use anyhow::Result; +use base16ct::lower::encode_str; +use jni::objects::JClass; +use jni::sys::{jint, jstring}; +use jni::JNIEnv; +use jni_fn::jni_fn; +use sha1::{Digest, Sha1}; +use std::{fs::File, io::copy, os::fd::BorrowedFd}; +use throw_msg; + +pub fn file_sha1(mut file: File, digest: &mut [u8; 40]) -> Result<&str> { + let mut sha = Sha1::new(); + copy(&mut file, &mut sha)?; + Ok(encode_str(&sha.finalize(), digest)?) +} + +#[no_mangle] +#[allow(non_snake_case)] +#[jni_fn("com.hippo.ehviewer.jni.HashKt")] +pub fn sha1(mut env: JNIEnv, _class: JClass, fd: jint) -> jstring { + let borrowed_fd = unsafe { BorrowedFd::borrow_raw(fd) }; + let owned_fd = match borrowed_fd.try_clone_to_owned() { + Ok(fd) => fd, + Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring, + }; + let mut hex_digest = [0u8; 40]; + let hex = match file_sha1(File::from(owned_fd), &mut hex_digest) { + Ok(str) => str, + Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring, + }; + match env.new_string(hex) { + Ok(obj) => obj.into_raw(), + Err(err) => throw_msg(&mut env, &format!("{err}")) as jstring, + } +} diff --git a/app/src/main/rust/src/lib.rs b/app/src/main/rust/src/lib.rs index 0a7ca361d..b43f4f8cd 100644 --- a/app/src/main/rust/src/lib.rs +++ b/app/src/main/rust/src/lib.rs @@ -1,6 +1,8 @@ +mod hash; mod parser; extern crate android_logger; +extern crate anyhow; extern crate base16ct; extern crate jni; extern crate jni_fn; @@ -13,18 +15,13 @@ extern crate sha1; extern crate tl; use android_logger::Config; -use base16ct::lower::encode_str; -use jni::objects::{JByteBuffer, JClass}; -use jni::sys::{jint, jstring, JavaVM, JNI_VERSION_1_6}; +use jni::objects::JByteBuffer; +use jni::sys::{jint, JavaVM, JNI_VERSION_1_6}; use jni::JNIEnv; -use jni_fn::jni_fn; use log::LevelFilter; use serde::Serialize; -use sha1::{Digest, Sha1}; use std::ffi::c_void; -use std::fs::File; -use std::io::{copy, Cursor}; -use std::os::fd::BorrowedFd; +use std::io::Cursor; use std::ptr::slice_from_raw_parts_mut; use std::str::from_utf8_unchecked; use tl::{Bytes, Node, NodeHandle, Parser, VDom}; @@ -129,28 +126,3 @@ pub extern "system" fn JNI_OnLoad(_: JavaVM, _: *mut c_void) -> jint { android_logger::init_once(Config::default().with_max_level(LevelFilter::Debug)); JNI_VERSION_1_6 } - -#[no_mangle] -#[allow(non_snake_case)] -#[jni_fn("com.hippo.ehviewer.jni.HashKt")] -pub fn sha1(mut env: JNIEnv, _class: JClass, fd: jint) -> jstring { - let mut sha = Sha1::new(); - let borrowed_fd = unsafe { BorrowedFd::borrow_raw(fd) }; - let owned_fd = match borrowed_fd.try_clone_to_owned() { - Ok(fd) => fd, - Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring, - }; - if let Err(err) = copy(&mut File::from(owned_fd), &mut sha) { - return throw_msg(&mut env, &format!("{err}")) as jstring; - }; - let digest = sha.finalize(); - let mut hex_digest = [0u8; 40]; - let hex = match encode_str(&digest, &mut hex_digest) { - Ok(str) => str, - Err(err) => return throw_msg(&mut env, &format!("{err}")) as jstring, - }; - match env.new_string(hex) { - Ok(obj) => obj.into_raw(), - Err(err) => throw_msg(&mut env, &format!("{err}")) as jstring, - } -}