[apkverify] Move HashAlgorithm to algorithms
Bug: 248999133
Test: libapkverify.test libapkverify.integration_test
Change-Id: I4b0b3f640187f8d6b1d0565678a84053250e6be9
diff --git a/libs/apkverify/src/algorithms.rs b/libs/apkverify/src/algorithms.rs
index ed2c1fc..6315606 100644
--- a/libs/apkverify/src/algorithms.rs
+++ b/libs/apkverify/src/algorithms.rs
@@ -16,7 +16,8 @@
//! Algorithms used for APK Signature Scheme.
-use anyhow::{ensure, Result};
+use anyhow::{ensure, Context, Result};
+use byteorder::{LittleEndian, ReadBytesExt};
use bytes::{Buf, Bytes};
use num_derive::{FromPrimitive, ToPrimitive};
use num_traits::{FromPrimitive, ToPrimitive};
@@ -25,6 +26,7 @@
use openssl::rsa::Padding;
use openssl::sign::Verifier;
use serde::{Deserialize, Serialize};
+use std::io::Read;
use crate::bytes_ext::ReadFromBytes;
@@ -203,3 +205,24 @@
VerityChunkedSha256,
ChunkedSha512,
}
+
+/// Hash algorithms.
+#[derive(Clone, Copy, Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
+#[repr(u32)]
+pub enum HashAlgorithm {
+ /// SHA-256
+ SHA256 = 1,
+}
+
+impl HashAlgorithm {
+ pub(crate) fn from_read<R: Read>(read: &mut R) -> Result<Self> {
+ let val = read.read_u32::<LittleEndian>()?;
+ Self::from_u32(val).context(format!("Unsupported hash algorithm: {}", val))
+ }
+}
+
+impl Default for HashAlgorithm {
+ fn default() -> Self {
+ HashAlgorithm::SHA256
+ }
+}
diff --git a/libs/apkverify/src/lib.rs b/libs/apkverify/src/lib.rs
index 359d963..f7cbb7e 100644
--- a/libs/apkverify/src/lib.rs
+++ b/libs/apkverify/src/lib.rs
@@ -26,6 +26,6 @@
mod v4;
mod ziputil;
-pub use algorithms::SignatureAlgorithmID;
+pub use algorithms::{HashAlgorithm, SignatureAlgorithmID};
pub use v3::{get_public_key_der, verify};
-pub use v4::{get_apk_digest, HashAlgorithm, V4Signature};
+pub use v4::{get_apk_digest, V4Signature};
diff --git a/libs/apkverify/src/v4.rs b/libs/apkverify/src/v4.rs
index 33e666f..715f742 100644
--- a/libs/apkverify/src/v4.rs
+++ b/libs/apkverify/src/v4.rs
@@ -26,7 +26,7 @@
use std::io::{copy, Cursor, Read, Seek, SeekFrom, Write};
use std::path::Path;
-use crate::algorithms::SignatureAlgorithmID;
+use crate::algorithms::{HashAlgorithm, SignatureAlgorithmID};
use crate::hashtree::*;
use crate::v3::extract_signer_and_apk_sections;
@@ -123,26 +123,6 @@
}
}
-/// Hash algorithm that can be used for idsig file.
-#[derive(Debug, PartialEq, Eq, FromPrimitive, ToPrimitive)]
-#[repr(u32)]
-pub enum HashAlgorithm {
- /// SHA2-256
- SHA256 = 1,
-}
-
-impl HashAlgorithm {
- fn from(val: u32) -> Result<HashAlgorithm> {
- Self::from_u32(val).ok_or_else(|| anyhow!("{} is an unsupported hash algorithm", val))
- }
-}
-
-impl Default for HashAlgorithm {
- fn default() -> Self {
- HashAlgorithm::SHA256
- }
-}
-
impl V4Signature<fs::File> {
/// Creates a `V4Signature` struct from the given idsig path.
pub fn from_idsig_path<P: AsRef<Path>>(idsig_path: P) -> Result<Self> {
@@ -239,7 +219,7 @@
// fields in the struct are also length encoded.
r.read_u32::<LittleEndian>()?;
Ok(HashingInfo {
- hash_algorithm: HashAlgorithm::from(r.read_u32::<LittleEndian>()?)?,
+ hash_algorithm: HashAlgorithm::from_read(&mut r)?,
log2_blocksize: r.read_u8()?,
salt: read_sized_array(&mut r)?,
raw_root_hash: read_sized_array(&mut r)?,