
    ,h!                     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        Z/var/www/html/Resume-Scraper/venv/lib/python3.12/site-packages/Crypto/PublicKey/ElGamal.pyr   r   "   s   & 	C )D8LCE	qA G((q3655.689:CEEC 55F? EEAI!#
 uu}}SUU#EEAI" 	   q/2uuQw*24CE suucee$CE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   `   sI   @ 	C
3xu@AA3s8_ -QUGCFO,- $CEE*i7I)SUUCEE\)ISUUCEE!GSUU+Q..Iq(CEE355L(I
3x{SUUAX--	Ssuu-suu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     zz|((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    
dffa
 466"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/3vvax*...: tvvq$&&)AaD0DFF:w'::dff-!4?$s4661dff'==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66!8AJEE"IqL9::
dffa
 1:dffQh"
$cQrT1acQYYr]?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    #&'awqz''q6!8s1vdffQhtvvs1vtvv&s3q63q6466**dff4tvvq$&&!r6 (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__   sz      "#tE,=,=,?'@@MM 	AD A4!>!(D$!?"@F	A 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   