o
    Þý°j{,  ã                   @   s|   d Z ddlmZ ddlmZ ddlmZ dZdZddd„Z	d	d
„ Z
ddlmZ eedd… ƒZddd„Zdd„ Zdd„ ZdS )zHFunctions to create and test prime numbers.

:undocumented: __package__
é    )ÚRandom)ÚInteger)Ú
iter_rangeé   Nc                 C   s<  t | tƒs	t| ƒ} | dv rtS |  ¡ rtS tdƒ}t| d ƒ}|du r(t ¡ j}t|ƒ}d}| ¡ r>|dL }|d7 }| ¡ s2t|ƒD ]Y}d}|||fv rltj	d| d |d�}d|  krc| d ksfJ ‚ J ‚|||fv sLt
||| ƒ}	|	||fv ryqBtd|ƒD ]}
t
|	d| ƒ}	|	|krŒ n|	|kr–t    S q~t  S qBtS )a:  Perform a Miller-Rabin primality test on an integer.

    The test is specified in Section C.3.1 of `FIPS PUB 186-4`__.

    :Parameters:
      candidate : integer
        The number to test for primality.
      iterations : integer
        The maximum number of iterations to perform before
        declaring a candidate a probable prime.
      randfunc : callable
        An RNG function where bases are taken from.

    :Returns:
      ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``.

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    ©r   é   é   é   r   Nr   r   )Úmin_inclusiveÚmax_inclusiveÚrandfunc)Ú
isinstancer   ÚPROBABLY_PRIMEÚis_evenÚ	COMPOSITEr   ÚnewÚreadr   Úrandom_rangeÚpow)Ú	candidateÚ
iterationsr   ÚoneÚ	minus_oneÚmÚaÚiÚbaseÚzÚj© r   úŒ/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/Cryptodome/Math/Primality.pyÚmiller_rabin_test-   sL   

þþ üÿür!   c                 C   sÀ  t | tƒs	t| ƒ} | dv rtS |  ¡ s|  ¡ rtS dd„ }|ƒ D ]}| || fv r*q t || ¡}|dkr8t  S |dkr> nq | d }| ¡ d }tdƒ}tdƒ}tdƒ}tdƒ}	t|d ddƒD ]v}
| 	|¡ ||9 }|| ; }|	 	|¡ |	|9 }	|	|9 }	|	 
||¡ |	 ¡ r‹|	| 7 }	|	dL }	|	| ; }	| |
¡rÍ| 	|¡ ||	7 }| ¡ r©|| 7 }|dL }|| ; }| 	|	¡ | 
||¡ | ¡ rÄ|| 7 }|dL }|| ; }qa| 	|¡ | 	|	¡ qa|dkrÞtS tS )a_  Perform a Lucas primality test on an integer.

    The test is specified in Section C.3.3 of `FIPS PUB 186-4`__.

    :Parameters:
      candidate : integer
        The number to test for primality.

    :Returns:
      ``Primality.COMPOSITE`` or ``Primality.PROBABLY_PRIME``.

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    r   c                  s   s0   � d} 	 | V  | dkr| d7 } n| d8 } |  } q)Nr	   Tr   r   r   )Úvaluer   r   r    Ú	alternate�   s   €
úzlucas_test.<locals>.alternater   éÿÿÿÿr   )r   r   r   r   Úis_perfect_squarer   Újacobi_symbolÚsize_in_bitsr   ÚsetÚmultiply_accumulateÚis_oddÚget_bit)r   r#   ÚDÚjsÚKÚrÚU_iÚV_iÚU_tempÚV_tempr   r   r   r    Ú
lucas_testw   sh   


ÿ






r4   )Ú
sieve_baseéd   c                    sÌ   |du r	t  ¡ j}t| tƒst| ƒ} t| ƒtv rtS zt| j	tƒ W n t
y-   t Y S w d}|  ¡ ‰ ztt‡ fdd„|ƒƒd d }W n tyP   d}Y nw t| ||d�tkr\tS t| ƒtkrdtS tS )að  Test if a number is prime.

    A number is qualified as prime if it passes a certain
    number of Miller-Rabin tests (dependent on the size
    of the number, but such that probability of a false
    positive is less than 10^-30) and a single Lucas test.

    For instance, a 1024-bit candidate will need to pass
    4 Miller-Rabin tests.

    :Parameters:
      candidate : integer
        The number to test for primality.
      randfunc : callable
        The routine to draw random bytes from to select Miller-Rabin bases.
    :Returns:
      ``PROBABLE_PRIME`` if the number if prime with very high probability.
      ``COMPOSITE`` if the number is a composite.
      For efficiency reasons, ``COMPOSITE`` is also returned for small primes.
    N)
)éÜ   é   )i  é   )i†  é   )i   é
   )il  é   )iä  é   )iz  r	   )i°  é   )i¤  r   )it  r   c                    s   ˆ | d k S )Nr   r   ©Úx©Úbit_sizer   r    Ú<lambda>  s    z%test_probable_prime.<locals>.<lambda>r   r   ©r   )r   r   r   r   r   ÚintÚ_sieve_baser   ÚmapÚfail_if_divisible_byÚ
ValueErrorr   r'   ÚlistÚfilterÚ
IndexErrorr!   r4   )r   r   Ú	mr_rangesÚmr_iterationsr   rA   r    Útest_probable_primeÞ   sB   

ÿÿÿÿÿÿÿrO   c                  K   s¬   |   dd¡}|   dd¡}|   ddd„ ¡}| rtd|  ¡  ƒ‚|du r&tdƒ‚|d	k r.td
ƒ‚|du r7t ¡ j}t}|tkrTtj||d�dB }||ƒsKq9t	||ƒ}|tks=|S )ax  Generate a random probable prime.

    The prime will not have any specific properties
    (e.g. it will not be a *strong* prime).

    Random numbers are evaluated for primality until one
    passes all tests, consisting of a certain number of
    Miller-Rabin tests with random bases followed by
    a single Lucas test.

    The number of Miller-Rabin iterations is chosen such that
    the probability that the output number is a non-prime is
    less than 1E-30 (roughly 2^{-100}).

    This approach is compliant to `FIPS PUB 186-4`__.

    :Keywords:
      exact_bits : integer
        The desired size in bits of the probable prime.
        It must be at least 160.
      randfunc : callable
        An RNG function where candidate primes are taken from.
      prime_filter : callable
        A function that takes an Integer as parameter and returns
        True if the number can be passed to further primality tests,
        False if it should be immediately discarded.

    :Return:
        A probable prime in the range 2^exact_bits > p > 2^(exact_bits-1).

    .. __: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    Ú
exact_bitsNr   Úprime_filterc                 S   s   dS )NTr   r?   r   r   r    rC   <  s    z)generate_probable_prime.<locals>.<lambda>úUnknown parameters: zMissing exact_bits parameteré    zPrime number is not big enough.©rP   r   r   )
ÚpoprI   Úkeysr   r   r   r   r   ÚrandomrO   )ÚkwargsrP   r   rQ   Úresultr   r   r   r    Úgenerate_probable_prime  s.   "
ÿÿ
ûrZ   c                  K   sŒ   |   dd¡}|   dd¡}| rtd|  ¡  ƒ‚|du rt ¡ j}t}|tkrDt|d |d�}|d d }| ¡ |kr:q!t	||d�}|tks%|S )	a›  Generate a random, probable safe prime.

    Note this operation is much slower than generating a simple prime.

    :Keywords:
      exact_bits : integer
        The desired size in bits of the probable safe prime.
      randfunc : callable
        An RNG function where candidate primes are taken from.

    :Return:
        A probable safe prime in the range
        2^exact_bits > p > 2^(exact_bits-1).
    rP   Nr   rR   r   rT   r   rD   )
rU   rI   rV   r   r   r   r   rZ   r'   rO   )rX   rP   r   rY   Úqr   r   r   r    Úgenerate_probable_safe_primeR  s   
ûr\   )N)Ú__doc__Ú
Cryptodomer   ÚCryptodome.Math.Numbersr   ÚCryptodome.Util.py3compatr   r   r   r!   r4   ÚCryptodome.Util.numberr5   Ú_sieve_base_larger(   rF   rO   rZ   r\   r   r   r   r    Ú<module>   s   
Ja
::