@@ -12,6 +12,8 @@ module Crypto.Cipher.ChaCha
12
12
, combine
13
13
, generate
14
14
, State
15
+ , initializeRaw
16
+ , generateRaw
15
17
-- * Simple interface for DRG purpose
16
18
, initializeSimple
17
19
, generateSimple
@@ -53,22 +55,30 @@ initialize nbRounds key nonce
53
55
where kLen = B. length key
54
56
nonceLen = B. length nonce
55
57
56
- -- | Initialize simple ChaCha State
58
+ -- | Initialize raw ChaCha State
57
59
--
58
60
-- The seed need to be at least 40 bytes long
59
- initializeSimple :: ByteArrayAccess seed
61
+ initializeRaw :: ( ByteArrayAccess seed , ByteArray state )
60
62
=> seed -- ^ a 40 bytes long seed
61
- -> StateSimple
62
- initializeSimple seed
63
+ -> state
64
+ initializeRaw seed
63
65
| sLen < 40 = error " ChaCha Random: seed length should be 40 bytes"
64
66
| otherwise = unsafeDoIO $ do
65
67
stPtr <- B. alloc 64 $ \ stPtr ->
66
68
B. withByteArray seed $ \ seedPtr ->
67
69
ccryptonite_chacha_init_core stPtr 32 seedPtr 8 (seedPtr `plusPtr` 32 )
68
- return $ StateSimple stPtr
70
+ return stPtr
69
71
where
70
72
sLen = B. length seed
71
73
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
+
72
82
-- | Combine the chacha output and an arbitrary message with a xor,
73
83
-- and return the combined output and the new state.
74
84
combine :: ByteArray ba
@@ -98,16 +108,22 @@ generate prevSt@(State prevStMem) len
98
108
return (out, State st)
99
109
100
110
-- | similar to 'generate' but assume certains values
101
- generateSimple :: ByteArray ba
102
- => StateSimple
111
+ generateRaw :: ( ByteArray ba , ByteArray state )
112
+ => state
103
113
-> Int
104
- -> (ba , StateSimple )
105
- generateSimple ( StateSimple prevSt) nbBytes = unsafeDoIO $ do
114
+ -> (ba , state )
115
+ generateRaw prevSt nbBytes = unsafeDoIO $ do
106
116
newSt <- B. copy prevSt (\ _ -> return () )
107
117
output <- B. alloc nbBytes $ \ dstPtr ->
108
118
B. withByteArray newSt $ \ stPtr ->
109
119
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
111
127
112
128
foreign import ccall " cryptonite_chacha_init_core"
113
129
ccryptonite_chacha_init_core :: Ptr StateSimple -> Int -> Ptr Word8 -> Int -> Ptr Word8 -> IO ()
0 commit comments