Sign data using the Montgomery private key stored by this XEdDSA instance.

        :param data: A bytes-like object containing the data to sign.
        :param nonce: A bytes-like object with length 64 or None.
        :returns: A bytes-like object encoding the signature with length SIGNATURE_SIZE.

        If the nonce parameter is None, a new nonce is generated and used.

        :raises MissingKeyException: If the Montgomery private key is not available.

def sign(self, data, nonce = None):
        """
        Sign data using the Montgomery private key stored by this XEdDSA instance.

        :param data: A bytes-like object containing the data to sign.
        :param nonce: A bytes-like object with length 64 or None.
        :returns: A bytes-like object encoding the signature with length SIGNATURE_SIZE.

        If the nonce parameter is None, a new nonce is generated and used.

        :raises MissingKeyException: If the Montgomery private key is not available.
        """

        cls = self.__class__

        if not self.__mont_priv:
            raise MissingKeyException(
                "Cannot sign using this XEdDSA instance, Montgomery private key missing."
            )

        if not isinstance(data, bytes):
            raise TypeError("The data parameter must be a bytes-like object.")

        if nonce == None:
            nonce = os.urandom(64)

        if not isinstance(nonce, bytes):
            raise TypeError("Wrong type passed for the nonce parameter.")

        if len(nonce) != 64:
            raise ValueError("Invalid value passed for the nonce parameter.")

        ed_priv, ed_pub = cls._mont_priv_to_ed_pair(bytearray(self.__mont_priv))

        return bytes(cls._sign(
            bytearray(data),
            bytearray(nonce),
            ed_priv,
            ed_pub
        ))