Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.11/site-packages/Crypto/Cipher/__init__.py: 2%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

62 statements  

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