use crate::crypto::common::hmac_sha1;
use crate::crypto::utils::usage_ki;
use crate::crypto::{Checksum, ChecksumSuite, KerberosCryptoResult};

use super::{derive_key, DES3_MAC_SIZE};

#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct HmacSha1Des3Kd;

impl Checksum for HmacSha1Des3Kd {
    fn checksum_type(&self) -> ChecksumSuite {
        ChecksumSuite::HmacSha1Des3Kd
    }

    fn checksum(&self, key: &[u8], key_usage: i32, payload: &[u8]) -> KerberosCryptoResult<Vec<u8>> {
        let ki = derive_key(key, &usage_ki(key_usage))?;

        Ok(hmac_sha1(&ki, payload, DES3_MAC_SIZE))
    }
}
