[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)?,