blob: 21d12a385104e5d2f833153788d3dedabfb11c15 [file] [log] [blame]
Alex Gaynor2724ff62013-12-20 13:51:42 -08001.. hazmat:: /fernet
Donald Stufftd8f01182013-10-27 16:59:56 -04002
3
Alex Stapletonc5fffd32014-03-18 15:29:00 +00004Symmetric encryption
Donald Stuffte51fb932013-10-27 17:26:17 -04005====================
6
Paul Kehrer7c5c9fe2015-02-14 10:27:14 -06007.. module:: cryptography.hazmat.primitives.ciphers
David Reid1f3d7182013-10-22 16:55:18 -07008
Alex Stapleton092351d2014-03-09 17:44:43 +00009Symmetric encryption is a way to `encrypt`_ or hide the contents of material
10where the sender and receiver both use the same secret key. Note that symmetric
11encryption is **not** sufficient for most applications because it only
12provides secrecy but not authenticity. That means an attacker can't see the
13message but an attacker can create bogus messages and force the application to
14decrypt them.
15
Paul Kehrer006670c2014-05-09 11:12:43 -050016For this reason it is **strongly** recommended to combine encryption with a
Alex Gaynor969f18e2014-05-17 20:07:35 -070017message authentication code, such as :doc:`HMAC </hazmat/primitives/mac/hmac>`,
18in an "encrypt-then-MAC" formulation as `described by Colin Percival`_.
Paul Kehrerafa84f12017-05-27 15:11:24 -050019``cryptography`` includes a recipe named :doc:`/fernet` that does this for you.
20**To minimize the risk of security issues you should evaluate Fernet to see if
21it fits your needs before implementing anything using this module.**
Alex Gaynorf6c47e92013-08-08 07:16:01 -070022
David Reidef0fcf22013-11-06 11:12:45 -080023.. class:: Cipher(algorithm, mode, backend)
Alex Gaynorf6c47e92013-08-08 07:16:01 -070024
Alex Stapleton092351d2014-03-09 17:44:43 +000025 Cipher objects combine an algorithm such as
26 :class:`~cryptography.hazmat.primitives.ciphers.algorithms.AES` with a
27 mode like
Alex Gaynorab5f0112013-11-08 10:34:00 -080028 :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` or
Alex Stapleton092351d2014-03-09 17:44:43 +000029 :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`. A simple
30 example of encrypting and then decrypting content with AES is:
Alex Gaynorf6c47e92013-08-08 07:16:01 -070031
Donald Stufft173de982013-08-12 07:34:39 -040032 .. doctest::
Alex Gaynorf6c47e92013-08-08 07:16:01 -070033
Gregory Haynes0f986112014-12-30 09:43:24 -080034 >>> import os
Paul Kehrer051099e2013-11-06 15:53:40 +080035 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
Alex Gaynorf8796b12013-12-13 20:28:55 -080036 >>> from cryptography.hazmat.backends import default_backend
Alex Gaynorf56444d2013-12-13 15:19:22 -080037 >>> backend = default_backend()
Gregory Haynese261d942015-01-03 09:17:41 -080038 >>> key = os.urandom(32)
Gregory Haynese5917782015-01-03 21:58:25 -080039 >>> iv = os.urandom(16)
Gregory Haynese261d942015-01-03 09:17:41 -080040 >>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
Paul Kehrer3e0895c2013-10-21 22:19:29 -050041 >>> encryptor = cipher.encryptor()
42 >>> ct = encryptor.update(b"a secret message") + encryptor.finalize()
43 >>> decryptor = cipher.decryptor()
44 >>> decryptor.update(ct) + decryptor.finalize()
Paul Kehrer056c9dd2018-05-12 15:17:06 -040045 b'a secret message'
Alex Gaynorf6c47e92013-08-08 07:16:01 -070046
David Reid663295d2013-11-20 13:55:08 -080047 :param algorithms: A
Paul Kehrer7c5c9fe2015-02-14 10:27:14 -060048 :class:`~cryptography.hazmat.primitives.ciphers.CipherAlgorithm`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030049 instance such as those described
David Reid663295d2013-11-20 13:55:08 -080050 :ref:`below <symmetric-encryption-algorithms>`.
Paul Kehrer513b7cb2015-02-12 17:31:24 -060051 :param mode: A :class:`~cryptography.hazmat.primitives.ciphers.modes.Mode`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030052 instance such as those described
David Reid663295d2013-11-20 13:55:08 -080053 :ref:`below <symmetric-encryption-modes>`.
54 :param backend: A
Alex Gaynorf8796b12013-12-13 20:28:55 -080055 :class:`~cryptography.hazmat.backends.interfaces.CipherBackend`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030056 instance.
Alex Gaynor0ca7fdb2013-08-08 07:35:26 -070057
Alex Gaynor7a489db2014-03-22 15:09:34 -070058 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrxf56c54e2014-03-16 14:36:17 +080059 provided ``backend`` does not implement
60 :class:`~cryptography.hazmat.backends.interfaces.CipherBackend`
61
Paul Kehrer5399fd02013-10-21 23:48:25 -050062 .. method:: encryptor()
Alex Gaynor09515f02013-08-08 15:26:55 -070063
David Reid63ba6652013-10-22 14:09:19 -070064 :return: An encrypting
Paul Kehrer7c5c9fe2015-02-14 10:27:14 -060065 :class:`~cryptography.hazmat.primitives.ciphers.CipherContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030066 instance.
Alex Gaynore62aa402013-08-08 15:23:11 -070067
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070068 If the backend doesn't support the requested combination of ``cipher``
Alex Gaynor7a489db2014-03-22 15:09:34 -070069 and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm`
Alex Stapleton092351d2014-03-09 17:44:43 +000070 exception will be raised.
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070071
Paul Kehrer5399fd02013-10-21 23:48:25 -050072 .. method:: decryptor()
73
David Reid63ba6652013-10-22 14:09:19 -070074 :return: A decrypting
Paul Kehrer7c5c9fe2015-02-14 10:27:14 -060075 :class:`~cryptography.hazmat.primitives.ciphers.CipherContext`
Gabriel Orisaka617fe4b2016-07-31 10:49:59 -030076 instance.
Paul Kehrer5399fd02013-10-21 23:48:25 -050077
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070078 If the backend doesn't support the requested combination of ``cipher``
Alex Gaynorfdf63302014-04-29 18:26:11 -070079 and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm`
Alex Stapleton092351d2014-03-09 17:44:43 +000080 exception will be raised.
Alex Gaynorf1a3fc02013-11-02 14:03:34 -070081
David Reid663295d2013-11-20 13:55:08 -080082.. _symmetric-encryption-algorithms:
83
Paul Kehrer051099e2013-11-06 15:53:40 +080084Algorithms
85~~~~~~~~~~
Alex Gaynord96d1002013-08-08 07:37:26 -070086
Paul Kehrer051099e2013-11-06 15:53:40 +080087.. currentmodule:: cryptography.hazmat.primitives.ciphers.algorithms
David Reid1f3d7182013-10-22 16:55:18 -070088
89.. class:: AES(key)
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070090
Alex Gaynor1e3f81f2013-08-08 11:31:43 -070091 AES (Advanced Encryption Standard) is a block cipher standardized by NIST.
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070092 AES is both fast, and cryptographically strong. It is a good default
93 choice for encryption.
94
Paul Kehrer3c682502018-12-10 12:13:31 +080095 :param key: The secret key. This must be kept secret. Either ``128``,
Paul Kehrer1aac78c2017-10-11 19:49:57 +080096 ``192``, or ``256`` :term:`bits` long.
Paul Kehrer3c682502018-12-10 12:13:31 +080097 :type key: :term:`bytes-like`
Alex Gaynor5ba2dfa2013-08-08 11:04:44 -070098
David Reid1f3d7182013-10-22 16:55:18 -070099.. class:: Camellia(key)
Paul Kehrerdff22d42013-09-27 13:43:06 -0500100
Alex Stapleton092351d2014-03-09 17:44:43 +0000101 Camellia is a block cipher approved for use by `CRYPTREC`_ and ISO/IEC.
102 It is considered to have comparable security and performance to AES but
Paul Kehrerdff22d42013-09-27 13:43:06 -0500103 is not as widely studied or deployed.
104
Paul Kehrer3c682502018-12-10 12:13:31 +0800105 :param key: The secret key. This must be kept secret. Either ``128``,
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800106 ``192``, or ``256`` :term:`bits` long.
Paul Kehrer3c682502018-12-10 12:13:31 +0800107 :type key: :term:`bytes-like`
Paul Kehrerdff22d42013-09-27 13:43:06 -0500108
Paul Kehrer62ebb422017-09-28 23:46:49 +0800109.. class:: ChaCha20(key)
110
111 .. versionadded:: 2.1
112
113 .. note::
114
115 In most cases users should use
116 :class:`~cryptography.hazmat.primitives.ciphers.aead.ChaCha20Poly1305`
117 instead of this class. `ChaCha20` alone does not provide integrity
118 so it must be combined with a MAC to be secure.
119 :class:`~cryptography.hazmat.primitives.ciphers.aead.ChaCha20Poly1305`
120 does this for you.
121
122 ChaCha20 is a stream cipher used in several IETF protocols. It is
123 standardized in :rfc:`7539`.
124
Paul Kehrer3c682502018-12-10 12:13:31 +0800125 :param key: The secret key. This must be kept secret. ``256``
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800126 :term:`bits` (32 bytes) in length.
Paul Kehrer3c682502018-12-10 12:13:31 +0800127 :type key: :term:`bytes-like`
Paul Kehrer62ebb422017-09-28 23:46:49 +0800128
Paul Kehrer3c682502018-12-10 12:13:31 +0800129 :param nonce: Should be unique, a :term:`nonce`. It is
Paul Kehrer62ebb422017-09-28 23:46:49 +0800130 critical to never reuse a ``nonce`` with a given key. Any reuse of a
131 nonce with the same key compromises the security of every message
132 encrypted with that key. The nonce does not need to be kept secret
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800133 and may be included with the ciphertext. This must be ``128``
134 :term:`bits` in length.
Paul Kehrer3c682502018-12-10 12:13:31 +0800135 :type nonce: :term:`bytes-like`
Paul Kehrer62ebb422017-09-28 23:46:49 +0800136
137 .. note::
138
139 In :rfc:`7539` the nonce is defined as a 96-bit value that is later
140 concatenated with a block counter (encoded as a 32-bit
141 little-endian). If you have a separate nonce and block counter
142 you will need to concatenate it yourself before passing it. For
Alex Gaynorc0c70fb2017-12-29 11:09:30 -0500143 example, if you have an initial block counter of 2 and a 96-bit
Paul Kehrer62ebb422017-09-28 23:46:49 +0800144 nonce the concatenated nonce would be
145 ``struct.pack("<i", 2) + nonce``.
146
147 .. doctest::
148
149 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
150 >>> from cryptography.hazmat.backends import default_backend
151 >>> nonce = os.urandom(16)
152 >>> algorithm = algorithms.ChaCha20(key, nonce)
153 >>> cipher = Cipher(algorithm, mode=None, backend=default_backend())
154 >>> encryptor = cipher.encryptor()
155 >>> ct = encryptor.update(b"a secret message")
156 >>> decryptor = cipher.decryptor()
157 >>> decryptor.update(ct)
Paul Kehrer056c9dd2018-05-12 15:17:06 -0400158 b'a secret message'
Paul Kehrer62ebb422017-09-28 23:46:49 +0800159
David Reid1f3d7182013-10-22 16:55:18 -0700160.. class:: TripleDES(key)
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700161
Alex Gaynor9316f4c2013-11-15 16:38:42 -0800162 Triple DES (Data Encryption Standard), sometimes referred to as 3DES, is a
163 block cipher standardized by NIST. Triple DES has known crypto-analytic
Alex Gaynor17adce62013-10-16 17:04:40 -0700164 flaws, however none of them currently enable a practical attack.
Alex Chanee9710f2016-09-04 17:40:06 +0100165 Nonetheless, Triple DES is not recommended for new applications because it
Alex Gaynorfbcc5642013-10-22 08:26:00 -0700166 is incredibly slow; old applications should consider moving away from it.
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700167
Paul Kehrer3c682502018-12-10 12:13:31 +0800168 :param key: The secret key. This must be kept secret. Either ``64``,
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800169 ``128``, or ``192`` :term:`bits` long. DES only uses ``56``, ``112``,
170 or ``168`` bits of the key as there is a parity byte in each component
171 of the key. Some writing refers to there being up to three separate
172 keys that are each ``56`` bits long, they can simply be concatenated
173 to produce the full key.
Paul Kehrer3c682502018-12-10 12:13:31 +0800174 :type key: :term:`bytes-like`
Alex Gaynoraeb714c2013-09-09 18:06:14 -0700175
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600176.. class:: CAST5(key)
177
Paul Kehrera5011ec2014-02-13 12:33:34 -0600178 .. versionadded:: 0.2
179
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600180 CAST5 (also known as CAST-128) is a block cipher approved for use in the
181 Canadian government by the `Communications Security Establishment`_. It is
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800182 a variable key length cipher and supports keys from 40-128 :term:`bits` in
183 length.
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600184
Paul Kehrer3c682502018-12-10 12:13:31 +0800185 :param key: The secret key, This must be kept secret. 40 to 128
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800186 :term:`bits` in length in increments of 8 bits.
Paul Kehrer3c682502018-12-10 12:13:31 +0800187 :type key: :term:`bytes-like`
Paul Kehrerbab0e1a2014-02-09 10:51:59 -0600188
Paul Kehrer7e914c92014-04-09 09:12:29 -0500189.. class:: SEED(key)
190
191 .. versionadded:: 0.4
192
Alex Stapleton19e97bd2014-05-02 21:57:59 +0100193 SEED is a block cipher developed by the Korea Information Security Agency
194 (KISA). It is defined in :rfc:`4269` and is used broadly throughout South
Paul Kehrer7e914c92014-04-09 09:12:29 -0500195 Korean industry, but rarely found elsewhere.
196
Paul Kehrer3c682502018-12-10 12:13:31 +0800197 :param key: The secret key. This must be kept secret. ``128``
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800198 :term:`bits` in length.
Paul Kehrer3c682502018-12-10 12:13:31 +0800199 :type key: :term:`bytes-like`
Paul Kehrer7e914c92014-04-09 09:12:29 -0500200
Alex Stapletonc5fffd32014-03-18 15:29:00 +0000201Weak ciphers
Paul Kehrer3446d812013-10-31 17:15:03 -0500202------------
203
204.. warning::
205
206 These ciphers are considered weak for a variety of reasons. New
207 applications should avoid their use and existing applications should
208 strongly consider migrating away.
209
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500210.. class:: Blowfish(key)
211
212 Blowfish is a block cipher developed by Bruce Schneier. It is known to be
213 susceptible to attacks when using weak keys. The author has recommended
Alex Stapleton092351d2014-03-09 17:44:43 +0000214 that users of Blowfish move to newer algorithms such as :class:`AES`.
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500215
Paul Kehrer3c682502018-12-10 12:13:31 +0800216 :param key: The secret key. This must be kept secret. 32 to 448
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800217 :term:`bits` in length in increments of 8 bits.
Paul Kehrer3c682502018-12-10 12:13:31 +0800218 :type key: :term:`bytes-like`
Paul Kehrer5df0abe2013-10-30 16:57:04 -0500219
Paul Kehrer4da28c32013-11-07 07:50:17 +0800220.. class:: ARC4(key)
221
222 ARC4 (Alleged RC4) is a stream cipher with serious weaknesses in its
223 initial stream output. Its use is strongly discouraged. ARC4 does not use
224 mode constructions.
225
Paul Kehrer3c682502018-12-10 12:13:31 +0800226 :param key: The secret key. This must be kept secret. Either ``40``,
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800227 ``56``, ``64``, ``80``, ``128``, ``192``, or ``256`` :term:`bits` in
228 length.
Paul Kehrer3c682502018-12-10 12:13:31 +0800229 :type key: :term:`bytes-like`
Paul Kehrer4da28c32013-11-07 07:50:17 +0800230
Paul Kehrer0994c562013-11-10 03:19:14 +0800231 .. doctest::
232
233 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
Alex Gaynorf8796b12013-12-13 20:28:55 -0800234 >>> from cryptography.hazmat.backends import default_backend
Paul Kehrer0994c562013-11-10 03:19:14 +0800235 >>> algorithm = algorithms.ARC4(key)
Alex Gaynorf56444d2013-12-13 15:19:22 -0800236 >>> cipher = Cipher(algorithm, mode=None, backend=default_backend())
Paul Kehrer0994c562013-11-10 03:19:14 +0800237 >>> encryptor = cipher.encryptor()
238 >>> ct = encryptor.update(b"a secret message")
239 >>> decryptor = cipher.decryptor()
240 >>> decryptor.update(ct)
Paul Kehrer056c9dd2018-05-12 15:17:06 -0400241 b'a secret message'
Paul Kehrer0994c562013-11-10 03:19:14 +0800242
Paul Kehrere5dc1222014-02-20 16:19:32 -0600243.. class:: IDEA(key)
244
245 IDEA (`International Data Encryption Algorithm`_) is a block cipher created
246 in 1991. It is an optional component of the `OpenPGP`_ standard. This cipher
247 is susceptible to attacks when using weak keys. It is recommended that you
248 do not use this cipher for new applications.
249
Paul Kehrer3c682502018-12-10 12:13:31 +0800250 :param key: The secret key. This must be kept secret. ``128``
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800251 :term:`bits` in length.
Paul Kehrer3c682502018-12-10 12:13:31 +0800252 :type key: :term:`bytes-like`
Paul Kehrere5dc1222014-02-20 16:19:32 -0600253
David Reid30722b92013-11-07 13:03:39 -0800254
255.. _symmetric-encryption-modes:
256
Alex Gaynord96d1002013-08-08 07:37:26 -0700257Modes
258~~~~~
259
Paul Kehrer2129d502015-02-13 12:37:34 -0600260.. module:: cryptography.hazmat.primitives.ciphers.modes
David Reid1f3d7182013-10-22 16:55:18 -0700261
262.. class:: CBC(initialization_vector)
Alex Gaynor48ec9a32013-08-08 11:13:46 -0700263
Alex Stapleton092351d2014-03-09 17:44:43 +0000264 CBC (Cipher Block Chaining) is a mode of operation for block ciphers. It is
Alex Gaynor48ec9a32013-08-08 11:13:46 -0700265 considered cryptographically strong.
266
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600267 **Padding is required when using this mode.**
268
Paul Kehrer3c682502018-12-10 12:13:31 +0800269 :param initialization_vector: Must be :doc:`random bytes
Alex Gaynor9b6fd8e2014-12-19 10:29:56 -0800270 </random-numbers>`. They do not need to be kept secret and they can be
271 included in a transmitted message. Must be the same number of bytes as
272 the ``block_size`` of the cipher. Each time something is encrypted a
273 new ``initialization_vector`` should be generated. Do not reuse an
274 ``initialization_vector`` with a given ``key``, and particularly do not
275 use a constant ``initialization_vector``.
Paul Kehrer3c682502018-12-10 12:13:31 +0800276 :type initialization_vector: :term:`bytes-like`
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800277
278 A good construction looks like:
279
Alex Gaynor989061d2013-12-13 20:22:14 -0800280 .. doctest::
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800281
282 >>> import os
Alex Gaynord83c5902013-12-13 20:43:54 -0800283 >>> from cryptography.hazmat.primitives.ciphers.modes import CBC
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800284 >>> iv = os.urandom(16)
285 >>> mode = CBC(iv)
286
287 While the following is bad and will leak information:
288
Alex Gaynor989061d2013-12-13 20:22:14 -0800289 .. doctest::
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800290
Alex Gaynord83c5902013-12-13 20:43:54 -0800291 >>> from cryptography.hazmat.primitives.ciphers.modes import CBC
Paul Kehrer056c9dd2018-05-12 15:17:06 -0400292 >>> iv = b"a" * 16
Alex Gaynor8ed651e2013-11-07 13:24:31 -0800293 >>> mode = CBC(iv)
Paul Kehrer13f108f2013-09-09 21:41:03 -0500294
Paul Kehrer45064282013-10-17 13:41:53 -0500295
David Reid1f3d7182013-10-22 16:55:18 -0700296.. class:: CTR(nonce)
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500297
Paul Kehrer45064282013-10-17 13:41:53 -0500298 .. warning::
299
300 Counter mode is not recommended for use with block ciphers that have a
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800301 block size of less than 128-:term:`bits`.
Paul Kehrer45064282013-10-17 13:41:53 -0500302
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500303 CTR (Counter) is a mode of operation for block ciphers. It is considered
Alex Gaynord1f02012013-11-01 14:12:35 -0700304 cryptographically strong. It transforms a block cipher into a stream
305 cipher.
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500306
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600307 **This mode does not require padding.**
308
Paul Kehrer3c682502018-12-10 12:13:31 +0800309 :param nonce: Should be unique, a :term:`nonce`. It is
Alex Gaynor9b6fd8e2014-12-19 10:29:56 -0800310 critical to never reuse a ``nonce`` with a given key. Any reuse of a
311 nonce with the same key compromises the security of every message
312 encrypted with that key. Must be the same number of bytes as the
313 ``block_size`` of the cipher with a given key. The nonce does not need
314 to be kept secret and may be included with the ciphertext.
Paul Kehrer3c682502018-12-10 12:13:31 +0800315 :type nonce: :term:`bytes-like`
Paul Kehrerd0ec60e2013-10-16 08:46:50 -0500316
David Reid1f3d7182013-10-22 16:55:18 -0700317.. class:: OFB(initialization_vector)
Paul Kehrer6f412a02013-09-10 21:30:50 -0500318
319 OFB (Output Feedback) is a mode of operation for block ciphers. It
320 transforms a block cipher into a stream cipher.
321
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600322 **This mode does not require padding.**
323
Paul Kehrer3c682502018-12-10 12:13:31 +0800324 :param initialization_vector: Must be :doc:`random bytes
Alex Gaynor9b6fd8e2014-12-19 10:29:56 -0800325 </random-numbers>`. They do not need to be kept secret and they can be
326 included in a transmitted message. Must be the same number of bytes as
327 the ``block_size`` of the cipher. Do not reuse an
328 ``initialization_vector`` with a given ``key``.
Paul Kehrer3c682502018-12-10 12:13:31 +0800329 :type initialization_vector: :term:`bytes-like`
Paul Kehrer6f412a02013-09-10 21:30:50 -0500330
David Reid1f3d7182013-10-22 16:55:18 -0700331.. class:: CFB(initialization_vector)
Paul Kehrer4223df72013-09-11 09:48:04 -0500332
333 CFB (Cipher Feedback) is a mode of operation for block ciphers. It
334 transforms a block cipher into a stream cipher.
335
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600336 **This mode does not require padding.**
337
Paul Kehrer3c682502018-12-10 12:13:31 +0800338 :param initialization_vector: Must be :doc:`random bytes
Alex Gaynor9b6fd8e2014-12-19 10:29:56 -0800339 </random-numbers>`. They do not need to be kept secret and they can be
340 included in a transmitted message. Must be the same number of bytes as
341 the ``block_size`` of the cipher. Do not reuse an
342 ``initialization_vector`` with a given ``key``.
Paul Kehrer3c682502018-12-10 12:13:31 +0800343 :type initialization_vector: :term:`bytes-like`
Paul Kehrer4223df72013-09-11 09:48:04 -0500344
Paul Kehrer2a947c42014-05-15 17:22:08 -0400345.. class:: CFB8(initialization_vector)
346
347 CFB (Cipher Feedback) is a mode of operation for block ciphers. It
348 transforms a block cipher into a stream cipher. The CFB8 variant uses an
349 8-bit shift register.
350
351 **This mode does not require padding.**
352
Paul Kehrer3c682502018-12-10 12:13:31 +0800353 :param initialization_vector: Must be :doc:`random bytes
Alex Gaynor9b6fd8e2014-12-19 10:29:56 -0800354 </random-numbers>`. They do not need to be kept secret and they can be
355 included in a transmitted message. Must be the same number of bytes as
356 the ``block_size`` of the cipher. Do not reuse an
357 ``initialization_vector`` with a given ``key``.
Paul Kehrer3c682502018-12-10 12:13:31 +0800358 :type initialization_vector: :term:`bytes-like`
Paul Kehrer2a947c42014-05-15 17:22:08 -0400359
Alex Gaynorcc5224f2014-06-30 09:25:48 -0700360.. class:: GCM(initialization_vector, tag=None, min_tag_length=16)
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600361
Paul Kehrer5b828b12013-11-29 17:32:08 -0600362 .. danger::
Paul Kehrer26c8c6a2013-11-29 16:24:56 -0600363
Paul Kehrera2173582017-07-17 13:10:14 +0200364 If you are encrypting data that can fit into memory you should strongly
365 consider using
366 :class:`~cryptography.hazmat.primitives.ciphers.aead.AESGCM` instead
367 of this.
368
Alex Stapleton092351d2014-03-09 17:44:43 +0000369 When using this mode you **must** not use the decrypted data until
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200370 the appropriate finalization method
371 (:meth:`~cryptography.hazmat.primitives.ciphers.CipherContext.finalize`
372 or
373 :meth:`~cryptography.hazmat.primitives.ciphers.AEADDecryptionContext.finalize_with_tag`)
Alex Stapleton092351d2014-03-09 17:44:43 +0000374 has been called. GCM provides **no** guarantees of ciphertext integrity
Alex Gaynord4f93832013-12-04 16:31:59 -0600375 until decryption is complete.
Paul Kehrer26c8c6a2013-11-29 16:24:56 -0600376
Paul Kehrer5578c662013-12-03 17:37:42 -0600377 GCM (Galois Counter Mode) is a mode of operation for block ciphers. An
378 AEAD (authenticated encryption with additional data) mode is a type of
Alex Stapleton092351d2014-03-09 17:44:43 +0000379 block cipher mode that simultaneously encrypts the message as well as
380 authenticating it. Additional unencrypted data may also be authenticated.
381 Additional means of verifying integrity such as
Ayrxfa4a6b22014-04-16 23:03:14 +0800382 :doc:`HMAC </hazmat/primitives/mac/hmac>` are not necessary.
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600383
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600384 **This mode does not require padding.**
385
Paul Kehrer3c682502018-12-10 12:13:31 +0800386 :param initialization_vector: Must be unique, a :term:`nonce`.
Eeshan Garg94759002015-05-20 20:35:33 +0530387 They do not need to be kept secret and they can be included in a
388 transmitted message. NIST `recommends a 96-bit IV length`_ for
389 performance critical situations but it can be up to 2\ :sup:`64` - 1
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800390 :term:`bits`. Do not reuse an ``initialization_vector`` with a given
391 ``key``.
Paul Kehrer3c682502018-12-10 12:13:31 +0800392 :type initialization_vector: :term:`bytes-like`
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600393
Paul Kehrerca735042013-12-21 17:31:48 -0600394 .. note::
395
Alex Stapleton092351d2014-03-09 17:44:43 +0000396 Cryptography will generate a 128-bit tag when finalizing encryption.
397 You can shorten a tag by truncating it to the desired length but this
Alex Gaynord6256092018-07-05 23:04:46 -0400398 is **not recommended** as it makes it easier to forge messages, and
399 also potentially leaks the key (`NIST SP-800-38D`_ recommends
400 96-:term:`bits` or greater). Applications wishing to allow truncation
401 can pass the ``min_tag_length`` parameter.
Alex Gaynor8f1b8e82014-06-29 20:43:29 -0700402
403 .. versionchanged:: 0.5
404
405 The ``min_tag_length`` parameter was added in ``0.5``, previously
Alex Gaynorcc5224f2014-06-30 09:25:48 -0700406 truncation down to ``4`` bytes was always allowed.
Paul Kehrerca735042013-12-21 17:31:48 -0600407
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800408 :param bytes tag: The tag bytes to verify during decryption. When
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200409 encrypting this must be ``None``. When decrypting, it may be ``None``
410 if the tag is supplied on finalization using
411 :meth:`~cryptography.hazmat.primitives.ciphers.AEADDecryptionContext.finalize_with_tag`.
412 Otherwise, the tag is mandatory.
Paul Kehrer67abc862013-11-25 14:29:35 -0600413
Paul Kehrerc563b572018-07-18 00:15:55 +0800414 :param int min_tag_length: The minimum length ``tag`` must be. By default
Alex Gaynorcc5224f2014-06-30 09:25:48 -0700415 this is ``16``, meaning tag truncation is not allowed. Allowing tag
416 truncation is strongly discouraged for most applications.
417
Paul Kehrer12a1cac2018-07-17 22:56:12 +0800418 :raises ValueError: This is raised if ``len(tag) < min_tag_length`` or the
419 ``initialization_vector`` is too short.
Alex Gaynor8f1b8e82014-06-29 20:43:29 -0700420
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200421 :raises NotImplementedError: This is raised if the version of the OpenSSL
422 backend used is 1.0.1 or earlier.
423
Alex Gaynor09828cd2016-02-10 15:21:36 -0500424 An example of securely encrypting and decrypting data with ``AES`` in the
425 ``GCM`` mode looks like:
426
David Reidabb72d22014-01-07 16:06:18 -0800427 .. testcode::
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600428
David Reidabb72d22014-01-07 16:06:18 -0800429 import os
430
gdmnbt2a0b8342017-03-24 01:19:20 +0100431 from cryptography.hazmat.backends import default_backend
David Reidabb72d22014-01-07 16:06:18 -0800432 from cryptography.hazmat.primitives.ciphers import (
433 Cipher, algorithms, modes
434 )
435
David Reid78569d62014-01-07 15:42:17 -0800436 def encrypt(key, plaintext, associated_data):
David Reidabb72d22014-01-07 16:06:18 -0800437 # Generate a random 96-bit IV.
David Reid78569d62014-01-07 15:42:17 -0800438 iv = os.urandom(12)
David Reidabb72d22014-01-07 16:06:18 -0800439
Alex Gaynorebb1cb92014-06-10 09:36:39 -0700440 # Construct an AES-GCM Cipher object with the given key and a
Alex Stapleton092351d2014-03-09 17:44:43 +0000441 # randomly generated IV.
David Reidabb72d22014-01-07 16:06:18 -0800442 encryptor = Cipher(
David Reid78569d62014-01-07 15:42:17 -0800443 algorithms.AES(key),
444 modes.GCM(iv),
445 backend=default_backend()
David Reidabb72d22014-01-07 16:06:18 -0800446 ).encryptor()
David Reid78569d62014-01-07 15:42:17 -0800447
David Reidabb72d22014-01-07 16:06:18 -0800448 # associated_data will be authenticated but not encrypted,
449 # it must also be passed in on decryption.
David Reid78569d62014-01-07 15:42:17 -0800450 encryptor.authenticate_additional_data(associated_data)
David Reid78569d62014-01-07 15:42:17 -0800451
David Reidabb72d22014-01-07 16:06:18 -0800452 # Encrypt the plaintext and get the associated ciphertext.
Paul Kehreraf0b9f52014-01-07 19:21:49 -0600453 # GCM does not require padding.
454 ciphertext = encryptor.update(plaintext) + encryptor.finalize()
David Reidabb72d22014-01-07 16:06:18 -0800455
456 return (iv, ciphertext, encryptor.tag)
David Reid78569d62014-01-07 15:42:17 -0800457
458 def decrypt(key, associated_data, iv, ciphertext, tag):
David Reidabb72d22014-01-07 16:06:18 -0800459 # Construct a Cipher object, with the key, iv, and additionally the
460 # GCM tag used for authenticating the message.
461 decryptor = Cipher(
David Reid78569d62014-01-07 15:42:17 -0800462 algorithms.AES(key),
463 modes.GCM(iv, tag),
464 backend=default_backend()
David Reidabb72d22014-01-07 16:06:18 -0800465 ).decryptor()
David Reid78569d62014-01-07 15:42:17 -0800466
David Reidabb72d22014-01-07 16:06:18 -0800467 # We put associated_data back in or the tag will fail to verify
468 # when we finalize the decryptor.
David Reid78569d62014-01-07 15:42:17 -0800469 decryptor.authenticate_additional_data(associated_data)
470
Paul Kehreraf0b9f52014-01-07 19:21:49 -0600471 # Decryption gets us the authenticated plaintext.
472 # If the tag does not match an InvalidTag exception will be raised.
473 return decryptor.update(ciphertext) + decryptor.finalize()
David Reidabb72d22014-01-07 16:06:18 -0800474
475 iv, ciphertext, tag = encrypt(
David Reid78569d62014-01-07 15:42:17 -0800476 key,
David Reidabb72d22014-01-07 16:06:18 -0800477 b"a secret message!",
David Reid78569d62014-01-07 15:42:17 -0800478 b"authenticated but not encrypted payload"
479 )
480
David Reidabb72d22014-01-07 16:06:18 -0800481 print(decrypt(
482 key,
483 b"authenticated but not encrypted payload",
484 iv,
485 ciphertext,
486 tag
487 ))
David Reid78569d62014-01-07 15:42:17 -0800488
489 .. testoutput::
490
Paul Kehrer056c9dd2018-05-12 15:17:06 -0400491 b'a secret message!'
Paul Kehrer22e80cb2013-11-20 21:27:00 -0600492
Paul Kehrera397d752017-10-02 10:03:20 +0800493.. class:: XTS(tweak)
494
495 .. versionadded:: 2.1
496
497 .. warning::
498
499 XTS mode is meant for disk encryption and should not be used in other
500 contexts. ``cryptography`` only supports XTS mode with
501 :class:`~cryptography.hazmat.primitives.ciphers.algorithms.AES`.
502
503 .. note::
504
505 AES XTS keys are double length. This means that to do AES-128
506 encryption in XTS mode you need a 256-bit key. Similarly, AES-256
507 requires passing a 512-bit key. AES 192 is not supported in XTS mode.
508
509 XTS (XEX-based tweaked-codebook mode with ciphertext stealing) is a mode
510 of operation for the AES block cipher that is used for `disk encryption`_.
511
512 **This mode does not require padding.**
513
Paul Kehrer3c682502018-12-10 12:13:31 +0800514 :param tweak: The tweak is a 16 byte value typically derived from
Paul Kehrera397d752017-10-02 10:03:20 +0800515 something like the disk sector number. A given ``(tweak, key)`` pair
516 should not be reused, although doing so is less catastrophic than
517 in CTR mode.
Paul Kehrer3c682502018-12-10 12:13:31 +0800518 :type tweak: :term:`bytes-like`
Paul Kehrer13f108f2013-09-09 21:41:03 -0500519
Alex Stapletonc5fffd32014-03-18 15:29:00 +0000520Insecure modes
Paul Kehrer13f108f2013-09-09 21:41:03 -0500521--------------
522
Alex Gaynorcd413a32013-09-10 18:59:43 -0700523.. warning::
524
525 These modes are insecure. New applications should never make use of them,
526 and existing applications should strongly consider migrating away.
527
528
David Reid1f3d7182013-10-22 16:55:18 -0700529.. class:: ECB()
Paul Kehrer13f108f2013-09-09 21:41:03 -0500530
531 ECB (Electronic Code Book) is the simplest mode of operation for block
Alex Gaynorcd413a32013-09-10 18:59:43 -0700532 ciphers. Each block of data is encrypted in the same way. This means
533 identical plaintext blocks will always result in identical ciphertext
Alex Stapleton092351d2014-03-09 17:44:43 +0000534 blocks, which can leave `significant patterns in the output`_.
Alex Gaynorab5f0112013-11-08 10:34:00 -0800535
Paul Kehrerfe2e3c22014-01-07 20:55:20 -0600536 **Padding is required when using this mode.**
537
Paul Kehrerad6d1642014-01-07 19:10:12 -0600538Interfaces
Paul Kehrere3ff3642017-06-04 11:48:32 -1000539~~~~~~~~~~
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600540
Paul Kehrer7c5c9fe2015-02-14 10:27:14 -0600541.. currentmodule:: cryptography.hazmat.primitives.ciphers
Paul Kehrerad6d1642014-01-07 19:10:12 -0600542
543.. class:: CipherContext
544
545 When calling ``encryptor()`` or ``decryptor()`` on a ``Cipher`` object
Alex Gaynorb4818892014-02-06 10:58:50 -0800546 the result will conform to the ``CipherContext`` interface. You can then
547 call ``update(data)`` with data until you have fed everything into the
548 context. Once that is done call ``finalize()`` to finish the operation and
549 obtain the remainder of the data.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600550
Alex Stapleton092351d2014-03-09 17:44:43 +0000551 Block ciphers require that the plaintext or ciphertext always be a multiple
552 of their block size. Because of that **padding** is sometimes required to
553 make a message the correct size. ``CipherContext`` will not automatically
554 apply any padding; you'll need to add your own. For block ciphers the
555 recommended padding is
Alex Gaynord99fc652014-06-25 10:24:03 -0700556 :class:`~cryptography.hazmat.primitives.padding.PKCS7`. If you are using a
Alex Stapleton092351d2014-03-09 17:44:43 +0000557 stream cipher mode (such as
Paul Kehrer45efdbc2015-02-12 10:58:22 -0600558 :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`) you don't have
559 to worry about this.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600560
561 .. method:: update(data)
562
Paul Kehrer3c682502018-12-10 12:13:31 +0800563 :param data: The data you wish to pass into the context.
564 :type data: :term:`bytes-like`
Paul Kehrerad6d1642014-01-07 19:10:12 -0600565 :return bytes: Returns the data that was encrypted or decrypted.
566 :raises cryptography.exceptions.AlreadyFinalized: See :meth:`finalize`
567
568 When the ``Cipher`` was constructed in a mode that turns it into a
569 stream cipher (e.g.
Alex Gaynord99fc652014-06-25 10:24:03 -0700570 :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`), this will
Alex Stapleton092351d2014-03-09 17:44:43 +0000571 return bytes immediately, however in other modes it will return chunks
Paul Kehrerad6d1642014-01-07 19:10:12 -0600572 whose size is determined by the cipher's block size.
573
Paul Kehrer9b34ca92017-02-16 22:20:38 -0600574 .. method:: update_into(data, buf)
575
576 .. versionadded:: 1.8
577
578 .. warning::
579
580 This method allows you to avoid a memory copy by passing a writable
581 buffer and reading the resulting data. You are responsible for
582 correctly sizing the buffer and properly handling the data. This
583 method should only be used when extremely high performance is a
584 requirement and you will be making many small calls to
585 ``update_into``.
586
Paul Kehrer3c682502018-12-10 12:13:31 +0800587 :param data: The data you wish to pass into the context.
588 :type data: :term:`bytes-like`
Paul Kehrer9b34ca92017-02-16 22:20:38 -0600589 :param buf: A writable Python buffer that the data will be written
590 into. This buffer should be ``len(data) + n - 1`` bytes where ``n``
591 is the block size (in bytes) of the cipher and mode combination.
592 :return int: Number of bytes written.
593 :raises NotImplementedError: This is raised if the version of ``cffi``
594 used is too old (this can happen on older PyPy releases).
595 :raises ValueError: This is raised if the supplied buffer is too small.
596
597 .. doctest::
598
599 >>> import os
600 >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
601 >>> from cryptography.hazmat.backends import default_backend
602 >>> backend = default_backend()
603 >>> key = os.urandom(32)
604 >>> iv = os.urandom(16)
605 >>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend)
606 >>> encryptor = cipher.encryptor()
607 >>> # the buffer needs to be at least len(data) + n - 1 where n is cipher/mode block size in bytes
608 >>> buf = bytearray(31)
609 >>> len_encrypted = encryptor.update_into(b"a secret message", buf)
610 >>> # get the ciphertext from the buffer reading only the bytes written to it (len_encrypted)
611 >>> ct = bytes(buf[:len_encrypted]) + encryptor.finalize()
612 >>> decryptor = cipher.decryptor()
613 >>> len_decrypted = decryptor.update_into(ct, buf)
614 >>> # get the plaintext from the buffer reading only the bytes written (len_decrypted)
615 >>> bytes(buf[:len_decrypted]) + decryptor.finalize()
Paul Kehrer056c9dd2018-05-12 15:17:06 -0400616 b'a secret message'
Paul Kehrer9b34ca92017-02-16 22:20:38 -0600617
Paul Kehrerad6d1642014-01-07 19:10:12 -0600618 .. method:: finalize()
619
620 :return bytes: Returns the remainder of the data.
621 :raises ValueError: This is raised when the data provided isn't
Alex Stapleton092351d2014-03-09 17:44:43 +0000622 a multiple of the algorithm's block size.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600623
624 Once ``finalize`` is called this object can no longer be used and
Alex Stapleton092351d2014-03-09 17:44:43 +0000625 :meth:`update` and :meth:`finalize` will raise an
626 :class:`~cryptography.exceptions.AlreadyFinalized` exception.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600627
628.. class:: AEADCipherContext
629
Alex Stapleton092351d2014-03-09 17:44:43 +0000630 When calling ``encryptor`` or ``decryptor`` on a ``Cipher`` object
Paul Kehrerad6d1642014-01-07 19:10:12 -0600631 with an AEAD mode (e.g.
Alex Gaynorb4818892014-02-06 10:58:50 -0800632 :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM`) the result will
633 conform to the ``AEADCipherContext`` and ``CipherContext`` interfaces. If
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200634 it is an encryption or decryption context it will additionally be an
635 ``AEADEncryptionContext`` or ``AEADDecryptionContext`` instance,
636 respectively. ``AEADCipherContext`` contains an additional method
637 :meth:`authenticate_additional_data` for adding additional authenticated
638 but unencrypted data (see note below). You should call this before calls to
639 ``update``. When you are done call ``finalize`` to finish the operation.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600640
641 .. note::
642
643 In AEAD modes all data passed to ``update()`` will be both encrypted
644 and authenticated. Do not pass encrypted data to the
645 ``authenticate_additional_data()`` method. It is meant solely for
646 additional data you may want to authenticate but leave unencrypted.
647
648 .. method:: authenticate_additional_data(data)
649
Paul Kehrer3c682502018-12-10 12:13:31 +0800650 :param data: Any data you wish to authenticate but not encrypt.
651 :type data: :term:`bytes-like`
Paul Kehrerad6d1642014-01-07 19:10:12 -0600652 :raises: :class:`~cryptography.exceptions.AlreadyFinalized`
653
654.. class:: AEADEncryptionContext
655
Alex Stapleton092351d2014-03-09 17:44:43 +0000656 When creating an encryption context using ``encryptor`` on a ``Cipher``
657 object with an AEAD mode such as
658 :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM` an object
659 conforming to both the ``AEADEncryptionContext`` and ``AEADCipherContext``
660 interfaces will be returned. This interface provides one
661 additional attribute ``tag``. ``tag`` can only be obtained after
662 ``finalize`` has been called.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600663
664 .. attribute:: tag
665
666 :return bytes: Returns the tag value as bytes.
667 :raises: :class:`~cryptography.exceptions.NotYetFinalized` if called
Alex Gaynorfb843aa2014-02-25 11:37:36 -0800668 before the context is finalized.
Paul Kehrerad6d1642014-01-07 19:10:12 -0600669
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200670.. class:: AEADDecryptionContext
671
672 .. versionadded:: 1.9
673
674 When creating an encryption context using ``decryptor`` on a ``Cipher``
675 object with an AEAD mode such as
676 :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM` an object
677 conforming to both the ``AEADDecryptionContext`` and ``AEADCipherContext``
678 interfaces will be returned. This interface provides one additional method
679 :meth:`finalize_with_tag` that allows passing the authentication tag for
680 validation after the ciphertext has been decrypted.
681
682 .. method:: finalize_with_tag(tag)
683
Paul Kehrer5fb10212017-05-02 12:04:53 -0500684 .. note::
685
686 This method is not supported when compiled against OpenSSL 1.0.1.
687
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200688 :param bytes tag: The tag bytes to verify after decryption.
689 :return bytes: Returns the remainder of the data.
690 :raises ValueError: This is raised when the data provided isn't
691 a multiple of the algorithm's block size, if ``min_tag_length`` is
692 less than 4, or if ``len(tag) < min_tag_length``.
Paul Kehrerd4378e42018-07-17 21:49:03 +0800693 ``min_tag_length`` is an argument to the ``GCM`` constructor.
Philipp Gesang2e84daa2017-05-02 15:28:33 +0200694 :raises NotImplementedError: This is raised if the version of the
695 OpenSSL backend used is 1.0.1 or earlier.
696
697 If the authentication tag was not already supplied to the constructor
698 of the :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM` mode
699 object, this method must be used instead of
700 :meth:`~cryptography.hazmat.primitives.ciphers.CipherContext.finalize`.
701
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600702.. class:: CipherAlgorithm
703
704 A named symmetric encryption algorithm.
705
706 .. attribute:: name
707
708 :type: str
709
710 The standard name for the mode, for example, "AES", "Camellia", or
711 "Blowfish".
712
713 .. attribute:: key_size
714
715 :type: int
716
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800717 The number of :term:`bits` in the key being used.
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600718
719
720.. class:: BlockCipherAlgorithm
721
722 A block cipher algorithm.
723
724 .. attribute:: block_size
725
726 :type: int
727
Paul Kehrer1aac78c2017-10-11 19:49:57 +0800728 The number of :term:`bits` in a block.
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600729
730Interfaces used by the symmetric cipher modes described in
731:ref:`Symmetric Encryption Modes <symmetric-encryption-modes>`.
732
733.. currentmodule:: cryptography.hazmat.primitives.ciphers.modes
734
735.. class:: Mode
736
737 A named cipher mode.
738
739 .. attribute:: name
740
741 :type: str
742
743 This should be the standard shorthand name for the mode, for example
744 Cipher-Block Chaining mode is "CBC".
745
746 The name may be used by a backend to influence the operation of a
747 cipher in conjunction with the algorithm's name.
748
749 .. method:: validate_for_algorithm(algorithm)
750
Alex Gaynor2c526052015-02-24 10:55:28 -0800751 :param cryptography.hazmat.primitives.ciphers.CipherAlgorithm algorithm:
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600752
753 Checks that the combination of this mode with the provided algorithm
754 meets any necessary invariants. This should raise an exception if they
755 are not met.
756
757 For example, the
758 :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode uses
759 this method to check that the provided initialization vector's length
760 matches the block size of the algorithm.
761
762
763.. class:: ModeWithInitializationVector
764
765 A cipher mode with an initialization vector.
766
767 .. attribute:: initialization_vector
768
Paul Kehrer3c682502018-12-10 12:13:31 +0800769 :type: :term:`bytes-like`
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600770
771 Exact requirements of the initialization are described by the
772 documentation of individual modes.
773
774
775.. class:: ModeWithNonce
776
777 A cipher mode with a nonce.
778
779 .. attribute:: nonce
780
Paul Kehrer3c682502018-12-10 12:13:31 +0800781 :type: :term:`bytes-like`
Paul Kehrer513b7cb2015-02-12 17:31:24 -0600782
783 Exact requirements of the nonce are described by the documentation of
784 individual modes.
785
786
Paul Kehrer4ab60592015-02-13 09:06:48 -0600787.. class:: ModeWithAuthenticationTag
788
789 A cipher mode with an authentication tag.
790
791 .. attribute:: tag
792
Paul Kehrer3c682502018-12-10 12:13:31 +0800793 :type: :term:`bytes-like`
Paul Kehrer4ab60592015-02-13 09:06:48 -0600794
795 Exact requirements of the tag are described by the documentation of
796 individual modes.
797
Paul Kehrera397d752017-10-02 10:03:20 +0800798
799.. class:: ModeWithTweak
800
801 .. versionadded:: 2.1
802
803 A cipher mode with a tweak.
804
805 .. attribute:: tweak
806
Paul Kehrer3c682502018-12-10 12:13:31 +0800807 :type: :term:`bytes-like`
Paul Kehrera397d752017-10-02 10:03:20 +0800808
809 Exact requirements of the tweak are described by the documentation of
810 individual modes.
811
Paul Kehrera8b1c6e2017-06-04 11:48:24 -1000812Exceptions
813~~~~~~~~~~
814
815.. currentmodule:: cryptography.exceptions
816
817
818.. class:: InvalidTag
819
820 This is raised if an authenticated encryption tag fails to verify during
821 decryption.
822
Paul Kehrer4ab60592015-02-13 09:06:48 -0600823
Alex Gaynorab5f0112013-11-08 10:34:00 -0800824
Alex Gaynor5e5990a2018-10-23 21:34:44 -0400825.. _`described by Colin Percival`: https://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html
Alex Gaynor20721c92017-09-20 04:39:45 -0400826.. _`recommends a 96-bit IV length`: https://csrc.nist.gov/publications/detail/sp/800-38d/final
Alex Gaynor53e45052017-09-20 09:57:47 -0400827.. _`NIST SP-800-38D`: https://csrc.nist.gov/publications/detail/sp/800-38d/final
Alex Gaynor111aff22015-02-17 14:47:49 -0800828.. _`Communications Security Establishment`: https://www.cse-cst.gc.ca
Alex Gaynor042dce42019-01-01 21:26:00 -0500829.. _`encrypt`: https://ssd.eff.org/en/module/what-should-i-know-about-encryption
Alex Gaynor6422d832016-03-06 21:40:57 -0500830.. _`CRYPTREC`: https://www.cryptrec.go.jp/english/
Alex Gaynor543031a2015-02-16 20:27:35 -0800831.. _`significant patterns in the output`: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29
Paul Kehrere5dc1222014-02-20 16:19:32 -0600832.. _`International Data Encryption Algorithm`: https://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm
Alex Gaynor9569f5c2018-10-23 23:47:29 -0400833.. _`OpenPGP`: https://www.openpgp.org/
Paul Kehrera397d752017-10-02 10:03:20 +0800834.. _`disk encryption`: https://en.wikipedia.org/wiki/Disk_encryption_theory#XTS