§
    8·tcZ"  ã                   ó~   — d dl mZ d dlmZ d dlmZmZ d dlmZ	 d„ Z
d„ Z G d„ de¦  «        Z G d	„ d
e¦  «        ZdS )é    )Úis_native_int)Únumber)Úlong_to_bytesÚbytes_to_long)Úget_random_bytesc                 óN   — || k    r|| }} d}|r|dz  r|| z  }| dz  } |dz  }|°|S )z!Multiply two polynomials in GF(2)r   é   © )Úf1Úf2Úzs      úC/usr/lib/python3/dist-packages/Cryptodome/Protocol/SecretSharing.pyÚ	_mult_gf2r   (   s[   € ð 
ˆB‚w€wØ�RˆBˆØ	€AØ
ð Ø�‰6ð 	Ø�‰GˆAØ
ˆq‰ˆØ
ˆq‰ˆð	 ð ð
 €Hó    c                 óâ   — | |k     rd| fS t           j        }d}| } ||¦  «        } ||¦  «        |k    r8d ||¦  «        |z
  z  }||z  }|t          ||¦  «        z  } ||¦  «        |k    °8||fS )z˜
    Compute division of polynomials over GF(2).
    Given a and b, it finds two polynomials q and r such that:

    a = b*q + r with deg(r)<deg(b)
    r   r	   )r   Úsizer   )ÚaÚbÚdegÚqÚrÚdÚss          r   Ú_div_gf2r   7   s”   € ð 	
ˆAŠˆØ�!ˆtˆå
Œ+€CØ	€AØ	€AØˆˆA‰Œ€AØ
ˆ#ˆa‰&Œ&�AŠ+ˆ+Ø�#�#�a‘&”&˜1‘*ÑˆØ	ˆQ‰ˆØ	�Y�q˜!‰_Œ_Ñˆð ˆ#ˆa‰&Œ&�AŠ+ˆ+ð ˆqˆ6€Mr   c                   óR   — e Zd ZdZdddz  z   Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
d„ Zd„ ZdS )Ú_ElementzElement of GF(2^128) fieldé‡   é   é€   c                 ó¢   — t          |¦  «        r	|| _        dS t          |¦  «        dk    rt          |¦  «        | _        dS t	          d¦  «        ‚)zïInitialize the element to a certain value.

        The value passed as parameter is internally encoded as
        a 128-bit integer, where each bit represents a polynomial
        coefficient. The LSB is the constant coefficient.
        é   z8The encoded value must be an integer or a 16 byte stringN)r   Ú_valueÚlenr   Ú
ValueError)ÚselfÚencoded_values     r   Ú__init__z_Element.__init__S   sU   € õ ˜Ñ'Ô'ð 	YØ'ˆDŒKˆKˆKÝ�ÑÔ 2Ò%Ð%Ý'¨Ñ6Ô6ˆDŒKˆKˆKåÐWÑXÔXÐXr   c                 ó"   — | j         |j         k    S ©N©r"   )r%   Úothers     r   Ú__eq__z_Element.__eq__b   s   € ØŒ{˜eœlÒ*Ð*r   c                 ó   — | j         S )z7Return the field element, encoded as a 128-bit integer.r*   ©r%   s    r   Ú__int__z_Element.__int__e   s
   € àŒ{Ðr   c                 ó,   — t          | j        d¦  «        S )z6Return the field element, encoded as a 16 byte string.r!   )r   r"   r.   s    r   Úencodez_Element.encodei   s   € å˜Tœ[¨"Ñ-Ô-Ð-r   c                 óÂ  — | j         }|j         }||k    r||}}| j        ||fv rt          d¦  «        S ddz  }|d}}|r”t          t	          |dz  ¦  «        dd …         dz  d¬¦  «        }|||z  z  ||z
  dz
  |z  z  }|dz  }t          t	          |dz	  dz  ¦  «        dd …         dz  d¬¦  «        }||| j        z  z  ||z
  dz
  |z  z  }|dz  }|°”t          |¦  «        S )Nr   r   r   r	   )Úbase)r"   Úirr_polyr   ÚintÚbin)	r%   Úfactorr   r   Úmask1Úvr   Úmask2Úmask3s	            r   Ú__mul__z_Element.__mul__m   s"  € àŒ[ˆØŒ]ˆð �Š7ˆ7Ø˜�ˆBàŒ=˜R ˜HÐ$Ð$Ý˜A‘;”;Ðà�S‘ˆØ�1ˆ1ˆØð 	å�˜B ™F™œ A B Bœ¨#Ñ-°AÐ6Ñ6Ô6ˆEØ˜!˜a™%‘ e¨e¡m°aÑ&7¸1Ñ%<Ñ=ˆAØ�!‰GˆAå�˜Q #™X¨™NÑ+Ô+¨A¨B¨BÔ/°#Ñ5¸AÐ>Ñ>Ô>ˆEØ˜!˜dœmÑ+Ñ,°%¸%±-À!Ñ2CÀqÑ1HÑIˆAØ�1‰HˆBð ð 	õ ˜‰{Œ{Ðr   c                 ó:   — t          | j        |j        z  ¦  «        S r)   )r   r"   )r%   Úterms     r   Ú__add__z_Element.__add__†   s   € Ý˜œ d¤kÑ1Ñ2Ô2Ð2r   c                 ó  — | j         dk    rt          d¦  «        ‚| j         | j        }}d\  }}|dk    rFt          ||¦  «        d         }||t	          ||¦  «        z  }}||t	          ||¦  «        z  }}|dk    °Ft          |¦  «        S )z0Return the inverse of this element in GF(2^128).r   zInversion of zero)r	   r   )r"   r$   r4   r   r   r   )r%   Úr0Úr1Ús0Ús1r   s         r   Úinversez_Element.inverse‰   sœ   € ð Œ;˜!ÒÐÝÐ0Ñ1Ô1Ð1à”˜dœmˆBˆØ‰ˆˆBØ�1ŠfˆfÝ˜˜RÑ Ô  Ô#ˆAØ˜�i¨¨2Ñ.Ô.Ñ.�ˆBØ˜�i¨¨2Ñ.Ô.Ñ.�ˆBð �1Šfˆfõ ˜‰|Œ|Ðr   c                 ób   — t          | j        ¦  «        }t          |dz
  ¦  «        D ]}|| z  }Œ|S )Nr	   )r   r"   Úrange)r%   ÚexponentÚresultÚ_s       r   Ú__pow__z_Element.__pow__š   s<   € Ý˜$œ+Ñ&Ô&ˆÝ�x !‘|Ñ$Ô$ð 	#ð 	#ˆAØ˜d‘]ˆFˆFØˆr   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r4   r'   r,   r/   r1   r<   r?   rE   rK   r
   r   r   r   r   M   s¥   € € € € € Ø$Ð$ð   c¡Ñ)€HðYð Yð Yð+ð +ð +ðð ð ð.ð .ð .ðð ð ð23ð 3ð 3ðð ð ð"ð ð ð ð r   r   c                   óB   — e Zd ZdZedd„¦   «         Zedd„¦   «         ZdS )ÚShamirz›Shamir's secret sharing scheme.

    A secret is split into ``n`` shares, and it is sufficient to collect
    ``k`` of them to reconstruct the secret.
    Fc                 óÌ   ‡‡‡— d„ t          | dz
  ¦  «        D ¦   «         Š‰                     t          |¦  «        ¦  «         d„ Šˆˆˆfd„t          d|dz   ¦  «        D ¦   «         S )a±  Split a secret into ``n`` shares.

        The secret can be reconstructed later using just ``k`` shares
        out of the original ``n``.
        Each share must be kept confidential to the person it was
        assigned to.

        Each share is associated to an index (starting from 1).

        Args:
          k (integer):
            The sufficient number of shares to reconstruct the secret (``k < n``).
          n (integer):
            The number of shares that this method will create.
          secret (byte string):
            A byte string of 16 bytes (e.g. the AES 128 key).
          ssss (bool):
            If ``True``, the shares can be used with the ``ssss`` utility.
            Default: ``False``.

        Return (tuples):
            ``n`` tuples. A tuple is meant for each participant and it contains two items:

            1. the unique index (an integer)
            2. the share (a byte string, 16 bytes)
        c                 óF   — g | ]}t          t          d ¦  «        ¦  «        ‘ŒS )r!   )r   Úrng)Ú.0Úis     r   ú
<listcomp>z Shamir.split.<locals>.<listcomp>Í   s&   € Ð:Ð:Ð:¨•(�3˜r™7œ7Ñ#Ô#Ð:Ð:Ð:r   r	   c                 óÈ   — t          | ¦  «        }t          d¦  «        }|D ]
}||z  |z   }Œ|r"|t          | ¦  «        t          |¦  «        z  z  }|                     ¦   «         S )Nr   )r   r#   r1   )ÚuserÚcoeffsÚssssÚidxÚshareÚcoeffs         r   Ú
make_sharez Shamir.split.<locals>.make_shareÓ   sh   € Ý˜4‘.”.ˆCÝ˜Q‘K”KˆEØð ,ð ,�Ø˜e™ eÑ+��Øð 7Ø� $™œ­3¨v©;¬;Ñ6Ñ6�Ø—<’<‘>”>Ð!r   c                 ó.   •— g | ]}| ‰|‰‰¦  «        f‘ŒS r
   r
   )rU   rV   rZ   r_   r[   s     €€€r   rW   z Shamir.split.<locals>.<listcomp>Ü   s,   ø€ ÐJÐJÐJ°Q��J�J˜q &¨$Ñ/Ô/Ð0ÐJÐJÐJr   )rG   Úappendr   )ÚkÚnÚsecretr[   rZ   r_   s      `@@r   ÚsplitzShamir.split¨   s}   øøø€ ðJ ;Ð:­U°1°q±5©\¬\Ð:Ñ:Ô:ˆØ�Š•h˜vÑ&Ô&Ñ'Ô'Ð'ð
	"ð 	"ð 	"ð KÐJÐJÐJÐJÐJ½%ÀÀ1ÀqÁ5¹/¼/ÐJÑJÔJÐJr   c                 óv  ‡— t          | ¦  «        }g }| D ]w}t          |d         ¦  «        Št          |d         ¦  «        }t          ˆfd„|D ¦   «         ¦  «        rt          d¦  «        ‚|r|‰|z  z  }|                     ‰|f¦  «         Œxt          d¦  «        }t          |¦  «        D ]{}||         \  }}	t          d¦  «        }
t          d¦  «        }t          |¦  «        D ]#}||         d         }||k    r|
|z  }
|||z   z  }Œ$||	|
z  |                     ¦   «         z  z  }Œ||                     ¦   «         S )aè  Recombine a secret, if enough shares are presented.

        Args:
          shares (tuples):
            The *k* tuples, each containin the index (an integer) and
            the share (a byte string, 16 bytes long) that were assigned to
            a participant.
          ssss (bool):
            If ``True``, the shares were produced by the ``ssss`` utility.
            Default: ``False``.

        Return:
            The original secret, as a byte string (16 bytes long).
        r   r	   c              3   ó0   •K  — | ]}|d          ‰k    V — ŒdS )r   Nr
   )rU   Úyr\   s     €r   ú	<genexpr>z!Shamir.combine.<locals>.<genexpr>  s+   øè è € Ð2Ð2 1�1�Q”4˜3’;Ð2Ð2Ð2Ð2Ð2Ð2r   zDuplicate share)r#   r   Úanyr$   ra   rG   rE   r1   )Úsharesr[   rb   Ú	gf_sharesÚxÚvaluerI   ÚjÚx_jÚy_jÚ	numeratorÚdenominatorÚmÚx_mr\   s                 @r   ÚcombinezShamir.combineÞ   s]  ø€ õ> �‰KŒKˆàˆ	Øð 	+ð 	+ˆAÝ˜1˜Qœ4‘.”.ˆCÝ˜Q˜qœT‘N”NˆEÝÐ2Ð2Ð2Ð2¨	Ð2Ñ2Ô2Ñ2Ô2ð 4Ý Ð!2Ñ3Ô3Ð3Øð "Ø˜ ™Ñ!�Ø×Ò˜c 5˜\Ñ*Ô*Ð*Ð*å˜!‘”ˆÝ�q‘”ð 	>ð 	>ˆAØ  ”|‰HˆC�å  ™œˆIÝ" 1™+œ+ˆKå˜1‘X”Xð -ð -�Ø ”l 1”o�Ø˜’6�6Ø Ñ$�IØ 3¨¡9Ñ,�KøØ�c˜I‘o¨×(;Ò(;Ñ(=Ô(=Ñ=Ñ=ˆFˆFØ�}Š}‰ŒÐr   N)F)rL   rM   rN   rO   Ústaticmethodre   rv   r
   r   r   rQ   rQ   ¡   sc   € € € € € ðð ð ð3Kð 3Kð 3Kñ „\ð3Kðj ð7ð 7ð 7ñ „\ð7ð 7ð 7r   rQ   N)ÚCryptodome.Util.py3compatr   ÚCryptodome.Utilr   ÚCryptodome.Util.numberr   r   ÚCryptodome.Randomr   rT   r   r   Úobjectr   rQ   r
   r   r   ú<module>r}      så   ððD 4Ð 3Ð 3Ð 3Ð 3Ð 3Ø "Ð "Ð "Ð "Ð "Ð "Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ðð ð ð,Qð Qð Qð Qð Qˆvñ Qô Qð Qðhuð uð uð uð uˆVñ uô uð uð uð ur   