| Alex Gaynor | 2724ff6 | 2013-12-20 13:51:42 -0800 | [diff] [blame] | 1 | .. hazmat:: /fernet | 
| Donald Stufft | d8f0118 | 2013-10-27 16:59:56 -0400 | [diff] [blame] | 2 |  | 
 | 3 |  | 
| Alex Stapleton | c5fffd3 | 2014-03-18 15:29:00 +0000 | [diff] [blame] | 4 | Symmetric encryption | 
| Donald Stufft | e51fb93 | 2013-10-27 17:26:17 -0400 | [diff] [blame] | 5 | ==================== | 
 | 6 |  | 
| Paul Kehrer | 051099e | 2013-11-06 15:53:40 +0800 | [diff] [blame] | 7 | .. currentmodule:: cryptography.hazmat.primitives.ciphers | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 8 |  | 
| Donald Stufft | 173de98 | 2013-08-12 07:34:39 -0400 | [diff] [blame] | 9 | .. testsetup:: | 
 | 10 |  | 
 | 11 |     import binascii | 
 | 12 |     key = binascii.unhexlify(b"0" * 32) | 
 | 13 |     iv = binascii.unhexlify(b"0" * 32) | 
 | 14 |  | 
 | 15 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 16 | Symmetric encryption is a way to `encrypt`_ or hide the contents of material | 
 | 17 | where the sender and receiver both use the same secret key. Note that symmetric | 
 | 18 | encryption is **not** sufficient for most applications because it only | 
 | 19 | provides secrecy but not authenticity. That means an attacker can't see the | 
 | 20 | message but an attacker can create bogus messages and force the application to | 
 | 21 | decrypt them. | 
 | 22 |  | 
| Paul Kehrer | 006670c | 2014-05-09 11:12:43 -0500 | [diff] [blame] | 23 | For this reason it is **strongly** recommended to combine encryption with a | 
| Alex Gaynor | 969f18e | 2014-05-17 20:07:35 -0700 | [diff] [blame] | 24 | message authentication code, such as :doc:`HMAC </hazmat/primitives/mac/hmac>`, | 
 | 25 | in an "encrypt-then-MAC" formulation as `described by Colin Percival`_. | 
| Alex Gaynor | f6c47e9 | 2013-08-08 07:16:01 -0700 | [diff] [blame] | 26 |  | 
| David Reid | ef0fcf2 | 2013-11-06 11:12:45 -0800 | [diff] [blame] | 27 | .. class:: Cipher(algorithm, mode, backend) | 
| Alex Gaynor | f6c47e9 | 2013-08-08 07:16:01 -0700 | [diff] [blame] | 28 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 29 |     Cipher objects combine an algorithm such as | 
 | 30 |     :class:`~cryptography.hazmat.primitives.ciphers.algorithms.AES` with a | 
 | 31 |     mode like | 
| Alex Gaynor | ab5f011 | 2013-11-08 10:34:00 -0800 | [diff] [blame] | 32 |     :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` or | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 33 |     :class:`~cryptography.hazmat.primitives.ciphers.modes.CTR`. A simple | 
 | 34 |     example of encrypting and then decrypting content with AES is: | 
| Alex Gaynor | f6c47e9 | 2013-08-08 07:16:01 -0700 | [diff] [blame] | 35 |  | 
| Donald Stufft | 173de98 | 2013-08-12 07:34:39 -0400 | [diff] [blame] | 36 |     .. doctest:: | 
| Alex Gaynor | f6c47e9 | 2013-08-08 07:16:01 -0700 | [diff] [blame] | 37 |  | 
| Paul Kehrer | 051099e | 2013-11-06 15:53:40 +0800 | [diff] [blame] | 38 |         >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes | 
| Alex Gaynor | f8796b1 | 2013-12-13 20:28:55 -0800 | [diff] [blame] | 39 |         >>> from cryptography.hazmat.backends import default_backend | 
| Alex Gaynor | f56444d | 2013-12-13 15:19:22 -0800 | [diff] [blame] | 40 |         >>> backend = default_backend() | 
| David Reid | 63fa19a | 2013-11-20 10:49:13 -0800 | [diff] [blame] | 41 |         >>> cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=backend) | 
| Paul Kehrer | 3e0895c | 2013-10-21 22:19:29 -0500 | [diff] [blame] | 42 |         >>> encryptor = cipher.encryptor() | 
 | 43 |         >>> ct = encryptor.update(b"a secret message") + encryptor.finalize() | 
 | 44 |         >>> decryptor = cipher.decryptor() | 
 | 45 |         >>> decryptor.update(ct) + decryptor.finalize() | 
| Paul Kehrer | f6cf956 | 2013-10-22 10:36:00 -0500 | [diff] [blame] | 46 |         'a secret message' | 
| Alex Gaynor | f6c47e9 | 2013-08-08 07:16:01 -0700 | [diff] [blame] | 47 |  | 
| David Reid | 663295d | 2013-11-20 13:55:08 -0800 | [diff] [blame] | 48 |     :param algorithms: A | 
 | 49 |         :class:`~cryptography.hazmat.primitives.interfaces.CipherAlgorithm` | 
 | 50 |         provider such as those described | 
 | 51 |         :ref:`below <symmetric-encryption-algorithms>`. | 
 | 52 |     :param mode: A :class:`~cryptography.hazmat.primitives.interfaces.Mode` | 
 | 53 |         provider such as those described | 
 | 54 |         :ref:`below <symmetric-encryption-modes>`. | 
 | 55 |     :param backend: A | 
| Alex Gaynor | f8796b1 | 2013-12-13 20:28:55 -0800 | [diff] [blame] | 56 |         :class:`~cryptography.hazmat.backends.interfaces.CipherBackend` | 
| David Reid | 663295d | 2013-11-20 13:55:08 -0800 | [diff] [blame] | 57 |         provider. | 
| Alex Gaynor | 0ca7fdb | 2013-08-08 07:35:26 -0700 | [diff] [blame] | 58 |  | 
| Alex Gaynor | 7a489db | 2014-03-22 15:09:34 -0700 | [diff] [blame] | 59 |     :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the | 
| Ayrx | f56c54e | 2014-03-16 14:36:17 +0800 | [diff] [blame] | 60 |         provided ``backend`` does not implement | 
 | 61 |         :class:`~cryptography.hazmat.backends.interfaces.CipherBackend` | 
 | 62 |  | 
| Paul Kehrer | 5399fd0 | 2013-10-21 23:48:25 -0500 | [diff] [blame] | 63 |     .. method:: encryptor() | 
| Alex Gaynor | 09515f0 | 2013-08-08 15:26:55 -0700 | [diff] [blame] | 64 |  | 
| David Reid | 63ba665 | 2013-10-22 14:09:19 -0700 | [diff] [blame] | 65 |         :return: An encrypting | 
| Donald Stufft | f04317a | 2013-10-27 16:44:30 -0400 | [diff] [blame] | 66 |             :class:`~cryptography.hazmat.primitives.interfaces.CipherContext` | 
| David Reid | 63ba665 | 2013-10-22 14:09:19 -0700 | [diff] [blame] | 67 |             provider. | 
| Alex Gaynor | e62aa40 | 2013-08-08 15:23:11 -0700 | [diff] [blame] | 68 |  | 
| Alex Gaynor | f1a3fc0 | 2013-11-02 14:03:34 -0700 | [diff] [blame] | 69 |         If the backend doesn't support the requested combination of ``cipher`` | 
| Alex Gaynor | 7a489db | 2014-03-22 15:09:34 -0700 | [diff] [blame] | 70 |         and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm` | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 71 |         exception will be raised. | 
| Alex Gaynor | f1a3fc0 | 2013-11-02 14:03:34 -0700 | [diff] [blame] | 72 |  | 
| Paul Kehrer | 5399fd0 | 2013-10-21 23:48:25 -0500 | [diff] [blame] | 73 |     .. method:: decryptor() | 
 | 74 |  | 
| David Reid | 63ba665 | 2013-10-22 14:09:19 -0700 | [diff] [blame] | 75 |         :return: A decrypting | 
| Donald Stufft | f04317a | 2013-10-27 16:44:30 -0400 | [diff] [blame] | 76 |             :class:`~cryptography.hazmat.primitives.interfaces.CipherContext` | 
| David Reid | 63ba665 | 2013-10-22 14:09:19 -0700 | [diff] [blame] | 77 |             provider. | 
| Paul Kehrer | 5399fd0 | 2013-10-21 23:48:25 -0500 | [diff] [blame] | 78 |  | 
| Alex Gaynor | f1a3fc0 | 2013-11-02 14:03:34 -0700 | [diff] [blame] | 79 |         If the backend doesn't support the requested combination of ``cipher`` | 
| Alex Gaynor | fdf6330 | 2014-04-29 18:26:11 -0700 | [diff] [blame] | 80 |         and ``mode`` an :class:`~cryptography.exceptions.UnsupportedAlgorithm` | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 81 |         exception will be raised. | 
| Alex Gaynor | f1a3fc0 | 2013-11-02 14:03:34 -0700 | [diff] [blame] | 82 |  | 
| David Reid | 663295d | 2013-11-20 13:55:08 -0800 | [diff] [blame] | 83 | .. _symmetric-encryption-algorithms: | 
 | 84 |  | 
| Paul Kehrer | 051099e | 2013-11-06 15:53:40 +0800 | [diff] [blame] | 85 | Algorithms | 
 | 86 | ~~~~~~~~~~ | 
| Alex Gaynor | d96d100 | 2013-08-08 07:37:26 -0700 | [diff] [blame] | 87 |  | 
| Paul Kehrer | 051099e | 2013-11-06 15:53:40 +0800 | [diff] [blame] | 88 | .. currentmodule:: cryptography.hazmat.primitives.ciphers.algorithms | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 89 |  | 
 | 90 | .. class:: AES(key) | 
| Alex Gaynor | 5ba2dfa | 2013-08-08 11:04:44 -0700 | [diff] [blame] | 91 |  | 
| Alex Gaynor | 1e3f81f | 2013-08-08 11:31:43 -0700 | [diff] [blame] | 92 |     AES (Advanced Encryption Standard) is a block cipher standardized by NIST. | 
| Alex Gaynor | 5ba2dfa | 2013-08-08 11:04:44 -0700 | [diff] [blame] | 93 |     AES is both fast, and cryptographically strong. It is a good default | 
 | 94 |     choice for encryption. | 
 | 95 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 96 |     :param bytes key: The secret key. This must be kept secret. Either ``128``, | 
 | 97 |         ``192``, or ``256`` bits long. | 
| Alex Gaynor | 5ba2dfa | 2013-08-08 11:04:44 -0700 | [diff] [blame] | 98 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 99 | .. class:: Camellia(key) | 
| Paul Kehrer | dff22d4 | 2013-09-27 13:43:06 -0500 | [diff] [blame] | 100 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 101 |     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 Kehrer | dff22d4 | 2013-09-27 13:43:06 -0500 | [diff] [blame] | 103 |     is not as widely studied or deployed. | 
 | 104 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 105 |     :param bytes key: The secret key. This must be kept secret. Either ``128``, | 
 | 106 |         ``192``, or ``256`` bits long. | 
| Paul Kehrer | dff22d4 | 2013-09-27 13:43:06 -0500 | [diff] [blame] | 107 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 108 | .. class:: TripleDES(key) | 
| Alex Gaynor | aeb714c | 2013-09-09 18:06:14 -0700 | [diff] [blame] | 109 |  | 
| Alex Gaynor | 9316f4c | 2013-11-15 16:38:42 -0800 | [diff] [blame] | 110 |     Triple DES (Data Encryption Standard), sometimes referred to as 3DES, is a | 
 | 111 |     block cipher standardized by NIST. Triple DES has known crypto-analytic | 
| Alex Gaynor | 17adce6 | 2013-10-16 17:04:40 -0700 | [diff] [blame] | 112 |     flaws, however none of them currently enable a practical attack. | 
| Alex Gaynor | 9316f4c | 2013-11-15 16:38:42 -0800 | [diff] [blame] | 113 |     Nonetheless, Triples DES is not recommended for new applications because it | 
| Alex Gaynor | fbcc564 | 2013-10-22 08:26:00 -0700 | [diff] [blame] | 114 |     is incredibly slow; old applications should consider moving away from it. | 
| Alex Gaynor | aeb714c | 2013-09-09 18:06:14 -0700 | [diff] [blame] | 115 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 116 |     :param bytes key: The secret key. This must be kept secret. Either ``64``, | 
 | 117 |         ``128``, or ``192`` bits long. DES only uses ``56``, ``112``, or ``168`` | 
 | 118 |         bits of the key as there is a parity byte in each component of the key. | 
 | 119 |         Some writing refers to there being up to three separate keys that are each | 
 | 120 |         ``56`` bits long, they can simply be concatenated to produce the full key. | 
| Alex Gaynor | aeb714c | 2013-09-09 18:06:14 -0700 | [diff] [blame] | 121 |  | 
| Paul Kehrer | bab0e1a | 2014-02-09 10:51:59 -0600 | [diff] [blame] | 122 | .. class:: CAST5(key) | 
 | 123 |  | 
| Paul Kehrer | a5011ec | 2014-02-13 12:33:34 -0600 | [diff] [blame] | 124 |     .. versionadded:: 0.2 | 
 | 125 |  | 
| Paul Kehrer | bab0e1a | 2014-02-09 10:51:59 -0600 | [diff] [blame] | 126 |     CAST5 (also known as CAST-128) is a block cipher approved for use in the | 
 | 127 |     Canadian government by the `Communications Security Establishment`_. It is | 
 | 128 |     a variable key length cipher and supports keys from 40-128 bits in length. | 
 | 129 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 130 |     :param bytes key: The secret key, This must be kept secret. 40 to 128 bits | 
 | 131 |         in length in increments of 8 bits. | 
| Paul Kehrer | bab0e1a | 2014-02-09 10:51:59 -0600 | [diff] [blame] | 132 |  | 
| Paul Kehrer | 7e914c9 | 2014-04-09 09:12:29 -0500 | [diff] [blame] | 133 | .. class:: SEED(key) | 
 | 134 |  | 
 | 135 |     .. versionadded:: 0.4 | 
 | 136 |  | 
| Alex Stapleton | 19e97bd | 2014-05-02 21:57:59 +0100 | [diff] [blame] | 137 |     SEED is a block cipher developed by the Korea Information Security Agency | 
 | 138 |     (KISA). It is defined in :rfc:`4269` and is used broadly throughout South | 
| Paul Kehrer | 7e914c9 | 2014-04-09 09:12:29 -0500 | [diff] [blame] | 139 |     Korean industry, but rarely found elsewhere. | 
 | 140 |  | 
 | 141 |     :param bytes key: The secret key. This must be kept secret. ``128`` bits in | 
 | 142 |         length. | 
 | 143 |  | 
| Alex Stapleton | c5fffd3 | 2014-03-18 15:29:00 +0000 | [diff] [blame] | 144 | Weak ciphers | 
| Paul Kehrer | 3446d81 | 2013-10-31 17:15:03 -0500 | [diff] [blame] | 145 | ------------ | 
 | 146 |  | 
 | 147 | .. warning:: | 
 | 148 |  | 
 | 149 |     These ciphers are considered weak for a variety of reasons. New | 
 | 150 |     applications should avoid their use and existing applications should | 
 | 151 |     strongly consider migrating away. | 
 | 152 |  | 
| Paul Kehrer | 5df0abe | 2013-10-30 16:57:04 -0500 | [diff] [blame] | 153 | .. class:: Blowfish(key) | 
 | 154 |  | 
 | 155 |     Blowfish is a block cipher developed by Bruce Schneier. It is known to be | 
 | 156 |     susceptible to attacks when using weak keys. The author has recommended | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 157 |     that users of Blowfish move to newer algorithms such as :class:`AES`. | 
| Paul Kehrer | 5df0abe | 2013-10-30 16:57:04 -0500 | [diff] [blame] | 158 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 159 |     :param bytes key: The secret key. This must be kept secret. 32 to 448 bits | 
 | 160 |         in length in increments of 8 bits. | 
| Paul Kehrer | 5df0abe | 2013-10-30 16:57:04 -0500 | [diff] [blame] | 161 |  | 
| Paul Kehrer | 4da28c3 | 2013-11-07 07:50:17 +0800 | [diff] [blame] | 162 | .. class:: ARC4(key) | 
 | 163 |  | 
 | 164 |     ARC4 (Alleged RC4) is a stream cipher with serious weaknesses in its | 
 | 165 |     initial stream output. Its use is strongly discouraged. ARC4 does not use | 
 | 166 |     mode constructions. | 
 | 167 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 168 |     :param bytes key: The secret key. This must be kept secret. Either ``40``, | 
 | 169 |         ``56``, ``64``, ``80``, ``128``, ``192``, or ``256`` bits in length. | 
| Paul Kehrer | 4da28c3 | 2013-11-07 07:50:17 +0800 | [diff] [blame] | 170 |  | 
| Paul Kehrer | 0994c56 | 2013-11-10 03:19:14 +0800 | [diff] [blame] | 171 |     .. doctest:: | 
 | 172 |  | 
 | 173 |         >>> from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes | 
| Alex Gaynor | f8796b1 | 2013-12-13 20:28:55 -0800 | [diff] [blame] | 174 |         >>> from cryptography.hazmat.backends import default_backend | 
| Paul Kehrer | 0994c56 | 2013-11-10 03:19:14 +0800 | [diff] [blame] | 175 |         >>> algorithm = algorithms.ARC4(key) | 
| Alex Gaynor | f56444d | 2013-12-13 15:19:22 -0800 | [diff] [blame] | 176 |         >>> cipher = Cipher(algorithm, mode=None, backend=default_backend()) | 
| Paul Kehrer | 0994c56 | 2013-11-10 03:19:14 +0800 | [diff] [blame] | 177 |         >>> encryptor = cipher.encryptor() | 
 | 178 |         >>> ct = encryptor.update(b"a secret message") | 
 | 179 |         >>> decryptor = cipher.decryptor() | 
 | 180 |         >>> decryptor.update(ct) | 
 | 181 |         'a secret message' | 
 | 182 |  | 
| Paul Kehrer | e5dc122 | 2014-02-20 16:19:32 -0600 | [diff] [blame] | 183 | .. class:: IDEA(key) | 
 | 184 |  | 
 | 185 |     IDEA (`International Data Encryption Algorithm`_) is a block cipher created | 
 | 186 |     in 1991. It is an optional component of the `OpenPGP`_ standard. This cipher | 
 | 187 |     is susceptible to attacks when using weak keys. It is recommended that you | 
 | 188 |     do not use this cipher for new applications. | 
 | 189 |  | 
| Paul Kehrer | 7e914c9 | 2014-04-09 09:12:29 -0500 | [diff] [blame] | 190 |     :param bytes key: The secret key. This must be kept secret. ``128`` bits in | 
| Paul Kehrer | 7ba0c01 | 2014-03-08 11:33:35 -0400 | [diff] [blame] | 191 |         length. | 
| Paul Kehrer | e5dc122 | 2014-02-20 16:19:32 -0600 | [diff] [blame] | 192 |  | 
| David Reid | 30722b9 | 2013-11-07 13:03:39 -0800 | [diff] [blame] | 193 |  | 
 | 194 | .. _symmetric-encryption-modes: | 
 | 195 |  | 
| Alex Gaynor | d96d100 | 2013-08-08 07:37:26 -0700 | [diff] [blame] | 196 | Modes | 
 | 197 | ~~~~~ | 
 | 198 |  | 
| Paul Kehrer | 051099e | 2013-11-06 15:53:40 +0800 | [diff] [blame] | 199 | .. currentmodule:: cryptography.hazmat.primitives.ciphers.modes | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 200 |  | 
 | 201 | .. class:: CBC(initialization_vector) | 
| Alex Gaynor | 48ec9a3 | 2013-08-08 11:13:46 -0700 | [diff] [blame] | 202 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 203 |     CBC (Cipher Block Chaining) is a mode of operation for block ciphers. It is | 
| Alex Gaynor | 48ec9a3 | 2013-08-08 11:13:46 -0700 | [diff] [blame] | 204 |     considered cryptographically strong. | 
 | 205 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 206 |     **Padding is required when using this mode.** | 
 | 207 |  | 
| Alex Gaynor | 48ec9a3 | 2013-08-08 11:13:46 -0700 | [diff] [blame] | 208 |     :param bytes initialization_vector: Must be random bytes. They do not need | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 209 |         to be kept secret and they can be included in a transmitted message. | 
 | 210 |         Must be the same number of bytes as the ``block_size`` of the cipher. | 
 | 211 |         Each time something is encrypted a new ``initialization_vector`` should | 
 | 212 |         be generated. Do not reuse an ``initialization_vector`` with a given | 
| Alex Gaynor | fb843aa | 2014-02-25 11:37:36 -0800 | [diff] [blame] | 213 |         ``key``, and particularly do not use a constant | 
 | 214 |         ``initialization_vector``. | 
| Alex Gaynor | 8ed651e | 2013-11-07 13:24:31 -0800 | [diff] [blame] | 215 |  | 
 | 216 |     A good construction looks like: | 
 | 217 |  | 
| Alex Gaynor | 989061d | 2013-12-13 20:22:14 -0800 | [diff] [blame] | 218 |     .. doctest:: | 
| Alex Gaynor | 8ed651e | 2013-11-07 13:24:31 -0800 | [diff] [blame] | 219 |  | 
 | 220 |         >>> import os | 
| Alex Gaynor | d83c590 | 2013-12-13 20:43:54 -0800 | [diff] [blame] | 221 |         >>> from cryptography.hazmat.primitives.ciphers.modes import CBC | 
| Alex Gaynor | 8ed651e | 2013-11-07 13:24:31 -0800 | [diff] [blame] | 222 |         >>> iv = os.urandom(16) | 
 | 223 |         >>> mode = CBC(iv) | 
 | 224 |  | 
 | 225 |     While the following is bad and will leak information: | 
 | 226 |  | 
| Alex Gaynor | 989061d | 2013-12-13 20:22:14 -0800 | [diff] [blame] | 227 |     .. doctest:: | 
| Alex Gaynor | 8ed651e | 2013-11-07 13:24:31 -0800 | [diff] [blame] | 228 |  | 
| Alex Gaynor | d83c590 | 2013-12-13 20:43:54 -0800 | [diff] [blame] | 229 |         >>> from cryptography.hazmat.primitives.ciphers.modes import CBC | 
| Alex Gaynor | 8ed651e | 2013-11-07 13:24:31 -0800 | [diff] [blame] | 230 |         >>> iv = "a" * 16 | 
 | 231 |         >>> mode = CBC(iv) | 
| Paul Kehrer | 13f108f | 2013-09-09 21:41:03 -0500 | [diff] [blame] | 232 |  | 
| Paul Kehrer | 4506428 | 2013-10-17 13:41:53 -0500 | [diff] [blame] | 233 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 234 | .. class:: CTR(nonce) | 
| Paul Kehrer | d0ec60e | 2013-10-16 08:46:50 -0500 | [diff] [blame] | 235 |  | 
| Paul Kehrer | 4506428 | 2013-10-17 13:41:53 -0500 | [diff] [blame] | 236 |     .. warning:: | 
 | 237 |  | 
 | 238 |         Counter mode is not recommended for use with block ciphers that have a | 
 | 239 |         block size of less than 128-bits. | 
 | 240 |  | 
| Paul Kehrer | d0ec60e | 2013-10-16 08:46:50 -0500 | [diff] [blame] | 241 |     CTR (Counter) is a mode of operation for block ciphers. It is considered | 
| Alex Gaynor | d1f0201 | 2013-11-01 14:12:35 -0700 | [diff] [blame] | 242 |     cryptographically strong. It transforms a block cipher into a stream | 
 | 243 |     cipher. | 
| Paul Kehrer | d0ec60e | 2013-10-16 08:46:50 -0500 | [diff] [blame] | 244 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 245 |     **This mode does not require padding.** | 
 | 246 |  | 
| Paul Kehrer | 89b3dd3 | 2013-10-17 14:02:45 -0500 | [diff] [blame] | 247 |     :param bytes nonce: Should be random bytes. It is critical to never reuse a | 
| Alex Gaynor | fb843aa | 2014-02-25 11:37:36 -0800 | [diff] [blame] | 248 |         ``nonce`` with a given key.  Any reuse of a nonce with the same key | 
 | 249 |         compromises the security of every message encrypted with that key. Must | 
 | 250 |         be the same number of bytes as the ``block_size`` of the cipher with a | 
 | 251 |         given key. The nonce does not need to be kept secret and may be | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 252 |         included with the ciphertext. | 
| Paul Kehrer | d0ec60e | 2013-10-16 08:46:50 -0500 | [diff] [blame] | 253 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 254 | .. class:: OFB(initialization_vector) | 
| Paul Kehrer | 6f412a0 | 2013-09-10 21:30:50 -0500 | [diff] [blame] | 255 |  | 
 | 256 |     OFB (Output Feedback) is a mode of operation for block ciphers. It | 
 | 257 |     transforms a block cipher into a stream cipher. | 
 | 258 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 259 |     **This mode does not require padding.** | 
 | 260 |  | 
| David Reid | f1a39bd | 2013-09-11 16:28:42 -0700 | [diff] [blame] | 261 |     :param bytes initialization_vector: Must be random bytes. They do not need | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 262 |         to be kept secret and they can be included in a transmitted message. | 
 | 263 |         Must be the same number of bytes as the ``block_size`` of the cipher. | 
 | 264 |         Do not reuse an ``initialization_vector`` with a given ``key``. | 
| Paul Kehrer | 6f412a0 | 2013-09-10 21:30:50 -0500 | [diff] [blame] | 265 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 266 | .. class:: CFB(initialization_vector) | 
| Paul Kehrer | 4223df7 | 2013-09-11 09:48:04 -0500 | [diff] [blame] | 267 |  | 
 | 268 |     CFB (Cipher Feedback) is a mode of operation for block ciphers. It | 
 | 269 |     transforms a block cipher into a stream cipher. | 
 | 270 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 271 |     **This mode does not require padding.** | 
 | 272 |  | 
| Paul Kehrer | 4223df7 | 2013-09-11 09:48:04 -0500 | [diff] [blame] | 273 |     :param bytes initialization_vector: Must be random bytes. They do not need | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 274 |         to be kept secret and they can be included in a transmitted message. | 
 | 275 |         Must be the same number of bytes as the ``block_size`` of the cipher. | 
 | 276 |         Do not reuse an ``initialization_vector`` with a given ``key``. | 
| Paul Kehrer | 4223df7 | 2013-09-11 09:48:04 -0500 | [diff] [blame] | 277 |  | 
| Paul Kehrer | 2a947c4 | 2014-05-15 17:22:08 -0400 | [diff] [blame] | 278 | .. class:: CFB8(initialization_vector) | 
 | 279 |  | 
 | 280 |     CFB (Cipher Feedback) is a mode of operation for block ciphers. It | 
 | 281 |     transforms a block cipher into a stream cipher. The CFB8 variant uses an | 
 | 282 |     8-bit shift register. | 
 | 283 |  | 
 | 284 |     **This mode does not require padding.** | 
 | 285 |  | 
 | 286 |     :param bytes initialization_vector: Must be random bytes. They do not need | 
 | 287 |         to be kept secret and they can be included in a transmitted message. | 
 | 288 |         Must be the same number of bytes as the ``block_size`` of the cipher. | 
 | 289 |         Do not reuse an ``initialization_vector`` with a given ``key``. | 
 | 290 |  | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 291 | .. class:: GCM(initialization_vector, tag=None) | 
 | 292 |  | 
| Paul Kehrer | 5b828b1 | 2013-11-29 17:32:08 -0600 | [diff] [blame] | 293 |     .. danger:: | 
| Paul Kehrer | 26c8c6a | 2013-11-29 16:24:56 -0600 | [diff] [blame] | 294 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 295 |         When using this mode you **must** not use the decrypted data until | 
| Alex Gaynor | 0d23e94 | 2013-12-04 17:28:24 -0600 | [diff] [blame] | 296 |         :meth:`~cryptography.hazmat.primitives.interfaces.CipherContext.finalize` | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 297 |         has been called. GCM provides **no** guarantees of ciphertext integrity | 
| Alex Gaynor | d4f9383 | 2013-12-04 16:31:59 -0600 | [diff] [blame] | 298 |         until decryption is complete. | 
| Paul Kehrer | 26c8c6a | 2013-11-29 16:24:56 -0600 | [diff] [blame] | 299 |  | 
| Paul Kehrer | 5578c66 | 2013-12-03 17:37:42 -0600 | [diff] [blame] | 300 |     GCM (Galois Counter Mode) is a mode of operation for block ciphers. An | 
 | 301 |     AEAD (authenticated encryption with additional data) mode is a type of | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 302 |     block cipher mode that simultaneously encrypts the message as well as | 
 | 303 |     authenticating it. Additional unencrypted data may also be authenticated. | 
 | 304 |     Additional means of verifying integrity such as | 
| Ayrx | fa4a6b2 | 2014-04-16 23:03:14 +0800 | [diff] [blame] | 305 |     :doc:`HMAC </hazmat/primitives/mac/hmac>` are not necessary. | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 306 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 307 |     **This mode does not require padding.** | 
 | 308 |  | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 309 |     :param bytes initialization_vector: Must be random bytes. They do not need | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 310 |         to be kept secret and they can be included in a transmitted message. | 
 | 311 |         NIST `recommends a 96-bit IV length`_ for performance critical | 
 | 312 |         situations but it can be up to 2\ :sup:`64` - 1 bits. Do not reuse an | 
| Alex Gaynor | fb843aa | 2014-02-25 11:37:36 -0800 | [diff] [blame] | 313 |         ``initialization_vector`` with a given ``key``. | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 314 |  | 
| Paul Kehrer | ca73504 | 2013-12-21 17:31:48 -0600 | [diff] [blame] | 315 |     .. note:: | 
 | 316 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 317 |         Cryptography will generate a 128-bit tag when finalizing encryption. | 
 | 318 |         You can shorten a tag by truncating it to the desired length but this | 
| Paul Kehrer | fc73e2d | 2013-12-21 18:41:38 -0600 | [diff] [blame] | 319 |         is **not recommended** as it lowers the security margins of the | 
| Paul Kehrer | 048d6cb | 2013-12-21 18:53:19 -0600 | [diff] [blame] | 320 |         authentication (`NIST SP-800-38D`_ recommends 96-bits or greater). | 
| Paul Kehrer | fc73e2d | 2013-12-21 18:41:38 -0600 | [diff] [blame] | 321 |         If you must shorten the tag the minimum allowed length is 4 bytes | 
| Paul Kehrer | 048d6cb | 2013-12-21 18:53:19 -0600 | [diff] [blame] | 322 |         (32-bits). Applications **must** verify the tag is the expected length | 
 | 323 |         to guarantee the expected security margin. | 
| Paul Kehrer | ca73504 | 2013-12-21 17:31:48 -0600 | [diff] [blame] | 324 |  | 
| Alex Gaynor | fb843aa | 2014-02-25 11:37:36 -0800 | [diff] [blame] | 325 |     :param bytes tag: The tag bytes to verify during decryption. When | 
 | 326 |         encrypting this must be ``None``. | 
| Paul Kehrer | 67abc86 | 2013-11-25 14:29:35 -0600 | [diff] [blame] | 327 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 328 |     .. testcode:: | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 329 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 330 |         import os | 
 | 331 |  | 
 | 332 |         from cryptography.hazmat.primitives.ciphers import ( | 
 | 333 |             Cipher, algorithms, modes | 
 | 334 |         ) | 
 | 335 |  | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 336 |         def encrypt(key, plaintext, associated_data): | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 337 |             # Generate a random 96-bit IV. | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 338 |             iv = os.urandom(12) | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 339 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 340 |             # Construct a AES-GCM Cipher object with the given key and a | 
 | 341 |             # randomly generated IV. | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 342 |             encryptor = Cipher( | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 343 |                 algorithms.AES(key), | 
 | 344 |                 modes.GCM(iv), | 
 | 345 |                 backend=default_backend() | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 346 |             ).encryptor() | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 347 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 348 |             # associated_data will be authenticated but not encrypted, | 
 | 349 |             # it must also be passed in on decryption. | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 350 |             encryptor.authenticate_additional_data(associated_data) | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 351 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 352 |             # Encrypt the plaintext and get the associated ciphertext. | 
| Paul Kehrer | af0b9f5 | 2014-01-07 19:21:49 -0600 | [diff] [blame] | 353 |             # GCM does not require padding. | 
 | 354 |             ciphertext = encryptor.update(plaintext) + encryptor.finalize() | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 355 |  | 
 | 356 |             return (iv, ciphertext, encryptor.tag) | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 357 |  | 
 | 358 |         def decrypt(key, associated_data, iv, ciphertext, tag): | 
| Alex Gaynor | 007e5e1 | 2014-01-12 14:25:49 -0800 | [diff] [blame] | 359 |             if len(tag) != 16: | 
 | 360 |                 raise ValueError( | 
 | 361 |                     "tag must be 16 bytes -- truncation not supported" | 
 | 362 |                 ) | 
 | 363 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 364 |             # Construct a Cipher object, with the key, iv, and additionally the | 
 | 365 |             # GCM tag used for authenticating the message. | 
 | 366 |             decryptor = Cipher( | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 367 |                 algorithms.AES(key), | 
 | 368 |                 modes.GCM(iv, tag), | 
 | 369 |                 backend=default_backend() | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 370 |             ).decryptor() | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 371 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 372 |             # We put associated_data back in or the tag will fail to verify | 
 | 373 |             # when we finalize the decryptor. | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 374 |             decryptor.authenticate_additional_data(associated_data) | 
 | 375 |  | 
| Paul Kehrer | af0b9f5 | 2014-01-07 19:21:49 -0600 | [diff] [blame] | 376 |             # Decryption gets us the authenticated plaintext. | 
 | 377 |             # If the tag does not match an InvalidTag exception will be raised. | 
 | 378 |             return decryptor.update(ciphertext) + decryptor.finalize() | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 379 |  | 
 | 380 |         iv, ciphertext, tag = encrypt( | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 381 |             key, | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 382 |             b"a secret message!", | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 383 |             b"authenticated but not encrypted payload" | 
 | 384 |         ) | 
 | 385 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 386 |         print(decrypt( | 
 | 387 |             key, | 
 | 388 |             b"authenticated but not encrypted payload", | 
 | 389 |             iv, | 
 | 390 |             ciphertext, | 
 | 391 |             tag | 
 | 392 |         )) | 
| David Reid | 78569d6 | 2014-01-07 15:42:17 -0800 | [diff] [blame] | 393 |  | 
 | 394 |     .. testoutput:: | 
 | 395 |  | 
| David Reid | abb72d2 | 2014-01-07 16:06:18 -0800 | [diff] [blame] | 396 |         a secret message! | 
| Paul Kehrer | 22e80cb | 2013-11-20 21:27:00 -0600 | [diff] [blame] | 397 |  | 
| Paul Kehrer | 13f108f | 2013-09-09 21:41:03 -0500 | [diff] [blame] | 398 |  | 
| Alex Stapleton | c5fffd3 | 2014-03-18 15:29:00 +0000 | [diff] [blame] | 399 | Insecure modes | 
| Paul Kehrer | 13f108f | 2013-09-09 21:41:03 -0500 | [diff] [blame] | 400 | -------------- | 
 | 401 |  | 
| Alex Gaynor | cd413a3 | 2013-09-10 18:59:43 -0700 | [diff] [blame] | 402 | .. warning:: | 
 | 403 |  | 
 | 404 |     These modes are insecure. New applications should never make use of them, | 
 | 405 |     and existing applications should strongly consider migrating away. | 
 | 406 |  | 
 | 407 |  | 
| David Reid | 1f3d718 | 2013-10-22 16:55:18 -0700 | [diff] [blame] | 408 | .. class:: ECB() | 
| Paul Kehrer | 13f108f | 2013-09-09 21:41:03 -0500 | [diff] [blame] | 409 |  | 
 | 410 |     ECB (Electronic Code Book) is the simplest mode of operation for block | 
| Alex Gaynor | cd413a3 | 2013-09-10 18:59:43 -0700 | [diff] [blame] | 411 |     ciphers. Each block of data is encrypted in the same way. This means | 
 | 412 |     identical plaintext blocks will always result in identical ciphertext | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 413 |     blocks, which can leave `significant patterns in the output`_. | 
| Alex Gaynor | ab5f011 | 2013-11-08 10:34:00 -0800 | [diff] [blame] | 414 |  | 
| Paul Kehrer | fe2e3c2 | 2014-01-07 20:55:20 -0600 | [diff] [blame] | 415 |     **Padding is required when using this mode.** | 
 | 416 |  | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 417 | Interfaces | 
 | 418 | ---------- | 
 | 419 |  | 
 | 420 | .. class:: CipherContext | 
 | 421 |  | 
 | 422 |     When calling ``encryptor()`` or ``decryptor()`` on a ``Cipher`` object | 
| Alex Gaynor | b481889 | 2014-02-06 10:58:50 -0800 | [diff] [blame] | 423 |     the result will conform to the ``CipherContext`` interface. You can then | 
 | 424 |     call ``update(data)`` with data until you have fed everything into the | 
 | 425 |     context. Once that is done call ``finalize()`` to finish the operation and | 
 | 426 |     obtain the remainder of the data. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 427 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 428 |     Block ciphers require that the plaintext or ciphertext always be a multiple | 
 | 429 |     of their block size. Because of that **padding** is sometimes required to | 
 | 430 |     make a message the correct size. ``CipherContext`` will not automatically | 
 | 431 |     apply any padding; you'll need to add your own. For block ciphers the | 
 | 432 |     recommended padding is | 
 | 433 |     :class:`cryptography.hazmat.primitives.padding.PKCS7`. If you are using a | 
 | 434 |     stream cipher mode (such as | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 435 |     :class:`cryptography.hazmat.primitives.modes.CTR`) you don't have to worry | 
 | 436 |     about this. | 
 | 437 |  | 
 | 438 |     .. method:: update(data) | 
 | 439 |  | 
 | 440 |         :param bytes data: The data you wish to pass into the context. | 
 | 441 |         :return bytes: Returns the data that was encrypted or decrypted. | 
 | 442 |         :raises cryptography.exceptions.AlreadyFinalized: See :meth:`finalize` | 
 | 443 |  | 
 | 444 |         When the ``Cipher`` was constructed in a mode that turns it into a | 
 | 445 |         stream cipher (e.g. | 
 | 446 |         :class:`cryptography.hazmat.primitives.ciphers.modes.CTR`), this will | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 447 |         return bytes immediately, however in other modes it will return chunks | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 448 |         whose size is determined by the cipher's block size. | 
 | 449 |  | 
 | 450 |     .. method:: finalize() | 
 | 451 |  | 
 | 452 |         :return bytes: Returns the remainder of the data. | 
 | 453 |         :raises ValueError: This is raised when the data provided isn't | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 454 |             a multiple of the algorithm's block size. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 455 |  | 
 | 456 |         Once ``finalize`` is called this object can no longer be used and | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 457 |         :meth:`update` and :meth:`finalize` will raise an | 
 | 458 |         :class:`~cryptography.exceptions.AlreadyFinalized` exception. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 459 |  | 
 | 460 | .. class:: AEADCipherContext | 
 | 461 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 462 |     When calling ``encryptor`` or ``decryptor`` on a ``Cipher`` object | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 463 |     with an AEAD mode (e.g. | 
| Alex Gaynor | b481889 | 2014-02-06 10:58:50 -0800 | [diff] [blame] | 464 |     :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM`) the result will | 
 | 465 |     conform to the ``AEADCipherContext`` and ``CipherContext`` interfaces. If | 
 | 466 |     it is an encryption context it will additionally be an | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 467 |     ``AEADEncryptionContext`` provider. ``AEADCipherContext`` contains an | 
 | 468 |     additional method :meth:`authenticate_additional_data` for adding | 
 | 469 |     additional authenticated but unencrypted data (see note below). You should | 
 | 470 |     call this before calls to ``update``. When you are done call `finalize`` | 
 | 471 |     to finish the operation. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 472 |  | 
 | 473 |     .. note:: | 
 | 474 |  | 
 | 475 |         In AEAD modes all data passed to ``update()`` will be both encrypted | 
 | 476 |         and authenticated. Do not pass encrypted data to the | 
 | 477 |         ``authenticate_additional_data()`` method. It is meant solely for | 
 | 478 |         additional data you may want to authenticate but leave unencrypted. | 
 | 479 |  | 
 | 480 |     .. method:: authenticate_additional_data(data) | 
 | 481 |  | 
 | 482 |         :param bytes data: Any data you wish to authenticate but not encrypt. | 
 | 483 |         :raises: :class:`~cryptography.exceptions.AlreadyFinalized` | 
 | 484 |  | 
 | 485 | .. class:: AEADEncryptionContext | 
 | 486 |  | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 487 |     When creating an encryption context using ``encryptor`` on a ``Cipher`` | 
 | 488 |     object with an AEAD mode such as | 
 | 489 |     :class:`~cryptography.hazmat.primitives.ciphers.modes.GCM` an object | 
 | 490 |     conforming to both the ``AEADEncryptionContext`` and ``AEADCipherContext`` | 
 | 491 |     interfaces will be returned.  This interface provides one | 
 | 492 |     additional attribute ``tag``. ``tag`` can only be obtained after | 
 | 493 |     ``finalize`` has been called. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 494 |  | 
 | 495 |     .. attribute:: tag | 
 | 496 |  | 
 | 497 |         :return bytes: Returns the tag value as bytes. | 
 | 498 |         :raises: :class:`~cryptography.exceptions.NotYetFinalized` if called | 
| Alex Gaynor | fb843aa | 2014-02-25 11:37:36 -0800 | [diff] [blame] | 499 |             before the context is finalized. | 
| Paul Kehrer | ad6d164 | 2014-01-07 19:10:12 -0600 | [diff] [blame] | 500 |  | 
| Alex Gaynor | ab5f011 | 2013-11-08 10:34:00 -0800 | [diff] [blame] | 501 |  | 
 | 502 | .. _`described by Colin Percival`: http://www.daemonology.net/blog/2009-06-11-cryptographic-right-answers.html | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 503 | .. _`recommends a 96-bit IV length`: http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/gcm/gcm-spec.pdf | 
| Paul Kehrer | a7fbf07 | 2013-12-21 18:12:25 -0600 | [diff] [blame] | 504 | .. _`NIST SP-800-38D`: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf | 
| Paul Kehrer | bab0e1a | 2014-02-09 10:51:59 -0600 | [diff] [blame] | 505 | .. _`Communications Security Establishment`: http://www.cse-cst.gc.ca | 
| Alex Stapleton | 092351d | 2014-03-09 17:44:43 +0000 | [diff] [blame] | 506 | .. _`encrypt`: https://ssd.eff.org/tech/encryption | 
 | 507 | .. _`CRYPTREC`: http://www.cryptrec.go.jp/english/ | 
 | 508 | .. _`significant patterns in the output`: http://en.wikipedia.org/wiki/Cipher_block_chaining#Electronic_codebook_.28ECB.29 | 
| Paul Kehrer | e5dc122 | 2014-02-20 16:19:32 -0600 | [diff] [blame] | 509 | .. _`International Data Encryption Algorithm`: https://en.wikipedia.org/wiki/International_Data_Encryption_Algorithm | 
 | 510 | .. _`OpenPGP`: http://www.openpgp.org |