//! 密码杂凑算法（Cryptographic Hash Algorthms）
//!
//! 密码杂凑算法是杂凑算法的一种。
//! 它被认为是一种单向算法，也就是说极其难以由杂凑算法输出的结果，回推输入的数据是什么。
//! 这种杂凑算法的输入数据，通常被称为消息，而它的输出结果，经常被称为消息摘要或摘要。\
//! A cryptographic hash function (CHF) is a hash algorithm that has special properties desirable for a cryptographic application.
//!
//! 在信息安全中，有许多重要的应用，都使用了密码杂凑算法来实现，例如数字签名、消息鉴别码。\
//! Cryptographic hash functions have many information-security applications,
//! notably in digital signatures, message authentication codes (MACs), and other forms of authentication.

pub(self) mod constants;
mod sha1;
mod sha1_block;
mod sha2;
mod sha2_block;
mod sm3;
mod sm3_block;


pub use self::sha1::SHA1;
pub use self::sha1_block::sha1;
pub use self::sha2::SHA2;
pub use self::sha2_block::{sha224, sha256, sha384, sha512};
pub use self::sm3::SM3;
pub use self::sm3_block::sm3;


/// 密码杂凑算法（Cryptographic Hash Algorithms）
pub enum CryptographicHash {
    /// SM3密码杂凑算法（ShangMi 3 Cryptographic Hash Algorithm）
    SM3,
    /// 安全散列算法1（Secure Hash Algorithm 1）
    SHA1,
    /// 安全散列算法2（224位）（Secure Hash Algorithm 2 - 224 bits）
    SHA224,
    /// 安全散列算法2（256位）（Secure Hash Algorithm 2 - 256 bits）
    SHA256,
    /// 安全散列算法2（384位）（Secure Hash Algorithm 2 - 384 bits）
    SHA384,
    /// 安全散列算法2（512位）（Secure Hash Algorithm 2 - 512 bits）
    SHA512,
}


/// 密码杂凑算法特性（Trait for Cryptographic Hash Algorithms）
pub trait CryptographicHashImpl {

    /// 密码杂凑算法的块长度。\
    /// Block size of the cryptographic hash algorithm.
    fn block_size(&self) -> usize;

    /// 密码杂凑算法的输出长度。\
    /// Output size of the cryptographic hash algorithm.
    fn output_size(&self) -> usize;

    /// 填入任意长度的待计算的消息。\
    /// Feed a message of any length to be calculated.
    ///
    /// # 参数（Arguments）
    ///
    /// * message - 消息（Message）
    ///
    ///   任意长度的消息。\
    ///   Message of any length.
    fn update(&mut self, message: &[u8]) -> Result<(), ()>;

    /// 结束填入待计算的消息。\
    /// End feeding in messages to be calculated.
    fn r#final(&mut self) -> Result<Vec<u8>, ()>;
}
