module Data.VHD.CheckSum
	( adjustFooterChecksum
	, adjustHeaderChecksum
	, verifyFooterChecksum
	, verifyHeaderChecksum
	) where

import Data.VHD.Types
import Data.VHD.Serialize

import Data.Bits
import Data.Word
import Data.Serialize

import qualified Data.ByteString as B

plus :: CheckSum -> Word8 -> CheckSum
plus a b = a + fromIntegral b

getHeaderChecksum :: Header -> CheckSum
getHeaderChecksum header = complement $ B.foldl' plus 0 headerData
	where
		headerData = encode $ header { headerCheckSum = 0 }

getFooterChecksum :: Footer -> CheckSum
getFooterChecksum footer = complement $ B.foldl' plus 0 footerData
	where footerData = encode $ footer { footerCheckSum = 0 }

adjustFooterChecksum :: Footer -> Footer
adjustFooterChecksum f = f { footerCheckSum = checksum }
	where checksum = getFooterChecksum f

adjustHeaderChecksum :: Header -> Header
adjustHeaderChecksum h = h { headerCheckSum = checksum }
	where checksum = getHeaderChecksum h

verifyFooterChecksum :: Footer -> Bool
verifyFooterChecksum f = footerCheckSum f == checksum
	where checksum = getFooterChecksum f

verifyHeaderChecksum :: Header -> Bool
verifyHeaderChecksum h = headerCheckSum h == checksum
	where checksum = getHeaderChecksum h