Ë
    íU.jÅ"  ã                   óZ   — g d ¢Z ddlmZ ddlmZmZmZ ddlmZ d„ Z	d„ Z
 G d„ de«      Zy	)
)ÚgenerateÚ	constructÚ
ElGamalKeyé    )ÚRandom)Úgenerate_probable_safe_primeÚtest_probable_primeÚ	COMPOSITE)ÚIntegerc                 óf  — t        «       }t        | |¬«      |_        |j                  dz
  dz	  }	 t        t	        j
                  d|j                  |¬«      d|j                  «      |_        |j                  dv rŒL|j                  dz
  |j                  z  dk(  rŒl|j                  j                  |j                  «      }|j                  dz
  |z  dk(  rŒ§	 t	        j
                  d|j                  dz
  |¬«      |_        t        |j                  |j                  |j                  «      |_	        |S )a  Randomly generate a fresh, new ElGamal key.

    The key will be safe for use for both encryption and signature
    (although it should be used for **only one** purpose).

    Args:
      bits (int):
        Key length, or size (in bits) of the modulus *p*.
        The recommended value is 2048.
      randfunc (callable):
        Random number generation function; it should accept
        a single integer *N* and return a string of random
        *N* random bytes.

    Return:
        an :class:`ElGamalKey` object
    )Ú
exact_bitsÚrandfuncé   é   ©Úmin_inclusiveÚmax_exclusiver   )r   r   r   )
r   r   ÚpÚpowr
   Úrandom_rangeÚgÚinverseÚxÚy)Úbitsr   ÚobjÚqÚginvs        úZC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\Crypto/PublicKey/ElGamal.pyr   r   "   s  € ô& 	‹€Cô )°DÀ8ÔL€C„EØ	�‰�‰�qÑ€Að ä”G×(Ñ(°qØ36·5±5Ø.6ô8à9:¸C¿E¹EóCˆŒð �5‰5�F‰?Øð �E‰E�A‰I˜Ÿ™Ñ !Ò#Øð
 �u‰u�}‰}˜SŸU™UÓ#ˆØ�E‰E�A‰I˜Ñ Ò"Øð 	ô × Ñ ¨qØ/2¯u©u°Q©wØ*2ô4€C„Eô �—‘�s—u‘u˜cŸe™eÓ$€C„EØ€Jó    c           	      ó&  — t        «       }t        | «      dvrt        d«      ‚t        t        | «      «      D ]*  }|j                  |   }t        ||t        | |   «      «       Œ, t        |j                  «      t        k(  }||j                  dk  xs |j                  |j                  k\  z  }|t        |j                  |j                  dz
  |j                  «      dk7  z  }||j                  dk  xs |j                  |j                  k\  z  }t        | «      dk(  rh||j                  dk  xs |j                  |j                  k\  z  }|t        |j                  |j                  |j                  «      |j                  k7  z  }|rt        d«      ‚|S )aÍ  Construct an ElGamal key from a tuple of valid ElGamal components.

    The modulus *p* must be a prime.
    The following conditions must apply:

    .. math::

        \begin{align}
        &1 < g < p-1 \\
        &g^{p-1} = 1 \text{ mod } 1 \\
        &1 < x < p-1 \\
        &g^x = y \text{ mod } p
        \end{align}

    Args:
      tup (tuple):
        A tuple with either 3 or 4 integers,
        in the following order:

        1. Modulus (*p*).
        2. Generator (*g*).
        3. Public key (*y*).
        4. Private key (*x*). Optional.

    Raises:
        ValueError: when the key being imported fails the most basic ElGamal validity checks.

    Returns:
        an :class:`ElGamalKey` object
    )é   é   z%argument for construct() wrong lengthr   r"   zInvalid ElGamal key components)r   ÚlenÚ
ValueErrorÚrangeÚ_keydataÚsetattrr
   r   r   r	   r   r   r   r   )Útupr   ÚiÚfieldÚ	fmt_errors        r   r   r   `   sD  € ô@ 	‹€CÜ
ˆ3ƒx�uÑÜÐ@ÓAÐAÜ”3�s“8Ž_ˆØ—‘˜Q‘ˆÜ��UœG C¨¡F›OÕ,ð ô $ C§E¡EÓ*¬iÑ7€IØ�—‘˜‘Ò)˜SŸU™U C§E¡E™\Ñ)€IØ”�S—U‘U˜CŸE™E !™G S§U¡UÓ+¨QÑ.Ñ.€IØ�—‘�q‘Ò(˜CŸE™E 3§5¡5™LÑ(€IÜ
ˆ3ƒx�‚{Ø�S—U‘U˜A‘XÒ- §¡¨¯©¡Ñ-ˆ	Ø”S˜Ÿ™ §¡ s§u¡uÓ-¨s¯u©uÑ4Ñ4ˆ	áÜÐ9Ó:Ð:à€Jr   c                   óŒ   — e Zd ZdZg d¢Zdd„Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r   aP  Class defining an ElGamal key.
    Do not instantiate directly.
    Use :func:`generate` or :func:`construct` instead.

    :ivar p: Modulus
    :vartype d: integer

    :ivar g: Generator
    :vartype e: integer

    :ivar y: Public key component
    :vartype y: integer

    :ivar x: Private key component
    :vartype x: integer
    )r   r   r   r   Nc                 óR   — |€t        j                  «       j                  }|| _        y ©N)r   ÚnewÚreadÚ	_randfunc)Úselfr   s     r   Ú__init__zElGamalKey.__init__³   s    € ØÐÜ—z‘z“|×(Ñ(ˆHØ!ˆ�r   c                 óÒ   — t        | j                  || j                  «      }t        | j                  || j                  «      |z  | j                  z  }t	        |«      t	        |«      gS r.   )r   r   r   r   Úint)r2   ÚMÚKÚaÚbs        r   Ú_encryptzElGamalKey._encrypt¸   sO   € Ü
ˆd�f‰f�a˜Ÿ™Ó
 ˆÜ�—‘˜˜4Ÿ6™6Ó" 1Ñ$¨¯©Ñ
/ˆÜ�A“œ˜A›ÐÐr   c                 ó  — t        | d«      st        d«      ‚t        j                  d| j                  dz
  | j
                  ¬«      }t        | j                  || j                  «      |d   z  | j                  z  }t        || j                  | j                  «      }|j                  | j                  «      |d   z  | j                  z  }|t        | j                  || j                  «      z  | j                  z  }t        |«      S )Nr   ú(Private key not available in this objectr   r   r   r   )ÚhasattrÚ	TypeErrorr
   r   r   r1   r   r   r   r   r   r5   )r2   r6   ÚrÚa_blindÚaxÚplaintext_blindÚ	plaintexts          r   Ú_decryptzElGamalKey._decrypt½   sÎ   € Ü˜˜cÔ"ÜÐFÓGÐGÜ× Ñ ¨qØ/3¯v©v°a©xØ*.¯.©.ô:ˆô �t—v‘v˜q $§&¡&Ó)¨A¨a©DÑ0°D·F±FÑ:ˆÜˆw˜Ÿ™ §¡Ó'ˆØŸ:™: d§f¡fÓ-°°!±Ñ4¸¿¹Ñ?ˆØ$¤s¨4¯6©6°1°d·f±fÓ'=Ñ=ÀÇÁÑGˆ	Ü�9‹~Ðr   c                 óš  — t        | d«      st        d«      ‚| j                  dz
  }t        |«      }|j	                  |«      dk7  rt        d«      ‚t        | j                  || j                  «      }t        |«      | j                  |z  z
  |z  }|dk  r||z   }|dk  rŒ||j                  |«      z  |z  }t        |«      t        |«      gS )Nr   r<   r   zBad K value: GCD(K,p-1)!=1r   )r=   r>   r   r
   Úgcdr$   r   r   r   r   r5   )r2   r6   r7   Úp1r8   Útr9   s          r   Ú_signzElGamalKey._signÉ   s¸   € Ü˜˜cÔ"ÜÐFÓGÐGØ�6‰6�!‰8ˆÜ�A‹JˆØ�E‰E�"‹I�qŠLÜÐ9Ó:Ð:Ü
ˆd�f‰f�a˜Ÿ™Ó
 ˆÜ�1‹:�d—f‘f˜Q‘hÑ "Ñ
$ˆØ�Šc�Q�r‘T�1ˆa�‹cØˆQ�Y‰Y�r‹]‰?˜bÑ
 ˆÜ�A“œ˜A›ÐÐr   c                 ój  — |D �cg c]  }t        |«      ‘Œ }}|d   dk  s|d   | j                  dz
  kD  ryt        | j                  |d   | j                  «      }|t        |d   |d   | j                  «      z  | j                  z  }t        | j                  || j                  «      }||k(  ryyc c}w )Nr   r   )r
   r   r   r   r   )r2   r6   Úsigr   Úv1Úv2s         r   Ú_verifyzElGamalKey._verifyÖ   s¤   € Ù#&Ó'¡3˜aŒw�q�z 3ˆÐ'Øˆq‰6�!Š8�s˜1‘v˜dŸf™f Q™h’ØÜˆt�v‰v�s˜1‘v˜tŸv™vÓ&ˆØŒs�3�q‘6˜3˜q™6 4§6¡6Ó*Ñ*¨d¯f©fÑ4ˆÜˆt�v‰v�q˜$Ÿ&™&Ó!ˆØˆrŠ6ØØùò (s   …B0c                 ó   — t        | d«      ryy)z&Whether this is an ElGamal private keyr   r   r   )r=   ©r2   s    r   Úhas_privatezElGamalKey.has_privateá   s   € ô �4˜ÔØàr   c                  ó   — y©NT© rP   s    r   Úcan_encryptzElGamalKey.can_encrypté   ó   € Ør   c                  ó   — yrS   rT   rP   s    r   Úcan_signzElGamalKey.can_signì   rV   r   c                 óZ   — t        | j                  | j                  | j                  f«      S )zfA matching ElGamal public key.

        Returns:
            a new :class:`ElGamalKey` object
        )r   r   r   r   rP   s    r   Ú	publickeyzElGamalKey.publickeyï   s"   € ô ˜$Ÿ&™& $§&¡&¨$¯&©&Ð1Ó2Ð2r   c                 óú   — t        | j                  «       «      t        |j                  «       «      k7  ryd}| j                  D ]5  }|xr/ t        | j                  |d «      t        |j                  |d «      k(  }Œ7 |S )NFT)ÚboolrQ   r&   ÚgetattrÚkey)r2   ÚotherÚresultÚcomps       r   Ú__eq__zElGamalKey.__eq__÷   ss   € Ü�× Ñ Ó"Ó#¤t¨E×,=Ñ,=Ó,?Ó'@Ò@ØàˆØ—M”MˆDØò A¤¨¯©°4¸Ó!>Ü!(¨¯©°D¸$Ó!?ñ"@‰Fð "ð ˆr   c                 ó&   — | j                  |«       S r.   )rb   )r2   r_   s     r   Ú__ne__zElGamalKey.__ne__  s   € Ø—;‘;˜uÓ%Ð%Ð%r   c                 ó   — ddl m} |‚)Nr   )ÚPicklingError)Úpicklerf   )r2   rf   s     r   Ú__getstate__zElGamalKey.__getstate__  s   € å(ØÐr   c                 ó   — t         ‚r.   ©ÚNotImplementedError)r2   r6   r7   s      r   ÚsignzElGamalKey.sign  ó   € Ü!Ð!r   c                 ó   — t         ‚r.   rj   )r2   r6   Ú	signatures      r   ÚverifyzElGamalKey.verify  rm   r   c                 ó   — t         ‚r.   rj   )r2   rC   r7   s      r   ÚencryptzElGamalKey.encrypt  rm   r   c                 ó   — t         ‚r.   rj   )r2   Ú
ciphertexts     r   ÚdecryptzElGamalKey.decrypt  rm   r   c                 ó   — t         ‚r.   rj   ©r2   r6   ÚBs      r   ÚblindzElGamalKey.blind  rm   r   c                 ó   — t         ‚r.   rj   rw   s      r   ÚunblindzElGamalKey.unblind  rm   r   c                 ó   — t         ‚r.   rj   rP   s    r   ÚsizezElGamalKey.size  rm   r   r.   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r&   r3   r:   rD   rI   rN   rQ   rU   rX   rZ   rb   rd   rh   rl   rp   rr   ru   ry   r{   r}   rT   r   r   r   r   ”   sm   „ ñò8 "€Hó"ò
 ò

ò ò	òòòò3òò&òò"ò"ò"ò"ò"ò"ó"r   r   N)Ú__all__ÚCryptor   ÚCrypto.Math.Primalityr   r   r	   ÚCrypto.Math.Numbersr
   r   r   Úobjectr   rT   r   r   Ú<module>r‡      s8   ðò4 2€å ÷Eñ Eå 'ò<ò|2ôhJ"�õ J"r   