packages feed

biscuit-haskell-0.2.0.0: test/Spec/RevocationIds.hs

{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE OverloadedStrings #-}
module Spec.RevocationIds
  ( specs
  ) where

import           Data.ByteString        (ByteString)
import qualified Data.ByteString        as ByteString
import qualified Data.ByteString.Base16 as Hex
import           Data.Functor           (void)
import           Data.List              (intersect)
import qualified Data.List.NonEmpty     as NE
import           Data.Maybe             (mapMaybe)
import           Test.Tasty
import           Test.Tasty.HUnit

import           Auth.Biscuit
import           Auth.Biscuit.Token     (getRevocationIds)

pk :: PublicKey
pk = maybe undefined id $ parsePublicKeyHex "acdd6d5b53bfee478bf689f8e012fe7988bf755e3d7c5152947abc149bc20189"

readFromFile :: FilePath -> IO (Biscuit OpenOrSealed Verified)
readFromFile path = do
  result <- parse pk <$> ByteString.readFile ("test/samples/v2/" <> path)
  case result of
    Left x  -> fail $ show x
    Right b -> pure b

readFromFileCheckRevocation :: [ByteString]
                            -> FilePath
                            -> IO (Either ParseError (Biscuit OpenOrSealed Verified))
readFromFileCheckRevocation revokedIds path =
  let parser = parseWith ParserConfig { encoding = RawBytes
                                      , getPublicKey = const pk
                                      , isRevoked = fromRevocationList revokedIds
                                      }
   in parser =<< ByteString.readFile ("test/samples/v2/" <> path)

getHex :: Biscuit OpenOrSealed Verified -> [ByteString]
getHex = NE.toList . fmap Hex.encode . getRevocationIds

specs :: TestTree
specs = testGroup "Revocation ids"
  [ testGroup "Computation"
      [ token1
      , token16
      ]
  , parseTimeCheck
  ]

token1 :: TestTree
token1 = testCase "Token 1" $ do
  b <- readFromFile "test1_basic.bc"
  let rids = getHex b
  rids @?=
    [ "9d3e984bd0447eea9f31a56df51ba606160c66102063dd29410a2c85601a2139ce0cd212daf755ed0b8fe1f0e9388a89074b009b7169499e51df83c308e8d20b"
    , "5cade9fd3690b72bf90c29c529cb5b1bb50832554ba525b15c5d3f7c994814af522c5a68d61a950bc5f98d9ff4e3e20ffecef65ddaa2858251768ec999ed8b06"
    ]

token16 :: TestTree
token16 = testCase "Token 16" $ do
  b <- readFromFile "test16_caveat_head_name.bc"
  let rids = getHex b
  rids @?=
    [ "aa8f26e32b6a55fe99decfb0f2c229776cc30360e5b68a5b06e730f1e9a13697f87929592f37b7b58dd00dececd6fa40540a3879f74bd232505f1c419907000c"
    , "02766fa2dbb0bd5a2d4d3fc4e0dd9252ec4dc118fe5bc0eafb67fbce0ddf6a86f4db7ecc0b1da14c210b8dcae53fcfc44565edb32ba18bfc9ca9f97258c4db0d"
    ]

parseTimeCheck :: TestTree
parseTimeCheck = testCase "Parse time revocation check" $ do
  let revokedIds :: [ByteString]
      revokedIds = mapMaybe fromHex [ "02766fa2dbb0bd5a2d4d3fc4e0dd9252ec4dc118fe5bc0eafb67fbce0ddf6a86f4db7ecc0b1da14c210b8dcae53fcfc44565edb32ba18bfc9ca9f97258c4db0d" ]
  res1 <- readFromFileCheckRevocation revokedIds "test16_caveat_head_name.bc"
  res1 @?= Left RevokedBiscuit
  res2 <- void <$> readFromFileCheckRevocation revokedIds "test1_basic.bc"
  res2 @?= Right ()