module Data.Vhd.Checksum
	( adjustFooterChecksum
	, adjustHeaderChecksum
	, verifyFooterChecksum
	, verifyHeaderChecksum
	) where

import Data.Bits
import qualified Data.ByteString as B
import Data.Serialize
import Data.Vhd.Serialize
import Data.Vhd.Types
import Data.Word

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