docs: def sign(self, M, t=None, h=None, mgf=None, sLen=None):
          """
          Sign message 'M' using 't' signature scheme where 't' can be:
  
          - None: the message 'M' is directly applied the RSASP1 signature
                  primitive, as described in PKCS#1 v2.1, i.e. RFC 3447 Sect
                  5.2.1. Simply put, the message undergo a modular exponentiation
                  using the private key. Additionnal method parameters are just
                  ignored.
  
          - 'pkcs': the message 'M' is applied RSASSA-PKCS1-v1_5-SIGN signature
                  scheme as described in Sect. 8.2.1 of RFC 3447. In that context,
                  the hash function name is passed using 'h'. Possible values are
                  "md2", "md4", "md5", "sha1", "tls", "sha224", "sha256", "sha384"
                  and "sha512". If none is provided, sha1 is used. Other additionnal 
                  parameters are ignored.
  
          - 'pss' : the message 'M' is applied RSASSA-PSS-SIGN signature scheme as
                  described in Sect. 8.1.1. of RFC 3447. In that context,
  
                  o 'h' parameter provides the name of the hash method to use.
                     Possible values are "md2", "md4", "md5", "sha1", "tls", "sha224",
                     "sha256", "sha384" and "sha512". if none is provided, sha1
                     is used. 
  
                  o 'mgf' is the mask generation function. By default, mgf
                     is derived from the provided hash function using the
                     generic MGF1 (see pkcs_mgf1() for details).
  
                  o 'sLen' is the length in octet of the salt. You can overload the
                    default value (the octet length of the hash value for provided
                    algorithm) by providing another one with that parameter.
          """
  
          if t is None: # RSASP1
              M = pkcs_os2ip(M)
              n = self.modulus
              if M > n-1:
                  warning("Message to be signed is too long for key modulus")
                  return None
              s = self._rsasp1(M)
              if s is None:
                  return None
              return pkcs_i2osp(s, self.modulusLen/8)
          
          elif t == "pkcs": # RSASSA-PKCS1-v1_5-SIGN
              if h is None:
                  h = "sha1"
              return self._rsassa_pkcs1_v1_5_sign(M, h)
          
          elif t == "pss": # RSASSA-PSS-SIGN
              return self._rsassa_pss_sign(M, h, mgf, sLen)
  
          else:
              warning("Key.sign(): Unknown signature type (%s) provided" % t)
              return None