License | BSD-style |
---|---|
Maintainer | Vincent Hanquez <vincent@snarc.org> |
Stability | stable |
Portability | good |
Safe Haskell | None |
Language | Haskell2010 |
A simple AEAD scheme using ChaCha20 and Poly1305. See RFC 7539.
The State is not modified in place, so each function changing the State, returns a new State.
Authenticated Data need to be added before any call to encrypt
or decrypt
,
and once all the data has been added, then finalizeAAD
need to be called.
Once finalizeAAD
has been called, no further appendAAD
call should be make.
import Data.ByteString.Char8 as B import Data.ByteArray import Crypto.Error import Crypto.Cipher.ChaChaPoly1305 as C encrypt :: ByteString -- nonce (12 random bytes) -> ByteString -- symmetric key -> ByteString -- optional associated data (won't be encrypted) -> ByteString -- input plaintext to be encrypted -> CryptoFailable ByteString -- ciphertext with a 128-bit tag attached encrypt nonce key header plaintext = do st1 <- C.nonce12 nonce >>= C.initialize key let st2 = C.finalizeAAD $ C.appendAAD header st1 (out, st3) = C.encrypt plaintext st2 auth = C.finalize st3 return $ out `B.append` Data.ByteArray.convert auth
- data State
- data Nonce
- nonce12 :: ByteArrayAccess iv => iv -> CryptoFailable Nonce
- nonce8 :: ByteArrayAccess ba => ba -> ba -> CryptoFailable Nonce
- incrementNonce :: Nonce -> Nonce
- initialize :: ByteArrayAccess key => key -> Nonce -> CryptoFailable State
- appendAAD :: ByteArrayAccess ba => ba -> State -> State
- finalizeAAD :: State -> State
- encrypt :: ByteArray ba => ba -> State -> (ba, State)
- decrypt :: ByteArray ba => ba -> State -> (ba, State)
- finalize :: State -> Auth
Documentation
nonce12 :: ByteArrayAccess iv => iv -> CryptoFailable Nonce Source #
Nonce smart constructor 12 bytes IV, nonce constructor
:: ByteArrayAccess ba | |
=> ba | 4 bytes constant |
-> ba | 8 bytes IV |
-> CryptoFailable Nonce |
8 bytes IV, nonce constructor
incrementNonce :: Nonce -> Nonce Source #
Increment a nonce
initialize :: ByteArrayAccess key => key -> Nonce -> CryptoFailable State Source #
appendAAD :: ByteArrayAccess ba => ba -> State -> State Source #
Append Authenticated Data to the State and return the new modified State.
Once no further call to this function need to be make,
the user should call finalizeAAD
finalizeAAD :: State -> State Source #
Finalize the Authenticated Data and return the finalized State
encrypt :: ByteArray ba => ba -> State -> (ba, State) Source #
Encrypt a piece of data and returns the encrypted Data and the updated State.