packages feed

libjwt-typed-0.2: test/Interop/JWTHelpers.hs

{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}

module Interop.JWTHelpers
  ( mkSigner
  , SomeAlgorithm(..)
  , hmac256
  , none
  , rsa256
  , toHeaderAlg
  )
where

import           Web.Libjwt                     ( Algorithm(..)
                                                , SigningKey(..)
                                                , Secret(..)
                                                )
import           Libjwt.Algorithms              ( toHeaderAlg )

import qualified Env                           as E

import           Data.Maybe                     ( fromMaybe )

import qualified Web.JWT                       as JWT

data SomeAlgorithm = forall k . SigningKey k => SomeAlgorithm (Algorithm k)

hmac256 :: SomeAlgorithm
hmac256 =
  SomeAlgorithm
    $ HMAC256
        "MWNmYzExODA5OWFjOGM3NDNmMmM5Zjg5ZDc0YTM3M2VhMGNkMzA2MDY3ZjFhZDk5N2I3OTc5Yjdm\
        \NDg3NDBkMiAgLQo"

none :: SomeAlgorithm
none = SomeAlgorithm AlgNone

rsa256 :: SomeAlgorithm
rsa256 = SomeAlgorithm $ RSA256 E.testRsa2048KeyPair

mkSigner :: SomeAlgorithm -> Maybe JWT.Signer
mkSigner (SomeAlgorithm (HMAC256 secret)) =
  Just $ JWT.HMACSecret $ reveal secret
mkSigner (SomeAlgorithm (RSA256 pem)) = Just $ mkRSAPrivateKey pem
mkSigner (SomeAlgorithm AlgNone     ) = Nothing
mkSigner _                            = error "Unsupported alg"

mkRSAPrivateKey :: SigningKey k => k -> JWT.Signer
mkRSAPrivateKey k =
  let rsaSecret = getSigningKey k
  in  JWT.RSAPrivateKey
        $ fromMaybe (error $ "JWT.readRsaSecret on\n" ++ show rsaSecret)
        $ JWT.readRsaSecret rsaSecret