Add ccm decrypt
This commit is contained in:
parent
55bf620365
commit
1e04890d73
@ -535,12 +535,7 @@ ccmEncrypt ctx ccm input = unsafeDoIO $ (withCCMKeyAndCopySt ctx ccm cbcmacAndIv
|
|||||||
-- needs to happen after AAD appending, or after initialization if no AAD data.
|
-- needs to happen after AAD appending, or after initialization if no AAD data.
|
||||||
{-# NOINLINE ccmDecrypt #-}
|
{-# NOINLINE ccmDecrypt #-}
|
||||||
ccmDecrypt :: ByteArray ba => AES -> AESCCM -> ba -> (ba, AESCCM)
|
ccmDecrypt :: ByteArray ba => AES -> AESCCM -> ba -> (ba, AESCCM)
|
||||||
ccmDecrypt ctx ccm input = unsafeDoIO $ withCCMKeyAndCopySt ctx ccm doDec
|
ccmDecrypt = ccmEncrypt
|
||||||
where len = B.length input
|
|
||||||
doDec ccmStPtr aesPtr =
|
|
||||||
B.alloc len $ \o ->
|
|
||||||
withByteArray input $ \i ->
|
|
||||||
c_aes_ccm_decrypt (castPtr o) ccmStPtr aesPtr i (fromIntegral len)
|
|
||||||
|
|
||||||
-- | Generate the Tag from CCM context
|
-- | Generate the Tag from CCM context
|
||||||
{-# NOINLINE ccmFinish #-}
|
{-# NOINLINE ccmFinish #-}
|
||||||
|
|||||||
@ -16,7 +16,7 @@ import Imports
|
|||||||
import Data.Maybe
|
import Data.Maybe
|
||||||
import Crypto.Error
|
import Crypto.Error
|
||||||
import Crypto.Cipher.Types
|
import Crypto.Cipher.Types
|
||||||
import Data.ByteArray as B hiding (pack, null)
|
import Data.ByteArray as B hiding (pack, null, length)
|
||||||
import qualified Data.ByteString as B hiding (all)
|
import qualified Data.ByteString as B hiding (all)
|
||||||
|
|
||||||
------------------------------------------------------------------------
|
------------------------------------------------------------------------
|
||||||
@ -389,7 +389,7 @@ testBlockCipherModes cipher =
|
|||||||
testBlockCipherAEAD :: BlockCipher a => a -> [TestTree]
|
testBlockCipherAEAD :: BlockCipher a => a -> [TestTree]
|
||||||
testBlockCipherAEAD cipher =
|
testBlockCipherAEAD cipher =
|
||||||
[ testProperty "OCB" (aeadProp AEAD_OCB)
|
[ testProperty "OCB" (aeadProp AEAD_OCB)
|
||||||
, testProperty "CCM" (aeadProp AEAD_CCM)
|
, testProperty "CCM" (aeadProp (AEAD_CCM 0 CCM_M16 CCM_L2))
|
||||||
, testProperty "EAX" (aeadProp AEAD_EAX)
|
, testProperty "EAX" (aeadProp AEAD_EAX)
|
||||||
, testProperty "CWC" (aeadProp AEAD_CWC)
|
, testProperty "CWC" (aeadProp AEAD_CWC)
|
||||||
, testProperty "GCM" (aeadProp AEAD_GCM)
|
, testProperty "GCM" (aeadProp AEAD_GCM)
|
||||||
@ -398,7 +398,7 @@ testBlockCipherAEAD cipher =
|
|||||||
toTests :: BlockCipher a => a -> (AEADMode -> AEADUnit a -> Bool)
|
toTests :: BlockCipher a => a -> (AEADMode -> AEADUnit a -> Bool)
|
||||||
toTests _ = testProperty_AEAD
|
toTests _ = testProperty_AEAD
|
||||||
testProperty_AEAD mode (AEADUnit key testIV (unPlaintext -> aad) (unPlaintext -> plaintext)) = withCtx key $ \ctx ->
|
testProperty_AEAD mode (AEADUnit key testIV (unPlaintext -> aad) (unPlaintext -> plaintext)) = withCtx key $ \ctx ->
|
||||||
case aeadInit mode ctx testIV of
|
case aeadInit mode' ctx testIV of
|
||||||
CryptoPassed iniAead ->
|
CryptoPassed iniAead ->
|
||||||
let aead = aeadAppendHeader iniAead aad
|
let aead = aeadAppendHeader iniAead aad
|
||||||
(eText, aeadE) = aeadEncrypt aead plaintext
|
(eText, aeadE) = aeadEncrypt aead plaintext
|
||||||
@ -409,6 +409,10 @@ testBlockCipherAEAD cipher =
|
|||||||
CryptoFailed err
|
CryptoFailed err
|
||||||
| err == CryptoError_AEADModeNotSupported -> True
|
| err == CryptoError_AEADModeNotSupported -> True
|
||||||
| otherwise -> error ("testProperty_AEAD: " ++ show err)
|
| otherwise -> error ("testProperty_AEAD: " ++ show err)
|
||||||
|
where mode' = updateCcmInputSize mode (B.length plaintext)
|
||||||
|
updateCcmInputSize aeadmode k = case aeadmode of
|
||||||
|
AEAD_CCM _ m l -> AEAD_CCM k m l
|
||||||
|
aeadOther -> aeadOther
|
||||||
|
|
||||||
withCtx :: Cipher c => Key c -> (c -> a) -> a
|
withCtx :: Cipher c => Key c -> (c -> a) -> a
|
||||||
withCtx (Key key) f =
|
withCtx (Key key) f =
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user