1# This file is dual licensed under the terms of the Apache License, Version
2# 2.0, and the BSD License. See the LICENSE file in the root of this repository
3# for complete details.
4
5from __future__ import annotations
6
7from cryptography.hazmat.primitives._cipheralgorithm import (
8 BlockCipherAlgorithm,
9 CipherAlgorithm,
10 _verify_key_size,
11)
12
13
14class ARC4(CipherAlgorithm):
15 name = "RC4"
16 key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])
17
18 def __init__(self, key: bytes):
19 self.key = _verify_key_size(self, key)
20
21 @property
22 def key_size(self) -> int:
23 return len(self.key) * 8
24
25
26class TripleDES(BlockCipherAlgorithm):
27 name = "3DES"
28 block_size = 64
29 key_sizes = frozenset([64, 128, 192])
30
31 def __init__(self, key: bytes):
32 if len(key) == 8:
33 key += key + key
34 elif len(key) == 16:
35 key += key[:8]
36 self.key = _verify_key_size(self, key)
37
38 @property
39 def key_size(self) -> int:
40 return len(self.key) * 8
41
42
43class Blowfish(BlockCipherAlgorithm):
44 name = "Blowfish"
45 block_size = 64
46 key_sizes = frozenset(range(32, 449, 8))
47
48 def __init__(self, key: bytes):
49 self.key = _verify_key_size(self, key)
50
51 @property
52 def key_size(self) -> int:
53 return len(self.key) * 8
54
55
56class CAST5(BlockCipherAlgorithm):
57 name = "CAST5"
58 block_size = 64
59 key_sizes = frozenset(range(40, 129, 8))
60
61 def __init__(self, key: bytes):
62 self.key = _verify_key_size(self, key)
63
64 @property
65 def key_size(self) -> int:
66 return len(self.key) * 8
67
68
69class SEED(BlockCipherAlgorithm):
70 name = "SEED"
71 block_size = 128
72 key_sizes = frozenset([128])
73
74 def __init__(self, key: bytes):
75 self.key = _verify_key_size(self, key)
76
77 @property
78 def key_size(self) -> int:
79 return len(self.key) * 8
80
81
82class IDEA(BlockCipherAlgorithm):
83 name = "IDEA"
84 block_size = 64
85 key_sizes = frozenset([128])
86
87 def __init__(self, key: bytes):
88 self.key = _verify_key_size(self, key)
89
90 @property
91 def key_size(self) -> int:
92 return len(self.key) * 8
93
94
95# This class only allows RC2 with a 128-bit key. No support for
96# effective key bits or other key sizes is provided.
97class RC2(BlockCipherAlgorithm):
98 name = "RC2"
99 block_size = 64
100 key_sizes = frozenset([128])
101
102 def __init__(self, key: bytes):
103 self.key = _verify_key_size(self, key)
104
105 @property
106 def key_size(self) -> int:
107 return len(self.key) * 8