You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
448 lines
14 KiB
448 lines
14 KiB
.. hazmat::
|
|
|
|
DSA
|
|
===
|
|
|
|
.. module:: cryptography.hazmat.primitives.asymmetric.dsa
|
|
|
|
`DSA`_ is a `public-key`_ algorithm for signing messages.
|
|
|
|
Generation
|
|
~~~~~~~~~~
|
|
|
|
.. function:: generate_private_key(key_size, backend)
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
Generate a DSA private key from the given key size. This function will
|
|
generate a new set of parameters and key in one step.
|
|
|
|
:param int key_size: The length of the modulus in :term:`bits`. It should
|
|
be either 1024, 2048 or 3072. For keys generated in 2015 this should
|
|
be `at least 2048`_ (See page 41). Note that some applications
|
|
(such as SSH) have not yet gained support for larger key sizes
|
|
specified in FIPS 186-3 and are still restricted to only the
|
|
1024-bit keys specified in FIPS 186-2.
|
|
|
|
:param backend: An instance of
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`.
|
|
|
|
:return: An instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey`.
|
|
|
|
:raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if
|
|
the provided ``backend`` does not implement
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`
|
|
|
|
.. function:: generate_parameters(key_size, backend)
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
Generate DSA parameters using the provided ``backend``.
|
|
|
|
:param int key_size: The length of :attr:`~DSAParameterNumbers.q`. It
|
|
should be either 1024, 2048 or 3072. For keys generated in 2015 this
|
|
should be `at least 2048`_ (See page 41). Note that some applications
|
|
(such as SSH) have not yet gained support for larger key sizes
|
|
specified in FIPS 186-3 and are still restricted to only the
|
|
1024-bit keys specified in FIPS 186-2.
|
|
|
|
:param backend: An instance of
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`.
|
|
|
|
:return: An instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameters`.
|
|
|
|
:raises cryptography.exceptions.UnsupportedAlgorithm: This is raised if
|
|
the provided ``backend`` does not implement
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`
|
|
|
|
Signing
|
|
~~~~~~~
|
|
|
|
Using a :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey`
|
|
instance.
|
|
|
|
.. doctest::
|
|
|
|
>>> from cryptography.hazmat.backends import default_backend
|
|
>>> from cryptography.hazmat.primitives import hashes
|
|
>>> from cryptography.hazmat.primitives.asymmetric import dsa
|
|
>>> private_key = dsa.generate_private_key(
|
|
... key_size=1024,
|
|
... backend=default_backend()
|
|
... )
|
|
>>> data = b"this is some data I'd like to sign"
|
|
>>> signature = private_key.sign(
|
|
... data,
|
|
... hashes.SHA256()
|
|
... )
|
|
|
|
The ``signature`` is a ``bytes`` object, whose contents is DER encoded as
|
|
described in :rfc:`3279`. This can be decoded using
|
|
:func:`~cryptography.hazmat.primitives.asymmetric.utils.decode_dss_signature`.
|
|
|
|
If your data is too large to be passed in a single call, you can hash it
|
|
separately and pass that value using
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`.
|
|
|
|
.. doctest::
|
|
|
|
>>> from cryptography.hazmat.primitives.asymmetric import utils
|
|
>>> chosen_hash = hashes.SHA256()
|
|
>>> hasher = hashes.Hash(chosen_hash, default_backend())
|
|
>>> hasher.update(b"data & ")
|
|
>>> hasher.update(b"more data")
|
|
>>> digest = hasher.finalize()
|
|
>>> sig = private_key.sign(
|
|
... digest,
|
|
... utils.Prehashed(chosen_hash)
|
|
... )
|
|
|
|
Verification
|
|
~~~~~~~~~~~~
|
|
|
|
Verification is performed using a
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicKey` instance.
|
|
You can get a public key object with
|
|
:func:`~cryptography.hazmat.primitives.serialization.load_pem_public_key`,
|
|
:func:`~cryptography.hazmat.primitives.serialization.load_der_public_key`,
|
|
:meth:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicNumbers.public_key`
|
|
, or
|
|
:meth:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey.public_key`.
|
|
|
|
.. doctest::
|
|
|
|
>>> public_key = private_key.public_key()
|
|
>>> public_key.verify(
|
|
... signature,
|
|
... data,
|
|
... hashes.SHA256()
|
|
... )
|
|
|
|
``verify()`` takes the signature in the same format as is returned by
|
|
``sign()``.
|
|
|
|
``verify()`` will raise an :class:`~cryptography.exceptions.InvalidSignature`
|
|
exception if the signature isn't valid.
|
|
|
|
If your data is too large to be passed in a single call, you can hash it
|
|
separately and pass that value using
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`.
|
|
|
|
.. doctest::
|
|
|
|
>>> chosen_hash = hashes.SHA256()
|
|
>>> hasher = hashes.Hash(chosen_hash, default_backend())
|
|
>>> hasher.update(b"data & ")
|
|
>>> hasher.update(b"more data")
|
|
>>> digest = hasher.finalize()
|
|
>>> public_key.verify(
|
|
... sig,
|
|
... digest,
|
|
... utils.Prehashed(chosen_hash)
|
|
... )
|
|
|
|
Numbers
|
|
~~~~~~~
|
|
|
|
.. class:: DSAParameterNumbers(p, q, g)
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
The collection of integers that make up a set of DSA parameters.
|
|
|
|
.. attribute:: p
|
|
|
|
:type: int
|
|
|
|
The public modulus.
|
|
|
|
.. attribute:: q
|
|
|
|
:type: int
|
|
|
|
The sub-group order.
|
|
|
|
.. attribute:: g
|
|
|
|
:type: int
|
|
|
|
The generator.
|
|
|
|
.. method:: parameters(backend)
|
|
|
|
:param backend: An instance of
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`.
|
|
|
|
:returns: A new instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameters`.
|
|
|
|
.. class:: DSAPublicNumbers(y, parameter_numbers)
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
The collection of integers that make up a DSA public key.
|
|
|
|
.. attribute:: y
|
|
|
|
:type: int
|
|
|
|
The public value ``y``.
|
|
|
|
.. attribute:: parameter_numbers
|
|
|
|
:type: :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameterNumbers`
|
|
|
|
The :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameterNumbers`
|
|
associated with the public key.
|
|
|
|
.. method:: public_key(backend)
|
|
|
|
:param backend: An instance of
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`.
|
|
|
|
:returns: A new instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicKey`.
|
|
|
|
.. class:: DSAPrivateNumbers(x, public_numbers)
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
The collection of integers that make up a DSA private key.
|
|
|
|
.. warning::
|
|
|
|
Revealing the value of ``x`` will compromise the security of any
|
|
cryptographic operations performed.
|
|
|
|
.. attribute:: x
|
|
|
|
:type: int
|
|
|
|
The private value ``x``.
|
|
|
|
.. attribute:: public_numbers
|
|
|
|
:type: :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicNumbers`
|
|
|
|
The :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicNumbers`
|
|
associated with the private key.
|
|
|
|
.. method:: private_key(backend)
|
|
|
|
:param backend: An instance of
|
|
:class:`~cryptography.hazmat.backends.interfaces.DSABackend`.
|
|
|
|
:returns: A new instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey`.
|
|
|
|
Key interfaces
|
|
~~~~~~~~~~~~~~
|
|
|
|
.. class:: DSAParameters
|
|
|
|
.. versionadded:: 0.3
|
|
|
|
`DSA`_ parameters.
|
|
|
|
.. method:: generate_private_key()
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
Generate a DSA private key. This method can be used to generate many
|
|
new private keys from a single set of parameters.
|
|
|
|
:return: An instance of
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateKey`.
|
|
|
|
|
|
.. class:: DSAParametersWithNumbers
|
|
|
|
.. versionadded:: 0.5
|
|
|
|
Extends :class:`DSAParameters`.
|
|
|
|
.. method:: parameter_numbers()
|
|
|
|
Create a
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameterNumbers`
|
|
object.
|
|
|
|
:returns: A
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameterNumbers`
|
|
instance.
|
|
|
|
|
|
.. class:: DSAPrivateKey
|
|
|
|
.. versionadded:: 0.3
|
|
|
|
A `DSA`_ private key. A DSA private key that is not an
|
|
:term:`opaque key` also implements :class:`DSAPrivateKeyWithSerialization`
|
|
to provide serialization methods.
|
|
|
|
.. method:: public_key()
|
|
|
|
:return: :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicKey`
|
|
|
|
An DSA public key object corresponding to the values of the private key.
|
|
|
|
.. method:: parameters()
|
|
|
|
:return: :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameters`
|
|
|
|
The DSAParameters object associated with this private key.
|
|
|
|
.. attribute:: key_size
|
|
|
|
:type: int
|
|
|
|
The bit length of :attr:`~DSAParameterNumbers.q`.
|
|
|
|
.. method:: sign(data, algorithm)
|
|
|
|
.. versionadded:: 1.5
|
|
.. versionchanged:: 1.6
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`
|
|
can now be used as an ``algorithm``.
|
|
|
|
Sign one block of data which can be verified later by others using the
|
|
public key.
|
|
|
|
:param bytes data: The message string to sign.
|
|
|
|
:param algorithm: An instance of
|
|
:class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm` or
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`
|
|
if the ``data`` you want to sign has already been hashed.
|
|
|
|
:return bytes: Signature.
|
|
|
|
|
|
.. class:: DSAPrivateKeyWithSerialization
|
|
|
|
.. versionadded:: 0.8
|
|
|
|
This interface contains additional methods relating to serialization.
|
|
Any object with this interface also has all the methods from
|
|
:class:`DSAPrivateKey`.
|
|
|
|
.. method:: private_numbers()
|
|
|
|
Create a
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateNumbers`
|
|
object.
|
|
|
|
:returns: A
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPrivateNumbers`
|
|
instance.
|
|
|
|
.. method:: private_bytes(encoding, format, encryption_algorithm)
|
|
|
|
Allows serialization of the key to bytes. Encoding (
|
|
:attr:`~cryptography.hazmat.primitives.serialization.Encoding.PEM` or
|
|
:attr:`~cryptography.hazmat.primitives.serialization.Encoding.DER`),
|
|
format (
|
|
:attr:`~cryptography.hazmat.primitives.serialization.PrivateFormat.TraditionalOpenSSL`
|
|
or
|
|
:attr:`~cryptography.hazmat.primitives.serialization.PrivateFormat.PKCS8`)
|
|
and encryption algorithm (such as
|
|
:class:`~cryptography.hazmat.primitives.serialization.BestAvailableEncryption`
|
|
or :class:`~cryptography.hazmat.primitives.serialization.NoEncryption`)
|
|
are chosen to define the exact serialization.
|
|
|
|
:param encoding: A value from the
|
|
:class:`~cryptography.hazmat.primitives.serialization.Encoding` enum.
|
|
|
|
:param format: A value from the
|
|
:class:`~cryptography.hazmat.primitives.serialization.PrivateFormat`
|
|
enum.
|
|
|
|
:param encryption_algorithm: An instance of an object conforming to the
|
|
:class:`~cryptography.hazmat.primitives.serialization.KeySerializationEncryption`
|
|
interface.
|
|
|
|
:return bytes: Serialized key.
|
|
|
|
|
|
.. class:: DSAPublicKey
|
|
|
|
.. versionadded:: 0.3
|
|
|
|
A `DSA`_ public key.
|
|
|
|
.. attribute:: key_size
|
|
|
|
:type: int
|
|
|
|
The bit length of :attr:`~DSAParameterNumbers.q`.
|
|
|
|
.. method:: parameters()
|
|
|
|
:return: :class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAParameters`
|
|
|
|
The DSAParameters object associated with this public key.
|
|
|
|
.. method:: public_numbers()
|
|
|
|
Create a
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicNumbers`
|
|
object.
|
|
|
|
:returns: A
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.dsa.DSAPublicNumbers`
|
|
instance.
|
|
|
|
.. method:: public_bytes(encoding, format)
|
|
|
|
Allows serialization of the key to bytes. Encoding (
|
|
:attr:`~cryptography.hazmat.primitives.serialization.Encoding.PEM` or
|
|
:attr:`~cryptography.hazmat.primitives.serialization.Encoding.DER`) and
|
|
format (
|
|
:attr:`~cryptography.hazmat.primitives.serialization.PublicFormat.SubjectPublicKeyInfo`)
|
|
are chosen to define the exact serialization.
|
|
|
|
:param encoding: A value from the
|
|
:class:`~cryptography.hazmat.primitives.serialization.Encoding` enum.
|
|
|
|
:param format: A value from the
|
|
:class:`~cryptography.hazmat.primitives.serialization.PublicFormat` enum.
|
|
|
|
:return bytes: Serialized key.
|
|
|
|
.. method:: verify(signature, data, algorithm)
|
|
|
|
.. versionadded:: 1.5
|
|
.. versionchanged:: 1.6
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`
|
|
can now be used as an ``algorithm``.
|
|
|
|
Verify one block of data was signed by the private key
|
|
associated with this public key.
|
|
|
|
:param bytes signature: The signature to verify.
|
|
|
|
:param bytes data: The message string that was signed.
|
|
|
|
:param algorithm: An instance of
|
|
:class:`~cryptography.hazmat.primitives.hashes.HashAlgorithm` or
|
|
:class:`~cryptography.hazmat.primitives.asymmetric.utils.Prehashed`
|
|
if the ``data`` you want to sign has already been hashed.
|
|
|
|
:raises cryptography.exceptions.InvalidSignature: If the signature does
|
|
not validate.
|
|
|
|
|
|
.. class:: DSAPublicKeyWithSerialization
|
|
|
|
.. versionadded:: 0.8
|
|
|
|
Alias for :class:`DSAPublicKey`.
|
|
|
|
|
|
.. _`DSA`: https://en.wikipedia.org/wiki/Digital_Signature_Algorithm
|
|
.. _`public-key`: https://en.wikipedia.org/wiki/Public-key_cryptography
|
|
.. _`FIPS 186-4`: https://csrc.nist.gov/publications/detail/fips/186/4/final
|
|
.. _`at least 2048`: https://www.cosic.esat.kuleuven.be/ecrypt/ecrypt2/documents/D.SPA.20.pdf
|