algorithms.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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 absolute_import, division, print_function
  5. from cryptography import utils
  6. from cryptography.hazmat.primitives.ciphers import (
  7. BlockCipherAlgorithm,
  8. CipherAlgorithm,
  9. )
  10. from cryptography.hazmat.primitives.ciphers.modes import ModeWithNonce
  11. def _verify_key_size(algorithm, key):
  12. # Verify that the key is instance of bytes
  13. utils._check_byteslike("key", key)
  14. # Verify that the key size matches the expected key size
  15. if len(key) * 8 not in algorithm.key_sizes:
  16. raise ValueError(
  17. "Invalid key size ({}) for {}.".format(
  18. len(key) * 8, algorithm.name
  19. )
  20. )
  21. return key
  22. @utils.register_interface(BlockCipherAlgorithm)
  23. @utils.register_interface(CipherAlgorithm)
  24. class AES(object):
  25. name = "AES"
  26. block_size = 128
  27. # 512 added to support AES-256-XTS, which uses 512-bit keys
  28. key_sizes = frozenset([128, 192, 256, 512])
  29. def __init__(self, key):
  30. self.key = _verify_key_size(self, key)
  31. @property
  32. def key_size(self):
  33. return len(self.key) * 8
  34. @utils.register_interface(BlockCipherAlgorithm)
  35. @utils.register_interface(CipherAlgorithm)
  36. class Camellia(object):
  37. name = "camellia"
  38. block_size = 128
  39. key_sizes = frozenset([128, 192, 256])
  40. def __init__(self, key):
  41. self.key = _verify_key_size(self, key)
  42. @property
  43. def key_size(self):
  44. return len(self.key) * 8
  45. @utils.register_interface(BlockCipherAlgorithm)
  46. @utils.register_interface(CipherAlgorithm)
  47. class TripleDES(object):
  48. name = "3DES"
  49. block_size = 64
  50. key_sizes = frozenset([64, 128, 192])
  51. def __init__(self, key):
  52. if len(key) == 8:
  53. key += key + key
  54. elif len(key) == 16:
  55. key += key[:8]
  56. self.key = _verify_key_size(self, key)
  57. @property
  58. def key_size(self):
  59. return len(self.key) * 8
  60. @utils.register_interface(BlockCipherAlgorithm)
  61. @utils.register_interface(CipherAlgorithm)
  62. class Blowfish(object):
  63. name = "Blowfish"
  64. block_size = 64
  65. key_sizes = frozenset(range(32, 449, 8))
  66. def __init__(self, key):
  67. self.key = _verify_key_size(self, key)
  68. @property
  69. def key_size(self):
  70. return len(self.key) * 8
  71. @utils.register_interface(BlockCipherAlgorithm)
  72. @utils.register_interface(CipherAlgorithm)
  73. class CAST5(object):
  74. name = "CAST5"
  75. block_size = 64
  76. key_sizes = frozenset(range(40, 129, 8))
  77. def __init__(self, key):
  78. self.key = _verify_key_size(self, key)
  79. @property
  80. def key_size(self):
  81. return len(self.key) * 8
  82. @utils.register_interface(CipherAlgorithm)
  83. class ARC4(object):
  84. name = "RC4"
  85. key_sizes = frozenset([40, 56, 64, 80, 128, 160, 192, 256])
  86. def __init__(self, key):
  87. self.key = _verify_key_size(self, key)
  88. @property
  89. def key_size(self):
  90. return len(self.key) * 8
  91. @utils.register_interface(CipherAlgorithm)
  92. class IDEA(object):
  93. name = "IDEA"
  94. block_size = 64
  95. key_sizes = frozenset([128])
  96. def __init__(self, key):
  97. self.key = _verify_key_size(self, key)
  98. @property
  99. def key_size(self):
  100. return len(self.key) * 8
  101. @utils.register_interface(BlockCipherAlgorithm)
  102. @utils.register_interface(CipherAlgorithm)
  103. class SEED(object):
  104. name = "SEED"
  105. block_size = 128
  106. key_sizes = frozenset([128])
  107. def __init__(self, key):
  108. self.key = _verify_key_size(self, key)
  109. @property
  110. def key_size(self):
  111. return len(self.key) * 8
  112. @utils.register_interface(CipherAlgorithm)
  113. @utils.register_interface(ModeWithNonce)
  114. class ChaCha20(object):
  115. name = "ChaCha20"
  116. key_sizes = frozenset([256])
  117. def __init__(self, key, nonce):
  118. self.key = _verify_key_size(self, key)
  119. utils._check_byteslike("nonce", nonce)
  120. if len(nonce) != 16:
  121. raise ValueError("nonce must be 128-bits (16 bytes)")
  122. self._nonce = nonce
  123. nonce = utils.read_only_property("_nonce")
  124. @property
  125. def key_size(self):
  126. return len(self.key) * 8