
    ÿig"                     b    d dl Zd dl mZmZmZ d dlmZmZmZm	Z	  G d d          Z
d	dZd ZdS )
    N)ceil_divbytes_to_longlong_to_bytes)DerSequenceDerNullDerOctetStringDerObjectIdc                   *    e Zd ZdZd Zd Zd Zd ZdS )PKCS115_SigSchemezA signature object for ``RSASSA-PKCS1-v1_5``.
    Do not instantiate directly.
    Use :func:`Cryptodome.Signature.pkcs1_15.new`.
    c                     || _         dS )a  Initialize this PKCS#1 v1.5 signature scheme object.

        :Parameters:
          rsa_key : an RSA key object
            Creation of signatures is only possible if this is a *private*
            RSA key. Verification of signatures is always possible.
        N)_key)selfrsa_keys     Y/var/www/html/afkarena/venv/lib/python3.11/site-packages/Cryptodome/Signature/pkcs1_15.py__init__zPKCS115_SigScheme.__init__)   s     			    c                 4    | j                                         S )z<Return ``True`` if this object can be used to sign messages.)r   has_private)r   s    r   can_signzPKCS115_SigScheme.can_sign3   s    y$$&&&r   c                 ~   t           j        j                            | j        j                  }t          |d          }t          ||          }t          |          }| j        	                    |          }|t          t          |          | j        j        | j        j                  k    rt          d          |S )a  Create the PKCS#1 v1.5 signature of a message.

        This function is also called ``RSASSA-PKCS1-V1_5-SIGN`` and
        it is specified in
        `section 8.2.1 of RFC8017 <https://tools.ietf.org/html/rfc8017#page-36>`_.

        :parameter msg_hash:
            This is an object from the :mod:`Cryptodome.Hash` package.
            It has been used to digest the message to sign.
        :type msg_hash: hash object

        :return: the signature encoded as a *byte string*.
        :raise ValueError: if the RSA key is not long enough for the given hash algorithm.
        :raise TypeError: if the RSA key has no private half.
           z+Fault detected in RSA private key operation)
CryptodomeUtilnumbersizer   nr   _EMSA_PKCS1_V1_5_ENCODEr   _decrypt_to_bytespowe
ValueError)r   msg_hashmodBitskemem_int	signatures          r   signzPKCS115_SigScheme.sign7   s    $ /(--dik::WQ %Xq11r""I//77	Sy1149;	LLLLJKKKr   c                 h   t           j        j                            | j        j                  }t          |d          }t          |          |k    rt          d          t          |          }| j        
                    |          }t          ||          }	 t          ||d          g}	 |j                            d          }	n# t          $ r d}	Y nw xY w|	s$|                    t          ||d                     n# t          $ r t          d          w xY w||vrt          d          dS )a|  Check if the  PKCS#1 v1.5 signature over a message is valid.

        This function is also called ``RSASSA-PKCS1-V1_5-VERIFY`` and
        it is specified in
        `section 8.2.2 of RFC8037 <https://tools.ietf.org/html/rfc8017#page-37>`_.

        :parameter msg_hash:
            The hash that was carried out over the message. This is an object
            belonging to the :mod:`Cryptodome.Hash` module.
        :type parameter: hash object

        :parameter signature:
            The signature that needs to be validated.
        :type signature: byte string

        :raise ValueError: if the signature is not valid.
        r   zInvalid signatureTz1.2.840.113549.2.FN)r   r   r   r   r   r   r   lenr!   r   _encryptr   r   oid
startswithAttributeErrorappend)
r   r"   r'   r#   r$   signature_intr&   em1possible_em1algorithm_is_mds
             r   verifyzPKCS115_SigScheme.verifyW   sR   ( /(--dik::Wa   y>>Q0111%i00##M22FA&&	24Xq$GGIL("*,"9"9:M"N"N! ( ( ("'(" Q##$;Ha$O$OPPP 	2 	2 	20111	2 l""0111s0   D .C	 D 	CD C)D DN)__name__
__module____qualname____doc__r   r   r(   r4    r   r   r   r   #   s[         
  ' ' '  @4 4 4 4 4r   r   Tc                 T   t          t          | j                                                  g          }|r3|                    t                                                                 t          |                                           }t          |                                |                                g                                          }|t          |          dz   k     rt          dt          |          z            d|t          |          z
  dz
  z  }d|z   dz   |z   S )a  
    Implement the ``EMSA-PKCS1-V1_5-ENCODE`` function, as defined
    in PKCS#1 v2.1 (RFC3447, 9.2).

    ``_EMSA-PKCS1-V1_5-ENCODE`` actually accepts the message ``M`` as input,
    and hash it internally. Here, we expect that the message has already
    been hashed instead.

    :Parameters:
     msg_hash : hash object
            The hash object that holds the digest of the message being signed.
     emLen : int
            The length the final encoding must have, in bytes.
     with_hash_parameters : bool
            If True (default), include NULL parameters for the hash
            algorithm in the ``digestAlgorithm`` SEQUENCE.

    :attention: the early standard (RFC2313) stated that ``DigestInfo``
        had to be BER-encoded. This means that old signatures
        might have length tags in indefinite form, which
        is not supported in DER. Such encoding cannot be
        reproduced by this function.

    :Return: An ``emLen`` byte long string that encodes the hash.
       z3DigestInfo is too long for this RSA key (%d bytes).      s        )
r   r	   r,   encoder/   r   r   digestr*   	TypeError)r"   emLenwith_hash_parameters
digestAlgor@   
digestInfoPSs          r   r   r      s   d {8<88??AACDDJ .'))**,,--- !2!233F%%''MMOO   vxx  S__RMPST^P_P__```	EC
OO+a/	0Bg%
22r   c                      t          |           S )a  Create a signature object for creating
    or verifying PKCS#1 v1.5 signatures.

    :parameter rsa_key:
      The RSA key to use for signing or verifying the message.
      This is a :class:`Cryptodome.PublicKey.RSA` object.
      Signing is only possible when ``rsa_key`` is a **private** RSA key.
    :type rsa_key: RSA object

    :return: a :class:`PKCS115_SigScheme` signature object
    )r   )r   s    r   newrH      s     W%%%r   )T)Cryptodome.Util.numberr   r   r   r   Cryptodome.Util.asn1r   r   r   r	   r   r   rH   r9   r   r   <module>rK      s   >     I I I I I I I I I I R R R R R R R R R R R Rh h h h h h h hVB3 B3 B3 B3H& & & & &r   