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)