codekingpro/portable-devtools
114k
1# This file is dual licensed under the terms of the Apache License, Version2# 2.0, and the BSD License. See the LICENSE file in the root of this repository3# for complete details.4 5from __future__ import annotations6 7import warnings8 9from cryptography import utils10from cryptography.hazmat.primitives._cipheralgorithm import (11 BlockCipherAlgorithm,12 CipherAlgorithm,13 _verify_key_size,14)15 16 17class ARC4(CipherAlgorithm):18 name = "RC4"19 key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])20 21 def __init__(self, key: bytes):22 self.key = _verify_key_size(self, key)23 24 @property25 def key_size(self) -> int:26 return len(self.key) * 827 28 29class TripleDES(BlockCipherAlgorithm):30 name = "3DES"31 block_size = 6432 key_sizes = frozenset([64, 128, 192])33 34 def __init__(self, key: bytes):35 if len(key) == 8:36 warnings.warn(37 "Single-key TripleDES (8-byte keys) is deprecated and "38 "support will be removed in a future release. Use 24-byte "39 "keys instead (e.g., key + key + key).",40 utils.DeprecatedIn47,41 stacklevel=2,42 )43 key = key + key + key44 elif len(key) == 16:45 warnings.warn(46 "Two-key TripleDES (16-byte keys) is deprecated and "47 "support will be removed in a future release. Use 24-byte "48 "keys instead (e.g., key + key[:8]).",49 utils.DeprecatedIn47,50 stacklevel=2,51 )52 key = key + key[:8]53 self.key = _verify_key_size(self, key)54 55 @property56 def key_size(self) -> int:57 return len(self.key) * 858 59 60# Not actually supported, marker for tests61class _DES:62 key_size = 6463 64 65class Blowfish(BlockCipherAlgorithm):66 name = "Blowfish"67 block_size = 6468 key_sizes = frozenset(range(32, 449, 8))69 70 def __init__(self, key: bytes):71 self.key = _verify_key_size(self, key)72 73 @property74 def key_size(self) -> int:75 return len(self.key) * 876 77 78class CAST5(BlockCipherAlgorithm):79 name = "CAST5"80 block_size = 6481 key_sizes = frozenset(range(40, 129, 8))82 83 def __init__(self, key: bytes):84 self.key = _verify_key_size(self, key)85 86 @property87 def key_size(self) -> int:88 return len(self.key) * 889 90 91class SEED(BlockCipherAlgorithm):92 name = "SEED"93 block_size = 12894 key_sizes = frozenset([128])95 96 def __init__(self, key: bytes):97 self.key = _verify_key_size(self, key)98 99 @property100 def key_size(self) -> int:101 return len(self.key) * 8102 103 104class IDEA(BlockCipherAlgorithm):105 name = "IDEA"106 block_size = 64107 key_sizes = frozenset([128])108 109 def __init__(self, key: bytes):110 self.key = _verify_key_size(self, key)111 112 @property113 def key_size(self) -> int:114 return len(self.key) * 8115 116 117class Camellia(BlockCipherAlgorithm):118 name = "camellia"119 block_size = 128120 key_sizes = frozenset([128, 192, 256])121 122 def __init__(self, key: bytes):123 self.key = _verify_key_size(self, key)124 125 @property126 def key_size(self) -> int:127 return len(self.key) * 8128 129 130# This class only allows RC2 with a 128-bit key. No support for131# effective key bits or other key sizes is provided.132class RC2(BlockCipherAlgorithm):133 name = "RC2"134 block_size = 64135 key_sizes = frozenset([128])136 137 def __init__(self, key: bytes):138 self.key = _verify_key_size(self, key)139 140 @property141 def key_size(self) -> int:142 return len(self.key) * 8143 