[Poly1305] make initialize explicitely failable

This commit is contained in:
Vincent Hanquez 2015-07-29 09:49:49 +01:00
parent 4af8185d65
commit 8a0bacfc6d
3 changed files with 7 additions and 5 deletions

View File

@ -82,7 +82,7 @@ initialize key (Nonce nonce)
where where
rootState = ChaCha.initialize 20 key nonce rootState = ChaCha.initialize 20 key nonce
(polyKey, encState) = ChaCha.generate rootState 64 (polyKey, encState) = ChaCha.generate rootState 64
polyState = Poly1305.initialize (B.take 32 polyKey :: ScrubbedBytes) polyState = throwCryptoError $ Poly1305.initialize (B.take 32 polyKey :: ScrubbedBytes)
appendAAD :: ByteArrayAccess ba => ba -> State -> State appendAAD :: ByteArrayAccess ba => ba -> State -> State
appendAAD ba (State encState macState aadLength plainLength) = appendAAD ba (State encState macState aadLength plainLength) =

View File

@ -29,6 +29,7 @@ import Foreign.C.Types
import Data.Word import Data.Word
import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes, Bytes) import Crypto.Internal.ByteArray (ByteArrayAccess, ScrubbedBytes, Bytes)
import qualified Crypto.Internal.ByteArray as B import qualified Crypto.Internal.ByteArray as B
import Crypto.Error
-- | Poly1305 State -- | Poly1305 State
newtype State = State ScrubbedBytes newtype State = State ScrubbedBytes
@ -56,10 +57,10 @@ foreign import ccall unsafe "cryptonite_poly1305.h cryptonite_poly1305_finalize"
-- | initialize a Poly1305 context -- | initialize a Poly1305 context
initialize :: ByteArrayAccess key initialize :: ByteArrayAccess key
=> key => key
-> State -> CryptoFailable State
initialize key initialize key
| B.length key /= 32 = error "Poly1305: key length expected 32 bytes" | B.length key /= 32 = CryptoFailed $ CryptoError_MacKeyInvalid
| otherwise = State $ B.allocAndFreeze 84 $ \ctxPtr -> | otherwise = CryptoPassed $ State $ B.allocAndFreeze 84 $ \ctxPtr ->
B.withByteArray key $ \keyPtr -> B.withByteArray key $ \keyPtr ->
c_poly1305_init (castPtr ctxPtr) keyPtr c_poly1305_init (castPtr ctxPtr) keyPtr
{-# NOINLINE initialize #-} {-# NOINLINE initialize #-}

View File

@ -5,6 +5,7 @@ import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as B () import qualified Data.ByteString.Char8 as B ()
import Imports import Imports
import Crypto.Error
import qualified Crypto.MAC.Poly1305 as Poly1305 import qualified Crypto.MAC.Poly1305 as Poly1305
import qualified Data.ByteArray as B (convert) import qualified Data.ByteArray as B (convert)
@ -27,7 +28,7 @@ tests = testGroup "Poly1305"
, testProperty "Chunking" $ \(Chunking chunkLen totalLen) -> , testProperty "Chunking" $ \(Chunking chunkLen totalLen) ->
let key = B.replicate 32 0 let key = B.replicate 32 0
msg = B.pack $ take totalLen $ concat (replicate 10 [1..255]) msg = B.pack $ take totalLen $ concat (replicate 10 [1..255])
in Poly1305.auth key msg == Poly1305.finalize (foldr (flip Poly1305.update) (Poly1305.initialize key) (chunks chunkLen msg)) in Poly1305.auth key msg == Poly1305.finalize (foldr (flip Poly1305.update) (throwCryptoError $ Poly1305.initialize key) (chunks chunkLen msg))
] ]
where where
chunks i bs chunks i bs