module Signet.Unstable.Type.SymmetricSignature where

import qualified Crypto.Hash as Hash
import qualified Data.ByteArray as ByteArray
import qualified Data.ByteArray.Encoding as Encoding
import qualified Data.ByteString as ByteString
import qualified Data.Function as Function
import qualified Signet.Unstable.Exception.InvalidSymmetricSignature as InvalidSymmetricSignature
import qualified Signet.Unstable.Extra.Either as Either
import qualified Signet.Unstable.Extra.Maybe as Maybe

newtype SymmetricSignature
  = MkSymmetricSignature (Hash.Digest Hash.SHA256)
  deriving (Int -> SymmetricSignature -> ShowS
[SymmetricSignature] -> ShowS
SymmetricSignature -> String
(Int -> SymmetricSignature -> ShowS)
-> (SymmetricSignature -> String)
-> ([SymmetricSignature] -> ShowS)
-> Show SymmetricSignature
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SymmetricSignature -> ShowS
showsPrec :: Int -> SymmetricSignature -> ShowS
$cshow :: SymmetricSignature -> String
show :: SymmetricSignature -> String
$cshowList :: [SymmetricSignature] -> ShowS
showList :: [SymmetricSignature] -> ShowS
Show)

instance Eq SymmetricSignature where
  == :: SymmetricSignature -> SymmetricSignature -> Bool
(==) = (Digest SHA256 -> Digest SHA256 -> Bool)
-> (SymmetricSignature -> Digest SHA256)
-> SymmetricSignature
-> SymmetricSignature
-> Bool
forall b c a. (b -> b -> c) -> (a -> b) -> a -> a -> c
Function.on Digest SHA256 -> Digest SHA256 -> Bool
forall bs1 bs2.
(ByteArrayAccess bs1, ByteArrayAccess bs2) =>
bs1 -> bs2 -> Bool
ByteArray.constEq SymmetricSignature -> Digest SHA256
unwrap

unwrap :: SymmetricSignature -> Hash.Digest Hash.SHA256
unwrap :: SymmetricSignature -> Digest SHA256
unwrap (MkSymmetricSignature Digest SHA256
digest) = Digest SHA256
digest

parse :: ByteString.ByteString -> Either InvalidSymmetricSignature.InvalidSymmetricSignature SymmetricSignature
parse :: ByteString -> Either InvalidSymmetricSignature SymmetricSignature
parse ByteString
encoded = InvalidSymmetricSignature
-> Maybe SymmetricSignature
-> Either InvalidSymmetricSignature SymmetricSignature
forall e a. e -> Maybe a -> Either e a
Maybe.note (ByteString -> InvalidSymmetricSignature
InvalidSymmetricSignature.MkInvalidSymmetricSignature ByteString
encoded) (Maybe SymmetricSignature
 -> Either InvalidSymmetricSignature SymmetricSignature)
-> Maybe SymmetricSignature
-> Either InvalidSymmetricSignature SymmetricSignature
forall a b. (a -> b) -> a -> b
$ do
  byteString <- Either String ByteString -> Maybe ByteString
forall x a. Either x a -> Maybe a
Either.hush (Either String ByteString -> Maybe ByteString)
-> Either String ByteString -> Maybe ByteString
forall a b. (a -> b) -> a -> b
$ Base -> ByteString -> Either String ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> Either String bout
Encoding.convertFromBase Base
Encoding.Base64 ByteString
encoded
  MkSymmetricSignature <$> Hash.digestFromByteString (byteString :: ByteString.ByteString)

render :: SymmetricSignature -> ByteString.ByteString
render :: SymmetricSignature -> ByteString
render = Base -> Digest SHA256 -> ByteString
forall bin bout.
(ByteArrayAccess bin, ByteArray bout) =>
Base -> bin -> bout
Encoding.convertToBase Base
Encoding.Base64 (Digest SHA256 -> ByteString)
-> (SymmetricSignature -> Digest SHA256)
-> SymmetricSignature
-> ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SymmetricSignature -> Digest SHA256
unwrap