o
    _¨ÊhŽ  ã                   @   sp   d Z ddlT ddlmZ ddlmZmZ ddlmZ ddl	T G dd„ de
ƒZdd	„ Zddd„ZG dd„ dƒZd
S )z$Id$é    )Ú*)Únumber)Úbytes_to_longÚlong_to_bytes)ÚSHAc                   @   ó   e Zd ZdS )ÚerrorN©Ú__name__Ú
__module__Ú__qualname__© r   r   úG/var/www/html/env/lib/python3.10/site-packages/Crypto/PublicKey/_DSA.pyr   $   ó    r   c                 C   sÜ   | dƒ}t  |¡ ¡ }t  tt|ƒd ƒ¡ ¡ }tdƒ}tddƒD ]$}t|| ƒt|| ƒA }|dkr7|dB }|dkr?|dB }|d | }q!t|ƒsR|d }t|ƒrJt	ddƒ|  k ret	dd	ƒk rj||fS  t
d
ƒ‚t
d
ƒ‚)Né   é   r   é€   é   é   é   éŸ   é    zBad q value generated)r   ÚnewÚdigestr   r   ÚbignumÚrangeÚbordÚisPrimeÚpowÚRuntimeError)ÚrandfuncÚSÚhash1Úhash2ÚqÚiÚcr   r   r   Ú	generateQ'   s$   ÿÿr'   Nc                 C   s(  | dk rt dƒ‚tƒ }|r|dƒ 	 t|ƒ\}|_t| d dƒd }ddi }}}|jd? d@ }	ttdƒ|	ƒ}
ttdƒ| d ƒ}|d	k r¢td|d ƒD ]}tt	 
|t|ƒ t|ƒ ¡ ¡ ƒ||< qL|| |
 }t|d d
d
ƒD ]
}|d> ||  }qp|| }||d|j  d  }||kr“t|ƒr“n|d || d }}|d	k sE|d	k r§n|r­|dƒ q||_t|d |jƒd }|rÁ|dƒ 	 t|| ƒƒ|d  }t|||ƒ}d|  k rÞ|d k rån n|dkrånqÂ||_|rï|dƒ 	 t|dƒƒ}d|  k �r|jk �rn nnqð|t|||ƒ|_|_|S )zègenerate(bits:int, randfunc:callable, progress_func:callable)

    Generate a DSA key of length 'bits', using 'randfunc' to get
    random data and 'progress_func', if present, to display
    the progress of the key generation.
    r   zKey length < 160 bitszp,q
r   r   r   é   é   i   éÿÿÿÿz4096 multiples failed
zh,g
zx,y
r   )Ú
ValueErrorÚDSAobjr'   r$   Údivmodr   r   r   r   r   r   Úbstrr   r   ÚpÚgÚxÚy)Úbitsr    Úprogress_funcÚobjr!   ÚnÚCÚNÚVÚbÚpowbÚpowL1ÚkÚWÚXr/   ÚpowerÚhr0   r1   r   r   r   Úgenerate_py9   sb   (öë$üýrB   c                   @   r   )r,   Nr	   r   r   r   r   r,   q   r   r,   )N)Ú__revision__ÚCrypto.PublicKey.pubkeyÚCrypto.Utilr   ÚCrypto.Util.numberr   r   ÚCrypto.Hashr   ÚCrypto.Util.py3compatÚ	Exceptionr   r'   rB   r,   r   r   r   r   Ú<module>   s   
8