+
    '(j!                     \    . R	Ot ^ RIHt ^ RIHtHtHt ^ RIHt R t	R t
 ! R R]4      tR# )
generate
ElGamalKey)Random)generate_probable_safe_primetest_probable_prime	COMPOSITE)Integerc                   \        4       p\        WR7      Vn        VP                  ^,
          ^,	          p \        \        P
                  ! ^VP                  VR7      ^VP                  4      Vn        VP                  R9   d   KQ  VP                  ^,
          VP                  ,          ^ 8X  d   K|  VP                  P                  VP                  4      pVP                  ^,
          V,          ^ 8X  d   K   \        P
                  ! ^TP                  ^,
          TR7      Tn        \        TP                  TP                  TP                  4      Tn	        T# )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   ppowr   random_rangeginversexy)bitsr   objqginvs   &&   M/home/ubuntu/cf-venv/lib/python3.14/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           	        \        4       p\        V 4      R9  d   \        R4      h\        \        V 4      4       F1  pVP                  V,          p\        W\        W,          4      4       K3  	  \        VP                  4      \        8H  pYAP                  ^8*  ;'       g    VP                  VP                  8  ,          pV\        VP                  VP                  ^,
          VP                  4      ^8g  ,          pYAP                  ^8  ;'       g    VP                  VP                  8  ,          p\        V 4      ^8X  dv   YAP                  ^8*  ;'       g    VP                  VP                  8  ,          pV\        VP                  VP                  VP                  4      VP                  8g  ,          pV'       d   \        R4      hV# )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 lengthzInvalid ElGamal key components)      )r   len
ValueErrorrange_keydatasetattrr   r   r   r   r   r   r   r   )tupr   ifield	fmt_errors   &    r   	constructr*   `   sC   @ 	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                      a  ] tR t^t o Rt. ROtRR ltR tR tR t	R t
R tR	 tR
 tR tR tR tR tR tR tR tR tR tR tR tRtV tR# )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
Nc                X    Vf    \         P                  ! 4       P                  pWn        R # N)r   newread	_randfunc)selfr   s   &&r   __init__ElGamalKey.__init__   s    zz|((H!r   c                    \        V P                  W P                  4      p\        V P                  W P                  4      V,          V P                  ,          p\	        V4      \	        V4      .# r-   )r   r   r   r   int)r1   MKabs   &&&  r   _encryptElGamalKey._encrypt   sK    
dffa
 66"1$
/AAr   c                \   \        V R 4      '       g   \        R4      h\        P                  ! ^V P                  ^,
          V P
                  R7      p\        V P                  W P                  4      V^ ,          ,          V P                  ,          p\        W0P                  V P                  4      pVP                  V P                  4      V^,          ,          V P                  ,          pV\        V P                  W P                  4      ,          V P                  ,          p\        V4      # )r   (Private key not available in this objectr   )hasattr	TypeErrorr   r   r   r0   r   r   r   r   r   r5   )r1   r6   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                   \        V R 4      '       g   \        R4      hV P                  ^,
          p\        V4      pVP	                  V4      ^8w  d   \        R4      h\        V P                  W P                  4      p\        V4      V P                  V,          ,
          V,          pV^ 8  d   WS,           pK  WRP                  V4      ,          V,          p\        V4      \        V4      .# )r   r=   zBad K value: GCD(K,p-1)!=1)r>   r?   r   r   gcdr"   r   r   r   r   r5   )r1   r6   r7   p1r8   tr9   s   &&&    r   _signElGamalKey._sign   s    c""FGG66!8AJEE"IqL9::
dffa
 1:dffQh"
$cQT1YYr]?b
 AAr   c                   V Uu. uF  p\        V4      NK  	  ppV^ ,          ^8  g    V^ ,          V P                  ^,
          8  d   ^ # \        V P                  V^ ,          V P                  4      pV\        V^ ,          V^,          V P                  4      ,          V P                  ,          p\        V P                  WP                  4      pWE8X  d   ^# ^ # u upi )    )r   r   r   r   r   )r1   r6   sigr   v1v2s   &&&   r   _verifyElGamalKey._verify   s    #&'3awqz3'q6!8s1vdffQhtvvs1vtvv&s3q63q6466**dff4tvvq&&!6 (s   Cc                .    \        V R4      '       d   ^# ^ # )z&Whether this is an ElGamal private keyr   )r>   r1   s   &r   has_privateElGamalKey.has_private   s     4r   c                    R # T rU   s   &r   can_encryptElGamalKey.can_encrypt       r   c                    R # rY   rZ   rU   s   &r   can_signElGamalKey.can_sign   r]   r   c                Z    \        V P                  V P                  V P                  34      # )zNA matching ElGamal public key.

Returns:
    a new :class:`ElGamalKey` object
)r*   r   r   r   rU   s   &r   	publickeyElGamalKey.publickey   s"     $&&$&&$&&122r   c                   \        V P                  4       4      \        VP                  4       4      8w  d   R # RpV P                   F<  pT;'       d0    \        V P                  VR4      \        VP                  VR4      8H  pK>  	  V# )FTN)boolrV   r$   getattrkey)r1   otherresultcomps   &&  r   __eq__ElGamalKey.__eq__   sy      "#tE,=,=,?'@@MMD A A4!>!(D$!?"@F " r   c                .    V P                  V4      '       * # r-   )rk   )r1   rh   s   &&r   __ne__ElGamalKey.__ne__  s    ;;u%%%r   c                    ^ RI Hp Vh)rN   )PicklingError)picklerq   )r1   rq   s   & r   __getstate__ElGamalKey.__getstate__  s    (r   c                    \         hr-   NotImplementedError)r1   r6   r7   s   &&&r   signElGamalKey.sign      !!r   c                    \         hr-   rv   )r1   r6   	signatures   &&&r   verifyElGamalKey.verify  rz   r   c                    \         hr-   rv   )r1   rD   r7   s   &&&r   encryptElGamalKey.encrypt  rz   r   c                    \         hr-   rv   )r1   
ciphertexts   &&r   decryptElGamalKey.decrypt  rz   r   c                    \         hr-   rv   r1   r6   Bs   &&&r   blindElGamalKey.blind  rz   r   c                    \         hr-   rv   r   s   &&&r   unblindElGamalKey.unblind  rz   r   c                    \         hr-   rv   rU   s   &r   sizeElGamalKey.size  rz   r   )r0   )r   r   r   r   r-   )__name__
__module____qualname____firstlineno____doc__r$   r2   r:   rE   rK   rR   rV   r[   r_   rb   rk   rn   rs   rx   r}   r   r   r   r   r   __static_attributes____classdictcell__)__classdict__s   @r   r   r      su     8 "H"
 

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