.. _rsa_pss:

PKCS#1 PSS (RSA)
================

A probabilistic digital signature scheme based on RSA.

It is more formally called ``RSASSA-PSS``
in `Section 8.1 of RFC8017`__.

The following example shows how the sender can use its own *private* key
(loaded from a file) to create the signature of a message::

    >>> from Crypto.Signature import pss
    >>> from Crypto.Hash import SHA256
    >>> from Crypto.PublicKey import RSA
    >>>
    >>> message = b'To be signed'
    >>> key = RSA.import_key(open('privkey.der', 'rb').read())
    >>> h = SHA256.new(message)
    >>> signature = pss.new(key).sign(h)

At the receiver side, the matching *public* RSA key is used to verify
authenticity of the incoming message::

    >>> key = RSA.import_key(open('pubkey.der', 'rb').read())
    >>> h = SHA256.new(message)
    >>> verifier = pss.new(key)
    >>> try:
    >>>     verifier.verify(h, signature)
    >>>     print("The signature is authentic.")
    >>> except (ValueError):
    >>>     print("The signature is not authentic.")

.. __: https://tools.ietf.org/html/rfc8017#section-8.1

.. automodule:: Crypto.Signature.pss
    :members:
