[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
+    }
+}