check AESCCM IV length in ccmInit instead of aeadInit
This commit is contained in:
parent
f6d9fb0cf1
commit
1e57f41e1d
@ -48,14 +48,6 @@ instance Cipher AES256 where
|
|||||||
cipherKeySize _ = KeySizeFixed 32
|
cipherKeySize _ = KeySizeFixed 32
|
||||||
cipherInit k = AES256 <$> (initAES =<< validateKeySize (undefined :: AES256) k)
|
cipherInit k = AES256 <$> (initAES =<< validateKeySize (undefined :: AES256) k)
|
||||||
|
|
||||||
aeadInitCcm :: ByteArrayAccess iv => Int -> CCM_M -> CCM_L -> AES -> iv -> CryptoFailable (AEAD cihper)
|
|
||||||
aeadInitCcm n m l aes iv = if BA.length iv /= 15 - ln then CryptoFailed CryptoError_IvSizeInvalid else CryptoPassed $ AEAD (ccmMode aes) (ccmInit aes iv n m l)
|
|
||||||
where
|
|
||||||
ln = case l of
|
|
||||||
CCM_L2 -> 2
|
|
||||||
CCM_L3 -> 3
|
|
||||||
CCM_L4 -> 4
|
|
||||||
|
|
||||||
#define INSTANCE_BLOCKCIPHER(CSTR) \
|
#define INSTANCE_BLOCKCIPHER(CSTR) \
|
||||||
instance BlockCipher CSTR where \
|
instance BlockCipher CSTR where \
|
||||||
{ blockSize _ = 16 \
|
{ blockSize _ = 16 \
|
||||||
@ -66,7 +58,7 @@ instance BlockCipher CSTR where \
|
|||||||
; ctrCombine (CSTR aes) (IV iv) = encryptCTR aes (IV iv) \
|
; ctrCombine (CSTR aes) (IV iv) = encryptCTR aes (IV iv) \
|
||||||
; aeadInit AEAD_GCM (CSTR aes) iv = CryptoPassed $ AEAD (gcmMode aes) (gcmInit aes iv) \
|
; aeadInit AEAD_GCM (CSTR aes) iv = CryptoPassed $ AEAD (gcmMode aes) (gcmInit aes iv) \
|
||||||
; aeadInit AEAD_OCB (CSTR aes) iv = CryptoPassed $ AEAD (ocbMode aes) (ocbInit aes iv) \
|
; aeadInit AEAD_OCB (CSTR aes) iv = CryptoPassed $ AEAD (ocbMode aes) (ocbInit aes iv) \
|
||||||
; aeadInit (AEAD_CCM n m l) (CSTR aes) iv = aeadInitCcm n m l aes iv \
|
; aeadInit (AEAD_CCM n m l) (CSTR aes) iv = AEAD (ccmMode aes) <$> ccmInit aes iv n m l \
|
||||||
; aeadInit _ _ _ = CryptoFailed CryptoError_AEADModeNotSupported \
|
; aeadInit _ _ _ = CryptoFailed CryptoError_AEADModeNotSupported \
|
||||||
}; \
|
}; \
|
||||||
instance BlockCipher128 CSTR where \
|
instance BlockCipher128 CSTR where \
|
||||||
|
|||||||
@ -77,7 +77,7 @@ instance BlockCipher AES where
|
|||||||
ctrCombine = encryptCTR
|
ctrCombine = encryptCTR
|
||||||
aeadInit AEAD_GCM aes iv = CryptoPassed $ AEAD (gcmMode aes) (gcmInit aes iv)
|
aeadInit AEAD_GCM aes iv = CryptoPassed $ AEAD (gcmMode aes) (gcmInit aes iv)
|
||||||
aeadInit AEAD_OCB aes iv = CryptoPassed $ AEAD (ocbMode aes) (ocbInit aes iv)
|
aeadInit AEAD_OCB aes iv = CryptoPassed $ AEAD (ocbMode aes) (ocbInit aes iv)
|
||||||
aeadInit (AEAD_CCM n m l) aes iv = CryptoPassed $ AEAD (ccmMode aes) (ccmInit aes iv n m l)
|
aeadInit (AEAD_CCM n m l) aes iv = AEAD (ccmMode aes) <$> ccmInit aes iv n m l
|
||||||
aeadInit _ _ _ = CryptoFailed CryptoError_AEADModeNotSupported
|
aeadInit _ _ _ = CryptoFailed CryptoError_AEADModeNotSupported
|
||||||
instance BlockCipher128 AES where
|
instance BlockCipher128 AES where
|
||||||
xtsEncrypt = encryptXTS
|
xtsEncrypt = encryptXTS
|
||||||
@ -492,12 +492,13 @@ ccmGetL l = case l of
|
|||||||
|
|
||||||
-- | initialize a ccm context
|
-- | initialize a ccm context
|
||||||
{-# NOINLINE ccmInit #-}
|
{-# NOINLINE ccmInit #-}
|
||||||
ccmInit :: ByteArrayAccess iv => AES -> iv -> Int -> CCM_M -> CCM_L -> AESCCM
|
ccmInit :: ByteArrayAccess iv => AES -> iv -> Int -> CCM_M -> CCM_L -> CryptoFailable AESCCM
|
||||||
ccmInit ctx iv n m l = unsafeDoIO $ do
|
ccmInit ctx iv n m l = if 15 - ccmGetL l /= B.length iv then CryptoFailed CryptoError_IvSizeInvalid
|
||||||
sm <- B.alloc sizeCCM $ \ccmStPtr ->
|
else unsafeDoIO $ do
|
||||||
withKeyAndIV ctx iv $ \k v ->
|
sm <- B.alloc sizeCCM $ \ccmStPtr ->
|
||||||
c_aes_ccm_init (castPtr ccmStPtr) k v (fromIntegral $ B.length iv) (fromIntegral n) (fromIntegral (ccmGetM m)) (fromIntegral (ccmGetL l))
|
withKeyAndIV ctx iv $ \k v ->
|
||||||
return $ AESCCM sm
|
c_aes_ccm_init (castPtr ccmStPtr) k v (fromIntegral $ B.length iv) (fromIntegral n) (fromIntegral (ccmGetM m)) (fromIntegral (ccmGetL l))
|
||||||
|
return $ CryptoPassed (AESCCM sm)
|
||||||
|
|
||||||
-- | append data which is only going to be authenticated to the CCM context.
|
-- | append data which is only going to be authenticated to the CCM context.
|
||||||
--
|
--
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user