Skip to content
This repository was archived by the owner on Sep 20, 2023. It is now read-only.

Commit beecd66

Browse files
committed
ChaCha: Expose raw initialize / generation functionality
1 parent ebad21c commit beecd66

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

Crypto/Cipher/ChaCha.hs

+26-10
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ module Crypto.Cipher.ChaCha
1212
, combine
1313
, generate
1414
, State
15+
, initializeRaw
16+
, generateRaw
1517
-- * Simple interface for DRG purpose
1618
, initializeSimple
1719
, generateSimple
@@ -53,22 +55,30 @@ initialize nbRounds key nonce
5355
where kLen = B.length key
5456
nonceLen = B.length nonce
5557

56-
-- | Initialize simple ChaCha State
58+
-- | Initialize raw ChaCha State
5759
--
5860
-- The seed need to be at least 40 bytes long
59-
initializeSimple :: ByteArrayAccess seed
61+
initializeRaw :: (ByteArrayAccess seed, ByteArray state)
6062
=> seed -- ^ a 40 bytes long seed
61-
-> StateSimple
62-
initializeSimple seed
63+
-> state
64+
initializeRaw seed
6365
| sLen < 40 = error "ChaCha Random: seed length should be 40 bytes"
6466
| otherwise = unsafeDoIO $ do
6567
stPtr <- B.alloc 64 $ \stPtr ->
6668
B.withByteArray seed $ \seedPtr ->
6769
ccryptonite_chacha_init_core stPtr 32 seedPtr 8 (seedPtr `plusPtr` 32)
68-
return $ StateSimple stPtr
70+
return stPtr
6971
where
7072
sLen = B.length seed
7173

74+
-- | Initialize simple ChaCha State
75+
--
76+
-- The seed need to be at least 40 bytes long
77+
initializeSimple :: ByteArrayAccess seed
78+
=> seed -- ^ a 40 bytes long seed
79+
-> StateSimple
80+
initializeSimple = StateSimple . initializeRaw
81+
7282
-- | Combine the chacha output and an arbitrary message with a xor,
7383
-- and return the combined output and the new state.
7484
combine :: ByteArray ba
@@ -98,16 +108,22 @@ generate prevSt@(State prevStMem) len
98108
return (out, State st)
99109

100110
-- | similar to 'generate' but assume certains values
101-
generateSimple :: ByteArray ba
102-
=> StateSimple
111+
generateRaw :: (ByteArray ba, ByteArray state)
112+
=> state
103113
-> Int
104-
-> (ba, StateSimple)
105-
generateSimple (StateSimple prevSt) nbBytes = unsafeDoIO $ do
114+
-> (ba, state)
115+
generateRaw prevSt nbBytes = unsafeDoIO $ do
106116
newSt <- B.copy prevSt (\_ -> return ())
107117
output <- B.alloc nbBytes $ \dstPtr ->
108118
B.withByteArray newSt $ \stPtr ->
109119
ccryptonite_chacha_random 8 dstPtr stPtr (fromIntegral nbBytes)
110-
return (output, StateSimple newSt)
120+
return (output, newSt)
121+
122+
generateSimple :: ByteArray ba
123+
=> StateSimple
124+
-> Int
125+
-> (ba, StateSimple)
126+
generateSimple (StateSimple prevSt) = fmap StateSimple <$> generateRaw prevSt
111127

112128
foreign import ccall "cryptonite_chacha_init_core"
113129
ccryptonite_chacha_init_core :: Ptr StateSimple -> Int -> Ptr Word8 -> Int -> Ptr Word8 -> IO ()

0 commit comments

Comments
 (0)