| .. hazmat:: |
| |
| Constant time functions |
| ======================= |
| |
| .. currentmodule:: cryptography.hazmat.primitives.constant_time |
| |
| This module contains functions for operating with secret data in a way that |
| does not leak information about that data through how long it takes to perform |
| the operation. These functions should be used whenever operating on secret data |
| along with data that is user supplied. |
| |
| An example would be comparing a HMAC signature received from a client to the |
| one generated by the server code for authentication purposes. |
| |
| For more information about this sort of issue, see `Coda Hale's blog post`_ |
| about the timing attacks on KeyCzar and Java's ``MessageDigest.isEqual()``. |
| |
| |
| .. function:: bytes_eq(a, b) |
| |
| Compares ``a`` and ``b`` with one another. If ``a`` and ``b`` have |
| different lengths, this returns ``False`` immediately. Otherwise it |
| compares them in a way that takes the same amount of time, regardless of |
| how many characters are the same between the two. |
| |
| .. doctest:: |
| |
| >>> from cryptography.hazmat.primitives import constant_time |
| >>> constant_time.bytes_eq(b"foo", b"foo") |
| True |
| >>> constant_time.bytes_eq(b"foo", b"bar") |
| False |
| |
| :param bytes a: The left-hand side. |
| :param bytes b: The right-hand side. |
| :returns bool: ``True`` if ``a`` has the same bytes as ``b``, otherwise |
| ``False``. |
| :raises TypeError: This exception is raised if ``a`` or ``b`` is not |
| ``bytes``. |
| |
| |
| .. _`Coda Hale's blog post`: https://codahale.com/a-lesson-in-timing-attacks/ |