U
    ʹh                  	   @   sd  d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ dd d	 Zd
ZeedZdZeedZeedZdd d Zdd ZeeeeeeZejeeedee e eddZdd dd  d ZdZde ZdZeedZeedZdd d Zdd ZeeeeeeZejeeedee e eddZG dd  d eZG d!d" d"eZdS )#z6Implementation of Edwards Digital Signature Algorithm.    N   	shake_256)ellipticcurve)remove_whitespace
bit_lengthbytes_to_intint_to_bytescompat26_str         ZM37095705934669439343138083508754565189542113879843219016388785533085940283555   ZM15112221349535400772501151409588531511454012693041857206046113283949847762202ZM46316835694926478169428394003475163141307993866256225615783033603165251855960   l	   S9i@eM^w|o c                 C   s   t dt|  S )NZsha512)hashlibnewr
   Zdigestdata r   1./venv/lib/python3.8/site-packages/ecdsa/eddsa.py_sha512(   s    r   T)	generatori     iWg   Z224580040295924300187604334099896036246789641632564134246125461686950415467406032909029192869357953282578032075146446173674602635247710Z298819210078481492676017930443930673437544040154080242095928241372331506189835876003536878655418784733982303233503462500531545062832660i  l   ;O)u9d
NG\cIoSDY%	c; c                 C   s
   t | dS )Nr   r   r   r   r   r   	_shake256I   s    r   c                   @   s\   e Zd ZdZdddZdd Zdd Zed	d
 Zej	dd
 Zdd Z
dd Zdd ZdS )	PublicKeyz7Public key for the Edwards Digital Signature Algorithm.Nc                 C   sr   || _ | | _|| _t| j d d d | _t|| jkrPtd| j|r\|| _	nt
j| j|| _	d S )Nr      r   z5Incorrect size of the public key, expected: {0} bytes)r   curve_PublicKey__encodedr   pbaselenlen
ValueErrorformat_PublicKey__pointr   PointEdwards
from_bytes)selfr   
public_keypublic_pointr   r   r   __init__V   s     
 zPublicKey.__init__c                 C   s&   t |tr"| j|jko | j|jkS tS N)
isinstancer   r   r    NotImplementedr)   otherr   r   r   __eq__i   s    
zPublicKey.__eq__c                 C   s
   | |k S r-   r   r0   r   r   r   __ne__p   s    zPublicKey.__ne__c                 C   s   | j S r-   r&   r)   r   r   r   points   s    zPublicKey.pointc                 C   s   | j |krtd|| _ d S )Nz)Can't change the coordinates of the point)r&   r$   r0   r   r   r   r6   w   s    
c                 C   s   | j S r-   r4   r5   r   r   r   r+   }   s    zPublicKey.public_pointc                 C   s   | j S r-   )r    r5   r   r   r   r*      s    zPublicKey.public_keyc                 C   s   t |}t|d| j kr.tdd| j tj| j|d| j }t	|| jd d}|| j
 krrtdt }| jtkrtd}t	| j||  | j | d}| j
| | j| | krtddS )z(Verify a Pure EdDSA signature over data.r   z-Invalid signature length, expected: {0} bytesNlittlezInvalid signature
   SigEd448  T)r
   r#   r"   r$   r%   r   r'   r(   r   r   r   order	bytearraycurve_ed448	hash_functo_bytesr    r&   )r)   r   Z	signatureRSdomkr   r   r   verify   s0     
zPublicKey.verify)N)__name__
__module____qualname____doc__r,   r2   r3   propertyr6   setterr+   r*   rB   r   r   r   r   r   S   s   


r   c                   @   sL   e Zd ZdZdd Zedd Zdd Zdd	 Zd
d Z	dd Z
dd ZdS )
PrivateKeyz8Private key for the Edwards Digital Signature Algorithm.c                 C   s   || _ | | _t| j d d d | _t|| jkrJtd| jt|| _	t
| j|| _d | _| jd | j }| |}t|d}|| _d S )Nr   r   r   z2Incorrect size of private key, expected: {0} bytesr7   )r   r   r   r!   r"   r#   r$   r%   bytes_PrivateKey__private_keyr:   r<   _PrivateKey__h_PrivateKey__public_key
_key_pruner   _PrivateKey__s)r)   r   private_keyaZscalarr   r   r   r,      s     



zPrivateKey.__init__c                 C   s   | j S r-   )rK   r5   r   r   r   rP      s    zPrivateKey.private_keyc                 C   s&   t |tr"| j|jko | j|jkS tS r-   )r.   rI   r   rK   r/   r0   r   r   r   r2      s
    

zPrivateKey.__eq__c                 C   s
   | |k S r-   r   r0   r   r   r   r3      s    zPrivateKey.__ne__c                 C   s   | j  }|dkrd}n|dkr&d}ntd|d  d|> d  M  < t| j  }|d dkr|d|d< |d	  d
O  < n,|d d|d > d @ d|d d > B |d< |S )Nr   r   r      z&Only cofactor 4 and 8 curves supportedr   r   r      )r   Zcofactorr$   r   r!   )r)   keyhZh_loglr   r   r   rN      s    
,zPrivateKey._key_prunec                 C   s2   | j r| j S | j| j }t| j| || _ | j S )z9Generate the public key based on the included private key)rM   r   rO   r   r=   )r)   r+   r   r   r   r*      s      zPrivateKey.public_keyc           	      C   s   t |}|   }| j| jd }t }| jtkr<td}t| j|| | d}| j	| 
 }t| j|| | | d}|| j	 ; }||| j  | j	  }|t|| jd S )z)Perform a Pure EdDSA signature over data.Nr8   r7   )r
   r*   rL   r"   r:   r   r;   r   r<   r   r=   r9   rO   r	   )	r)   r   Aprefixr@   rr>   rA   r?   r   r   r   sign   s    
zPrivateKey.signN)rC   rD   rE   rF   r,   rG   rP   r2   r3   rN   r*   r[   r   r   r   r   rI      s   
rI   )rF   r   Z_sha3r    r   Z_compatr   r   r   r	   r
   Z_pZ_aintZ_dZ_hZ_GxZ_GyZ_rr   Z	CurveEdTwZcurve_ed25519r'   Zgenerator_ed25519r   r;   Zgenerator_ed448objectr   rI   r   r   r   r   <module>   s|   	    
      
  O