-- |
-- Module      : Crypto.TripleSec.Constants
-- License     : BSD-style
-- Maintainer  : Sam Protas <sam.protas@gmail.com>
-- Stability   : experimental
-- Portability : unknown
--
module Crypto.TripleSec.Constants where

import Data.Word

import qualified Crypto.KDF.Scrypt as Scrypt

import qualified Crypto.TripleSec.Internal as I
import           Crypto.TripleSec.Internal (ByteArray)


magicBytes :: [Word8]
magicBytes = [0x1c, 0x94, 0xd7, 0xde]

packedMagicBytes :: ByteArray ba => ba
packedMagicBytes = I.pack magicBytes

versionBytes :: [Word8]
versionBytes = [0x00, 0x00, 0x00, 0x03]

packedVersionBytes :: ByteArray ba => ba
packedVersionBytes = I.pack versionBytes

saltLen, macOutputLen, macKeyLen, cipherKeyLen, ivLen, salsaIvLen, totalIvLen, dkLen, overhead :: Int

saltLen = 16
macOutputLen = 64
macKeyLen = 48
cipherKeyLen = 32
ivLen = 16
salsaIvLen = 24
totalIvLen = 2 * ivLen + salsaIvLen
dkLen = 2 * macKeyLen + 3 * cipherKeyLen

overhead = length magicBytes + length versionBytes + saltLen + 2 * macOutputLen + totalIvLen

paramsScrypt :: Scrypt.Parameters
paramsScrypt = Scrypt.Parameters ((2 :: Word64) ^ (15 :: Word64)) 8 1 dkLen