From c00d7b9ecaf63222ed6a771026356d9bdb68163f Mon Sep 17 00:00:00 2001 From: Vincent Hanquez Date: Thu, 9 Apr 2015 07:59:08 +0100 Subject: [PATCH] [Camellia] cleanup words handling --- Crypto/Cipher/Camellia/Primitive.hs | 35 +++++++++++++---------------- Crypto/Internal/Words.hs | 9 ++++++++ 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Crypto/Cipher/Camellia/Primitive.hs b/Crypto/Cipher/Camellia/Primitive.hs index b399c70..eca6f15 100644 --- a/Crypto/Cipher/Camellia/Primitive.hs +++ b/Crypto/Cipher/Camellia/Primitive.hs @@ -28,9 +28,6 @@ import Crypto.Internal.Words data Mode = Decrypt | Encrypt -w128tow64 :: Word128 -> (Word64, Word64) -w128tow64 (Word128 w1 w2) = (w1, w2) - w64tow128 :: (Word64, Word64) -> Word128 w64tow128 (x1, x2) = Word128 x1 x2 @@ -157,20 +154,20 @@ initCamellia key | otherwise = let (kL, _, kA, _) = setKeyInterim key in - let (kw1, kw2) = w128tow64 (kL `rotl128` 0) in - let (k1, k2) = w128tow64 (kA `rotl128` 0) in - let (k3, k4) = w128tow64 (kL `rotl128` 15) in - let (k5, k6) = w128tow64 (kA `rotl128` 15) in - let (ke1, ke2) = w128tow64 (kA `rotl128` 30) in --ke1 = (KA <<< 30) >> 64; ke2 = (KA <<< 30) & MASK64; - let (k7, k8) = w128tow64 (kL `rotl128` 45) in --k7 = (KL <<< 45) >> 64; k8 = (KL <<< 45) & MASK64; - let (k9, _) = w128tow64 (kA `rotl128` 45) in --k9 = (KA <<< 45) >> 64; - let (_, k10) = w128tow64 (kL `rotl128` 60) in - let (k11, k12) = w128tow64 (kA `rotl128` 60) in - let (ke3, ke4) = w128tow64 (kL `rotl128` 77) in - let (k13, k14) = w128tow64 (kL `rotl128` 94) in - let (k15, k16) = w128tow64 (kA `rotl128` 94) in - let (k17, k18) = w128tow64 (kL `rotl128` 111) in - let (kw3, kw4) = w128tow64 (kA `rotl128` 111) in + let (Word128 kw1 kw2) = (kL `rotl128` 0) in + let (Word128 k1 k2) = (kA `rotl128` 0) in + let (Word128 k3 k4) = (kL `rotl128` 15) in + let (Word128 k5 k6) = (kA `rotl128` 15) in + let (Word128 ke1 ke2) = (kA `rotl128` 30) in --ke1 = (KA <<< 30) >> 64; ke2 = (KA <<< 30) & MASK64; + let (Word128 k7 k8) = (kL `rotl128` 45) in --k7 = (KL <<< 45) >> 64; k8 = (KL <<< 45) & MASK64; + let (Word128 k9 _) = (kA `rotl128` 45) in --k9 = (KA <<< 45) >> 64; + let (Word128 _ k10) = (kL `rotl128` 60) in + let (Word128 k11 k12) = (kA `rotl128` 60) in + let (Word128 ke3 ke4) = (kL `rotl128` 77) in + let (Word128 k13 k14) = (kL `rotl128` 94) in + let (Word128 k15 k16) = (kA `rotl128` 94) in + let (Word128 k17 k18) = (kL `rotl128` 111) in + let (Word128 kw3 kw4) = (kA `rotl128` 111) in CryptoPassed $ Camellia { kw = fromList [ kw1, kw2, kw3, kw4 ] @@ -251,9 +248,7 @@ doBlockRound mode key d1 d2 i = (r6, r5) doBlock :: Mode -> Camellia -> Word128 -> Word128 -doBlock mode key m = - let (d1, d2) = w128tow64 m in - +doBlock mode key (Word128 d1 d2) = let d1a = d1 `xor` (getKeyKw mode key 0) in {- Prewhitening -} let d2a = d2 `xor` (getKeyKw mode key 1) in diff --git a/Crypto/Internal/Words.hs b/Crypto/Internal/Words.hs index bd88242..0cf9318 100644 --- a/Crypto/Internal/Words.hs +++ b/Crypto/Internal/Words.hs @@ -9,9 +9,18 @@ -- module Crypto.Internal.Words ( Word128(..) + , w64to32 + , w32to64 ) where import Data.Word +import Data.Bits -- should probably use crypto large word ? data Word128 = Word128 !Word64 !Word64 deriving (Show, Eq) + +w64to32 :: Word64 -> (Word32, Word32) +w64to32 w = (fromIntegral (w `shiftR` 32), fromIntegral w) + +w32to64 :: (Word32, Word32) -> Word64 +w32to64 (x1, x2) = ((fromIntegral x1) `shiftL` 32) .|. (fromIntegral x2)