datacrypto 1.0.0 → 1.1.0
raw patch · 3 files changed
+57/−4 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Crypto: hash :: Int -> Word8 -> Word8
Files
- CHANGELOG.md +6/−1
- datacrypto.cabal +4/−2
- src/Data/Crypto.hs +47/−1
CHANGELOG.md view
@@ -1,5 +1,10 @@ # Revision history for crypto -## 0.1.0.0 -- YYYY-mm-dd+## 1.1.0 -- 2025-01-05++* Added a hash function+* Added documentation++## 1.0.0 -- 2025-01-04 * First version. Released on an unsuspecting world.
datacrypto.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: datacrypto-version: 1.0.0+version: 1.1.0 license: MIT author: jb@doctorbirch.com build-type: Simple@@ -11,7 +11,9 @@ synopsis: Encryption library library default-extensions:- DerivingStrategies+ BangPatterns,+ DerivingStrategies,+ Safe exposed-modules: Data.Crypto build-depends: base ^>=4.20.0.0 hs-source-dirs: src
src/Data/Crypto.hs view
@@ -1,14 +1,29 @@-module Data.Crypto (generatekey, encrypt, decrypt) where +{-| +Module : Data.Crypto +Description : Encryption library +Copyright : (c) dr. Jonas Birch, 2025 +License : MIT +Maintainer : none +Stability : stable +Portability : portable +Block cipher encryption library. +-} + +module Data.Crypto (generatekey, encrypt, decrypt, hash) where + import Prelude hiding (round) import Data.Word (Word8) import Data.Bits ((.&.)) +-- | Takes an integer value in the range [0..1023] and +-- produces a ten bit encryption key. generatekey :: Word -> Key generatekey w | w `elem` [0..1023] = bin10 w | otherwise = bin10 (w `mod` 1024) +-- | Encrypting an 8 bit value. encrypt :: Key -> Word8 -> Word8 encrypt k w = let (sk1,sk2) = keyschedule k @@ -18,6 +33,7 @@ in dec ct +-- | Decrypting an 8 bit value. decrypt :: Key -> Word8 -> Word8 decrypt k w = let (sk1,sk2) = keyschedule k @@ -27,6 +43,34 @@ in dec pt +constant :: Key +constant = B10 One Zero Zero Zero One Zero Zero Zero One One + +-- | __hash__ /n val/ +-- +-- Hashes an 8 bit value, using n number of rounds. +hash :: Int -> Word8 -> Word8 +hash n w = let + subkeys = keyschedule constant + ct = bin w + preround = (split . ip) ct + in + hash' n subkeys preround + +hash' :: Int -> (Subkey,Subkey) -> (Block,Block) -> Word8 +hash' 0 _ b = dec $ ipinverse b +hash' !n (s1,s2) (b1,b2) = + hash' (n - 1) (sk1,sk2) ((round s2 . sw. round s1) + (if even n then + (b1,b2) + else + (b2,b1)) + ) + where + sk1,sk2 :: Subkey + sk1 = ls1 s1 + sk2 = ls1 s2 + keyschedule :: Key -> (Subkey,Subkey) keyschedule k = let key' :: Subkey @@ -212,6 +256,8 @@ ls1,ls2 :: Rotation ls1 (B5 k1 k2 k3 k4 k5) = B5 k2 k3 k4 k5 k1 +ls1 (B8 k1 k2 k3 k4 k5 k6 k7 k8) = + B8 k2 k3 k4 k5 k6 k7 k8 k1 ls1 _ = undefined ls2 (B5 k1 k2 k3 k4 k5) = B5 k3 k4 k5 k1 k2