o
    e                  	   @   s   d Z ddlmZmZmZ ddedededefdd	Zd	gZ	e
d
krNed ddlZedD ]Ze \ZZer9 ned dkrGerGede  q-ed dS 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 n ty& } ztdjdtt j d|d}~ww |d| kr6t	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, )	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 )   )	fill_size)method_nameN)r   compute_hashr   	int2bytes).0counterr   r    7/usr/local/lib/python3.10/dist-packages/rsa/pkcs1_v2.py	<genexpr>H   s    
zmgf1.<locals>.<genexpr>   )r   HASH_METHODSdigest_sizeKeyError
ValueErrorformatjoinsortedkeysOverflowErrorranger   ceil_div)r   r   r   r   exoutputr   r   r   mgf1   s0   	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testmodfailurestestsr   r   r   r   <module>   s"   9