aboutsummaryrefslogtreecommitdiff
path: root/server/src/Model/HashedPassword.hs
blob: c71e3728e336fa58ec33e2be6e453f32157f8a49 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
module Model.HashedPassword
  ( hash
  , check
  , HashedPassword(..)
  ) where

import qualified Crypto.BCrypt         as BCrypt
import           Data.Text             (Text)
import qualified Data.Text.Encoding    as TE

import           Common.Model.Password (Password (..))

newtype HashedPassword = HashedPassword Text deriving (Show)

hash :: Password -> IO (Maybe HashedPassword)
hash (Password p) = do
  hashed <- BCrypt.hashPasswordUsingPolicy BCrypt.slowerBcryptHashingPolicy (TE.encodeUtf8 p)
  case hashed of
    Nothing ->
      return Nothing

    Just h ->
      return . Just . HashedPassword . TE.decodeUtf8 $ h

check :: Password -> HashedPassword -> Bool
check (Password p) (HashedPassword h) =
  BCrypt.validatePassword (TE.encodeUtf8 h) (TE.encodeUtf8 p)