U
    ڲg                     @   s   d Z ddlmZmZmZ deeeedddZdgZ	e
dkred dd	lZed
D ]4Ze \ZZerl qed dkrTerTede  qTed d	S )zFunctions for PKCS#1 version 2 encryption and signing

This module implements certain functionality from PKCS#1 version 2. Main
documentation is RFC 2437: https://tools.ietf.org/html/rfc2437
    )commonpkcs1	transformSHA-1)seedlengthhasherreturnc              
      s   zt j   j}W nD tk
rV } z&tdjdtt j d|W 5 d}~X Y nX |d| krvt	dj| dd fd	d
t
t||d D }|d| S )a  
    MGF1 is a Mask Generation Function based on a hash function.

    A mask generation function takes an octet string of variable length and a
    desired output length as input, and outputs an octet string of the desired
    length. The plaintext-awareness of RSAES-OAEP relies on the random nature of
    the output of the mask generation function, which in turn relies on the
    random nature of the underlying hash.

    :param bytes seed: seed from which mask is generated, an octet string
    :param int length: intended length in octets of the mask, at most 2^32(hLen)
    :param str hasher: hash function (hLen denotes the length in octets of the hash
        function output)

    :return: mask, an octet string of length `length`
    :rtype: bytes

    :raise OverflowError: when `length` is too large for the specified `hasher`
    :raise ValueError: when specified `hasher` is invalid
    z=Invalid `hasher` specified. Please select one of: {hash_list}z, )Z	hash_listNl        zmDesired length should be at most 2**32 times the hasher's output length ({hash_length} for {hasher} function))hash_lengthr       c                 3   s*   | ]"}t jtj|d d  dV  qdS )   )Z	fill_size)method_nameN)r   Zcompute_hashr   Z	int2bytes).0counterr   r    0/tmp/pip-unpacked-wheel-1z1vrokf/rsa/pkcs1_v2.py	<genexpr>H   s
   zmgf1.<locals>.<genexpr>   )r   ZHASH_METHODSdigest_sizeKeyError
ValueErrorformatjoinsortedkeysOverflowErrorranger   Zceil_div)r   r   r   r
   exoutputr   r   r   mgf1   s*    	r    __main__z'Running doctests 1000x or until failureNi  d   z%i timeszDoctests done)r   )__doc__rsar   r   r   bytesintstrr    __all____name__printdoctestr   counttestmodZfailurestestsr   r   r   r   <module>   s   9