2014-12-16 07:50:48 +01:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
from Crypto.Cipher._mode_ecb import _create_ecb_cipher
|
|
|
|
|
from Crypto.Cipher._mode_cbc import _create_cbc_cipher
|
|
|
|
|
from Crypto.Cipher._mode_cfb import _create_cfb_cipher
|
|
|
|
|
from Crypto.Cipher._mode_ofb import _create_ofb_cipher
|
|
|
|
|
from Crypto.Cipher._mode_ctr import _create_ctr_cipher
|
|
|
|
|
from Crypto.Cipher._mode_openpgp import _create_openpgp_cipher
|
|
|
|
|
from Crypto.Cipher._mode_ccm import _create_ccm_cipher
|
|
|
|
|
from Crypto.Cipher._mode_eax import _create_eax_cipher
|
|
|
|
|
from Crypto.Cipher._mode_siv import _create_siv_cipher
|
|
|
|
|
from Crypto.Cipher._mode_gcm import _create_gcm_cipher
|
2015-05-03 15:06:42 -04:00
|
|
|
from Crypto.Cipher._mode_ocb import _create_ocb_cipher
|
2014-12-16 07:50:48 +01:00
|
|
|
|
|
|
|
|
_modes = { 1:_create_ecb_cipher,
|
|
|
|
|
2:_create_cbc_cipher,
|
|
|
|
|
3:_create_cfb_cipher,
|
|
|
|
|
5:_create_ofb_cipher,
|
|
|
|
|
6:_create_ctr_cipher,
|
|
|
|
|
7:_create_openpgp_cipher,
|
2015-01-19 14:00:35 +01:00
|
|
|
9:_create_eax_cipher
|
|
|
|
|
}
|
2014-12-16 07:50:48 +01:00
|
|
|
|
|
|
|
|
_extra_modes = { 8:_create_ccm_cipher,
|
|
|
|
|
10:_create_siv_cipher,
|
2015-05-03 15:06:42 -04:00
|
|
|
11:_create_gcm_cipher,
|
|
|
|
|
12:_create_ocb_cipher
|
|
|
|
|
}
|
2014-12-10 21:40:49 +01:00
|
|
|
|
|
|
|
|
def _create_cipher(factory, key, mode, *args, **kwargs):
|
|
|
|
|
|
|
|
|
|
kwargs["key"] = key
|
|
|
|
|
|
|
|
|
|
modes = dict(_modes)
|
|
|
|
|
if kwargs.pop("add_aes_modes", False):
|
|
|
|
|
modes.update(_extra_modes)
|
|
|
|
|
if not modes.has_key(mode):
|
|
|
|
|
raise ValueError("Mode not supported")
|
|
|
|
|
|
|
|
|
|
if args:
|
2015-05-25 16:16:59 -04:00
|
|
|
if mode in (8, 9, 10, 11, 12):
|
2015-11-24 22:00:01 +01:00
|
|
|
if len(args) > 1:
|
|
|
|
|
raise TypeError("Too many arguments for this mode")
|
2014-12-10 21:40:49 +01:00
|
|
|
kwargs["nonce"] = args[0]
|
|
|
|
|
elif mode in (2, 3, 5, 7):
|
2015-11-08 22:05:58 +01:00
|
|
|
if len(args) > 1:
|
|
|
|
|
raise TypeError("Too many arguments for this mode")
|
2014-12-10 21:40:49 +01:00
|
|
|
kwargs["IV"] = args[0]
|
2015-11-15 14:02:52 +01:00
|
|
|
elif mode == 6:
|
|
|
|
|
if len(args) > 0:
|
|
|
|
|
raise TypeError("Too many arguments for this mode")
|
2015-01-19 14:00:35 +01:00
|
|
|
elif mode == 1:
|
|
|
|
|
raise TypeError("IV is not meaningful for the ECB mode")
|
2014-12-10 21:40:49 +01:00
|
|
|
|
|
|
|
|
return modes[mode](factory, **kwargs)
|