+
    ¢THi”  ã                   óL   € R t ^ RIt^ RIt^ RIHt ^ RIHt R.t ! R R4      tR# )z<passlib.utils.scrypt._builtin -- scrypt() kdf in pure-pythonN)Úpbkdf2_hmac)Úsalsa20ÚScryptEnginec                   óv   a € ] tR t^t o Rt^ t^ t^ t^ t^ t	^ t
^ tRtRt]R 4       tR tR tR tR tR tR	tV tR# )
r   zÿ
helper class used to run scrypt kdf, see scrypt() for frontend

.. warning::
    this class does NO validation of the input ranges or types.

    it's not intended to be used directly,
    but only as a backend for :func:`passlib.utils.scrypt.scrypt()`.
Nc                ó4   € V ! W4V4      P                  WV4      # )z-create engine & run scrypt() hash calculation)Úrun)ÚclsÚsecretÚsaltÚnÚrÚpÚkeylens   &&&&&&&Ú@/usr/lib/python3/dist-packages/passlib/crypto/scrypt/_builtin.pyÚexecuteÚScryptEngine.execute)   s   € ñ �1˜‹|×Ñ ¨fÓ5Ð5ó    c                óD  aa€ Wn         W n        W0n        V^,          V n        V P                  V,          V n        V^,          ;V n        pV^,          V n        \        P                  ! R4      ^8X  g   Q h\        P                  ! R\        V4      ,           R,           4      V n        V^8X  d   V P                  V n        VR8:  d   \        P                  ! R4      pM<VR8:  g   Q h\        P                  ! R4      o\        P                  ! R4      oVV3R lpWPn        R# )	é   ÚIÚ<l   ÿÿ l   ÿÿÿÿ c                 ó<   <€ S! V 4      S! V 4      ^ ,          ,          # )é    © )ÚXÚig1Úig2s   &€€r   Ú
integerifyÚ)ScryptEngine.__init__.<locals>.integerifyJ   s   ø€ Ù˜1“v¡ Q£¨2¥Õ.Ð.r   Néðÿÿÿiïÿÿÿ)r   r   r   Ú
smix_bytesÚiv_bytesÚbmix_lenÚbmix_half_lenÚstructÚcalcsizeÚStructÚstrÚbmix_structÚ_bmix_1ÚbmixÚoperatorÚ
itemgetterr   )Úselfr   r   r   r"   r   r   r   s   &&&&  @@r   Ú__init__ÚScryptEngine.__init__.   sç   ù€ àŒØŒØŒØ˜q�&ˆŒØŸ™¨!Õ+ˆŒØ#$¨¥6Ð)ˆŒ˜Ø !�VˆÔÜ�Š˜sÓ# qÔ(Ð(Ð(Ü!Ÿ=š=¨¬s°8«}Õ)<¸sÕ)BÓCˆÔð �Œ6ØŸ™ˆDŒIð �
Œ?Ü!×,Ò,¨SÓ1‰JàÐ*Ô*Ð*Ð*Ü×%Ò% cÓ*ˆCÜ×%Ò% cÓ*ˆCö/ð %Žr   c                ó  aaa€ V P                   p\        RW^VR7      oV P                  oV P                  ^8X  d
   S! S4      pM4V P                  oRP                  VVV3R l\        ^ VS4       4       4      p\        RW^VR7      # )z†
run scrypt kdf for specified secret, salt, and keylen

.. note::

    * time cost is ``O(n * r * p)``
    * mem cost is ``O(n * r)``
Úsha256)Úroundsr   r   c              3   óF   <"  € T F  pS! SWS,            4      x € K  	  R # 5i©Nr   )Ú.0ÚoffsetÚinputÚsmixr    s   & €€€r   Ú	<genexpr>Ú#ScryptEngine.run.<locals>.<genexpr>e   s*   øé € ð á<�Fñ �U˜6¨ZÕ$7Ð8×9Ð9Û<ùs   ƒ!)r!   r   r8   r   r    ÚjoinÚrange)	r-   r	   r
   r   r!   Úoutputr7   r8   r    s	   &&&&  @@@r   r   ÚScryptEngine.runO   s   ú€ ð —=‘=ˆÜ˜H f¸1ÀXÔNˆð �y‰yˆØ�6‰6�QŒ;Ù˜%“[‰Fð Ÿ™ˆJØ—X‘Xö ä# A x°Ô<óó ˆFô ˜8 V¸AÀfÔMÐMr   c           	     ó  aaa€ V P                   oV P                  pV P                  pV P                  o\	        VP                  V4      4      oVVV3R lp\	        V! 4       4      pVP                  pS^,
          p^ pVS8  dp   V! S4      V,          p	\        ;QJ d$    . R \        SV! V	4      4       4       F  NK  	  5M! R \        SV! V	4      4       4       4      p
S! V
S4       V^,          pKv  VP                  ! S!  # )a3  run SCrypt smix function on a single input block

:arg input:
    byte string containing input data.
    interpreted as 32*r little endian 4 byte integers.

:returns:
    byte string containing output data
    derived by mixing input using n & r parameters.

.. note:: time & mem cost are both ``O(n * r)``
c               3   óh   <"  € ^ p V S8  d$   \        S4      pVx € S! VS4       V ^,          p K*  R# 5i)é    N)Útuple)ÚiÚlastr*   Úbufferr   s     €€€r   ÚvgenÚScryptEngine.smix.<locals>.vgen‹   s8   øé € ØˆAØ�a”%Ü˜V“}�Ø’
Ù�T˜6Ô"Ø�Q•’ñ	 ùs   ƒ/2c              3   ó6   "  € T F  w  rW,          x € K  	  R # 5ir4   r   ©r5   ÚaÚbs   &  r   r9   Ú$ScryptEngine.smix.<locals>.<genexpr>ž   s   é € ÐHÑ-G¡T Q˜1Ÿ5š5Ó-Gùó   ‚)
r*   r(   r   r   ÚlistÚunpackÚ__getitem__rB   ÚzipÚpack)r-   r7   r(   r   rF   ÚVÚ
get_v_elemÚn_maskrC   ÚjÚresultr*   rE   r   s   &&         @@@r   r8   ÚScryptEngine.smixm   sÝ   ú€ ð �y‰yˆØ×&Ñ&ˆØ—_‘_ˆ
Ø�F‰Fˆô �k×(Ñ(¨Ó/Ó0ˆ÷	ô ‘“‹Lˆð —]‘]ˆ
Ø�Q•ˆØˆØ�!ŒeÙ˜6Ó" VÕ+ˆAß”UÑH¬S°¹ÀA»Ô-GÓH—U‘UÑH¬S°¹ÀA»Ô-GÓHÓHˆFÙ�˜Ô Ø��FŠAð ×Ò Ñ(Ð(r   c                óþ   € V P                   pVRR p\        V4      p^ pWc8  dY   V^,           p\        R \        WE4       4       4      ;W&V% p\        R \        WE4       4       4      ;W#V,           W7,           % pTpK^  R# )aj  
block mixing function used by smix()
uses salsa20/8 core to mix block contents.

:arg source:
    source to read from.
    should be list of 32*r 4-byte integers
    (2*r salsa20 blocks).

:arg target:
    target to write to.
    should be list with same size as source.
    the existing value of this buffer is ignored.

.. warning::

    this operates *in place* on target,
    so source & target should NOT be same list.

.. note::

    * time cost is ``O(r)`` -- loops 16*r times, salsa20() has ``O(1)`` cost.

    * memory cost is ``O(1)`` -- salsa20() uses 16 x uint4,
      all other operations done in-place.
Nc              3   ó6   "  € T F  w  rW,          x € K  	  R # 5ir4   r   rI   s   &  r   r9   Ú$ScryptEngine.bmix.<locals>.<genexpr>Ò   s   é € Ð(K¹?±4°1¨¯ª»?ùrM   c              3   ó6   "  € T F  w  rW,          x € K  	  R # 5ir4   r   rI   s   &  r   r9   r[   Ó   s   é € ð 9Ù"1™$˜!�—’£/ùrM   r   )r#   Úiterr   rQ   )r-   ÚsourceÚtargetÚhalfÚtmpÚsiterrV   Újns   &&&     r   r*   ÚScryptEngine.bmix®   sŒ   € ð< ×!Ñ!ˆØ�S�TˆlˆÜ�V“ˆØˆØŒhØ�R•ˆBÜ!(Ñ(K¼3¸s¼?Ó(KÓ!KÐKˆF�RˆL˜3Ü18ñ 9Ü"% c¤/ó9ó 2ð ˆF˜!•8˜d�iÐ(¨3ð ŠAñ r   c           	     ó¨   € VR,          p\        R \        V\        V4      4       4       4      ;VR&   p\        R \        WC4       4       4      VR&   R# )z0special bmix() method optimized for ``r=1`` case:é   NNc              3   ó6   "  € T F  w  rW,          x € K  	  R # 5ir4   r   rI   s   &  r   r9   Ú'ScryptEngine._bmix_1.<locals>.<genexpr>Û   s   é € Ð#KÑ6J©d¨a A§E¢EÓ6JùrM   :Nrf   Nc              3   ó6   "  € T F  w  rW,          x € K  	  R # 5ir4   r   rI   s   &  r   r9   rh   Ü   s   é € Ð<±©¨˜aŸeše³ùrM   N)r   rQ   r]   )r-   r^   r_   ÚBra   s   &&&  r   r)   ÚScryptEngine._bmix_1Ø   sG   € à�3�KˆÜ#Ñ#K´c¸!¼TÀ&»\Ô6JÓ#KÓKÐKˆˆs‰�cÜÑ<´°C´Ó<Ó<ˆˆs‹r   )
r*   r#   r"   r(   r   r!   r   r   r   r    )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   r   r   r    r!   r"   r#   r(   r   Úclassmethodr   r.   r   r8   r*   r)   Ú__static_attributes__Ú__classdictcell__)Ú__classdict__s   @r   r   r      so   ø‡ € ñð 	
€AØ	€AØ	€Að €JØ€HØ€HØ€MØ€KØ€Jàñ6ó ð6ò%òBNò<?)òB(÷T=ð =r   )	rp   r+   r$   Úpasslib.crypto.digestr   Úpasslib.crypto.scrypt._salsar   Ú__all__r   r   r   r   Ú<module>rx      s0   ðÙ Bó Û õ .Ý 0ð ð€÷
K=ó K=r   