
    ÿig!                     b    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d	S )
)generate	construct
ElGamalKey    )Random)generate_probable_safe_primetest_probable_prime	COMPOSITEIntegerc                    t                      }t          | |          |_        |j        dz
  dz	  }	 t          t	          j        d|j        |          d|j                  |_        |j        dv r@|j        dz
  |j        z  dk    rW|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        X/var/www/html/afkarena/venv/lib/python3.11/site-packages/Cryptodome/PublicKey/ElGamal.pyr   r   "   s   & 	C )D8LLLCE	qAG(q365.68 8 89:CEC C 5F?? EAI!##
 u}}SU##EAI"" 	  q/2uQw*24 4 4CE suce$$CEJ    c           	         t                      }t          |           dvrt          d          t          t          |                     D ]3}|j        |         }t          ||t          | |                              4t          |j                  t          k    }||j
        dk    p|j
        |j        k    z  }|t          |j
        |j        dz
  |j                  dk    z  }||j        dk     p|j        |j        k    z  }t          |           dk    rJ||j        dk    p|j        |j        k    z  }|t          |j
        |j        |j                  |j        k    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   `   sQ   @ 	C
3xxu@AAA3s88__ - -QUGCFOO,,,,#CE**i7I)SUCE\)ISUCE!GSU++Q..Iq(CE35L(I
3xx{{SUAX--	Ssu--su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dS )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                 H    |t          j                    j        }|| _        d S N)r   newread	_randfunc)selfr   s     r   __init__zElGamalKey.__init__   s!    z||(H!r    c                     t          | j        || j                  }t          | j        || j                  |z  | j        z  }t	          |          t	          |          gS r/   )r   r   r   r   int)r3   MKabs        r   _encryptzElGamalKey._encrypt   sO    
dfa
 
 46""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                  |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   r2   r   r   r   r   r   r6   )r3   r7   ra_blindaxplaintext_blind	plaintexts          r   _decryptzElGamalKey._decrypt   s    c"" 	HFGGG q/3vax*..: : : tvq$&))AaD0DF:w''::df--!4?$s461df'='==G	9~~r    c                    t          | d          st          d          | j        dz
  }t          |          }|                    |          dk    rt          d          t          | j        || j                  }t          |          | j        |z  z
  |z  }|dk     r||z   }|dk     ||	                    |          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   r6   )r3   r7   r8   p1r9   tr:   s          r   _signzElGamalKey._sign   s    c"" 	HFGGG6!8AJJEE"IIqLL9:::
dfa
 
 1::dfQh"
$ccQrT1accQYYr]]?b
 AAr    c                 D   d |D             }|d         dk     s|d         | j         dz
  k    rdS t          | j        |d         | j                   }|t          |d         |d         | j                   z  | j         z  }t          | j        || j                   }||k    rdS dS )Nc                 ,    g | ]}t          |          S  r
   ).0r   s     r   
<listcomp>z&ElGamalKey._verify.<locals>.<listcomp>   s    '''awqzz'''r    r   r   )r   r   r   r   )r3   r7   sigv1v2s        r   _verifyzElGamalKey._verify   s    ''3'''q6!88s1vdfQh1tvs1vtv&&s3q63q646***df4tvq$&!!r661qr    c                 *    t          | d          rdS dS )z&Whether this is an ElGamal private keyr   r   r   )r>   r3   s    r   has_privatezElGamalKey.has_private   s      4 	11r    c                     dS NTrM   rU   s    r   can_encryptzElGamalKey.can_encrypt       tr    c                     dS rX   rM   rU   s    r   can_signzElGamalKey.can_sign   rZ   r    c                 D    t          | j        | j        | j        f          S )zfA matching ElGamal public key.

        Returns:
            a new :class:`ElGamalKey` object
        )r   r   r   r   rU   s    r   	publickeyzElGamalKey.publickey   s     $&$&$&1222r    c                 
   t          |                                           t          |                                          k    rdS d}| j        D ]2}|o-t          | j        |d           t          |j        |d           k    }3|S )NFT)boolrV   r'   getattrkey)r3   otherresultcomps       r   __eq__zElGamalKey.__eq__   s      ""##tE,=,=,?,?'@'@@@5M 	A 	AD A4!>!>!(D$!?!?"@FFr    c                 .    |                      |           S r/   )rf   )r3   rc   s     r   __ne__zElGamalKey.__ne__  s    ;;u%%%%r    c                     ddl m} |)Nr   )PicklingError)picklerj   )r3   rj   s     r   __getstate__zElGamalKey.__getstate__  s    ((((((r    c                     t           r/   NotImplementedError)r3   r7   r8   s      r   signzElGamalKey.sign      !!r    c                     t           r/   rn   )r3   r7   	signatures      r   verifyzElGamalKey.verify  rq   r    c                     t           r/   rn   )r3   rD   r8   s      r   encryptzElGamalKey.encrypt  rq   r    c                     t           r/   rn   )r3   
ciphertexts     r   decryptzElGamalKey.decrypt  rq   r    c                     t           r/   rn   r3   r7   Bs      r   blindzElGamalKey.blind  rq   r    c                     t           r/   rn   r{   s      r   unblindzElGamalKey.unblind  rq   r    c                     t           r/   rn   rU   s    r   sizezElGamalKey.size  rq   r    r/   )__name__
__module____qualname____doc__r'   r4   r;   rE   rJ   rS   rV   rY   r\   r^   rf   rh   rl   rp   rt   rv   ry   r}   r   r   rM   r    r   r   r      sM        8 "!!H" " " "
     

 
 
     	 	 	      3 3 3  & & &  " " "" " "" " "" " "" " "" " "" " " " "r    r   N)__all__
Cryptodomer   Cryptodome.Math.Primalityr   r   r	   Cryptodome.Math.Numbersr   r   r   objectr   rM   r    r   <module>r      s   4 2
1
1      E E E E E E E E E E + + + + + +< < <|2 2 2hJ" J" J" J" J" J" J" J" J" J"r    