§
    8·tc·!  ã                   ó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        ú>/usr/lib/python3/dist-packages/Cryptodome/PublicKey/ElGamal.pyr   r   "   s  € õ& 	‰Œ€Cõ )°DÀ8ÐLÑLÔL€C„EØ	Œ�‰�qÑ€Aðå•GÔ(°qØ36´5Ø.6ð8ñ 8ô 8à9:¸C¼EñCô CˆŒð Œ5�Fˆ?ˆ?Øð ŒE�A‰I˜œÑ !Ò#Ð#Øð
 Œu�}Š}˜SœUÑ#Ô#ˆØŒE�A‰I˜Ñ Ò"Ð"Øð 	õ Ô ¨qØ/2¬u°Q©wØ*2ð4ñ 4ô 4€C„Eõ �”�s”u˜cœeÑ$Ô$€C„EØ€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Ý
ˆ3�x„x�uÐÐÝÐ@ÑAÔAÐAÝ•3�s‘8”8‰_Œ_ð -ð -ˆØ”˜Q”ˆÝ��U�G C¨¤F™OœOÑ,Ô,Ð,Ð,å# C¤EÑ*Ô*­iÒ7€IØ�”˜’Ð)˜SœU C¤Eš\Ñ)€IØ•�S”U˜CœE !™G S¤UÑ+Ô+¨QÒ.Ñ.€IØ�”�q’Ð(˜CœE 3¤5šLÑ(€IÝ
ˆ3�x„x�‚{€{Ø�S”U˜A’XÐ- ¤¨¬¢Ñ-ˆ	Ø•S˜œ ¤ s¤uÑ-Ô-¨s¬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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   € Ý
ˆdŒf�a˜œÑ
 Ô
 ˆÝ�”˜˜4œ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        ¦  «        |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Ø/3¬v°a©xØ*.¬.ð:ñ :ô :ˆõ �t”v˜q $¤&Ñ)Ô)¨A¨a¬DÑ0°D´FÑ:ˆÝˆw˜œ ¤Ñ'Ô'ˆØŸ:š: d¤fÑ-Ô-°°!´Ñ4¸¼Ñ?ˆØ$¥s¨4¬6°1°d´fÑ'=Ô'=Ñ=ÀÄÑ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ˆÝ�A‰JŒJˆØ�EŠE�"‰IŒI�qŠLˆLÝÐ9Ñ:Ô:Ð:Ý
ˆdŒf�a˜œÑ
 Ô
 ˆÝ�1‰:Œ:�d”f˜Q‘hÑ "Ñ
$ˆØ�Šcˆc�Q�r‘T�1ˆa�ŠcˆcØˆQ�YŠY�r‰]Œ]‰?˜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   € Ð'Ð'Ð'˜a�w�q‰zŒzÐ'Ð'Ð'r    r   r   )r   r   r   r   )r3   r7   ÚsigÚv1Úv2s        r   Ú_verifyzElGamalKey._verifyÖ   s¡   € Ø'Ð' 3Ð'Ñ'Ô'ˆØˆqŒ6�!Š8ˆ8�s˜1”v˜dœf Q™h’�Ø�1ÝˆtŒv�s˜1”v˜tœvÑ&Ô&ˆØ�s�3�q”6˜3˜qœ6 4¤6Ñ*Ô*Ñ*¨d¬fÑ4ˆÝˆtŒv�q˜$œ&Ñ!Ô!ˆØˆrŠ6ˆ6Ø�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‹   € Ý�× Ò Ñ"Ô"Ñ#Ô#¥t¨E×,=Ò,=Ñ,?Ô,?Ñ'@Ô'@Ò@Ð@Ø�5àˆØ”Mð 	Að 	AˆDØð A¥¨¬°4¸Ñ!>Ô!>Ý!(¨¬°D¸$Ñ!?Ô!?ò"@ˆFˆFàˆ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    