blob: 4d95629cedd449310f85a382a08065ebfdf145f2 [file] [log] [blame]
Paul Kehrerb6d764c2014-01-27 22:32:11 -06001.. hazmat::
2
Alex Stapletonc5fffd32014-03-18 15:29:00 +00003Key derivation functions
Paul Kehrerb6d764c2014-01-27 22:32:11 -06004========================
5
Paul Kehrer48402ff2015-02-16 15:31:52 -06006.. module:: cryptography.hazmat.primitives.kdf
Paul Kehrerb6d764c2014-01-27 22:32:11 -06007
Paul Kehrer0b181182014-01-29 16:34:47 -06008Key derivation functions derive bytes suitable for cryptographic operations
9from passwords or other data sources using a pseudo-random function (PRF).
10Different KDFs are suitable for different tasks such as:
Paul Kehrer1cab1042014-01-29 14:30:11 -060011
Paul Kehrer0b181182014-01-29 16:34:47 -060012* Cryptographic key derivation
Paul Kehrer1cab1042014-01-29 14:30:11 -060013
14 Deriving a key suitable for use as input to an encryption algorithm.
15 Typically this means taking a password and running it through an algorithm
David Reidc0248b92014-01-30 15:23:33 -080016 such as :class:`~cryptography.hazmat.primitives.kdf.pbkdf2.PBKDF2HMAC` or
17 :class:`~cryptography.hazmat.primitives.kdf.hkdf.HKDF`.
Paul Kehrer1cab1042014-01-29 14:30:11 -060018 This process is typically known as `key stretching`_.
19
Paul Kehrer0b181182014-01-29 16:34:47 -060020* Password storage
Paul Kehrer1cab1042014-01-29 14:30:11 -060021
22 When storing passwords you want to use an algorithm that is computationally
23 intensive. Legitimate users will only need to compute it once (for example,
24 taking the user's password, running it through the KDF, then comparing it
25 to the stored value), while attackers will need to do it billions of times.
26 Ideal password storage KDFs will be demanding on both computational and
27 memory resources.
Paul Kehrerb6d764c2014-01-27 22:32:11 -060028
Paul Kehrer0b181182014-01-29 16:34:47 -060029.. currentmodule:: cryptography.hazmat.primitives.kdf.pbkdf2
30
31.. class:: PBKDF2HMAC(algorithm, length, salt, iterations, backend)
Paul Kehrerb6d764c2014-01-27 22:32:11 -060032
Paul Kehrer5d1af212014-01-28 12:19:32 -060033 .. versionadded:: 0.2
34
Paul Kehrer298e5332014-01-29 11:16:22 -060035 `PBKDF2`_ (Password Based Key Derivation Function 2) is typically used for
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060036 deriving a cryptographic key from a password. It may also be used for
Paul Kehrer0b181182014-01-29 16:34:47 -060037 key storage, but an alternate key storage KDF such as `scrypt`_ is generally
Paul Kehrer1cab1042014-01-29 14:30:11 -060038 considered a better solution.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060039
Paul Kehrer5d1af212014-01-28 12:19:32 -060040 This class conforms to the
Paul Kehrer48402ff2015-02-16 15:31:52 -060041 :class:`~cryptography.hazmat.primitives.kdf.KeyDerivationFunction`
Paul Kehrer5d1af212014-01-28 12:19:32 -060042 interface.
43
Paul Kehrerb6d764c2014-01-27 22:32:11 -060044 .. doctest::
45
Paul Kehrer5d1af212014-01-28 12:19:32 -060046 >>> import os
47 >>> from cryptography.hazmat.primitives import hashes
Paul Kehrerb3f763f2014-01-28 16:42:15 -060048 >>> from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
Paul Kehrerb6d764c2014-01-27 22:32:11 -060049 >>> from cryptography.hazmat.backends import default_backend
50 >>> backend = default_backend()
51 >>> salt = os.urandom(16)
52 >>> # derive
Paul Kehrerb3f763f2014-01-28 16:42:15 -060053 >>> kdf = PBKDF2HMAC(
54 ... algorithm=hashes.SHA256(),
55 ... length=32,
56 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060057 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060058 ... backend=backend
59 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060060 >>> key = kdf.derive(b"my great password")
61 >>> # verify
Paul Kehrerb3f763f2014-01-28 16:42:15 -060062 >>> kdf = PBKDF2HMAC(
63 ... algorithm=hashes.SHA256(),
64 ... length=32,
65 ... salt=salt,
Paul Kehrer1277bc72014-01-28 17:09:59 -060066 ... iterations=100000,
Paul Kehrerb3f763f2014-01-28 16:42:15 -060067 ... backend=backend
68 ... )
Paul Kehrerb6d764c2014-01-27 22:32:11 -060069 >>> kdf.verify(b"my great password", key)
Paul Kehrerb6d764c2014-01-27 22:32:11 -060070
Paul Kehrer5d1af212014-01-28 12:19:32 -060071 :param algorithm: An instance of a
Paul Kehrer601278a2015-02-12 12:51:00 -060072 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
Paul Kehrer5d1af212014-01-28 12:19:32 -060073 provider.
74 :param int length: The desired length of the derived key. Maximum is
Paul Kehrerb3f763f2014-01-28 16:42:15 -060075 (2\ :sup:`32` - 1) * ``algorithm.digest_size``.
Paul Kehrer5d1af212014-01-28 12:19:32 -060076 :param bytes salt: A salt. `NIST SP 800-132`_ recommends 128-bits or
77 longer.
78 :param int iterations: The number of iterations to perform of the hash
Paul Kehrerc58b4782014-01-29 13:56:25 -060079 function. This can be used to control the length of time the operation
80 takes. Higher numbers help mitigate brute force attacks against derived
81 keys. See OWASP's `Password Storage Cheat Sheet`_ for more
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060082 detailed recommendations if you intend to use this for password storage.
Paul Kehrer5d1af212014-01-28 12:19:32 -060083 :param backend: A
Paul Kehrer15a86a02014-01-29 17:44:47 -060084 :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`
Paul Kehrer5d1af212014-01-28 12:19:32 -060085 provider.
Paul Kehrerb6d764c2014-01-27 22:32:11 -060086
Alex Gaynor7a489db2014-03-22 15:09:34 -070087 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrx68702412014-03-15 23:29:36 +080088 provided ``backend`` does not implement
89 :class:`~cryptography.hazmat.backends.interfaces.PBKDF2HMACBackend`
90
Ayrx00eff9c2014-05-17 19:47:09 +080091 :raises TypeError: This exception is raised if ``salt`` is not ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +080092
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060093 .. method:: derive(key_material)
94
Alex Gaynora8e125f2014-01-29 19:21:03 -080095 :param bytes key_material: The input key material. For PBKDF2 this
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060096 should be a password.
Paul Kehrer0b181182014-01-29 16:34:47 -060097 :return bytes: the derived key.
Paul Kehrer3d8c66f2014-01-28 17:36:50 -060098 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
99 :meth:`derive` or
100 :meth:`verify` is
101 called more than
102 once.
103
Ayrx6d69eab2014-05-17 16:59:31 +0800104 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800105 ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +0800106
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600107 This generates and returns a new key from the supplied password.
108
109 .. method:: verify(key_material, expected_key)
110
Alex Gaynora8e125f2014-01-29 19:21:03 -0800111 :param bytes key_material: The input key material. This is the same as
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600112 ``key_material`` in :meth:`derive`.
Alex Gaynora8e125f2014-01-29 19:21:03 -0800113 :param bytes expected_key: The expected result of deriving a new key,
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600114 this is the same as the return value of
115 :meth:`derive`.
116 :raises cryptography.exceptions.InvalidKey: This is raised when the
117 derived key does not match
118 the expected key.
119 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
120 :meth:`derive` or
121 :meth:`verify` is
122 called more than
123 once.
124
125 This checks whether deriving a new key from the supplied
126 ``key_material`` generates the same key as the ``expected_key``, and
127 raises an exception if they do not match. This can be used for
Paul Kehrer99d51902014-01-28 20:16:20 -0600128 checking whether the password a user provides matches the stored derived
Paul Kehrer3d8c66f2014-01-28 17:36:50 -0600129 key.
130
David Reidc0248b92014-01-30 15:23:33 -0800131
132.. currentmodule:: cryptography.hazmat.primitives.kdf.hkdf
133
134.. class:: HKDF(algorithm, length, salt, info, backend)
135
136 .. versionadded:: 0.2
137
David Reid2ad94ab2014-02-03 10:01:15 -0800138 `HKDF`_ (HMAC-based Extract-and-Expand Key Derivation Function) is suitable
David Reidc0248b92014-01-30 15:23:33 -0800139 for deriving keys of a fixed size used for other cryptographic operations.
Alex Gaynorc43bb752014-02-12 16:42:11 -0800140
141 .. warning::
142
143 HKDF should not be used for password storage.
David Reidc0248b92014-01-30 15:23:33 -0800144
David Reid5df929c2014-02-03 13:26:15 -0800145 .. doctest::
146
147 >>> import os
148 >>> from cryptography.hazmat.primitives import hashes
149 >>> from cryptography.hazmat.primitives.kdf.hkdf import HKDF
150 >>> from cryptography.hazmat.backends import default_backend
151 >>> backend = default_backend()
152 >>> salt = os.urandom(16)
153 >>> info = b"hkdf-example"
154 >>> hkdf = HKDF(
155 ... algorithm=hashes.SHA256(),
156 ... length=32,
157 ... salt=salt,
158 ... info=info,
159 ... backend=backend
160 ... )
David Reid134f1f42014-02-03 13:54:30 -0800161 >>> key = hkdf.derive(b"input key")
David Reid5df929c2014-02-03 13:26:15 -0800162 >>> hkdf = HKDF(
163 ... algorithm=hashes.SHA256(),
164 ... length=32,
165 ... salt=salt,
166 ... info=info,
167 ... backend=backend
168 ... )
169 >>> hkdf.verify(b"input key", key)
170
David Reidc0248b92014-01-30 15:23:33 -0800171 :param algorithm: An instance of a
Paul Kehrer601278a2015-02-12 12:51:00 -0600172 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
David Reidc0248b92014-01-30 15:23:33 -0800173 provider.
174
175 :param int length: The desired length of the derived key. Maximum is
David Reidb89f34c2014-02-03 10:01:42 -0800176 ``255 * (algorithm.digest_size // 8)``.
David Reidc0248b92014-01-30 15:23:33 -0800177
David Reid2ad94ab2014-02-03 10:01:15 -0800178 :param bytes salt: A salt. Randomizes the KDF's output. Optional, but
179 highly recommended. Ideally as many bits of entropy as the security
180 level of the hash: often that means cryptographically random and as
181 long as the hash output. Worse (shorter, less entropy) salt values can
182 still meaningfully contribute to security. May be reused. Does not have
183 to be secret, but may cause stronger security guarantees if secret; see
184 `RFC 5869`_ and the `HKDF paper`_ for more details. If ``None`` is
185 explicitly passed a default salt of ``algorithm.digest_size // 8`` null
186 bytes will be used.
David Reidc0248b92014-01-30 15:23:33 -0800187
188 :param bytes info: Application specific context information. If ``None``
189 is explicitly passed an empty byte string will be used.
190
Wouter Bolsterleed63cbd02014-03-01 00:45:31 +0100191 :param backend: A
David Reidc0248b92014-01-30 15:23:33 -0800192 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
193 provider.
194
Alex Gaynor7a489db2014-03-22 15:09:34 -0700195 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
Ayrx68702412014-03-15 23:29:36 +0800196 provided ``backend`` does not implement
197 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
198
Ayrx6d69eab2014-05-17 16:59:31 +0800199 :raises TypeError: This exception is raised if ``salt`` or ``info`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800200 ``bytes``.
Ayrx6d69eab2014-05-17 16:59:31 +0800201
David Reidc0248b92014-01-30 15:23:33 -0800202 .. method:: derive(key_material)
203
204 :param bytes key_material: The input key material.
Ayrx1534e092014-05-06 14:19:46 +0800205 :return bytes: The derived key.
Ayrx6d69eab2014-05-17 16:59:31 +0800206 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800207 ``bytes``.
David Reidc0248b92014-01-30 15:23:33 -0800208
209 Derives a new key from the input key material by performing both the
210 extract and expand operations.
211
212 .. method:: verify(key_material, expected_key)
213
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600214 :param bytes key_material: The input key material. This is the same as
David Reidc0248b92014-01-30 15:23:33 -0800215 ``key_material`` in :meth:`derive`.
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600216 :param bytes expected_key: The expected result of deriving a new key,
David Reidc0248b92014-01-30 15:23:33 -0800217 this is the same as the return value of
218 :meth:`derive`.
219 :raises cryptography.exceptions.InvalidKey: This is raised when the
220 derived key does not match
221 the expected key.
222 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
223 :meth:`derive` or
224 :meth:`verify` is
225 called more than
226 once.
227
228 This checks whether deriving a new key from the supplied
229 ``key_material`` generates the same key as the ``expected_key``, and
David Reidb9fa7712014-02-03 10:45:11 -0800230 raises an exception if they do not match.
David Reidc0248b92014-01-30 15:23:33 -0800231
Ayrx9d72f122014-05-06 20:27:51 +0800232
Ayrxc0ce9112014-05-07 16:22:09 +0800233.. class:: HKDFExpand(algorithm, length, info, backend)
Ayrx9d72f122014-05-06 20:27:51 +0800234
235 .. versionadded:: 0.5
236
237 HKDF consists of two stages, extract and expand. This class exposes an
238 expand only version of HKDF that is suitable when the key material is
239 already cryptographically strong.
240
241 .. warning::
242
Ayrxc0ce9112014-05-07 16:22:09 +0800243 HKDFExpand should only be used if the key material is
Ayrx9d72f122014-05-06 20:27:51 +0800244 cryptographically strong. You should use
245 :class:`~cryptography.hazmat.primitives.kdf.hkdf.HKDF` if
246 you are unsure.
247
248 .. doctest::
249
250 >>> import os
251 >>> from cryptography.hazmat.primitives import hashes
Ayrxc0ce9112014-05-07 16:22:09 +0800252 >>> from cryptography.hazmat.primitives.kdf.hkdf import HKDFExpand
Ayrx9d72f122014-05-06 20:27:51 +0800253 >>> from cryptography.hazmat.backends import default_backend
254 >>> backend = default_backend()
255 >>> info = b"hkdf-example"
256 >>> key_material = os.urandom(16)
Ayrxc0ce9112014-05-07 16:22:09 +0800257 >>> hkdf = HKDFExpand(
Ayrx9d72f122014-05-06 20:27:51 +0800258 ... algorithm=hashes.SHA256(),
259 ... length=32,
260 ... info=info,
261 ... backend=backend
262 ... )
263 >>> key = hkdf.derive(key_material)
Ayrxc0ce9112014-05-07 16:22:09 +0800264 >>> hkdf = HKDFExpand(
Ayrx9d72f122014-05-06 20:27:51 +0800265 ... algorithm=hashes.SHA256(),
266 ... length=32,
267 ... info=info,
268 ... backend=backend
269 ... )
270 >>> hkdf.verify(key_material, key)
271
272 :param algorithm: An instance of a
Paul Kehrer601278a2015-02-12 12:51:00 -0600273 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
Ayrx9d72f122014-05-06 20:27:51 +0800274 provider.
275
276 :param int length: The desired length of the derived key. Maximum is
277 ``255 * (algorithm.digest_size // 8)``.
278
279 :param bytes info: Application specific context information. If ``None``
280 is explicitly passed an empty byte string will be used.
281
282 :param backend: A
283 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
284 provider.
285
286 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
287 provided ``backend`` does not implement
288 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
Ayrxc48100a2014-05-10 13:01:46 +0800289 :raises TypeError: This is raised if the provided ``info`` is a unicode object
Ayrx00eff9c2014-05-17 19:47:09 +0800290 :raises TypeError: This exception is raised if ``info`` is not ``bytes``.
Ayrx9d72f122014-05-06 20:27:51 +0800291
292 .. method:: derive(key_material)
293
294 :param bytes key_material: The input key material.
295 :return bytes: The derived key.
296
Ayrxc48100a2014-05-10 13:01:46 +0800297 :raises TypeError: This is raised if the provided ``key_material`` is
298 a unicode object
Ayrx6d69eab2014-05-17 16:59:31 +0800299 :raises TypeError: This exception is raised if ``key_material`` is not
Ayrx00eff9c2014-05-17 19:47:09 +0800300 ``bytes``.
Ayrxc48100a2014-05-10 13:01:46 +0800301
Ayrx9d72f122014-05-06 20:27:51 +0800302 Derives a new key from the input key material by performing both the
303 extract and expand operations.
304
305 .. method:: verify(key_material, expected_key)
306
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600307 :param bytes key_material: The input key material. This is the same as
Ayrx9d72f122014-05-06 20:27:51 +0800308 ``key_material`` in :meth:`derive`.
Alex Gaynor1cfc5d52014-11-23 17:44:28 -0600309 :param bytes expected_key: The expected result of deriving a new key,
Ayrx9d72f122014-05-06 20:27:51 +0800310 this is the same as the return value of
311 :meth:`derive`.
312 :raises cryptography.exceptions.InvalidKey: This is raised when the
313 derived key does not match
314 the expected key.
315 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
316 :meth:`derive` or
317 :meth:`verify` is
318 called more than
319 once.
Ayrxc48100a2014-05-10 13:01:46 +0800320 :raises TypeError: This is raised if the provided ``key_material`` is
321 a unicode object
Ayrx9d72f122014-05-06 20:27:51 +0800322
323 This checks whether deriving a new key from the supplied
324 ``key_material`` generates the same key as the ``expected_key``, and
325 raises an exception if they do not match.
326
Simo Sorce8a690fb2015-05-01 15:56:30 -0400327.. currentmodule:: cryptography.hazmat.primitives.kdf.concatkdf
328
329.. class:: ConcatKDFHash(algorithm, length, otherinfo, backend)
330
331 .. versionadded:: 1.0
332
333 ConcatKDFHash (Concatenation Key Derivation Function) is defined by the
334 NIST Special Publication `NIST SP 800-56Ar2`_ document, to be used to
335 derive keys for use after a Key Exchange negotiation operation.
336
337 .. warning::
338
339 ConcatKDFHash should not be used for password storage.
340
341 .. doctest::
342
343 >>> import os
344 >>> from cryptography.hazmat.primitives import hashes
345 >>> from cryptography.hazmat.primitives.kdf.concatkdf import ConcatKDFHash
346 >>> from cryptography.hazmat.backends import default_backend
347 >>> backend = default_backend()
Simo Sorce8a690fb2015-05-01 15:56:30 -0400348 >>> otherinfo = b"concatkdf-example"
349 >>> ckdf = ConcatKDFHash(
350 ... algorithm=hashes.SHA256(),
351 ... length=256,
352 ... otherinfo=otherinfo,
353 ... backend=backend
354 ... )
355 >>> key = ckdf.derive(b"input key")
356 >>> ckdf = ConcatKDFHash(
357 ... algorithm=hashes.SHA256(),
358 ... length=256,
359 ... otherinfo=otherinfo,
360 ... backend=backend
361 ... )
362 >>> ckdf.verify(b"input key", key)
363
364 :param algorithm: An instance of a
365 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
366 provider
367
368 :param int length: The desired length of the derived key in bytes.
369 Maximum is ``hashlen * (2^32 -1)``.
370
371 :param bytes otherinfo: Application specific context information.
372 If ``None`` is explicitly passed an empty byte string will be used.
373
374 :param backend: A
375 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
376 provider.
377
378 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised
379 if the provided ``backend`` does not implement
380 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
381
382 :raises TypeError: This exception is raised if ``otherinfo`` is not
383 ``bytes``.
384
385 .. method:: derive(key_material)
386
387 :param bytes key_material: The input key material.
388 :return bytes: The derived key.
389 :raises TypeError: This exception is raised if ``key_material`` is
390 not ``bytes``.
391
Terry Chiadae40762015-06-13 11:26:16 +0800392 Derives a new key from the input key material.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400393
394 .. method:: verify(key_material, expected_key)
395
396 :param bytes key_material: The input key material. This is the same as
397 ``key_material`` in :meth:`derive`.
398 :param bytes expected_key: The expected result of deriving a new key,
399 this is the same as the return value of
400 :meth:`derive`.
401 :raises cryptography.exceptions.InvalidKey: This is raised when the
402 derived key does not match
403 the expected key.
404 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
405 :meth:`derive` or
406 :meth:`verify` is
407 called more than
408 once.
409
410 This checks whether deriving a new key from the supplied
411 ``key_material`` generates the same key as the ``expected_key``, and
412 raises an exception if they do not match.
413
414
415.. class:: ConcatKDFHMAC(algorithm, length, salt, otherinfo, backend)
416
417 .. versionadded:: 1.0
418
419 Similar to ConcatKFDHash but uses an HMAC function instead.
420
421 .. warning::
422
423 ConcatKDFHMAC should not be used for password storage.
424
425 .. doctest::
426
427 >>> import os
428 >>> from cryptography.hazmat.primitives import hashes
429 >>> from cryptography.hazmat.primitives.kdf.concatkdf import ConcatKDFHMAC
430 >>> from cryptography.hazmat.backends import default_backend
431 >>> backend = default_backend()
432 >>> salt = os.urandom(16)
433 >>> otherinfo = b"concatkdf-example"
434 >>> ckdf = ConcatKDFHMAC(
435 ... algorithm=hashes.SHA256(),
436 ... length=256,
437 ... salt=salt,
438 ... otherinfo=otherinfo,
439 ... backend=backend
440 ... )
441 >>> key = ckdf.derive(b"input key")
442 >>> ckdf = ConcatKDFHMAC(
443 ... algorithm=hashes.SHA256(),
444 ... length=256,
445 ... salt=salt,
446 ... otherinfo=otherinfo,
447 ... backend=backend
448 ... )
449 >>> ckdf.verify(b"input key", key)
450
451 :param algorithm: An instance of a
452 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
453 provider
454
455 :param int length: The desired length of the derived key in bytes. Maximum
456 is ``hashlen * (2^32 -1)``.
457
458 :param bytes salt: A salt. Randomizes the KDF's output. Optional, but
459 highly recommended. Ideally as many bits of entropy as the security
460 level of the hash: often that means cryptographically random and as
461 long as the hash output. Does not have to be secret, but may cause
462 stronger security guarantees if secret; If ``None`` is explicitly
463 passed a default salt of ``algorithm.block_size`` null bytes will be
464 used.
465
466 :param bytes otherinfo: Application specific context information.
467 If ``None`` is explicitly passed an empty byte string will be used.
468
469 :param backend: A
470 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
471 provider.
472
473 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if the
474 provided ``backend`` does not implement
475 :class:`~cryptography.hazmat.backends.interfaces.HMACBackend`
476
477 :raises TypeError: This exception is raised if ``salt`` or ``otherinfo``
478 is not ``bytes``.
479
480 .. method:: derive(key_material)
481
482 :param bytes key_material: The input key material.
483 :return bytes: The derived key.
484 :raises TypeError: This exception is raised if ``key_material`` is not
485 ``bytes``.
486
Terry Chiadae40762015-06-13 11:26:16 +0800487 Derives a new key from the input key material.
Simo Sorce8a690fb2015-05-01 15:56:30 -0400488
489 .. method:: verify(key_material, expected_key)
490
491 :param bytes key_material: The input key material. This is the same as
492 ``key_material`` in :meth:`derive`.
493 :param bytes expected_key: The expected result of deriving a new key,
494 this is the same as the return value of
495 :meth:`derive`.
496 :raises cryptography.exceptions.InvalidKey: This is raised when the
497 derived key does not match
498 the expected key.
499 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
500 :meth:`derive` or
501 :meth:`verify` is
502 called more than
503 once.
504
505 This checks whether deriving a new key from the supplied
506 ``key_material`` generates the same key as the ``expected_key``, and
507 raises an exception if they do not match.
508
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400509.. currentmodule:: cryptography.hazmat.primitives.kdf.x963kdf
510
511.. class:: X963KDF(algorithm, length, otherinfo, backend)
512
513 .. versionadded:: 1.1
514
515 X963KDF (ANSI X9.63 Key Derivation Function) is defined by ANSI
516 in the `ANSI X9.63:2001`_ document, to be used to derive keys for use
517 after a Key Exchange negotiation operation.
518
519 SECG in `SEC 1 v2.0`_ recommends that
520 :class:`~cryptography.hazmat.primitives.kdf.concatkdf.ConcatKDFHash` be
521 used for new projects. This KDF should only be used for backwards
Alex Gaynorace036d2015-09-24 20:23:08 -0400522 compatibility with pre-existing protocols.
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400523
524
525 .. warning::
526
527 X963KDF should not be used for password storage.
528
529 .. doctest::
530
531 >>> import os
532 >>> from cryptography.hazmat.primitives import hashes
533 >>> from cryptography.hazmat.primitives.kdf.x963kdf import X963KDF
534 >>> from cryptography.hazmat.backends import default_backend
535 >>> backend = default_backend()
536 >>> sharedinfo = b"ANSI X9.63 Example"
537 >>> xkdf = X963KDF(
538 ... algorithm=hashes.SHA256(),
539 ... length=256,
540 ... sharedinfo=sharedinfo,
541 ... backend=backend
542 ... )
543 >>> key = xkdf.derive(b"input key")
544 >>> xkdf = X963KDF(
545 ... algorithm=hashes.SHA256(),
546 ... length=256,
547 ... sharedinfo=sharedinfo,
548 ... backend=backend
549 ... )
550 >>> xkdf.verify(b"input key", key)
551
552 :param algorithm: An instance of a
553 :class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm`
554 provider
555
556 :param int length: The desired length of the derived key in bytes.
557 Maximum is ``hashlen * (2^32 -1)``.
558
559 :param bytes sharedinfo: Application specific context information.
560 If ``None`` is explicitly passed an empty byte string will be used.
561
562 :param backend: A cryptography backend
563 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
564 provider.
565
566 :raises cryptography.exceptions.UnsupportedAlgorithm: This is raised
567 if the provided ``backend`` does not implement
568 :class:`~cryptography.hazmat.backends.interfaces.HashBackend`
569
570 :raises TypeError: This exception is raised if ``sharedinfo`` is not
571 ``bytes``.
572
573 .. method:: derive(key_material)
574
575 :param bytes key_material: The input key material.
576 :return bytes: The derived key.
577 :raises TypeError: This exception is raised if ``key_material`` is
578 not ``bytes``.
579
580 Derives a new key from the input key material.
581
582 .. method:: verify(key_material, expected_key)
583
584 :param bytes key_material: The input key material. This is the same as
585 ``key_material`` in :meth:`derive`.
586 :param bytes expected_key: The expected result of deriving a new key,
587 this is the same as the return value of
588 :meth:`derive`.
589 :raises cryptography.exceptions.InvalidKey: This is raised when the
590 derived key does not match
591 the expected key.
592 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
593 :meth:`derive` or
594 :meth:`verify` is
595 called more than
596 once.
597
598 This checks whether deriving a new key from the supplied
599 ``key_material`` generates the same key as the ``expected_key``, and
600 raises an exception if they do not match.
601
Simo Sorce8a690fb2015-05-01 15:56:30 -0400602
Paul Kehrer48402ff2015-02-16 15:31:52 -0600603Interface
604~~~~~~~~~
605
606.. currentmodule:: cryptography.hazmat.primitives.kdf
607
608.. class:: KeyDerivationFunction
609
610 .. versionadded:: 0.2
611
612 .. method:: derive(key_material)
613
614 :param bytes key_material: The input key material. Depending on what
615 key derivation function you are using this
616 could be either random bytes, or a user
617 supplied password.
618 :return: The new key.
619 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
620 :meth:`derive` or
621 :meth:`verify` is
622 called more than
623 once.
624
625 This generates and returns a new key from the supplied key material.
626
627 .. method:: verify(key_material, expected_key)
628
629 :param bytes key_material: The input key material. This is the same as
630 ``key_material`` in :meth:`derive`.
631 :param bytes expected_key: The expected result of deriving a new key,
632 this is the same as the return value of
633 :meth:`derive`.
634 :raises cryptography.exceptions.InvalidKey: This is raised when the
635 derived key does not match
636 the expected key.
637 :raises cryptography.exceptions.AlreadyFinalized: This is raised when
638 :meth:`derive` or
639 :meth:`verify` is
640 called more than
641 once.
642
643 This checks whether deriving a new key from the supplied
644 ``key_material`` generates the same key as the ``expected_key``, and
645 raises an exception if they do not match. This can be used for
646 something like checking whether a user's password attempt matches the
647 stored derived key.
648
649
Paul Kehrerb6d764c2014-01-27 22:32:11 -0600650.. _`NIST SP 800-132`: http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf
Simo Sorce8a690fb2015-05-01 15:56:30 -0400651.. _`NIST SP 800-56Ar2`: http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar2.pdf
Simo Sorce53c8f6a2015-09-15 11:13:56 -0400652.. _`ANSI X9.63:2001`: https://webstore.ansi.org
653.. _`SEC 1 v2.0`: http://www.secg.org/sec1-v2.pdf
Paul Kehrerb3f763f2014-01-28 16:42:15 -0600654.. _`Password Storage Cheat Sheet`: https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
David Reidb80deea2014-02-03 10:33:16 -0800655.. _`PBKDF2`: https://en.wikipedia.org/wiki/PBKDF2
656.. _`scrypt`: https://en.wikipedia.org/wiki/Scrypt
657.. _`key stretching`: https://en.wikipedia.org/wiki/Key_stretching
David Reid2ad94ab2014-02-03 10:01:15 -0800658.. _`HKDF`:
David Reidb80deea2014-02-03 10:33:16 -0800659.. _`RFC 5869`: https://tools.ietf.org/html/rfc5869
660.. _`HKDF paper`: https://eprint.iacr.org/2010/264