algorithms.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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. from __future__ import annotations
  5. from cryptography.hazmat.primitives._cipheralgorithm import (
  6. BlockCipherAlgorithm,
  7. CipherAlgorithm,
  8. _verify_key_size,
  9. )
  10. class ARC4(CipherAlgorithm):
  11. name = "RC4"
  12. key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])
  13. def __init__(self, key: bytes):
  14. self.key = _verify_key_size(self, key)
  15. @property
  16. def key_size(self) -> int:
  17. return len(self.key) * 8
  18. class TripleDES(BlockCipherAlgorithm):
  19. name = "3DES"
  20. block_size = 64
  21. key_sizes = frozenset([64, 128, 192])
  22. def __init__(self, key: bytes):
  23. if len(key) == 8:
  24. key += key + key
  25. elif len(key) == 16:
  26. key += key[:8]
  27. self.key = _verify_key_size(self, key)
  28. @property
  29. def key_size(self) -> int:
  30. return len(self.key) * 8
  31. class Blowfish(BlockCipherAlgorithm):
  32. name = "Blowfish"
  33. block_size = 64
  34. key_sizes = frozenset(range(32, 449, 8))
  35. def __init__(self, key: bytes):
  36. self.key = _verify_key_size(self, key)
  37. @property
  38. def key_size(self) -> int:
  39. return len(self.key) * 8
  40. class CAST5(BlockCipherAlgorithm):
  41. name = "CAST5"
  42. block_size = 64
  43. key_sizes = frozenset(range(40, 129, 8))
  44. def __init__(self, key: bytes):
  45. self.key = _verify_key_size(self, key)
  46. @property
  47. def key_size(self) -> int:
  48. return len(self.key) * 8
  49. class SEED(BlockCipherAlgorithm):
  50. name = "SEED"
  51. block_size = 128
  52. key_sizes = frozenset([128])
  53. def __init__(self, key: bytes):
  54. self.key = _verify_key_size(self, key)
  55. @property
  56. def key_size(self) -> int:
  57. return len(self.key) * 8
  58. class IDEA(BlockCipherAlgorithm):
  59. name = "IDEA"
  60. block_size = 64
  61. key_sizes = frozenset([128])
  62. def __init__(self, key: bytes):
  63. self.key = _verify_key_size(self, key)
  64. @property
  65. def key_size(self) -> int:
  66. return len(self.key) * 8
  67. # This class only allows RC2 with a 128-bit key. No support for
  68. # effective key bits or other key sizes is provided.
  69. class RC2(BlockCipherAlgorithm):
  70. name = "RC2"
  71. block_size = 64
  72. key_sizes = frozenset([128])
  73. def __init__(self, key: bytes):
  74. self.key = _verify_key_size(self, key)
  75. @property
  76. def key_size(self) -> int:
  77. return len(self.key) * 8