
    5i!                     Z    / S Qr SSKJr  SSKJrJrJr  SSKJr  S r	S r
 " S S\5      rg	)
)generate	construct
ElGamalKey    )Random)generate_probable_safe_primetest_probable_prime	COMPOSITE)Integerc                 d   [        5       n[        XS9Ul        UR                  S-
  S-	  n [        [        R
                  " SUR                  US9SUR                  5      Ul        UR                  S;   a  MM  UR                  S-
  UR                  -  S:X  a  Mo  UR                  R                  UR                  5      nUR                  S-
  U-  S:X  a  M   [        R
                  " SUR                  S-
  US9Ul        [        UR                  UR                  UR                  5      Ul	        U$ )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        f/var/www/html/BTCUSD/btcusdt_trading_app/venv/lib/python3.13/site-packages/Crypto/PublicKey/ElGamal.pyr   r   "   s	   & 	C )DLCE	qA G((q3655.689:CEEC 55F? EEAI!#
 uu}}SUU#EEAI" 	   q/2uuQw*24CE suucee$CEJ    c           	      N   [        5       n[        U 5      S;  a  [        S5      e[        [        U 5      5       H)  nUR                  U   n[        X[        X   5      5        M+     [        UR                  5      [        :H  nXAR                  S:*  =(       d    UR                  UR                  :  -  nU[        UR                  UR                  S-
  UR                  5      S:g  -  nXAR                  S:  =(       d    UR                  UR                  :  -  n[        U 5      S:X  al  XAR                  S:*  =(       d    UR                  UR                  :  -  nU[        UR                  UR                  UR                  5      UR                  :g  -  nU(       a  [        S5      eU$ )au  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   `   s:   @ 	C
3xu@AA3s8_QGCFO,  $CEE*i7I)SUUCEE\)ISUUCEE!GSUU+Q..Iq(CEE355L(I
3x{UUAX--	Ssuu-suu44	9::Jr   c                       \ rS rSrSr/ SQrSS jrS rS rS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)r      a$  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                 T    Uc  [         R                  " 5       R                  nXl        g N)r   newread	_randfunc)selfr   s     r   __init__ElGamalKey.__init__   s    zz|((H!r   c                     [        U R                  X R                  5      n[        U R                  X R                  5      U-  U R                  -  n[	        U5      [	        U5      /$ r/   )r   r   r   r   int)r3   MKabs        r   _encryptElGamalKey._encrypt   sK    
dffa
 66"1$
/AAr   c                    [        U S5      (       d  [        S5      e[        R                  " SU R                  S-
  U R
                  S9n[        U R                  X R                  5      US   -  U R                  -  n[        X0R                  U R                  5      nUR                  U R                  5      US   -  U R                  -  nU[        U R                  X R                  5      -  U R                  -  n[        U5      $ )Nr   (Private key not available in this objectr   r   r   r   )hasattr	TypeErrorr
   r   r   r2   r   r   r   r   r   r7   )r3   r8   ra_blindaxplaintext_blind	plaintexts          r   _decryptElGamalKey._decrypt   s    c""FGG  q/3vvax*...: tvvq&&)AaD0DFF:w'::dff-!4?$s4661ff'==G	9~r   c                    [        U S5      (       d  [        S5      eU R                  S-
  n[        U5      nUR	                  U5      S:w  a  [        S5      e[        U R                  X R                  5      n[        U5      U R                  U-  -
  U-  nUS:  a  XS-   oUS:  a  M  XRR                  U5      -  U-  n[        U5      [        U5      /$ )Nr   r?   r   zBad K value: GCD(K,p-1)!=1r   )r@   rA   r   r
   gcdr$   r   r   r   r   r7   )r3   r8   r9   p1r:   tr;   s          r   _signElGamalKey._sign   s    c""FGG66!8AJEE"IqL9::
dffa
 1:dffQh"
$cQT1cYYr]?b
 AAr   c                 r   U Vs/ s H  n[        U5      PM     nnUS   S:  d  US   U R                  S-
  :  a  g[        U R                  US   U R                  5      nU[        US   US   U R                  5      -  U R                  -  n[        U R                  XR                  5      nXE:X  a  ggs  snf )Nr   r   )r
   r   r   r   r   )r3   r8   sigr   v1v2s         r   _verifyElGamalKey._verify   s    #&'3awqz3'q6!8s1vdffQhtvvs1vtvv&s3q63q6466**dff4tvvq&&!6 (s   B4c                 (    [        U S5      (       a  gg)z&Whether this is an ElGamal private keyr   r   r   )r@   r3   s    r   has_privateElGamalKey.has_private   s     4r   c                     gNT rV   s    r   can_encryptElGamalKey.can_encrypt       r   c                     grZ   r[   rV   s    r   can_signElGamalKey.can_sign   r^   r   c                 Z    [        U R                  U R                  U R                  45      $ )zNA matching ElGamal public key.

Returns:
    a new :class:`ElGamalKey` object
)r   r   r   r   rV   s    r   	publickeyElGamalKey.publickey   s"     $&&$&&$&&122r   c                 
   [        U R                  5       5      [        UR                  5       5      :w  a  gSnU R                   H;  nU=(       a/    [        U R                  US 5      [        UR                  US 5      :H  nM=     U$ )NFT)boolrW   r&   getattrkey)r3   otherresultcomps       r   __eq__ElGamalKey.__eq__   ss      "#tE,=,=,?'@@MMD A4!>!(D$!?"@F " r   c                 .    U R                  U5      (       + $ r/   )rl   )r3   ri   s     r   __ne__ElGamalKey.__ne__  s    ;;u%%%r   c                     SSK Jn  Ue)Nr   )PicklingError)picklerr   )r3   rr   s     r   __getstate__ElGamalKey.__getstate__  s    (r   c                     [         er/   NotImplementedError)r3   r8   r9   s      r   signElGamalKey.sign      !!r   c                     [         er/   rw   )r3   r8   	signatures      r   verifyElGamalKey.verify  r{   r   c                     [         er/   rw   )r3   rF   r9   s      r   encryptElGamalKey.encrypt  r{   r   c                     [         er/   rw   )r3   
ciphertexts     r   decryptElGamalKey.decrypt  r{   r   c                     [         er/   rw   r3   r8   Bs      r   blindElGamalKey.blind  r{   r   c                     [         er/   rw   r   s      r   unblindElGamalKey.unblind  r{   r   c                     [         er/   rw   rV   s    r   sizeElGamalKey.size  r{   r   )r2   r/   )__name__
__module____qualname____firstlineno____doc__r&   r4   r<   rG   rM   rS   rW   r\   r`   rc   rl   ro   rt   ry   r~   r   r   r   r   r   __static_attributes__r[   r   r   r   r      sm    8 "H"
 

 	3&"""""""r   r   N)__all__Cryptor   Crypto.Math.Primalityr   r   r	   Crypto.Math.Numbersr
   r   r   objectr   r[   r   r   <module>r      s8   4 2 E E '<|2hJ" J"r   