U +¥MbJ"ã@shddlmZddlmZddlmZmZddlmZ dd„Z dd„Z Gd d „d e ƒZ Gd d „d e ƒZd S)é)Ú is_native_int)Únumber)Ú long_to_bytesÚ bytes_to_long)Úget_random_bytescCs@||kr||}}d}|r<|d@r*||N}|dK}|dL}q|S)z!Multiply two polynomials in GF(2)ré©)Úf1Úf2ÚzrrúD/tmp/pip-target-t616c12r/lib/python/Crypto/Protocol/SecretSharing.pyÚ _mult_gf2(s  r cCsb||krd|fStj}d}|}||ƒ}||ƒ|krZd||ƒ|>}||N}|t||ƒN}q&||fS)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)Ísz Shamir.split..rcSsFt|ƒ}tdƒ}|D]}|||}q|r>|t|ƒt|ƒ7}| ¡S)Nr)rrr')ÚuserÚcoeffsÚssssÚidxÚshareZcoeffrrr Ú make_shareÓsz Shamir.split..make_sharecsg|]}|ˆ|ˆˆƒf‘qSrrr@©rErIrFrr rCÜs)r5Úappendr)ÚkÚnÚsecretrFrrJr Úsplit¨s% z Shamir.splitcsît|ƒ}g}|D]X}t|dƒ‰t|dƒ}t‡fdd„|DƒƒrJtdƒ‚|rZ|ˆ|7}| ˆ|f¡qtdƒ}t|ƒD]j}||\}} tdƒ} tdƒ} t|ƒD],} || d} | |kr¢| | 9} | || 9} q¢|| | |  ¡7}qz| ¡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). rrc3s|]}|dˆkVqdS)rNr)rAÚy©rGrr Ú sz!Shamir.combine..zDuplicate share)rrÚanyrrKr5r4r')ZsharesrFrLZ gf_sharesÚxÚvaluer7ÚjZx_jZy_jÚ numeratorÚ denominatorÚmZx_mrrQr ÚcombineÞs,       zShamir.combineN)F)F)r:r;r<r=Ú staticmethodrOrZrrrr r>¡s  5r>N)ZCrypto.Util.py3compatrZ Crypto.UtilrZCrypto.Util.numberrrZ Crypto.Randomrr?r rÚobjectrr>rrrr Ú"s   T