packages feed

mldsa-0.1.0.0: tests/Vectors.hs

-- |
-- Module      : Vectors
-- License     : BSD-3-Clause
-- Copyright   : (c) 2025 Olivier Chéron
--
-- Common implementation of ML-DSA test vectors
--
{-# LANGUAGE OverloadedStrings #-}
module Vectors
    ( VectorFile(..), readJson
    ) where

import Data.Aeson
import qualified Data.ByteString.Lazy as L

import qualified Codec.Compression.GZip as GZip

data VectorFile tg = VectorFile
    { vsId :: Int
    , algorithm :: String
    , mode :: String
    , revision :: String
    , isSample :: Bool
    , testGroups :: [tg]
    } deriving Show

instance FromJSON tg => FromJSON (VectorFile tg) where
    parseJSON = withObject "File" $ \o -> VectorFile
        <$> o .: "vsId"
        <*> o .: "algorithm"
        <*> o .: "mode"
        <*> o .: "revision"
        <*> o .: "isSample"
        <*> o .: "testGroups"

readJson :: FromJSON tg => FilePath -> IO (VectorFile tg)
readJson path = do
    bs <- L.readFile path
    case decode (GZip.decompress bs) of
        Just file -> return file
        _         -> fail "could not parse"