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
43# Not actually supported, marker for tests
44class _DES:
45 key_size = 64
46
47
48class Blowfish(BlockCipherAlgorithm):
49 name = "Blowfish"
50 block_size = 64
51 key_sizes = frozenset(range(32, 449, 8))
52
53 def __init__(self, key: bytes):
54 self.key = _verify_key_size(self, key)
55
56 @property
57 def key_size(self) -> int:
58 return len(self.key) * 8
59
60
61class CAST5(BlockCipherAlgorithm):
62 name = "CAST5"
63 block_size = 64
64 key_sizes = frozenset(range(40, 129, 8))
65
66 def __init__(self, key: bytes):
67 self.key = _verify_key_size(self, key)
68
69 @property
70 def key_size(self) -> int:
71 return len(self.key) * 8
72
73
74class SEED(BlockCipherAlgorithm):
75 name = "SEED"
76 block_size = 128
77 key_sizes = frozenset([128])
78
79 def __init__(self, key: bytes):
80 self.key = _verify_key_size(self, key)
81
82 @property
83 def key_size(self) -> int:
84 return len(self.key) * 8
85
86
87class IDEA(BlockCipherAlgorithm):
88 name = "IDEA"
89 block_size = 64
90 key_sizes = frozenset([128])
91
92 def __init__(self, key: bytes):
93 self.key = _verify_key_size(self, key)
94
95 @property
96 def key_size(self) -> int:
97 return len(self.key) * 8
98
99
100# This class only allows RC2 with a 128-bit key. No support for
101# effective key bits or other key sizes is provided.
102class RC2(BlockCipherAlgorithm):
103 name = "RC2"
104 block_size = 64
105 key_sizes = frozenset([128])
106
107 def __init__(self, key: bytes):
108 self.key = _verify_key_size(self, key)
109
110 @property
111 def key_size(self) -> int:
112 return len(self.key) * 8