1# 
    2# A block cipher is instantiated as a combination of: 
    3# 1. A base cipher (such as AES) 
    4# 2. A mode of operation (such as CBC) 
    5# 
    6# Both items are implemented as C modules. 
    7# 
    8# The API of #1 is (replace "AES" with the name of the actual cipher): 
    9# - AES_start_operaion(key) --> base_cipher_state 
    10# - AES_encrypt(base_cipher_state, in, out, length) 
    11# - AES_decrypt(base_cipher_state, in, out, length) 
    12# - AES_stop_operation(base_cipher_state) 
    13# 
    14# Where base_cipher_state is AES_State, a struct with BlockBase (set of 
    15# pointers to encrypt/decrypt/stop) followed by cipher-specific data. 
    16# 
    17# The API of #2 is (replace "CBC" with the name of the actual mode): 
    18# - CBC_start_operation(base_cipher_state) --> mode_state 
    19# - CBC_encrypt(mode_state, in, out, length) 
    20# - CBC_decrypt(mode_state, in, out, length) 
    21# - CBC_stop_operation(mode_state) 
    22# 
    23# where mode_state is a a pointer to base_cipher_state plus mode-specific data. 
    24 
    25def _create_cipher(factory, key, mode, *args, **kwargs): 
    26 
    27    kwargs["key"] = key 
    28 
    29    if args: 
    30        if mode in (8, 9, 10, 11, 12): 
    31            if len(args) > 1: 
    32                raise TypeError("Too many arguments for this mode") 
    33            kwargs["nonce"] = args[0] 
    34        elif mode in (2, 3, 5, 7): 
    35            if len(args) > 1: 
    36                raise TypeError("Too many arguments for this mode") 
    37            kwargs["IV"] = args[0] 
    38        elif mode == 6: 
    39            if len(args) > 0: 
    40                raise TypeError("Too many arguments for this mode") 
    41        elif mode == 1: 
    42            raise TypeError("IV is not meaningful for the ECB mode") 
    43 
    44    res = None 
    45    extra_modes = kwargs.pop("add_aes_modes", False) 
    46 
    47    if mode == 1: 
    48        from Crypto.Cipher._mode_ecb import _create_ecb_cipher 
    49        res = _create_ecb_cipher(factory, **kwargs) 
    50    elif mode == 2: 
    51        from Crypto.Cipher._mode_cbc import _create_cbc_cipher 
    52        res = _create_cbc_cipher(factory, **kwargs) 
    53    elif mode == 3: 
    54        from Crypto.Cipher._mode_cfb import _create_cfb_cipher 
    55        res = _create_cfb_cipher(factory, **kwargs) 
    56    elif mode == 5: 
    57        from Crypto.Cipher._mode_ofb import _create_ofb_cipher 
    58        res = _create_ofb_cipher(factory, **kwargs) 
    59    elif mode == 6: 
    60        from Crypto.Cipher._mode_ctr import _create_ctr_cipher 
    61        res = _create_ctr_cipher(factory, **kwargs) 
    62    elif mode == 7: 
    63        from Crypto.Cipher._mode_openpgp import _create_openpgp_cipher 
    64        res = _create_openpgp_cipher(factory, **kwargs) 
    65    elif mode == 9: 
    66        from Crypto.Cipher._mode_eax import _create_eax_cipher 
    67        res = _create_eax_cipher(factory, **kwargs) 
    68    elif extra_modes: 
    69        if mode == 8: 
    70            from Crypto.Cipher._mode_ccm import _create_ccm_cipher 
    71            res = _create_ccm_cipher(factory, **kwargs) 
    72        elif mode == 10: 
    73            from Crypto.Cipher._mode_siv import _create_siv_cipher 
    74            res = _create_siv_cipher(factory, **kwargs) 
    75        elif mode == 11: 
    76            from Crypto.Cipher._mode_gcm import _create_gcm_cipher 
    77            res = _create_gcm_cipher(factory, **kwargs) 
    78        elif mode == 12: 
    79            from Crypto.Cipher._mode_ocb import _create_ocb_cipher 
    80            res = _create_ocb_cipher(factory, **kwargs) 
    81        elif mode == 13: 
    82            from Crypto.Cipher._mode_kw import _create_kw_cipher 
    83            res = _create_kw_cipher(factory, **kwargs) 
    84        elif mode == 14: 
    85            from Crypto.Cipher._mode_kwp import _create_kwp_cipher 
    86            res = _create_kwp_cipher(factory, **kwargs) 
    87 
    88    if res is None: 
    89        raise ValueError("Mode not supported") 
    90 
    91    return res