B
    ?[                 @   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               @   s   e Zd ZdS )errorN)__name__
__module____qualname__ r   r   4lib/python3.7/site-packages/Crypto/PublicKey/_DSA.pyr   $   s   r   c             C   s   | d}t | }t tt|d  }td}xVtddD ]H}t|| t|| A }|dkrp|dB }|dkr|dB }|d | }qDW xt|s|d }qW t	dd|  k rt	dd	k rn n||fS t
d
d S )N      r                     zBad q value generated)r   newdigestr   r   bignumrangeZbordisPrimepowRuntimeError)randfuncSZhash1Zhash2qicr   r   r   	generateQ'   s     
$r!   Nc             C   sL  | dk rt dt }|r"|d xHt|\}|_t| d dd }ddi   }}}|jd? d@ }	ttd|	}
ttd| d }x|d	k rPx<td|d D ]*}tt	
|t| t|  ||< qW || |
 }x(t|d d
d
D ]}|d> ||  }qW || }||d|j  d  }||kr8t|r8P |d || d  }}qW |d	k r^P |r&|d q&W ||_t|d |jd }|r|d xRt|| |d  }t|||}d|  k r|d k rn n|dkrP qW ||_|r|d x2t|d}d|  k r&|jk r n nP q W |t||| |_|_|S )zgenerate(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   Zbstrr   r   pgxy)bitsr   Zprogress_funcobjr   nCNVbZpowbZpowL1kWXr(   Zpowerhr)   r*   r   r   r   generate_py9   sZ    *
*r7   c               @   s   e Zd ZdS )r&   N)r   r	   r
   r   r   r   r   r&   q   s   r&   )N)Z__revision__ZCrypto.PublicKey.pubkeyZCrypto.Utilr   ZCrypto.Util.numberr   r   ZCrypto.Hashr   ZCrypto.Util.py3compat	Exceptionr   r!   r7   r&   r   r   r   r   <module>   s   
8