[Chacha/Salsa] cleanup nonce handling and use bufXor
This commit is contained in:
parent
cd42b2765b
commit
f09bbf55e3
@ -24,11 +24,10 @@ import Crypto.Internal.ByteArray (ByteArrayAccess, ByteArray, SecureBy
|
|||||||
import qualified Crypto.Internal.ByteArray as B
|
import qualified Crypto.Internal.ByteArray as B
|
||||||
import Crypto.Internal.Compat
|
import Crypto.Internal.Compat
|
||||||
import Crypto.Internal.Imports
|
import Crypto.Internal.Imports
|
||||||
import Data.Bits (xor)
|
import Crypto.Internal.Bytes (bufXor)
|
||||||
import Foreign.Ptr
|
import Foreign.Ptr
|
||||||
import Foreign.ForeignPtr
|
import Foreign.ForeignPtr
|
||||||
import Foreign.C.Types
|
import Foreign.C.Types
|
||||||
import Foreign.Storable
|
|
||||||
|
|
||||||
-- | ChaCha context
|
-- | ChaCha context
|
||||||
data State = State Int -- number of rounds
|
data State = State Int -- number of rounds
|
||||||
@ -47,11 +46,11 @@ round64 len
|
|||||||
|
|
||||||
-- | Initialize a new ChaCha context with the number of rounds,
|
-- | Initialize a new ChaCha context with the number of rounds,
|
||||||
-- the key and the nonce associated.
|
-- the key and the nonce associated.
|
||||||
initialize :: ByteArrayAccess key
|
initialize :: (ByteArrayAccess key, ByteArrayAccess nonce)
|
||||||
=> Int -- ^ number of rounds (8,12,20)
|
=> Int -- ^ number of rounds (8,12,20)
|
||||||
-> key -- ^ the key (128 or 256 bits)
|
-> key -- ^ the key (128 or 256 bits)
|
||||||
-> ByteString -- ^ the nonce (64 or 96 bits)
|
-> nonce -- ^ the nonce (64 or 96 bits)
|
||||||
-> State -- ^ the initial ChaCha state
|
-> State -- ^ the initial ChaCha state
|
||||||
initialize nbRounds key nonce
|
initialize nbRounds key nonce
|
||||||
| not (kLen `elem` [16,32]) = error "ChaCha: key length should be 128 or 256 bits"
|
| not (kLen `elem` [16,32]) = error "ChaCha: key length should be 128 or 256 bits"
|
||||||
| not (nonceLen `elem` [8,12]) = error "ChaCha: nonce length should be 64 or 96 bits"
|
| not (nonceLen `elem` [8,12]) = error "ChaCha: nonce length should be 64 or 96 bits"
|
||||||
@ -103,7 +102,7 @@ combine prev@(State nbRounds prevSt prevOut) src
|
|||||||
withByteArray src $ \srcPtr -> do
|
withByteArray src $ \srcPtr -> do
|
||||||
-- copy the previous buffer by xor if any
|
-- copy the previous buffer by xor if any
|
||||||
withByteArray prevOut $ \prevPtr ->
|
withByteArray prevOut $ \prevPtr ->
|
||||||
loopXor dstPtr srcPtr prevPtr prevBufLen
|
bufXor dstPtr srcPtr prevPtr prevBufLen
|
||||||
|
|
||||||
-- then create a new mutable copy of state
|
-- then create a new mutable copy of state
|
||||||
B.copy prevSt $ \stPtr ->
|
B.copy prevSt $ \stPtr ->
|
||||||
@ -120,12 +119,6 @@ combine prev@(State nbRounds prevSt prevOut) src
|
|||||||
outputLen = B.length src
|
outputLen = B.length src
|
||||||
prevBufLen = B.length prevOut
|
prevBufLen = B.length prevOut
|
||||||
|
|
||||||
loopXor :: Ptr Word8 -> Ptr Word8 -> Ptr Word8 -> Int -> IO ()
|
|
||||||
loopXor _ _ _ 0 = return ()
|
|
||||||
loopXor d s1 s2 n = do
|
|
||||||
(xor <$> peek s1 <*> peek s2) >>= poke d
|
|
||||||
loopXor (d `plusPtr` 1) (s1 `plusPtr` 1) (s2 `plusPtr` 1) (n-1)
|
|
||||||
|
|
||||||
-- | Generate a number of bytes from the ChaCha output directly
|
-- | Generate a number of bytes from the ChaCha output directly
|
||||||
--
|
--
|
||||||
-- TODO: use chacha_generate directly instead of using combine xor'ing with 0.
|
-- TODO: use chacha_generate directly instead of using combine xor'ing with 0.
|
||||||
|
|||||||
@ -14,6 +14,7 @@ module Crypto.Cipher.Salsa
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
|
import Crypto.Internal.Bytes (bufXor)
|
||||||
import Crypto.Internal.ByteArray (ByteArrayAccess, ByteArray, SecureBytes)
|
import Crypto.Internal.ByteArray (ByteArrayAccess, ByteArray, SecureBytes)
|
||||||
import qualified Crypto.Internal.ByteArray as B
|
import qualified Crypto.Internal.ByteArray as B
|
||||||
import qualified Data.ByteString.Internal as BS
|
import qualified Data.ByteString.Internal as BS
|
||||||
@ -24,7 +25,6 @@ import Data.Bits (xor)
|
|||||||
import Foreign.Ptr
|
import Foreign.Ptr
|
||||||
import Foreign.ForeignPtr
|
import Foreign.ForeignPtr
|
||||||
import Foreign.C.Types
|
import Foreign.C.Types
|
||||||
import Foreign.Storable
|
|
||||||
|
|
||||||
-- | Salsa context
|
-- | Salsa context
|
||||||
data State = State Int -- number of rounds
|
data State = State Int -- number of rounds
|
||||||
@ -40,7 +40,7 @@ round64 len
|
|||||||
|
|
||||||
-- | Initialize a new Salsa context with the number of rounds,
|
-- | Initialize a new Salsa context with the number of rounds,
|
||||||
-- the key and the nonce associated.
|
-- the key and the nonce associated.
|
||||||
initialize :: (ByteArrayAccess key, ByteArray nonce)
|
initialize :: (ByteArrayAccess key, ByteArrayAccess nonce)
|
||||||
=> Int -- ^ number of rounds (8,12,20)
|
=> Int -- ^ number of rounds (8,12,20)
|
||||||
-> key -- ^ the key (128 or 256 bits)
|
-> key -- ^ the key (128 or 256 bits)
|
||||||
-> nonce -- ^ the nonce (64 or 96 bits)
|
-> nonce -- ^ the nonce (64 or 96 bits)
|
||||||
@ -83,7 +83,7 @@ combine prev@(State nbRounds prevSt prevOut) src
|
|||||||
B.withByteArray src $ \srcPtr -> do
|
B.withByteArray src $ \srcPtr -> do
|
||||||
-- copy the previous buffer by xor if any
|
-- copy the previous buffer by xor if any
|
||||||
B.withByteArray prevOut $ \prevPtr ->
|
B.withByteArray prevOut $ \prevPtr ->
|
||||||
loopXor dstPtr srcPtr prevPtr prevBufLen
|
bufXor dstPtr srcPtr prevPtr prevBufLen
|
||||||
|
|
||||||
-- then create a new mutable copy of state
|
-- then create a new mutable copy of state
|
||||||
B.copy prevSt $ \stPtr ->
|
B.copy prevSt $ \stPtr ->
|
||||||
@ -99,12 +99,6 @@ combine prev@(State nbRounds prevSt prevOut) src
|
|||||||
outputLen = B.length src
|
outputLen = B.length src
|
||||||
prevBufLen = B.length prevOut
|
prevBufLen = B.length prevOut
|
||||||
|
|
||||||
loopXor :: Ptr Word8 -> Ptr Word8 -> Ptr Word8 -> Int -> IO ()
|
|
||||||
loopXor _ _ _ 0 = return ()
|
|
||||||
loopXor d s1 s2 n = do
|
|
||||||
(xor <$> peek s1 <*> peek s2) >>= poke d
|
|
||||||
loopXor (d `plusPtr` 1) (s1 `plusPtr` 1) (s2 `plusPtr` 1) (n-1)
|
|
||||||
|
|
||||||
-- | Generate a number of bytes from the Salsa output directly
|
-- | Generate a number of bytes from the Salsa output directly
|
||||||
--
|
--
|
||||||
-- TODO: use salsa_generate directly instead of using combine xor'ing with 0.
|
-- TODO: use salsa_generate directly instead of using combine xor'ing with 0.
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user