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