U
    ʹh                  	   @   s   d Z z$ddlZedd dd ZW n` eefk
r   ddlmZm	Z	 d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd ZY nX dS )z5
Implementation of the SHAKE-256 algorithm for Ed448
    Nshake256@   c                 C   s   t d| |S )Nr   )hashlibnewdigestmsgZoutlen r	   1./venv/lib/python3.8/site-packages/ecdsa/_sha3.py	shake_256
   s    r      )bytes_to_intint_to_bytesc                 C   s   t | ddS )Nlittle	byteorder)r   )sr	   r	   r
   _from_le   s    r   c                 C   s   | |> | d| ? B d@ S )Nr   l    r	   )xbr	   r	   r
   _rol   s    r   c           
      C   sl  ddddddddd	d
dddddddddddddddg}dddddd
ddddddd d!ddd"d#ddd$d%d&dg}dd'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d,d:d+d;g}t dd!D ]}dgd# }dgd# }t ddD ]}||d#   | | N  < qt dd#D ].}||d  d#  t||d d#  dA ||< qt ddD ]}| |  ||d#  N  < q.t ddD ]}t| | || | |< qX| |d  }t dt|d D ]}| ||d   | || < q|| |d< < t ddd#D ]}| | | |d  | |d  | |d  | |d   | | | |d  g}t dd#D ]0}	||	 ||	d   ||	d  @ A | ||	 < qq| d  || N  < qd S )=Nr   r   >         $   ,      7         
   +      '   )   -                  =   8      	                                       i  l          l          i  l       l         l   	             l   	   l   
    l      l           l          l          l          l           i
  l   
       l          l         )ranger   len)
r   Z	ROTATIONSZPERMUTATIONZRCZrndcditjr	   r	   r
   _sha3_transform   s    

,




	2rE   c              	   C   sD   t dt|d D ],}| |  t|d| d| d  N  < qd S )Nr   r(   )r>   r?   r   )r   r   rD   r	   r	   r
   _reinterpret_to_words_and_xor   s    rF   c                 C   s4   t  }tdt| D ]}|t| | ddd7 }q|S )Nr   r(   r   r   )	bytearrayr>   r?   r   )wZmprD   r	   r	   r
   _reinterpret_to_octets   s    rI   c                 C   s   d| }dgd }d}t | | }td|D ]*}t|| |||   ||7 }t| q,t| |d }	|	| t |	|k r|	d qr|	t |	d   dO  < t||	 t| t }
t |
|k r|
t|d| 7 }
t| q|
d| S )z!Semi-generic SHA-3 implementationr(   r   r"   Nr      )r?   r>   rF   rE   rG   appendrI   )r   Zr_wZo_pZe_bZr_br   idxZblocksrB   moutr	   r	   r
   	_sha3_raw   s(    




rO   c                 C   s   t | dd|S )Nr8      )rO   r   r	   r	   r
   r      s    )__doc__r   r   r   r   	TypeError
ValueErrorZ_compatr   r   r   r   rE   rF   rI   rO   r	   r	   r	   r
   <module>   s   t