§
    HŠtjU@ ã                   óÎ  — d Z ddlmZ ddlmZ ddlZddlmZmZ ddl	Z	ddl
Z
 e
j        e¦  «        ZddlZddlZddlZddlZddlZddlZddlZddlmZmZ ddlmZmZ ddlZddlmZ dd	lm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l)m*Z*m+Z+m,Z,m-Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4 ddlm5Z5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>c m?Z@ g d¢ZA	 ddlBZCdZDn# eE$ r dZDY nw xY wd„ ZFd„ ZG eGe3¦  «        ZHg d¢ZIeI J                    ejK         L                    dd¦  «         M                    ¦   «          N                    ¦   «         ¦  «        ZOd:d„ZPd„ ZQd;d„ZRd„ ZSd<d„ZTd„ ZUd„ ZVd„ ZWejX        d„ ¦   «         ZYd „ ZZd!„ Z[d"„ Z\d#„ Z]d$„ Z^d%„ Z_d=d(„Z`d>d+„Za G d,„ d-e$¦  «        Z#d.dgZbd/„ Zc G d0„ d1e#¦  «        Zd G d2„ d3ed¦  «        Ze G d4„ d5ed¦  «        Zf G d6„ d7ed¦  «        Zg G d8„ d9ejh        ¦  «        ZidS )?zhelpers for passlib unittestsé    )Úwith_statement)Ú	unhexlifyN)ÚwrapsÚpartial)ÚPasslibHashWarningÚPasslibConfigWarning)ÚPY3ÚJYTHON)Úwarn)Úexc)ÚMissingBackendError)ÚTestCaseÚskipÚskipIfÚ
skipUnlessÚSkipTest)
Úhas_rounds_infoÚhas_salt_infoÚrounds_cost_valuesÚrngÚ
getrandstrÚis_ascii_safeÚto_native_strÚrepeat_stringÚtickÚbatch)Ú	iteritemsÚirangeÚuÚunicodeÚPY2Únullcontext)Úclassproperty)Ú	TEST_MODEÚset_fileÚget_filer   ÚHandlerCaseTFc                 ó&  — t           j                             | ¦  «        }t           j                             | ¦  «        |k    rNt          j        d¦  «         t          j        | d¦  «         t           j                             | ¦  «        |k    °LdS dS )zensure file's mtime has changedçš™™™™™¹?N)ÚosÚpathÚgetmtimeÚtimeÚsleepÚutime)r+   Úlasts     úQ/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/tests/utils.pyÚensure_mtime_changedr2   ;   s|   € õ Œ7×Ò˜DÑ!Ô!€DÝ
Œ'×
Ò
˜4Ñ
 Ô
  DÒ
(Ð
(ÝŒ
�3‰ŒˆÝ
Œ��tÑÔÐõ Œ'×
Ò
˜4Ñ
 Ô
  DÒ
(Ð
(Ð
(Ð
(Ð
(Ð
(ó    c                 ó`   ‡ ‡— ˆ fd„Št          ˆfd„t          d¦  «        D ¦   «         ¦  «        S )Nc                  óR   •—  ‰¦   «         x} }| |k    r ‰¦   «         }| |k    °|| z
  S ©N© )ÚstartÚcurÚtimers     €r1   Úsamplez%_get_timer_resolution.<locals>.sampleE   s<   ø€ Ø�e‘g”gÐˆ�Ø�sŠlˆlØ�%‘'”'ˆCð �sŠlˆlà�5‰yÐr3   c              3   ó,   •K  — | ]} ‰¦   «         V — Œd S r6   r7   )Ú.0Ú_r;   s     €r1   ú	<genexpr>z(_get_timer_resolution.<locals>.<genexpr>J   s)   øè è € Ð*Ð*˜Aˆvˆv‰xŒxÐ*Ð*Ð*Ð*Ð*Ð*r3   é   )ÚminÚrange)r:   r;   s   `@r1   Ú_get_timer_resolutionrC   D   sH   øø€ ðð ð ð ð õ
 Ð*Ð*Ð*Ð*¥ q¡¤Ð*Ñ*Ô*Ñ*Ô*Ð*r3   )ÚquickÚdefaultÚfullÚPASSLIB_TEST_MODErE   c                 ó¢   — | r%t           t                               | ¦  «        k     rdS |r%t           t                               |¦  «        k    rdS dS )aä  check if test for specified mode should be enabled.

    ``"quick"``
        run the bare minimum tests to ensure functionality.
        variable-cost hashes are tested at their lowest setting.
        hash algorithms are only tested against the backend that will
        be used on the current host. no fuzz testing is done.

    ``"default"``
        same as ``"quick"``, except: hash algorithms are tested
        at default levels, and a brief round of fuzz testing is done
        for each hash.

    ``"full"``
        extra regression and internal tests are enabled, hash algorithms are tested
        against all available backends, unavailable ones are mocked whre possible,
        additional time is devoted to fuzz testing.
    FT)Ú
_test_modeÚ_TEST_MODESÚindex)rA   Úmaxs     r1   r$   r$   T   sS   € ð& ð �z�K×-Ò-¨cÑ2Ô2Ò2Ð2ØˆuØ
ð �z�K×-Ò-¨cÑ2Ô2Ò2Ð2ØˆuØˆ4r3   c                 ól   — t          | d¦  «        rdS d| j        v pt          | t          j        ¦  «        S )z'check if handler supports 'relaxed' kwdÚorig_prefixFÚrelaxed)ÚhasattrÚsetting_kwdsÚ
issubclassÚuhÚGenericHandler©Úhandlers    r1   Úhas_relaxed_settingrW   p   sH   € õ ˆw˜Ñ&Ô&ð Øˆuà˜Ô,Ð,ð Nµ
¸7Ý;=Ô;Lñ1Nô 1Nð Nr3   c                 óD   — t          | ¦  «        }  | |d¬¦  «        j        S )z'get effective rounds value from handlerT)ÚroundsÚuse_defaults)Úunwrap_handlerrY   )rV   rY   s     r1   Úget_effective_roundsr\   |   s'   € å˜WÑ%Ô%€GØˆ7˜&¨tÐ4Ñ4Ô4Ô;Ð;r3   c                 ó
  — 	 |                       ¦   «         }n# t          $ r Y dS w xY w	 |                      d¦  «         |                       ¦   «         |k    |                      |¦  «         S # |                      |¦  «         w xY w)z*check if backend is the default for sourceFrE   )Úget_backendr   Úset_backend)rV   ÚbackendÚorigs      r1   Úis_default_backendrb   �   sš   € ðØ×"Ò"Ñ$Ô$ˆˆøÝð ð ð Øˆuˆuðøøøð"Ø×Ò˜IÑ&Ô&Ð&Ø×"Ò"Ñ$Ô$¨Ò/à×Ò˜DÑ!Ô!Ð!Ð!øˆ×Ò˜DÑ!Ô!Ð!Ð!øøøs   ‚ —
%¤%©,A+ Á+Bc              #   óÔ   K  — |€|                       ¦   «         }| j        }|r|                     |¦  «        dz   nd}||d…         D ]!}||k    r|                      |¦  «        r|V — Œ"dS )zƒ
    iterate over alternate backends available to handler.

    .. warning::
        not thread-safe due to has_backend() call
    Né   r   )r^   ÚbackendsrK   Úhas_backend)rV   ÚcurrentÚfallbackre   Úidxr`   s         r1   Úiter_alt_backendsrj   �   s�   è è € ð €Ø×%Ò%Ñ'Ô'ˆØÔ€HØ'/Ð
6ˆ(�.Š.˜Ñ
!Ô
! !Ñ
#Ð
#°Q€CØ˜C˜D˜D”>ð ð ˆØ�gÒÐ '×"5Ò"5°gÑ">Ô">ÐØˆMˆMˆMøðð r3   c                  ó*   — t          | i |¤ŽD ]}|c S d S r6   )rj   )ÚargsÚkwdsr`   s      r1   Úget_alt_backendrn   œ   s,   € Ý$ dÐ3¨dÐ3Ð3ð ð ˆØˆˆˆØˆ4r3   c                 óT   — t          | d¦  «        r| j        } t          | d¦  «        °| S )z5return original handler, removing any wrapper objectsÚwrapped)rP   rp   rU   s    r1   r[   r[   ¡   s4   € å
�'˜9Ñ
%Ô
%ð "Ø”/ˆõ �'˜9Ñ
%Ô
%ð "à€Nr3   c                 ó  — | |k    rdS t          | t          j        ¦  «        r| r| |k    rdS | j        } | °dS t          | t          ¦  «        r*t          | t          j        ¦  «        rt          | |¦  «        S t          d| ›�¦  «        ‚)zG
    test if <handler> was derived from <base> via <base.using()>.
    TFz#don't know how to inspect handler: )Ú
isinstancerS   ÚPrefixWrapperÚ_derived_fromÚtyperR   ÚMinimalHandlerÚNotImplementedError)rV   Úbases     r1   Úhandler_derived_fromry   §   s¥   € ð �$‚€ØˆtÝ	�G�RÔ-Ñ	.Ô	.ð 
XØð 	,Ø˜$ŠˆØ�tàÔ+ˆGð	 ð 	,ð
 ˆuÝ	�G�TÑ	"Ô	"ð X¥z°'½2Ô;LÑ'MÔ'Mð XÝ˜' 4Ñ(Ô(Ð(å!Ð!ÈWÈWÐ"VÑWÔWÐWr3   c              #   óf  ‡K  — t          | t          ¦  «        rGt          | t          j        ¦  «        r-| j        Šˆfd„}|| _        	 dV — ‰| _        dS # ‰| _        w xY wt          | t          j        ¦  «        r3t          | j        ¦  «        5  dV — ddd¦  «         dS # 1 swxY w Y   dS dV — dS )a  
    internal helper for do_config_encrypt() --
    context manager which temporarily replaces handler's _calc_checksum()
    with one that uses min_rounds; useful when trying to generate config
    with high rounds value, but don't care if output is correct.
    c                 ój   •— | j         }	 | j        | _          ‰| g|¢R i |¤Ž|| _         S # || _         w xY wr6   )rY   Ú
min_rounds)Úselfrl   rm   rY   rp   s       €r1   Úwrapperz&patch_calc_min_rounds.<locals>.wrapperÆ   sQ   ø€ Ø”[ˆFð%Ø"œo�”Ø�w˜tÐ3 dÐ3Ð3Ð3¨dÐ3Ð3à$�”�ø˜f�”Ð$Ð$Ð$Ð$s   Š) ©	2N)	rr   ru   rR   rS   Ú	HasRoundsÚ_calc_checksumrs   Úpatch_calc_min_roundsrp   )rV   r~   rp   s     @r1   r�   r�   »   s+  øè è € õ �'�4Ñ Ô ð ¥Z°½¼Ñ%FÔ%Fð àÔ(ˆð	%ð 	%ð 	%ð 	%ð 	%ð ")ˆÔð	-ØˆEˆEˆEà%,ˆGÔ"Ð"Ð"ø WˆGÔ"Ð,Ð,Ð,Ð,Ý	�G�RÔ-Ñ	.Ô	.ð Ý" 7¤?Ñ3Ô3ð 	ð 	ØˆEˆEˆEð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ˆˆˆØˆs   ÁA Á	AÂB Â B$Â'B$c                 óÖ   — t          |t          ¦  «        r|                     d¦  «        }t          | d¦  «        5 }|                     |¦  «         ddd¦  «         dS # 1 swxY w Y   dS )zset file to specified bytesúutf-8ÚwbN)rr   r    ÚencodeÚopenÚwrite)r+   ÚcontentÚfhs      r1   r%   r%   Ü   s¨   € å�'�7Ñ#Ô#ð *Ø—.’. Ñ)Ô)ˆÝ	ˆd�DÑ	Ô	ð ˜RØ
�Š�ÑÔÐðð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s   »AÁA"Á%A"c                 ó~   — t          | d¦  «        5 }|                     ¦   «         cddd¦  «         S # 1 swxY w Y   dS )zread file as bytesÚrbN)r†   Úread)r+   r‰   s     r1   r&   r&   ã   s~   € å	ˆd�DÑ	Ô	ð ˜RØ�wŠw‰yŒyðð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ‘2²6¹6c                 óÞ   — t          | t          ¦  «        s| S t          r|                      d¦  «        S 	 |                      d¦  «        S # t
          $ r |                      d¦  «        cY S w xY w)z*convert native string to non-native stringrƒ   úlatin-1)rr   Ústrr	   r…   ÚdecodeÚUnicodeDecodeError©Úsources    r1   Útonnr”   è   s}   € å�f�cÑ"Ô"ð ,ØˆÝ	ð ,Ø�}Š}˜WÑ%Ô%Ð%ð	,Ø—=’= Ñ)Ô)Ð)øÝ!ð 	,ð 	,ð 	,Ø—=’= Ñ+Ô+Ð+Ð+Ð+ð	,øøøs   µA
 Á
A,Á+A,c                 óH   — t          t          j        dd| ¦  «        ¦  «        S )zT
    helper for represent byte strings in hex.

    usage: ``hb("deadbeef23")``
    z\sÚ )r   ÚreÚsubr’   s    r1   Úhbr™   ô   s    € õ •R”V˜E 2 vÑ.Ô.Ñ/Ô/Ð/r3   c                 ó&   — | |k     r|S | |k    r|S | S r6   r7   )ÚvalueÚlowerÚuppers      r1   Úlimitrž   ü   s#   € Øˆu‚}€}ØˆØ	�ŠˆØˆØ€Lr3   c                 ó|   — t          ¦   «         }t          ¦   «         |z
  | k     r	 t          ¦   «         |z
  | k     °dS dS )zAbecause time.sleep() doesn't even have 10ms accuracy on some OSesN©r   )Údelayr8   s     r1   Ú
quicksleepr¢     sB   € å‰FŒF€EÝ
‰&Œ&�‰,˜Ò
Ð
Øõ ‰&Œ&�‰,˜Ò
Ð
Ð
Ð
Ð
Ð
r3   rd   é
   c                 ó  — ddl m} ddlm}  || |pd¬¦  «        }d}t	          ¦   «         |z   }	 t          |                     ||¦  «        ¦  «        }	t	          ¦   «         |k    r|	|z  t           ||d¦  «        ¦  «        fS |dz  }ŒY)	z¸
    timeit() wrapper which tries to get as accurate a measurement as possible w/in maxtime seconds.

    :returns:
        ``(avg_seconds_per_call, log10_number_of_repetitions)``
    r   )ÚTimer©Úlogr–   )Úsetuprd   Tr£   )Útimeitr¥   Úmathr§   r   rA   ÚrepeatÚint)
Úfuncr¨   ÚmaxtimeÚbestofr¥   r§   r:   ÚnumberÚendÚdeltas
             r1   Ú	time_callr³   	  s¯   € ð ÐÐÐÐÐØÐÐÐÐÐØˆE�$˜e˜k rÐ*Ñ*Ô*€EØ€FÝ
‰&Œ&�7Ñ
€CðÝ�E—L’L ¨Ñ0Ô0Ñ1Ô1ˆÝ‰6Œ6�SŠ=ˆ=Ø˜‘<¥ S S¨°¡_¤_Ñ!5Ô!5Ð5Ð5Ø�"‰ˆð	r3   é€   ì   ÓF"*û! c                 ó   ‡ ‡— ˆ ˆfd„}|S )z<
    decorator run test method w/ multiple fixed seeds.
    c                 óB   •‡ — t          ‰ ¦  «        ˆˆ ˆfd„¦   «         }|S )Nc                  ó”   •— t          j        ‰¦  «        }t          ‰¦  «        D ]"}|                     d¦  «        |d<    ‰| i |¤Ž Œ#d S )Né    Úseed)ÚrandomÚRandomr   Úgetrandbits)rl   rm   r   r>   Úcountr­   Úmaster_seeds       €€€r1   r~   z6run_with_fixed_seeds.<locals>.builder.<locals>.wrapper   s^   ø€ å”- Ñ,Ô,ˆCÝ˜E‘]”]ð $ð $�Ø"Ÿš¨rÑ2Ô2��V‘Ø��dÐ#˜dÐ#Ð#Ð#Ð#ð$ð $r3   )r   )r­   r~   r¾   r¿   s   ` €€r1   Úbuilderz%run_with_fixed_seeds.<locals>.builder  s>   øø€ Ý	ˆt‰Œð	$ð 	$ð 	$ð 	$ð 	$ð 	$ñ 
Œð	$ð
 ˆr3   r7   )r¾   r¿   rÀ   s   `` r1   Úrun_with_fixed_seedsrÁ     s)   øø€ ðð ð ð ð ð ð €Nr3   c                   óv  ‡ — e Zd ZdZdZˆ fd„Zed„ ¦   «         Zed„ ¦   «         ZdZ	dZ
ˆ fd„Zd„ ZdZd	„ Zdˆ fd
„	Zd„ ZexZZ	 	 	 	 	 dd„Z G d„ dej        ¦  «        Zd d„Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z ej        ¦   «         Z dZ!dZ"d!d„Z# e$e%d¦  «        Z&e'j(        ˆ fd„¦   «         Z)dZ*d„ Z+d"d„Z,d„ Z-ˆ xZ.S )#r   aR  passlib-specific test case class

    this class adds a number of features to the standard TestCase...
    * common prefix for all test descriptions
    * resets warnings filter & registry for every test
    * tweaks to message formatting
    * __msg__ kwd added to assertRaises()
    * suite of methods for matching against warnings
    Nc                 ó”   •— t          t          | ¦  «                             ¦   «         }| j        }|r|›d|pt	          | ¦  «        ›�}|S )z;wrap shortDescription() method to prepend descriptionPrefixú: )Úsuperr   ÚshortDescriptionÚdescriptionPrefixr�   )r}   ÚdescÚprefixÚ	__class__s      €r1   rÆ   zTestCase.shortDescriptionB  sO   ø€ å•X˜tÑ$Ô$×5Ò5Ñ7Ô7ˆØÔ'ˆØð 	:Ø%˜v˜v tÐ'8­s°4©y¬yÐ'8Ð9ˆDØˆr3   c                 ób   — | j         }|                     d¦  «        pt          | d|z  d¦  «        S )Nr>   z_%s__unittest_skipF)Ú__name__Ú
startswithÚgetattr)ÚclsÚnames     r1   Ú__unittest_skip__zTestCase.__unittest_skip__N  s;   € ð Œ|ˆØ�Š˜sÑ#Ô#ð @Ý�sÐ0°4Ñ7¸Ñ?Ô?ð	@r3   c                 ó   — | j          S r6   )rÑ   ©rÏ   s    r1   Ú__test__zTestCase.__test__U  s   € ð Ô(Ð(Ð(r3   Tc                 ó¶   •— t          t          | ¦  «                             ¦   «          |                      ¦   «          |                      t
          dd¦  «         d S )NÚENABLE_DEBUG_ONLY_REPRT)rÅ   r   ÚsetUpÚsetUpWarningsÚ	patchAttrr   ©r}   rÊ   s    €r1   r×   zTestCase.setUpd  sN   ø€ Ý�h˜ÑÔ×#Ò#Ñ%Ô%Ð%Ø×ÒÑÔÐà�Š•sÐ4°dÑ;Ô;Ð;Ð;Ð;r3   c                 ó  — | j         r}t          ¦   «         }|                     ¦   «          |                      |j        ¦  «         t          j        dd¦  «         t          j        dd¦  «         t          j        dd¦  «         dS dS )z6helper to init warning filters before subclass setUp()Úignorez<the method .*\.(encrypt|genconfig|genhash)\(\) is deprecatedz&the 'vary_rounds' option is deprecatedz0Support for `(py-bcrypt|bcryptor)` is deprecatedN)ÚresetWarningStateÚreset_warningsÚ	__enter__Ú
addCleanupÚ__exit__ÚwarningsÚfilterwarnings)r}   Úctxs     r1   rØ   zTestCase.setUpWarningsj  sŠ   € àÔ!ð 	cÝ Ñ"Ô"ˆCØ�MŠM‰OŒOˆOØ�OŠO˜CœLÑ)Ô)Ð)õ Ô# HÐ.mÑnÔnÐnÝÔ# HÐ.WÑXÔXÐXÝÔ# HÐ.aÑbÔbÐbÐbÐbð	cð 	cr3   c                 óœ   — | j         rB|r@|                     ¦   «                              d¦  «        r|                     ¦   «         ›d|›�S |p|S )Nú:ú )ÚlongMessageÚrstripÚendswith)r}   ÚmsgÚstds      r1   Ú_formatMessagezTestCase._formatMessage‚  sT   € ØÔð 	 ð 	¨¯
ª
©¬×(=Ò(=¸cÑ(BÔ(Bð 	Ø!Ÿjšj™lœl˜l˜l¨C¨CÐ0Ð0à�:˜#Ðr3   c                 ó  •— |                      dd ¦  «        }|€% t          t          | ¦  «        j        |d g|¢R i |¤ŽS 	  ||i |¤Ž}n# |$ r}|cY d }~S d }~ww xY wd|›d|›�}|                      |                      ||¦  «        ¦  «        ‚)NÚ__msg__zfunction returned z, expected it to raise )ÚpoprÅ   r   ÚassertRaisesÚfailureExceptionrí   )
r}   Ú	_exc_typeÚ	_callablerl   rm   rë   ÚresultÚerrrì   rÊ   s
            €r1   rñ   zTestCase.assertRaisesŒ  sì   ø€ Ø�hŠh�y $Ñ'Ô'ˆØÐà5•5� 4Ñ(Ô(Ô5°iÀð EØ7;ðEð Eð EØ?CðEð Eð Eð	Ø�Y Ð-¨Ð-Ð-ˆFˆFøØð 	ð 	ð 	ØˆJˆJˆJˆJˆJˆJøøøøð	øøøð ð BHÀÀØAJÀðLˆà×#Ò# D×$7Ò$7¸¸SÑ$AÔ$AÑBÔBÐBs   Á A	 Á	AÁAÁAÁAc                 ó    — t          d¦  «        ‚)Nz%this alias is deprecated by unittest2)ÚAssertionError)r}   ÚaÚks      r1   ÚassertEqualszTestCase.assertEquals�  s   € ÝÐDÑEÔEÐEr3   c	                 ón  — t          |d¦  «        r
|}	|j        }nd}	|r$|                      t          |¦  «        ||¦  «         |r$|                      t          |¦  «        ||¦  «         |r|                      |||¦  «         |s|r~|	st          d¦  «        ‚|	j        }
|
                     d¦  «        s|
                     d¦  «        r
|
dd…         }
|r|                      |
||¦  «         |r|                      |
||¦  «         |r/|	st          d¦  «        ‚|                      |	j	        ||¦  «         dS dS )zÆcheck if warning matches specified parameters.
        'warning' is the instance of Warning to match against;
        can also be instance of WarningMessage (as returned by catch_warnings).
        ÚcategoryNz7matching on filename requires a WarningMessage instancez.pycz.pyoéÿÿÿÿz5matching on lineno requires a WarningMessage instance)
rP   ÚmessageÚassertEqualr�   ÚassertRegexÚassertIsInstanceÚ	TypeErrorÚfilenamerê   Úlineno)r}   ÚwarningÚ
message_rerÿ   rý   Úfilename_rer  r  rë   ÚwmsgÚreals              r1   ÚassertWarningzTestCase.assertWarning¤  s—  € õ �7˜JÑ'Ô'ð 	àˆDØ”oˆGˆGð ˆDð ð 	9Ø×Ò�S ™\œ\¨7°CÑ8Ô8Ð8Øð 	<Ø×Ò�S ™\œ\¨:°sÑ;Ô;Ð;Øð 	:Ø×!Ò! '¨8°SÑ9Ô9Ð9ð ð 	9�{ð 	9Øð ;Ýð !:ñ ;ô ;ð ;à”=ˆDØ�}Š}˜VÑ$Ô$ð !¨¯ª°fÑ(=Ô(=ð !ð ˜C˜R˜C”y�Øð 6Ø× Ò   x°Ñ5Ô5Ð5Øð 9Ø× Ò   {°CÑ8Ô8Ð8Øð 	7Øð ;Ýð !:ñ ;ô ;ð ;à×Ò˜Tœ[¨&°#Ñ6Ô6Ð6Ð6Ð6ð		7ð 	7r3   c                   ó.   ‡ — e Zd ZdZˆ fd„Zd„ Zd„ Zˆ xZS )úTestCase._AssertWarningListz'context manager for assertWarningList()c                 ó˜   •— || _         || _        t          t          j        | ¦  «        | _        | j                             d¬¦  «         d S )NT©Úrecord)Úcaserm   rÅ   r   Ú_AssertWarningListÚ_AssertWarningList__superÚ__init__)r}   r  rm   rÊ   s      €r1   r  z$TestCase._AssertWarningList.__init__Ö  sD   ø€ ØˆDŒIØˆDŒIÝ ¥Ô!<¸dÑCÔCˆDŒLØŒL×!Ò!¨Ð!Ñ.Ô.Ð.Ð.Ð.r3   c                 óB   — | j                              ¦   «         | _        d S r6   )r  rß   r§   ©r}   s    r1   rß   z%TestCase._AssertWarningList.__enter__Ü  s   € Ø”|×-Ò-Ñ/Ô/ˆDŒHˆHˆHr3   c                 ór   —  | j         j        |Ž  |d         € | j        j        | j        fi | j        ¤Ž d S d S ©Nr   )r  rá   r  ÚassertWarningListr§   rm   )r}   Úexc_infos     r1   rá   z$TestCase._AssertWarningList.__exit__ß  sM   € Ø!ˆDŒLÔ! 8Ð,Ð,Ø˜Œ{Ð"Ø+�”	Ô+¨D¬HÐBÐB¸¼	ÐBÐBÐBÐBÐBð #Ð"r3   ©rÌ   Ú
__module__Ú__qualname__Ú__doc__r  rß   rá   Ú__classcell__©rÊ   s   @r1   r  r  Ô  sc   ø€ € € € € Ø5Ð5ð	/ð 	/ð 	/ð 	/ð 	/ð	0ð 	0ð 	0ð	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	Cr3   r  c                 ó  — |€|€J ‚|                       | ||¬¦  «        S |€J ‚t          |t          t          f¦  «        s|g}t	          |¦  «        D ]µ\  }}t          |t
          ¦  «        rt          |¬¦  «        }n_t          |t          ¦  «        r&t          |t          ¦  «        rt          |¬¦  «        }n$t          |t          ¦  «        st          d¦  «        ‚	 ||         }n# t          $ r Y  n7w xY w | j        |fd|i|¤Ž Œ¶t          |¦  «        t          |¦  «        k    rdS dt          |¦  «        t          |¦  «        |                      |¦  «        |fz  }|                      |                      ||¦  «        ¦  «        ‚)zBcheck that warning list (e.g. from catch_warnings) matches patternN)rÈ   rë   )r  ©rý   z#entry must be str, warning, or dictrë   z0expected %d warnings, found %d: wlist=%s desc=%r)r  rr   ÚlistÚtupleÚ	enumerater�   Údictru   rR   ÚWarningr  Ú
IndexErrorr  ÚlenÚ_formatWarningListrò   rí   )r}   ÚwlistrÈ   rë   ri   ÚentryÚdatarì   s           r1   r  zTestCase.assertWarningListä  s´  € àˆ<ØÐ$Ð$Ð$Ø×*Ò*¨4°eÀÐ*ÑEÔEÐEàÐÐÐÝ˜$¥¥e Ñ-Ô-ð 	Ø�6ˆDÝ# D™/œ/ð 	ð 	‰JˆC�Ý˜%¥Ñ%Ô%ð GÝ¨Ð.Ñ.Ô.��Ý˜E¥4Ñ(Ô(ð G­Z¸½wÑ-GÔ-Gð GÝ eÐ,Ñ,Ô,��Ý ¥tÑ,Ô,ð GÝÐ EÑFÔFÐFðØ˜S”z��øÝð ð ð Ø��ðøøøàˆDÔ˜tÐ6Ð6¨Ð6°Ð6Ð6Ð6Ð6å�5‰zŒz�S ™YœYÒ&Ð&Ø�Ø@Ý�T‘”�C ™JœJ¨×(?Ò(?ÀÑ(FÔ(FÈÐMñNˆà×#Ò# D×$7Ò$7¸¸SÑ$AÔ$AÑBÔBÐBs   ÃC%Ã%
C3Ã2C3c                 ó<   — |€g } | j         ||g|¢R i |¤Ž |dd…= dS )zD[deprecated] assertWarningList() variant that clears list afterwardsN)r  )r}   r+  rÈ   rl   rm   s        r1   ÚconsumeWarningListzTestCase.consumeWarningList   s@   € àˆ<ØˆDØˆÔ˜u dÐ:¨TÐ:Ð:Ð:°TÐ:Ð:Ð:Ø�!�!�!ˆHˆHˆHr3   c                 óè   — d}t          |d¦  «        r-d|j        ›d|j        ›�}|j        r|d|j        ›�z  }|j        }t          |¦  «        }d|j        ›d|j        ›dt          |¦  «        ›|›d	�S )
Nr–   rÿ   z
 filename=z lineno=z line=ú<ú.z	 message=ú>)	rP   r  r  Úlinerÿ   ru   r  rÌ   r�   )r}   r,  ÚtailrÏ   s       r1   Ú_formatWarningzTestCase._formatWarning  s�   € ØˆÝ�5˜)Ñ$Ô$ð 	"ð 	"à/4¬~¨~¨~¸u¼|¸|ÐLˆDØŒzð 3Ø� e¤j jÐ2Ñ2�Ø”MˆEÝ�5‰kŒkˆˆØ),¬¨¨¸¼¸¸Ý+.¨u©:¬:¨:°t°t°tð=ð 	=r3   c                 óL   ‡ — dd                      ˆ fd„|D ¦   «         ¦  «        z  S )Nz[%s]ú, c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S r6   )r6  )r=   r,  r}   s     €r1   r?   z.TestCase._formatWarningList.<locals>.<genexpr>  s1   øè è € Ð!PÐ!PÀ $×"5Ò"5°eÑ"<Ô"<Ð!PÐ!PÐ!PÐ!PÐ!PÐ!Pr3   )Újoin)r}   r+  s   ` r1   r*  zTestCase._formatWarningList  s/   ø€ Ø˜Ÿ	š	Ð!PÐ!PÐ!PÐ!PÈ%Ð!PÑ!PÔ!PÑPÔPÑPÐPr3   c                 óR   — ddl m} |sddl m} |                      d|z   ¦  «        ‚dS )z,helper to skip test if stringprep is missingr   )Ú
stringprep)Ú_stringprep_missing_reasonz%not available - stringprep module is N)Úpasslib.utilsr<  r=  ÚskipTest)r}   r<  r=  s      r1   Úrequire_stringprepzTestCase.require_stringprep  sY   € à,Ð,Ð,Ð,Ð,Ð,Øð 	<Ø@Ð@Ð@Ð@Ð@Ð@Ø—-’-Ð GØ :ñ!;ñ <ô <ð <ð	<ð 	<r3   c                 óT   — t          |¦  «        s|                      d|z  ¦  «        ‚dS )z8skip test for all PASSLIB_TEST_MODE values below <level>zrequires >= %r test modeN)r$   r?  )r}   Úlevels     r1   Úrequire_TEST_MODEzTestCase.require_TEST_MODE!  s7   € å˜ÑÔð 	DØ—-’-Ð :¸UÑ BÑCÔCÐCð	Dð 	Dr3   c                 ó>   — t           r|                      d¦  «        S dS )z'skip test if writeable FS not availablez.GAE doesn't offer read/write filesystem accessN)ÚGAEr?  r  s    r1   Úrequire_writeable_filesystemz%TestCase.require_writeable_filesystem&  s*   € åð 	SØ—=’=Ð!QÑRÔRÐRð	Sð 	Sr3   rE   c                 óT  — | j         }|r||v r||         S | j        5  | j         }|r||v r||         cddd¦  «         S |s	i x}| _         |pt          j        }|€†t	          t
          j                             d¦  «        p2t
          j                             d¦  «        pt          j	        d¦  «        ¦  «        x}t          _        t                               d|¦  «         t          | ¦  «        }d                     t          |¦  «        |j        |j        | j        |g¦  «        }t%          j        |                     d¦  «        ¦  «                             ¦   «         }t	          |dd…         d¦  «        }t-          j        |¦  «        x}||<   |cddd¦  «         S # 1 swxY w Y   dS )	aU  
        Return a :class:`random.Random` object for current test method to use.
        Within an instance, multiple calls with the same name will return
        the same object.

        When first created, each RNG will be seeded with value derived from
        a global seed, the test class module & name, the current test method name,
        and the **name** parameter.

        The global seed taken from the $RANDOM_TEST_SEED env var,
        the $PYTHONHASHSEED env var, or a randomly generated the
        first time this method is called. In all cases, the value
        is logged for reproducibility.

        :param name:
            name to uniquely identify separate RNGs w/in a test
            (e.g. for threaded tests).

        :param seed:
            override global seed when initialzing rng.

        :rtype: random.Random
        NÚRANDOM_TEST_SEEDÚPYTHONHASHSEEDr¹   zusing RANDOM_TEST_SEED=%dú
rƒ   é   )Ú_random_cacheÚ_random_global_lockr   Ú_random_global_seedr¬   r*   ÚenvironÚgetÚsys_rngr½   r§   Úinforu   r:  r�   r  rÌ   Ú_testMethodNameÚhashlibÚsha256r…   Ú	hexdigestr»   r¼   )	r}   rÐ   rº   ÚcacheÚglobal_seedrÏ   r“   Údigestr›   s	            r1   Ú	getRandomzTestCase.getRandom9  s  € ð2 Ô"ˆØð 	�T˜U�]�]Ø˜”;ÐàÔ%ð 	ð 	ð Ô&ˆEØð 0˜ ˜˜Ø˜T”{ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð ð 0Ø-/Ð/�˜Ô*ð Ð>¥(Ô">ˆKØÐ"õ �œ
ŸšÐ'9Ñ:Ô:ð 0Ýœ
ŸšÐ'7Ñ8Ô8ð0åÔ+¨BÑ/Ô/ñ1ô 1ð1��hÔ:õ
 —’Ð4°kÑBÔBÐBõ �t‘*”*ˆCØ—Y’Y¥ KÑ 0Ô 0°#´.À#Ä,Ø $Ô 4°dð <ñ =ô =ˆFå”^ F§M¢M°'Ñ$:Ô$:Ñ;Ô;×EÒEÑGÔGˆFÝ�v˜c˜r˜c”{ BÑ'Ô'ˆDõ #)¤-°Ñ"5Ô"5Ð5ˆE�E˜$‘KØð=	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s   �F¿EFÆF!Æ$F!ÚsubTestc           
   /   ó&  •K  — dd„}|                       ¦   «         } ||i |¤Ž}| j        r! t          t          | ¦  «        j        |i |¤Ž}nt          ¦   «         }|5  |                     d|¦  «         	 dV — nk# t          $ r |                     d|¦  «         Y nIt          $ r=}| 	                    d|t          |¦  «        j        t          |¦  «        ¦  «         ‚ d}~ww xY wddd¦  «         n# 1 swxY w Y   |                     d|¦  «         dS )zt
        wrapper/backport for .subTest() which also traps SkipTest errors.
        (see source for details)
        Nc                 ó²   — | rd| z  nd}|r7|dd                      d„ |                     ¦   «         D ¦   «         ¦  «        z  z  }|                     ¦   «         pdS )Nz[%s] r–   z(%s)rç   c              3   ó:   K  — | ]}d t          |¦  «        z  V — ŒdS )z%s=%rN)r$  )r=   Úitems     r1   r?   z:TestCase.subTest.<locals>._render_title.<locals>.<genexpr>”  s-   è è € Ð(ZÐ(ZÀ4¨µ5¸±;´;Ñ)>Ð(ZÐ(ZÐ(ZÐ(ZÐ(ZÐ(Zr3   z	<subtest>)r:  ÚitemsÚstrip)Ú_msgÚparamsÚouts      r1   Ú_render_titlez'TestCase.subTest.<locals>._render_title‘  sb   € Ø%)Ð1�7˜T‘>�>¨rˆCØð [Ø�v §¢Ð(ZÐ(ZÈ6Ï<Ê<É>Ì>Ð(ZÑ(ZÔ(ZÑ ZÔ ZÑZÑZ�Ø—9’9‘;”;Ð- +Ð-r3   zrunning subtest: %szsubtest skipped: %szsubtest failed: %s: %s: %rzsubtest passed: %sr6   )Ú	getLoggerÚhas_real_subtestrÅ   r   r[  r"   rR  r   Ú	Exceptionr  ru   rÌ   r�   )	r}   rl   rm   re  Útest_logÚtitlerä   rö   rÊ   s	           €r1   r[  zTestCase.subTest|  s–  øè è € ð*	.ð 	.ð 	.ð 	.ð —>’>Ñ#Ô#ˆØ�˜tÐ, tÐ,Ð,ˆð Ô ð 	 Ø/•%� $Ñ'Ô'Ô/°Ð>¸Ð>Ð>ˆCˆCå‘-”-ˆCð ð 	ð 	Ø�MŠMÐ/°Ñ7Ô7Ð7ð
Ø����øÝð ð ð à—’Ð3°UÑ;Ô;Ð;Ø�Ýð ð ð ð × Ò Ð!=¸uÅdÈ3ÁiÄiÔFXÕZ]Ð^aÑZbÔZbÑcÔcÐcØøøøøð	øøøð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	�ŠÐ*¨EÑ2Ô2Ð2Ð2Ð2sB   ÁC0Á4A9Á8C0Á9 C!ÂC0Â	C!Â$8CÃC!Ã!C0Ã0C4Ã7C4c                 ó  ‡— |                       ¦   «          t          j        |i |¤Ž\  }}t          j        |¦  «         | j        Š‰€#g xŠ| _        ˆfd„}|                      |¦  «         ‰                     |¦  «         |S )z1create temp file that's cleaned up at end of testNc                  ó‚   •— ‰D ]5} t           j                             | ¦  «        rt          j        | ¦  «         Œ6‰d d …= d S r6   )r*   r+   ÚexistsÚremove)r+   Úqueues    €r1   Úcleanerz TestCase.mktemp.<locals>.cleaner¿  sE   ø€ Ø!ð (ð (�DÝ”w—~’~ dÑ+Ô+ð (Ýœ	 $™œ˜øØ˜!˜!˜!�H�H�Hr3   )rF  ÚtempfileÚmkstempr*   ÚcloseÚ_mktemp_queuerà   Úappend)r}   rl   rm   Úfdr+   rp  ro  s         @r1   ÚmktempzTestCase.mktemp·  s™   ø€ à×)Ò)Ñ+Ô+Ð+ÝÔ# TÐ2¨TÐ2Ð2‰ˆˆDÝ
Œ�‰ŒˆØÔ"ˆØˆ=Ø)+Ð+ˆE�DÔ&ðð ð ð ð ð
 �OŠO˜GÑ$Ô$Ð$Ø�Š�TÑÔÐØˆr3   Fc                 ó:  ‡‡— 	 t          ‰‰¦  «        }|                      t          ‰‰|¦  «         n.# t          $ r! |r‚ ˆˆfd„}|                      |¦  «         Y nw xY w|r(t	          ||¦  «        } t          |¦  «        |¦  «         t          ‰‰|¦  «         dS )z=monkeypatch object value, restoring original value on cleanupc                  óL   •— 	 t          ‰‰ ¦  «         d S # t          $ r Y d S w xY wr6   )ÚdelattrÚAttributeError)ÚattrÚobjs   €€r1   Úcleanupz#TestCase.patchAttr.<locals>.cleanupÏ  s@   ø€ ðÝ˜C Ñ&Ô&Ð&Ð&Ð&øÝ%ð ð ð Ø�D�Dðøøøs   ƒ •
#¢#N)rÎ   rà   Úsetattrr{  r   r   )r}   r}  r|  r›   Úrequire_existingÚwrapra   r~  s    ``     r1   rÙ   zTestCase.patchAttrÈ  sÜ   øø€ ð	6Ý˜3 Ñ%Ô%ˆDð �OŠO�G S¨$°Ñ5Ô5Ð5Ð5øõ ð 	%ð 	%ð 	%Øð Øðð ð ð ð ð ð
 �OŠO˜GÑ$Ô$Ð$Ð$Ð$ð	%øøøð ð 	Ý˜E 4Ñ(Ô(ˆEØ�E�$‰KŒK˜ÑÔÐÝ��T˜5Ñ!Ô!Ð!Ð!Ð!s   „2 ²(AÁAc                 ó¬   — t          | ¦  «        }|j        dz   t          |d|j        ¦  «        z   }| j        }|r|dz   |z   }t          j        |¦  «        S )z9
        return logger named after current test.
        r2  r  )ru   r  rÎ   rÌ   rS  Úloggingrf  )r}   rÏ   r+   rÐ   s       r1   rf  zTestCase.getLoggerÜ  s]   € õ �4‰jŒjˆàŒ~ Ñ#¥g¨c°>À3Ä<Ñ&PÔ&PÑPˆØÔ#ˆØð 	%Ø˜#‘: Ñ$ˆDÝÔ  Ñ&Ô&Ð&r3   r6   )NNNNNNN)NNN)rE   N)TF)/rÌ   r  r  r  rÇ   rÆ   r#   rÑ   rÔ   Ú_TestCase__unittest_skiprÝ   r×   rØ   rè   rí   rñ   rû   ÚassertNotEqualsÚassertRegexMatchesr  râ   Úcatch_warningsr  r  r/  r6  r*  r@  rC  rF  Ú	threadingÚLockrM  rN  rL  rZ  rP   Ú	_TestCaserg  Ú
contextlibÚcontextmanagerr[  rt  rw  rÙ   rf  r  r   s   @r1   r   r   -  sš  ø€ € € € € ðð ð$ Ððð ð ð ð ð ð@ð @ñ „]ð@ð ð)ð )ñ „]ð)ð
 €Oð Ðð<ð <ð <ð <ð <ðcð cð cð, €Kðð ð ðCð Cð Cð Cð Cð Cð"Fð Fð Fà+7Ð7€OÐ(ð 7;Ø&*Ø8<Ø$(Ø!%ð.7ð .7ð .7ð .7ð`Cð Cð Cð Cð C˜XÔ4ñ Cô Cð Cð Cð Cð Cð Cð8ð ð ð ð
=ð 
=ð 
=ðQð Qð Qð<ð <ð <ðDð Dð Dð
Sð Sð Sð )˜)œ.Ñ*Ô*Ðð Ðð €Mð;ð ;ð ;ð ;ðB �w˜y¨)Ñ4Ô4ÐàÔð33ð 33ð 33ð 33ñ Ôð33ðp €Mðð ð ð""ð "ð "ð "ð(
'ð 
'ð 
'ð 
'ð 
'ð 
'ð 
'r3   r   Úanyc                 ó   — d| _         | S )a0  
    decorator for HandlerCase.create_backend_case() --
    used to decorate methods that should be run even if backend isn't present
    (by default, full test suite is skipped when backend is missing)

    NOTE: tests decorated with this should not rely on handler have expected (or any!) backend.
    T)Ú_doesnt_require_backend)r­   s    r1   Údoesnt_require_backendr�  ó  s   € ð $(€DÔ Ø€Kr3   c                   ó4  ‡ — e Zd ZdZdZdZg Zg Zg Zg Z	g Z
g d¢Z ed¦  «         ed¦  «        dgZdZdZdZdZed„ ¦   «         Zd	Zed
„ ¦   «         Zed„ ¦   «         Zd„ Zd]d„Zd„ Zd„ Zd„ Zd^d„Zd_d„Zd„ Z d„ Z!d„ Z"d`d„Z#dZ$ed„ ¦   «         Z%ed„ ¦   «         Z&dZ'd„ Z(ˆ fd„Z)d„ Z*d„ Z+d„ Z,dad„Z-d „ Z.d!„ Z/d"„ Z0d#„ Z1d$„ Z2d%„ Z3ed&„ ¦   «         Z4d'„ Z5d(„ Z6d)„ Z7dZ8d*„ Z9d+„ Z:ed,„ ¦   «         Z;d-„ Z<d.„ Z=d/„ Z>d0„ Z?d1„ Z@d2„ ZAˆ fd3„ZBd4„ ZCd5„ ZDd6„ ZEd7„ ZFd8„ ZGd9„ ZHd:„ ZId;„ ZJd<„ ZKd=„ ZLd>„ ZMd?„ ZNd@„ ZOdA„ ZPdB„ ZQdC„ ZRdD„ ZSdE„ ZTdF„ ZUdG„ ZVdH„ ZWdI„ ZXdJ„ ZYdK„ ZZdL„ Z[dM„ Z\dN„ Z]g Z^dO„ Z_dP„ Z`dQ„ ZadR„ ZbdadS„ZcdT„ ZdedU„ ¦   «         ZeedV„ ¦   «         ZfdWZgdadX„ZhdY„ Zi G dZ„ d[ej¦  «        Zkd\„ Zlˆ xZmS )br'   aÙ  base class for testing password hash handlers (esp passlib.utils.handlers subclasses)

    In order to use this to test a handler,
    create a subclass will all the appropriate attributes
    filled as listed in the example below,
    and run the subclass via unittest.

    .. todo::

        Document all of the options HandlerCase offers.

    .. note::

        This is subclass of :class:`unittest.TestCase`
        (or :class:`unittest2.TestCase` if available).
    N))Ú	des_cryptÚ6f8c114b58f2c)Ú	md5_cryptz"$1$dOHYPKoP$tnxS1T8Q6VVn3kpV8cN6o.)Úsha512_cryptzx$6$rounds=123456$asaltof16chars..$BtCwjqMJGx5hrJhZywWvt0RLE8uZ4oPwcelCjmw2kSYu.Ec6ycULevoBK25fs2xXgMNrCzIMVcgEJAstJeonj1Útestu   â‚¬Â¥$s   â‚¬Â¥$Fc                 ó:   — dt          | j        dd¦  «        v rdS d S )NÚos_cryptre   r7   ó    )rÎ   rV   rÓ   s    r1   Úforbidden_charactersz HandlerCase.forbidden_charactersZ  s'   € ð � ¤¨j¸"Ñ=Ô=Ð=Ð=Ø�7Øˆtr3   Tc                 óx   — | j         }|j        }t          |d¦  «        r|d|                     ¦   «         ›d�z  }|S )Nr^   ú (ú	 backend))rV   rÐ   rP   r^   )r}   rV   rÐ   s      r1   rÇ   zHandlerCase.descriptionPrefixg  sH   € à”,ˆØŒ|ˆÝ�7˜MÑ*Ô*ð 	?ØˆD w×':Ò':Ñ'<Ô'<Ð'<Ð'<Ð>Ñ>ˆDØˆr3   c              #   ó€   K  — | j         D ]\  }}||fV — Œ| j        D ]\  }}}||fV — Œ| j        D ]\  }}}||fV — ŒdS )z*iterate through known (secret, hash) pairsN)Úknown_correct_hashesÚknown_correct_configsÚknown_alternate_hashes)rÏ   ÚsecretÚhashÚconfigÚalts        r1   Úiter_known_hasheszHandlerCase.iter_known_hashesv  s“   è è € ð  Ô4ð 	ð 	‰LˆF�DØ˜$�,ÐÐÐÐØ$'Ô$=ð 	ð 	Ñ ˆF�F˜DØ˜$�,ÐÐÐÐØ!$Ô!;ð 	ð 	ÑˆC�˜Ø˜$�,ÐÐÐÐð	ð 	r3   c                 ó’   — t          |                      ¦   «         ¦  «        }|                      ¦   «                              |¦  «        S )z#test random sample secret/hash pair)r#  r¦  rZ  Úchoice)r}   Úknowns     r1   Úget_sample_hashzHandlerCase.get_sample_hash€  s9   € å�T×+Ò+Ñ-Ô-Ñ.Ô.ˆØ�~Š~ÑÔ×&Ò& uÑ-Ô-Ð-r3   c                 ó  — |                       ||¦  «        }|                      |du p|du d|›�¦  «         | j        j        s|r#|sdS |sd|›d|›�}|                      |¦  «        ‚|rdS |sd|›d|›�}|                      |¦  «        ‚)z>helper to check verify() outcome, honoring is_disabled_handlerTFz%verify() returned non-boolean value: Nz)verify incorrectly returned True: secret=ú, hash=zverify failed: secret=)Ú	do_verifyÚ
assertTruerV   Úis_disabledrò   )r}   r¢  r£  rë   Únegaterõ   s         r1   Úcheck_verifyzHandlerCase.check_verifyˆ  sÚ   € à—’ ¨Ñ-Ô-ˆØ�Š˜ $˜Ð9¨&°E¨/øØEKÀVÐMñ	Oô 	Oð 	OàŒ<Ô#ð 	- vð 	-Øð Ø�Øð 'ð 'à˜˜  ð&�à×'Ò'¨Ñ,Ô,Ð,àð Ø�Øð Kð KØ=C¸V¸VÀTÀTÐJ�Ø×'Ò'¨Ñ,Ô,Ð,r3   c                 óH   — |                       |t          |›d|›�¦  «         d S )Nz#() failed to return native string: )r  r�   )r}   rõ   Ú	func_names      r1   Úcheck_returned_native_strz%HandlerCase.check_returned_native_str›  s;   € Ø×Ò˜f¥cØ9B¸¸ÀFÀFÐLñ	Nô 	Nð 	Nð 	Nð 	Nr3   c                 ó  — | j         }d|j        v rrd|vrp|j        }|j        }t	          d¬¦  «        rt          d|¦  «        |d<   dS d}t          |dd¦  «        dk    r||z  }n|d|z  z  }t          d||¦  «        |d<   dS dS dS )	z0subclassable method to populate default settingsrY   rD   ©rL   r@   Úrounds_costNÚlog2rd   )rV   rQ   r|   Údefault_roundsr$   rL   rÎ   )r}   rm   rV   ÚmnÚdfÚfactors         r1   Úpopulate_settingszHandlerCase.populate_settings£  s·   € ð ”,ˆØ�wÔ+Ð+Ð+°ÀÐ0DÐ0DØÔ#ˆBØÔ'ˆBÝ˜WÐ%Ñ%Ô%ð 
0å!$ Q¨¡¤��X‘��ð �Ý˜7 M°4Ñ8Ô8¸FÒBÐBØ˜&‘L�B�Bà˜A˜v™IÑ&�BÝ!$ Q¨¨B¡¤��X‘��ð ,Ð+Ð0DÐ0Dr3   c                 ó   — |S )z?subclassable method allowing 'secret' to be encode context kwdsr7   )r}   r¢  rm   s      r1   Úpopulate_contextzHandlerCase.populate_context¶  s   € àˆr3   c                 ón  — |                       |¦  «         |€i }|                      ||¦  «        }|reg }|r |j        di |¤Ž  |j        d¦  «         |                      |¦  «        5   |p| j        j        |fi |¤Žcddd¦  «         S # 1 swxY w Y   dS   |p| j        j        di |¤Žj        |fi |¤ŽS )z3call handler's hash() method with specified optionsNz"passing settings to.*is deprecatedr7   )	r½  r¿  Úupdateru  r  rV   ÚencryptÚusingr£  )r}   r¢  Úuse_encryptrV   ÚcontextÚsettingsrâ   s          r1   Ú
do_encryptzHandlerCase.do_encrypt»  s[  € à×Ò˜xÑ(Ô(Ð(Øˆ?ØˆGØ×&Ò& v¨wÑ7Ô7ˆØð 
	WàˆHØð FØ�”Ð*Ð* Ð*Ð*Ð*Ø�”Ð DÑEÔEÐEØ×'Ò'¨Ñ1Ô1ð Lð LØ8˜Ð/ 4¤<Ô8¸ÐKÐKÀ7ÐKÐKðLð Lð Lð Lñ Lô Lð Lð Lð Lð Lð Lð Løøøð Lð Lð Lð Lð Lð Lð DÐ2�GÐ+˜tœ|Ô2Ð>Ð>°XÐ>Ð>ÔCÀFÐVÐVÈgÐVÐVÐVs   Á(B
Â
BÂBc                 óZ   — |                       ||¦  «        } |p| j        j        ||fi |¤ŽS )zcall handler's verify method)r¿  rV   Úverify)r}   r¢  r£  rV   rm   s        r1   r­  zHandlerCase.do_verifyÍ  s;   € à×&Ò& v¨tÑ4Ô4ˆØ/�Ð'˜4œ<Ô/°¸ÐEÐEÀÐEÐEÐEr3   c                 ó6   — | j                              |¦  «        S )zcall handler's identify method)rV   Úidentify©r}   r£  s     r1   Údo_identifyzHandlerCase.do_identifyÒ  s   € àŒ|×$Ò$ TÑ*Ô*Ð*r3   c                 óP   — |                       |¦  «          | j        j        di |¤ŽS )z6call handler's genconfig method with specified optionsr7   )r½  rV   Ú	genconfig)r}   rm   s     r1   Údo_genconfigzHandlerCase.do_genconfigÖ  s1   € à×Ò˜tÑ$Ô$Ð$Ø%ˆtŒ|Ô%Ð-Ð-¨Ð-Ð-Ð-r3   c                 óV   — |                       ||¦  «        } | j        j        ||fi |¤ŽS )z4call handler's genhash method with specified options)r¿  rV   Úgenhash)r}   r¢  r¤  rm   s       r1   Ú
do_genhashzHandlerCase.do_genhashÛ  s6   € à×&Ò& v¨tÑ4Ô4ˆØ#ˆtŒ|Ô# F¨FÐ;Ð;°dÐ;Ð;Ð;r3   c                 óÌ   —  |p| j         j        di |¤Ž}|€i }|                      d|¦  «        }t          |¦  «        5   |j        |fi |¤Žcddd¦  «         S # 1 swxY w Y   dS )z–
        return sample hash for handler, w/o caring if digest is valid
        (uses some monkeypatching to minimize digest calculation cost)
        Nr–   r7   )rV   rÃ  r¿  r�   r£  )r}   rV   rÅ  rÆ  r¢  s        r1   Údo_stub_encryptzHandlerCase.do_stub_encryptà  sË   € ð
 2�7Ð*˜dœlÔ1Ð=Ð=°HÐ=Ð=ˆØˆ?ØˆGØ×&Ò& r¨7Ñ3Ô3ˆÝ" 7Ñ+Ô+ð 	3ð 	3Ø�7”< Ð2Ð2¨'Ð2Ð2ð	3ð 	3ð 	3ð 	3ñ 	3ô 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3øøøð 	3ð 	3ð 	3ð 	3ð 	3ð 	3s   ¾AÁAÁ Azbackend not availablec                 óŽ   — | j         }t          ||¦  «        st          d¦  «        sdS |                     |¦  «        rdS | j        S )z�
        helper for create_backend_case() --
        returns reason to skip backend, or None if backend should be tested
        rF   z$only default backend is being testedN)rV   rb   r$   rf   Ú_BACKEND_NOT_AVAILABLE)rÏ   r`   rV   s      r1   Ú_get_skip_backend_reasonz$HandlerCase._get_skip_backend_reasonô  sV   € ð ”+ˆÝ! '¨7Ñ3Ô3ð 	:½IÀfÑ<MÔ<Mð 	:Ø9Ð9Ø×Ò˜wÑ'Ô'ð 	Ø�4ØÔ)Ð)r3   c                 ó6  — | j         }|j        }t          |d¦  «        s
J d¦   «         ‚||j        v sJ d|›�¦   «         ‚| f}|dk    r|t          fz  }t          |›d|›d�|t          |›d|›d�||                      |¦  «        | j        ¬	¦  «        ¦  «        }|S )
Nre   z0handler must support uh.HasManyBackends protocolzunknown backend: r˜  r>   Ú_testrœ  r�  )rÇ   r`   Ú_skip_backend_reasonr  )	rV   rÐ   rP   re   ÚOsCryptMixinru   r&  rØ  r  )rÏ   r`   rV   rÐ   ÚbasesÚsubclss         r1   Úcreate_backend_casezHandlerCase.create_backend_case  sÕ   € à”+ˆØŒ|ˆÝ�w 
Ñ+Ô+Ð_Ð_Ð-_Ñ_Ô_Ð+Ø˜'Ô*Ð*Ð*Ð*Ð*ÀWÀWÐ,NÑ*Ô*Ð*Ø�ˆØ�jÒ Ð Ø•l�_Ñ$ˆEÝØ ˜D˜D ' ' 'Ð*ØÝØ7;°t°t¸W¸W¸WÐ"EØØ%(×%AÒ%AÀ'Ñ%JÔ%JØœ>ð	ñ ô ñ	
ô 	
ˆð ˆr3   c                 óR   — t          | | j        d¦  «        }t          |dd¦  «         S )z]
        check if current test method decorated with doesnt_require_backend() helper
        Nr�  F)rÎ   rS  )r}   Úmeths     r1   Ú_test_requires_backendz"HandlerCase._test_requires_backend  s.   € õ �t˜TÔ1°4Ñ8Ô8ˆÝ˜4Ð!:¸EÑBÔBÐBÐBr3   c                 óD  •— |                       ¦   «         }|r!| j        r|                      | j        ¦  «        ‚t          t          | ¦  «                             ¦   «          | j        }| j        }|r€t          |d¦  «        st          d¦  «        ‚	 |  
                    |j        |                     ¦   «         ¦  «         |                     |¦  «         n# t          j        j        $ r |r‚ Y nw xY wddlm} |                      |d|                      d¦  «        ¦  «         d S )Nr_   z)handler doesn't support multiple backendsr   )Úhandlersr   zsalt generator)râ  rÛ  r?  rÅ   r'   r×   rV   r`   rP   ÚRuntimeErrorrà   r_   r^   rS   r   r   r>  rä  rÙ   rZ  )r}   Útest_requires_backendrV   r`   rä  rÊ   s        €r1   r×   zHandlerCase.setUp$  sE  ø€ ð !%× ;Ò ;Ñ =Ô =ÐØ ð 	; TÔ%>ð 	;Ø—-’- Ô 9Ñ:Ô:Ð:å�k˜4Ñ Ô ×&Ò&Ñ(Ô(Ð(ð
 ”,ˆØ”,ˆØð 	Ý˜7 MÑ2Ô2ð PÝ"Ð#NÑOÔOÐOðØ—’ Ô 3°W×5HÒ5HÑ5JÔ5JÑKÔKÐKØ×#Ò# GÑ,Ô,Ð,Ð,øÝ”6Ô-ð ð ð Ø(ð Øðð ðøøøð 	+Ð*Ð*Ð*Ð*Ð*Ø�Š�x ¨¯ªÐ7GÑ(HÔ(HÑIÔIÐIÐIÐIs   ÂAC ÃC-Ã,C-c                 óF  ‡— | j         Šˆfd„} |d¦  «        }|                      |d¦  «         |                      |t          d¦  «         |                      |                     ¦   «         |k    d¦  «         |                      t          j        d|¦  «        d|›�¦  «          |d¦  «        }|                      |d	ud
¦  «         |                      |t          d¦  «          |d¦  «        }|                      |d	ud¦  «         |                      |t          d¦  «         d	S )zvalidate required attributesc                 ó&   •— t          ‰| d ¦  «        S r6   )rÎ   )rÐ   rV   s    €r1   Úgaz3HandlerCase.test_01_required_attributes.<locals>.gaH  s   ø€ Ý˜7 D¨$Ñ/Ô/Ð/r3   rÐ   zname not defined:zname must be native strzname not lower-case:z^[a-z0-9_]+$z$name must be alphanum + underscore: rQ   Nzsetting_kwds must be defined:zsetting_kwds must be a tuple:Úcontext_kwdszcontext_kwds must be defined:zcontext_kwds must be a tuple:)rV   r®  r  r�   rœ   r—   Úmatchr$  )r}   ré  rÐ   rÆ  rÅ  rV   s        @r1   Útest_01_required_attributesz'HandlerCase.test_01_required_attributesE  sB  ø€ à”,ˆð	0ð 	0ð 	0ð 	0ð 	0ð ˆr�&‰zŒzˆØ�Š˜Ð1Ñ2Ô2Ð2Ø×Ò˜d¥CÐ)BÑCÔCÐCØ�Š˜Ÿ
š
™œ¨Ò,Ð.DÑEÔEÐEØ�Š�œ °Ñ6Ô6Ð6ØDHÀDÐJñ	Lô 	Lð 	Lð �2�nÑ%Ô%ˆØ�Š˜¨Ð,Ð.MÑNÔNÐNØ×Ò˜h­Ð/NÑOÔOÐOð
 �"�^Ñ$Ô$ˆØ�Š˜ tÐ+Ð-LÑMÔMÐMØ×Ò˜g¥uÐ.MÑNÔNÐNÐNÐNr3   c                 ó6  — |                       ¦   «         }|                      |d¦  «         |                      d|¦  «        }|                      |d¦  «         |                      d|¦  «         |                      |                      |¦  «        d|›�¦  «         dS )z²test basic config-string workflow

        this tests that genconfig() returns the expected types,
        and that identify() and genhash() handle the result correctly.
        rÏ  ÚstubrÒ  r–   z2identify() failed to identify genconfig() output: N)rÐ  r´  rÓ  r­  r®  rÍ  )r}   r¤  rõ   s      r1   Útest_02_config_workflowz#HandlerCase.test_02_config_workflowe  s«   € ð ×"Ò"Ñ$Ô$ˆØ×&Ò& v¨{Ñ;Ô;Ð;ð —’ ¨Ñ0Ô0ˆØ×&Ò& v¨yÑ9Ô9Ð9ð 	�Š�r˜6Ñ"Ô"Ð"ð 	�Š˜×(Ò(¨Ñ0Ô0Ð0àˆVðñ	ô 	ð 	ð 	ð 	r3   c                 ó¨   — | j         }|                     ¦   «         }|                      ||¦  «         |                      |j        |j        ¦  «         dS )ztest basic using() workflowN)rV   rÃ  ÚassertIsNotr   rÐ   )r}   rV   rÞ  s      r1   Útest_02_using_workflowz"HandlerCase.test_02_using_workflowŽ  sL   € à”,ˆØ—’‘”ˆØ×Ò˜ Ñ)Ô)Ð)Ø×Ò˜œ g¤lÑ3Ô3Ð3Ð3Ð3r3   c                 ó4  — d}| j         D �]Œ}|                      ||¬¦  «        }|                      |d¦  «         |                      ||¦  «         |                      ||d¬¦  «         |                      ||¦  «        }|                      |d¦  «         | j        j        r(| j        r!|                      ||d|›d|›d	|›�¦  «         n |  	                    ||d
|›d|›d	|›�¦  «         |                      ||¦  «        }|                      |d¦  «         | j        j        r+| j        s$|  	                    ||d|›d|›d|›d	|›�¦  «         n#|                      ||d|›d|›d|›d	|›�¦  «         |  
                    |                      |¦  «        ¦  «         �ŒŽdS )zòtest basic hash-string workflow.

        this tests that hash()'s hashes are accepted
        by verify() and identify(), and regenerated correctly by genhash().
        the test is run against a couple of different stock passwords.
        rî  )rÄ  r£  T)r°  rÒ  z-genhash() failed to salt result hash: secret=ú hash=ú	: result=z+genhash() failed to reproduce hash: secret=z4genhash() failed to reproduce disabled-hash: secret=z other_secret=z"genhash() duplicated hash: secret=z wrong_secret=N)Ústock_passwordsrÇ  r´  r±  rÓ  rV   r¯  Údisabled_contains_saltÚassertNotEqualr   r®  rÍ  )r}   Úuse_16_legacyÚwrong_secretr¢  rõ   Úothers         r1   Útest_03_hash_workflowz!HandlerCase.test_03_hash_workflow—  s$  € ð ˆØÔ*ð -	6ñ -	6ˆFð
 —_’_ V¸�_ÑGÔGˆFØ×*Ò*¨6°6Ñ:Ô:Ð:ð
 ×Ò˜f fÑ-Ô-Ð-Ø×Ò˜l¨F¸4ÐÑ@Ô@Ð@ð
 —O’O F¨FÑ3Ô3ˆEØ×*Ò*¨5°)Ñ<Ô<Ð<ØŒ|Ô'ð :¨DÔ,Gð :Ø×#Ò# E¨6¨6à%+ V V¨V¨V¨V°U°Uð4<ñ =ô =ð =ð =ð × Ò  ¨¨à"( & &¨&¨&¨&°%°%ð19ñ :ô :ð :ð —O’O L°&Ñ9Ô9ˆEØ×*Ò*¨5°)Ñ<Ô<Ð<ØŒ|Ô'ð H°Ô0Kð HØ× Ò  ¨¨à"( & &¨&¨&¨&°,°,°,ÀÀð1Gñ Hô Hð Hð Hð ×#Ò# E¨6¨6à"( & &¨&¨&¨&°,°,°,ÀÀð4Gñ Hô Hð Hð �OŠO˜D×,Ò,¨VÑ4Ô4Ñ5Ô5Ð5Ñ5ð[-	6ð -	6r3   c                 ó2   — |                       d¬¦  «         dS )zEtest hash-string workflow with legacy .encrypt() & .genhash() methodsT)rù  N)rü  r  s    r1   Útest_03_legacy_hash_workflowz(HandlerCase.test_03_legacy_hash_workflowÎ  s   € à×"Ò"°Ð"Ñ6Ô6Ð6Ð6Ð6r3   c                 ó„  — |                       t          d¦  «        ¦  «        }|                      |d¦  «         |                      dt          |¦  «        ¦  «         |                      t          d¦  «        t          |¦  «        ¦  «         |                      dt          |¦  «        ¦  «        }|                      |d¦  «         | j        j        r| j        r|                      ||¦  «         n|  	                    ||¦  «         |                      t          d¦  «        t          |¦  «        ¦  «        }|                      |d¦  «         | j        j        r| j        r|                      ||¦  «         n|  	                    ||¦  «         |  
                    |                      t          |¦  «        ¦  «        ¦  «         dS )z#test hashes can be unicode or bytesrî  r£  rÒ  N)rÇ  r”   r´  r±  rÓ  rV   r¯  r÷  rø  r   r®  rÍ  )r}   rõ   rû  s      r1   Útest_04_hash_typeszHandlerCase.test_04_hash_typesÒ  s•  € ð —’¥ f¡¤Ñ.Ô.ˆØ×&Ò& v¨vÑ6Ô6Ð6ð 	×Ò˜&¥$ v¡,¤,Ñ/Ô/Ð/ð 	×Ò�$˜v™,œ,­¨V©¬Ñ5Ô5Ð5ð —’ ­¨V©¬Ñ5Ô5ˆØ×&Ò& u¨iÑ8Ô8Ð8ØŒ<Ô#ð 	,¨Ô(Cð 	,Ø×Ò  vÑ.Ô.Ð.Ð.à×Ò˜U FÑ+Ô+Ð+ð —’¥ V¡¤­d°6©l¬lÑ;Ô;ˆØ×&Ò& u¨iÑ8Ô8Ð8ØŒ<Ô#ð 	,¨Ô(Cð 	,Ø×Ò  vÑ.Ô.Ð.Ð.à×Ò˜U FÑ+Ô+Ð+ð 	�Š˜×(Ò(­¨f©¬Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7r3   c                 ób  — | j         }t          |d¦  «        s|                      d¦  «        ‚|                      |j        |                     ¦   «         ¦  «         |j        D ]Í}|                      |t          ¦  «         |  	                    |t          d|›�¦  «         |                     |¦  «        }|du r>|                     |¦  «         |                      |                     ¦   «         |¦  «         Œ“|du r"|                      t          |j        |¦  «         Œ¹t          d|›d|›�¦  «        ‚dS )	ztest multi-backend supportr_   zhandler only has one backendzinvalid backend name: TFzhas_backend(z) returned invalid value: N)rV   rP   r?  rà   r_   r^   re   r  r�   ÚassertNotInÚRESERVED_BACKEND_NAMESrf   r   rñ   r   r  )r}   rV   r`   Úrets       r1   Útest_05_backendszHandlerCase.test_05_backendsõ  se  € ð ”,ˆÝ�w Ñ.Ô.ð 	@Ø—-’-Ð >Ñ?Ô?Ð?ð 	�Š˜Ô+¨W×-@Ò-@Ñ-BÔ-BÑCÔCÐCð Ô'ð 	>ð 	>ˆGð
 ×!Ò! '­3Ñ/Ô/Ð/Ø×Ò˜WÕ&<Ð&<Ø;B¸7ÐDñFô Fð Fð ×%Ò% gÑ.Ô.ˆCØ�dˆ{ˆ{à×#Ò# GÑ,Ô,Ð,Ø× Ò  ×!4Ò!4Ñ!6Ô!6¸Ñ@Ô@Ð@Ð@à˜��à×!Ò!Õ"5°wÔ7JØ")ñ+ô +ð +ð +õ  �iØ/6¨w¨w¸¸ð!=ñ >ô >ð >ð5	>ð 	>r3   c                 óL   — d| j         j        vr|                      d¦  «        ‚d S )NÚsaltzhandler doesn't have salt)rV   rQ   r?  r  s    r1   Úrequire_saltzHandlerCase.require_salt!  s-   € Ø˜œÔ2Ð2Ð2Ø—-’-Ð ;Ñ<Ô<Ð<ð 3Ð2r3   c                 ó€   — |                       ¦   «          t          | j        ¦  «        s|                      d¦  «        ‚d S )Nz!handler doesn't provide salt info)r  r   rV   r?  r  s    r1   Úrequire_salt_infozHandlerCase.require_salt_info%  sF   € Ø×ÒÑÔÐÝ˜Tœ\Ñ*Ô*ð 	EØ—-’-Ð CÑDÔDÐDð	Eð 	Er3   c                 ód  — |                       ¦   «          | j        }| j        }|j        du}|r|j        dk     r |d¦  «        ‚|j        dk     r |d¦  «        ‚|r|j        |j        k    r |d¦  «        ‚|j        |j        k     r |d¦  «        ‚|r|j        |j        k    r |d¦  «        ‚d	|j        vr)|r|j        |j        k     rt          |j        ›d
�¦  «         |j	        r6|j
        s |d¦  «        ‚|j
        D ]}||j	        vr |d|›d�¦  «        ‚ŒdS |j
        s |d¦  «        ‚dS )z!validate optional salt attributesNrd   zmax_salt_chars must be >= 1r   zmin_salt_chars must be >= 0z(min_salt_chars must be <= max_salt_charsz*default_salt_size must be >= min_salt_sizez*default_salt_size must be <= max_salt_sizeÚ	salt_sizezR: hash handler supports range of salt sizes, but doesn't offer 'salt_size' settingz$default_salt_chars must not be emptyz1default_salt_chars must be subset of salt_chars: z not in salt_charsz;default_salt_chars MUST be specified if salt_chars is empty)r
  rò   rV   Úmax_salt_sizeÚmin_salt_sizeÚdefault_salt_sizerQ   r   rÐ   Ú
salt_charsÚdefault_salt_chars)r}   rø   rÏ   Úmx_setÚcs        r1   Ú test_10_optional_salt_attributesz,HandlerCase.test_10_optional_salt_attributes*  sß  € à×ÒÑ Ô Ð ØÔ.ˆØŒlˆð Ô#¨4Ð/ˆØð 	@�cÔ'¨!Ò+Ð+Ø �.Ð!>Ñ?Ô?Ð?ð Ô˜qÒ Ð Ø �.Ð!>Ñ?Ô?Ð?Øð 	M�cÔ'¨#Ô*;Ò;Ð;Ø �.Ð!KÑLÔLÐLð Ô  3Ô#4Ò4Ð4Ø �.Ð!MÑNÔNÐNØð 	O�cÔ+¨cÔ.?Ò?Ð?Ø �.Ð!MÑNÔNÐNð
 ˜cÔ.Ð.Ð.¸Ð.À#ÔBWÐZ]ÔZkÒBkÐBkÝØ?B¼x¸x¸xðJñ Kô Kð Kð Œ>ð 	dØÔ)ð MØ$�nÐ%KÑLÔLÐLØÔ+ð yð y�Ø˜CœNÐ*Ð*Ø(˜.˜.ÐtuÐtuÐtuÐ)wÑxÔxÐxð +ðyð yð Ô)ð dØ$�nÐ%bÑcÔcÐcðdð dr3   c                 óÄ   — | j         }t          |¦  «        sJ d|j        z   ¦   «         ‚ddlm} t          |j         |t          |j        ¦  «        d¦  «        z  ¦  «        S )z%calculate number of salt bits in hashzneed explicit bit-size for r   r¦   é   )	rV   r   rÐ   rª   r§   r¬   r  r)  r  )r}   rV   r§   s      r1   Ú	salt_bitszHandlerCase.salt_bitsS  sy   € ð ”,ˆÝ˜WÑ%Ô%ÐSÐSÐ'DÀwÄ|Ñ'SÑSÔSÐ%ØÐÐÐÐÐõ �7Ô,Ø�3•s˜7Ô5Ñ6Ô6¸Ñ:Ô:ñ;ñ <ô <ð 	<r3   c                 óª   ‡ ‡— ‰                       ¦   «          t          dd‰ j        z
  ¦  «        Šˆˆ fd„} |‰ j        ¦  «          |ˆ fd„¦  «         dS )z4test hash() / genconfig() creates new salt each timerd   rK  c                 ó”   •—  | ¦   «         }t          ‰¦  «        D ]} | ¦   «         }||k    r d S Œ‰                     d‰fz  ¦  «        ‚)Nz.failed to find different salt after %d samples)r   rò   )r­   Úvalue1r>   Úvalue2Úsamplesr}   s       €€r1   Úsamplerz0HandlerCase.test_11_unique_salt.<locals>.sampleri  sp   ø€ Ø�T‘V”VˆFÝ˜G‘_”_ð ð �Ø˜™œ�Ø˜VÒ#Ð#Ø�F�Fð $à×'Ò'ð )5Ø8?°zñ)Bñ Cô Cð Cr3   c                  ó.   •— ‰                       d¦  «        S ©Nrî  )rÇ  r  s   €r1   ú<lambda>z1HandlerCase.test_11_unique_salt.<locals>.<lambda>r  s   ø€ ˜Ÿš¨Ñ/Ô/€ r3   N)r  rL   r  rÐ  )r}   r  r  s   ` @r1   Útest_11_unique_saltzHandlerCase.test_11_unique_salt_  s‡   øø€ à×ÒÑÔÐõ �a˜ $¤.Ñ0Ñ1Ô1ˆð	Cð 	Cð 	Cð 	Cð 	Cð 	Cð 	ˆ�Ô!Ñ"Ô"Ð"ØˆÐ/Ð/Ð/Ð/Ñ0Ô0Ð0Ð0Ð0r3   c                 óx  — |                       ¦   «          | j        }|j        dd…         }|j        }||z  }|                      |¬¦  «         |                      d|¬¦  «         |dk    r*|                      t          | j        |dd…         ¬¦  «         |                      t          | j        d|dz
  ¬¦  «         dS )z.test hash() / genconfig() honors min_salt_sizer   rd   ©r  rî  ©r  Nrþ   )r
  rV   r  r  rÐ  rÇ  rñ   Ú
ValueError)r}   rV   Ú	salt_charÚmin_sizeÚs1s        r1   Útest_12_min_salt_sizez!HandlerCase.test_12_min_salt_sizet  sß   € à×ÒÑ Ô Ð à”,ˆØÔ& q¨ sÔ+ˆ	ØÔ(ˆð
 ˜Ñ!ˆØ×Ò˜rÐÑ"Ô"Ð"à�Š˜¨(ˆÑ3Ô3Ð3ð
 �aŠ<ˆ<Ø×Ò�j¨$Ô*;Ø#% c r c¤7ð ñ ,ô ,ð ,ð 	×Ò�* d¤o°vØ$,¨Q¡Jð 	ñ 	0ô 	0ð 	0ð 	0ð 	0r3   c                 óŠ  — |                       ¦   «          | j        }|j        }|j        dd…         }|�|dk    rb|dz  }|                      |¬¦  «        }|                      ||z   ¬¦  «        }|                      ||¦  «         |                      d¬¦  «         dS ||z  }|                      |¬¦  «        }|                      |¬¦  «         ||z   }|                      t          | j        |¬¦  «         |                      t          | j        |dz   ¬¦  «         t          |¦  «        rZt          j
        d¬	¦  «        5  |                      |d¬
¦  «        }ddd¦  «         n# 1 swxY w Y   |                      ||¦  «         |j        |k     r6|                      |dd…         ¬¦  «        }|                      ||¦  «         dS dS )z.test hash() / genconfig() honors max_salt_sizer   rd   Ni   i   r#  r$  Tr  )r  rO   rþ   )r
  rV   r  r  rÕ  rø  rñ   r%  rW   râ   r‡  r   r  )	r}   rV   Úmax_sizer&  r(  Úc1Úc2Ús2Úc3s	            r1   Útest_13_max_salt_sizez!HandlerCase.test_13_max_salt_sizeŽ  sF  € à×ÒÑ Ô Ð à”,ˆØÔ(ˆØÔ& q¨ sÔ+ˆ	ð Ð˜x¨7Ò3Ð3ð
 ˜TÑ!ˆBØ×%Ò%¨2Ð%Ñ.Ô.ˆBØ×%Ò%¨2°	©>Ð%Ñ:Ô:ˆBØ×Ò  BÑ'Ô'Ð'à× Ò ¨4Ð Ñ0Ô0Ð0Ð0Ð0ð ˜XÑ%ˆBØ×%Ò%¨2Ð%Ñ.Ô.ˆBà× Ò ¨8Ð Ñ4Ô4Ð4ð
 �i‘ˆBØ×Ò�j¨$Ô*>ÀRÐÑHÔHÐHà×Ò�j¨$Ô*>È(ÐUVÉ,ÐÑWÔWÐWõ
 # 7Ñ+Ô+ð )ÝÔ,°DÐ9Ñ9Ô9ð Eð EØ×-Ò-°2¸tÐ-ÑDÔD�BðEð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eà× Ò   RÑ(Ô(Ð(ð
 Ô$ xÒ/Ð/Ø×)Ò)¨r°#°2°#¬wÐ)Ñ7Ô7�Ø×#Ò# B¨Ñ+Ô+Ð+Ð+Ð+ð 0Ð/s   Ä=E!Å!E%Å(E%c                 óJ   — | j         rddlm} |                     |¦  «        }|S )zprepare generated saltr   )Úbcrypt64)Úfuzz_salts_need_bcrypt_repairÚpasslib.utils.binaryr2  Úrepair_unused)r}   r  r2  s      r1   Úprepare_saltzHandlerCase.prepare_saltÆ  s7   € àÔ-ð 	0Ø5Ð5Ð5Ð5Ð5Ð5Ø×)Ò)¨$Ñ/Ô/ˆDØˆr3   c           	      ó(  — |                       ¦   «          | j        }|j        }|j        }|j        }t          |t          ¦  «        }t          ||pd¦  «        D ]P}t          |¦  «        |k     rt          ||¦  «        }|  
                    |¦  «        }|                      |¬¦  «         ŒQt          d¦  «        }|r|                     d¦  «        }t          |d¦  «        }|D ]0}	|	|vr*|                      t           | j        |	|z  d|	›d�¬¦  «         Œ1d	S )
ztest hash() honors salt_charsr¹   r#  u    Ã¿rŽ   rd   zinvalid salt char ræ   )r  rï   N)r
  rV   r  r  r  rr   Úbytesr   r)  r   r6  rÕ  r   r…   rL   rñ   r%  )
r}   rV   Úmxrº  ÚcsÚrawr  r“   Úchunkr  s
             r1   Útest_14_salt_charszHandlerCase.test_14_salt_charsÍ  s?  € à×ÒÑ Ô Ð à”,ˆØÔ"ˆØÔ"ˆØÔˆÝ˜�UÑ#Ô#ˆõ ˜"˜b˜h BÑ'Ô'ð 	,ð 	,ˆDÝ�4‰yŒy˜2Š~ˆ~Ý$ T¨2Ñ.Ô.�Ø×$Ò$ TÑ*Ô*ˆDØ× Ò  dÐ Ñ+Ô+Ð+Ð+õ �:‘”ˆØð 	.Ø—]’] 9Ñ-Ô-ˆFÝ�B˜‘
”
ˆØð 	Jð 	JˆAØ˜ˆ{ˆ{Ø×!Ò!¥*¨dÔ.BÈÈ5ÉÈØEFÀQÀQÐ*Hð "ñ Jô Jð Jøð	Jð 	Jr3   c                 óJ   — t          | j        dd¦  «        rt          S t          S )z)hack to determine salt keyword's datatypeÚ_salt_is_bytesF)rÎ   rV   r8  r    r  s    r1   Ú	salt_typezHandlerCase.salt_typeè  s%   € õ �4”<Ð!1°5Ñ9Ô9ð 	ÝˆLåˆNr3   c                 óæ  — |                       ¦   «          | j        }t          | j        dd¦  «        pd} G d„ dt          ¦  «        }|                      t          | j        d |¦   «         ¬¦  «         |t          ur3|                      t          | j        dt          d¦  «        |z  ¬¦  «         |t          u s8t          r	|t          u s*|                      t          | j        dd	|z  ¬¦  «         d
S d
S d
S )ztest non-string salt valuesr  r   é   c                   ó   — e Zd ZdS )ú+HandlerCase.test_15_salt_type.<locals>.fakeN)rÌ   r  r  r7   r3   r1   ÚfakerD  ø  s   € € € € € ØˆDr3   rE  rî  r#  Úxó   xN)r  r@  rÎ   rV   Úobjectrñ   r  rÇ  r    r   r8  r!   )r}   r@  r  rE  s       r1   Útest_15_salt_typezHandlerCase.test_15_salt_typeñ  s  € à×ÒÑÔÐØ”Nˆ	Ý˜DœL¨/¸1Ñ=Ô=ÐBÀˆ	ð	ð 	ð 	ð 	ð 	•6ñ 	ô 	ð 	à×Ò�) T¤_°fÀ4À4Á6Ä6ÐÑJÔJÐJð �GÐ#Ð#Ø×Ò�i¨¬¸&ÅqÈÁvÄvÐPYÑGYÐÑZÔZÐZð �UÐ"Ð"¥sÐ"¨y½GÐ/CÐ/CØ×Ò�i¨¬¸&ÀtÈiÑGWÐÑXÔXÐXÐXÐXð #Ð"Ð/CÐ/Cr3   c                 óD  — |                       ¦   «          | j        }|j        }|j        }|j        }|                      t          |j        d¬¦  «         |                      t          g¦  «        5  |                     dd¬¦  «        }ddd¦  «         n# 1 swxY w Y   |  
                    |j        |¦  «         |r�|                      t          |j        |dz   ¬¦  «         |                      t          g¦  «        5  |                     |dz   d¬¦  «        }ddd¦  «         n# 1 swxY w Y   |  
                    |j        |¦  «         ||k    r¤|                     |dz   ¬¦  «        }|  
                    |j        |dz   ¦  «         |  
                    |j        |¦  «         |                     |dz   ¬¦  «        }|  
                    |j        |dz   ¦  «         |  
                    |j        |¦  «         ||k    r|}n|dz   }|                     t          |¦  «        ¬¦  «        }|  
                    |j        |¦  «         |                      t          |j        t          |¦  «        dz   ¬¦  «         |                     |¬	¦  «        }|  
                    |j        |¦  «         dS )
z$Handler.using() -- default_salt_sizerþ   )r  T)r  rO   Nrd   r  Úxxxr$  )r
  rV   r  r  r  rñ   r%  rÃ  r  r   r   r�   )r}   rV   rº  r9  r»  ÚtempÚrefs          r1   Útest_using_salt_sizez HandlerCase.test_using_salt_size  s*  € à×ÒÑ Ô Ð à”,ˆØÔ"ˆØÔ"ˆØÔ&ˆð 	×Ò�* g¤mÀrÐÑJÔJÐJØ×#Ò#Õ%7Ð$8Ñ9Ô9ð 	Eð 	EØ—=’=°2¸t�=ÑDÔDˆDð	Eð 	Eð 	Eñ 	Eô 	Eð 	Eð 	Eð 	Eð 	Eð 	Eð 	Eøøøð 	Eð 	Eð 	Eð 	Eà×Ò˜Ô/°Ñ4Ô4Ð4ð ð 	9Ø×Ò�j¨'¬-È2ÈaÉ4ÐÑPÔPÐPØ×'Ò'Õ);Ð(<Ñ=Ô=ð Kð KØ—}’}°r¸!±tÀT�}ÑJÔJ�ðKð Kð Kñ Kô Kð Kð Kð Kð Kð Kð Køøøð Kð Kð Kð Kà×Ò˜TÔ3°RÑ8Ô8Ð8ð �Š8ˆ8Ø—=’=°2°a±4�=Ñ8Ô8ˆDØ×Ò˜TÔ3°R¸±TÑ:Ô:Ð:Ø×Ò˜WÔ6¸Ñ;Ô;Ð;à—=’=°2°a±4�=Ñ8Ô8ˆDØ×Ò˜TÔ3°R¸±TÑ:Ô:Ð:Ø×Ò˜WÔ6¸Ñ;Ô;Ð;ð �Š8ˆ8ØˆCˆCà�q‘&ˆCØ�}Š}­s°3©x¬xˆ}Ñ8Ô8ˆØ×Ò˜Ô/°Ñ5Ô5Ð5ð 	×Ò�* g¤mÅsÈ3ÁxÄxÐRWÑGWÐÑXÔXÐXð �}Š} sˆ}Ñ+Ô+ˆØ×Ò˜Ô/°Ñ5Ô5Ð5Ð5Ð5s$   Á.BÂBÂBÃ:D!Ä!D%Ä(D%c                 óX   — t          | j        ¦  «        s|                      d¦  «        ‚d S )Nzhandler lacks rounds attributes)r   rV   r?  r  s    r1   Úrequire_rounds_infozHandlerCase.require_rounds_info7  s4   € Ý˜tœ|Ñ,Ô,ð 	CØ—-’-Ð AÑBÔBÐBð	Cð 	Cr3   c                 ó¸  — |                       ¦   «          | j        }| j        }|j        € |d¦  «        ‚|j        dk     r |d¦  «        ‚|j        dk     r |d¦  «        ‚|j        |j        k    r |d¦  «        ‚|j        �6|j        |j        k     r |d¦  «        ‚|j        |j        k    r |d	¦  «        ‚|j        t          vr |d
|j        ›�¦  «        ‚dS )z#validate optional rounds attributesNzmax_rounds not specifiedrd   zmax_rounds must be >= 1r   zmin_rounds must be >= 0z min_rounds must be <= max_roundsz$default_rounds must be >= min_roundsz$default_rounds must be <= max_roundszunknown rounds cost constant: )rP  rV   rò   Ú
max_roundsr|   r¹  r·  r   )r}   rÏ   rø   s      r1   Ú"test_20_optional_rounds_attributesz.HandlerCase.test_20_optional_rounds_attributes;  s  € à× Ò Ñ"Ô"Ð"àŒlˆØÔ.ˆð Œ>Ð!Ø �.Ð!;Ñ<Ô<Ð<ØŒ>˜AÒÐØ �.Ð!:Ñ;Ô;Ð;ð Œ>˜AÒÐØ �.Ð!:Ñ;Ô;Ð;ØŒ>˜CœNÒ*Ð*Ø �.Ð!CÑDÔDÐDð ÔÐ)ØÔ! C¤NÒ2Ð2Ø$�nÐ%KÑLÔLÐLØÔ! C¤NÒ2Ð2Ø$�nÐ%KÑLÔLÐLð Œ?Õ"4Ð4Ð4Ø �.�.ÀsÄÀÐ!XÑYÔYÐYð 5Ð4r3   c                 ó:  — |                       ¦   «          | j        }|j        }|                      |¬¦  «         |                      d|¬¦  «         |                      t          | j        |dz
  ¬¦  «         |                      t          | j        d|dz
  ¬¦  «         dS )z+test hash() / genconfig() honors min_rounds©rY   rî  rd   N)rP  rV   r|   rÐ  rÇ  rñ   r%  )r}   rV   r|   s      r1   Útest_21_min_roundszHandlerCase.test_21_min_roundsY  s    € à× Ò Ñ"Ô"Ð"Ø”,ˆØÔ'ˆ
ð 	×Ò ÐÑ,Ô,Ð,Ø�Š˜ zˆÑ2Ô2Ð2ð 	×Ò�* dÔ&7À
È1ÁÐÑMÔMÐMØ×Ò�* d¤o°vÀjÐQRÁlÐÑSÔSÐSÐSÐSr3   c                 óD  — |                       ¦   «          | j        }|j        }|�K|                      t          | j        |dz   ¬¦  «         |                      t          | j        d|dz   ¬¦  «         |€|                      d¬¦  «         dS |                      |¬¦  «         dS )z+test hash() / genconfig() honors max_roundsNrd   rU  rî  iÿÿÿ)rP  rV   rR  rñ   r%  rÐ  rÇ  rÕ  )r}   rV   rR  s      r1   Útest_21b_max_roundszHandlerCase.test_21b_max_roundsi  s±   € à× Ò Ñ"Ô"Ð"Ø”,ˆØÔ'ˆ
àÐ!à×Ò�j¨$Ô*;ÀJÈqÁLÐÑQÔQÐQØ×Ò�j¨$¬/¸6È*ÐUVÉ,ÐÑWÔWÐWð ÐØ× Ò ¨Ð Ñ6Ô6Ð6Ð6Ð6à× Ò ¨
Ð Ñ3Ô3Ð3Ð3Ð3r3   c                 óþ  •‡
— |                       ¦   «          | j        }|j        dk    r.|Š
|                     ¦   «         }t	          ˆˆ
fd„¦  «        |_        |j        }|j        }|j        }|pd|z   dz  }||k    r|dz  }||z   dz  }|pd|z   dz  }|j        dk    r|dz  }|dz  }|dz  }d}nd}|  	                    g ¦  «        5  |                     |||¬¦  «        }	ddd¦  «         n# 1 swxY w Y   ||	||||fS )zU
        setup test helpers for testing handler.using()'s rounds parameters.
        Ú
bsdi_cryptc                 óH   •— t          ‰| ¦  «                             ¦   «         S r6   )rÅ   Ú_generate_rounds)rÏ   rÊ   Úorig_handlers    €€r1   r   z9HandlerCase._create_using_rounds_helper.<locals>.<lambda>Š  s   ø€ ½uÀ\ÐSVÑ?WÔ?W×?hÒ?hÑ?jÔ?j€ r3   i'  r  rd   )Úmin_desired_roundsÚmax_desired_roundsr¹  N)
rP  rV   rÐ   rÃ  Úclassmethodr\  r|   rR  r¹  r  )r}   rV   Úorig_min_roundsÚorig_max_roundsÚorig_default_roundsÚmediumÚsmallÚlargeÚadjrÞ  r]  rÊ   s             @€r1   Ú_create_using_rounds_helperz'HandlerCase._create_using_rounds_helper  s—  øø€ ð 	× Ò Ñ"Ô"Ð"Ø”,ˆàŒ<˜<Ò'Ð'à"ˆLØ—m’m‘o”oˆGÝ'2Ð3jÐ3jÐ3jÐ3jÐ3jÑ'kÔ'kˆGÔ$ð "Ô,ˆØ!Ô,ˆØ%Ô4ÐØ"Ð* d¨oÑ=À!ÑCˆØÐ(Ò(Ð(Ø�a‰KˆFØ  6Ñ)¨aÑ/ˆØ!Ð) T¨VÑ3¸Ñ9ˆàŒ<˜<Ò'Ð'à�Q‰JˆEØ�a‰KˆFØ�Q‰JˆEØˆCˆCàˆCð ×#Ò# BÑ'Ô'ð 	ð 	Ø—]’]Ø#(Ø#(Ø%ð #ñ ô ˆFð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ˜  v¨u°cÐ9Ð9s   ÃC,Ã,C0Ã3C0c                 ó¸  — |                       ¦   «          | j        }|j        }|j        }|j        }|                      ¦   «         \  }}}}}}	|                      |j        |¦  «         |                      |j        |¦  «         |                      |j        d¦  «         |                      |j        d¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        |¦  «         |                      |j        |¦  «         dS )z@
        HasRounds.using() -- sanity check test harness
        N)	rP  rV   r|   rR  r¹  rh  r   r^  r_  )
r}   rV   ra  rb  rc  rÞ  re  rd  rf  rg  s
             r1   Útest_has_rounds_using_harnessz)HandlerCase.test_has_rounds_using_harnessª  sY  € ð
 	× Ò Ñ"Ô"Ð"Ø”,ˆØ!Ô,ˆØ!Ô,ˆØ%Ô4ÐØ59×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sð 	×Ò˜Ô+¨_Ñ=Ô=Ð=Ø×Ò˜Ô+¨_Ñ=Ô=Ð=Ø×Ò˜Ô3°TÑ:Ô:Ð:Ø×Ò˜Ô3°TÑ:Ô:Ð:Ø×Ò˜Ô/Ð1DÑEÔEÐEð 	×Ò˜Ô*¨OÑ<Ô<Ð<Ø×Ò˜Ô*¨OÑ<Ô<Ð<Ø×Ò˜Ô.°Ñ7Ô7Ð7Ø×Ò˜Ô2°EÑ:Ô:Ð:Ø×Ò˜Ô2°EÑ:Ô:Ð:Ð:Ð:r3   c                 ó@  — |                       ¦   «         \  }}}}}}|j        }|j        }|j        }	|dk    r�|                      t
          |j        ||z
  ¬¦  «         |                      t          g¦  «        5  |                     ||z
  d¬¦  «        }
ddd¦  «         n# 1 swxY w Y   |  	                    |
j
        |¦  «         |r�|                      t
          |j        ||z   ¬¦  «         |                      t          g¦  «        5  |                     ||z   d¬¦  «        }
ddd¦  «         n# 1 swxY w Y   |  	                    |
j
        |¦  «         |                      g ¦  «        5  |                     ||z
  ¬¦  «        }
ddd¦  «         n# 1 swxY w Y   |  	                    |
j
        ||z
  ¦  «         |                     |d|z  z   ¬¦  «        }
|  	                    |
j
        |d|z  z   ¦  «         |                      g ¦  «        5  |                     ||z   ¬¦  «        }
ddd¦  «         n# 1 swxY w Y   |  	                    |
j
        ||z   ¦  «         |  	                    t          |||z   ¦  «        ||z   ¦  «         |  	                    t          ||¦  «        |¦  «         |                      g ¦  «        5  |  	                    t          |||z
  ¦  «        ||z
  ¦  «         ddd¦  «         n# 1 swxY w Y   |                     |¬¦  «        }
|  	                    |
j
        |¦  «         |                     t          |¦  «        ¬¦  «        }
|  	                    |
j
        |¦  «         |                      t
          |j        t          |¦  «        dz   ¬¦  «         dS )	zF
        HasRounds.using() -- min_rounds / min_desired_rounds
        r   ©r^  T)r^  rO   Nr  ©r|   rK  )rh  r|   rR  r¹  rñ   r%  rÃ  r  r   r   r^  r\   r�   )r}   rV   rÞ  re  rd  rf  rg  ra  rb  rc  rL  s              r1   Ú"test_has_rounds_using_w_min_roundsz.HandlerCase.test_has_rounds_using_w_min_roundsÄ  s  € ð
 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sØ!Ô,ˆØ!Ô,ˆØ%Ô4Ðð ˜QÒÐØ×Ò�j¨'¬-ÈOÐ^aÑLaÐÑbÔbÐbØ×'Ò'Õ);Ð(<Ñ=Ô=ð ]ð ]Ø—}’}¸È#Ñ8MÐW[�}Ñ\Ô\�ð]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]à×Ò˜TÔ4°oÑFÔFÐFð ð 	GØ×Ò�j¨'¬-ÈOÐ^aÑLaÐÑbÔbÐbØ×'Ò'Õ);Ð(<Ñ=Ô=ð ]ð ]Ø—}’}¸È#Ñ8MÐW[�}Ñ\Ô\�ð]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]à×Ò˜TÔ4°oÑFÔFÐFð ×#Ò# BÑ'Ô'ð 	@ð 	@Ø—<’<°5¸3±;�<Ñ?Ô?ˆDð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@à×Ò˜Ô0°%¸#±+Ñ>Ô>Ð>ð �|Š|¨u°q¸3±w©ˆ|Ñ?Ô?ˆØ×Ò˜Ô0°%¸!¸c¹'±/ÑBÔBÐBð ×#Ò# BÑ'Ô'ð 	@ð 	@Ø—<’<°5¸3±;�<Ñ?Ô?ˆDð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@à×Ò˜Ô0°%¸#±+Ñ>Ô>Ð>ð 	×ÒÕ-¨f°e¸c±kÑBÔBÀEÈCÁKÑPÔPÐPØ×ÒÕ-¨f°eÑ<Ô<¸eÑDÔDÐDØ×#Ò# BÑ'Ô'ð 	Uð 	UØ×ÒÕ1°&¸%À#¹+ÑFÔFÈÐPSÉÑTÔTÐTð	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uøøøð 	Uð 	Uð 	Uð 	Uð �}Š}¨ˆ}Ñ.Ô.ˆØ×Ò˜Ô0°%Ñ8Ô8Ð8ð �}Š}­¨E©
¬
ˆ}Ñ3Ô3ˆØ×Ò˜Ô0°%Ñ8Ô8Ð8ð 	×Ò�* g¤mÅÀEÁ
Ä
ÈUÑ@RÐÑSÔSÐSÐSÐSsZ   Á7BÂB"Â%B"ÄD-Ä-D1Ä4D1Å(FÆFÆFÈ	H/È/H3È6H3Ê;+K2Ë2K6Ë9K6c                 óŠ  — |                       ¦   «         \  }}}}}}|j        }|j        }|dk    r�|                      t          |j        ||z
  ¬¦  «         |                      t          g¦  «        5  |                     ||z
  d¬¦  «        }	ddd¦  «         n# 1 swxY w Y   |                      |	j	        |¦  «         |r�|                      t          |j        ||z   ¬¦  «         |                      t          g¦  «        5  |                     ||z   d¬¦  «        }	ddd¦  «         n# 1 swxY w Y   |                      |	j	        |¦  «         |                      t          g¦  «        5  |                     ||z
  ¬¦  «        }	ddd¦  «         n# 1 swxY w Y   |                      |	j	        |¦  «         |                      t          |j        ||z   ||z
  ¬¦  «         |                     |d|z  z
  ¬¦  «        }	|                      |	j        |d|z  z
  ¦  «         |                      g ¦  «        5  |                     ||z   ¬¦  «        }	ddd¦  «         n# 1 swxY w Y   |                      |	j	        ||z   ¦  «         |                      t          |||z
  ¦  «        ||z
  ¦  «         |                      t          ||¦  «        |¦  «         |                      g ¦  «        5  |                      t          |||z   ¦  «        ||z   ¦  «         ddd¦  «         n# 1 swxY w Y   |                     |¬	¦  «        }	|                      |	j	        |¦  «         |                     t          |¦  «        ¬¦  «        }	|                      |	j	        |¦  «         |                      t          |j        t          |¦  «        d
z   ¬¦  «         dS )zF
        HasRounds.using() -- max_rounds / max_desired_rounds
        r   )r_  T)r_  rO   N©r^  r_  r  rl  ©rR  rK  )rh  r|   rR  rñ   r%  rÃ  r  r   r   r_  r   r^  r\   r�   )
r}   rV   rÞ  re  rd  rf  rg  ra  rb  rL  s
             r1   Ú$test_has_rounds_replace_w_max_roundsz0HandlerCase.test_has_rounds_replace_w_max_roundsü  sH  € ð
 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sØ!Ô,ˆØ!Ô,ˆð ˜QÒÐØ×Ò�j¨'¬-ÈOÐ^aÑLaÐÑbÔbÐbØ×'Ò'Õ);Ð(<Ñ=Ô=ð ]ð ]Ø—}’}¸È#Ñ8MÐW[�}Ñ\Ô\�ð]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]à×Ò˜TÔ4°oÑFÔFÐFð ð 	GØ×Ò�j¨'¬-ÈOÐ^aÑLaÐÑbÔbÐbØ×'Ò'Õ);Ð(<Ñ=Ô=ð ]ð ]Ø—}’}¸È#Ñ8MÐW[�}Ñ\Ô\�ð]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]ð ]ð ]ð ]øøøð ]ð ]ð ]ð ]à×Ò˜TÔ4°oÑFÔFÐFð ×#Ò#Õ%9Ð$:Ñ;Ô;ð 	@ð 	@Ø—<’<°5¸3±;�<Ñ?Ô?ˆDð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@à×Ò˜Ô0°%Ñ8Ô8Ð8ð 	×Ò�* f¤lØ-3°C©ZØ-3°C©Zð 	ñ 	9ô 	9ð 	9ð
 �|Š|¨u°q¸3±w©ˆ|Ñ?Ô?ˆØ×Ò˜Ô0°%¸!¸c¹'±/ÑBÔBÐBð ×#Ò# BÑ'Ô'ð 	@ð 	@Ø—<’<°5¸3±;�<Ñ?Ô?ˆDð	@ð 	@ð 	@ñ 	@ô 	@ð 	@ð 	@ð 	@ð 	@ð 	@ð 	@øøøð 	@ð 	@ð 	@ð 	@à×Ò˜Ô0°%¸#±+Ñ>Ô>Ð>ð 	×ÒÕ-¨f°e¸c±kÑBÔBÀEÈCÁKÑPÔPÐPØ×ÒÕ-¨f°eÑ<Ô<¸eÑDÔDÐDØ×#Ò# BÑ'Ô'ð 	Uð 	UØ×ÒÕ1°&¸%À#¹+ÑFÔFÈÐPSÉÑTÔTÐTð	Uð 	Uð 	Uñ 	Uô 	Uð 	Uð 	Uð 	Uð 	Uð 	Uð 	Uøøøð 	Uð 	Uð 	Uð 	Uð �}Š}¨ˆ}Ñ.Ô.ˆØ×Ò˜Ô0°%Ñ8Ô8Ð8ð �}Š}µ°E±
´
ˆ}Ñ;Ô;ˆØ×Ò˜Ô0°%Ñ8Ô8Ð8ð 	×Ò�* g¤mÍÈEÉ
Ì
ÐUZÑHZÐÑ[Ô[Ð[Ð[Ð[sZ   Á0BÂBÂBÃ?D&Ä&D*Ä-D*Å'FÆFÆFÈ.IÉIÉIË +LÌLÌLc                 ó8  — |                       ¦   «         \  }}}}}}|j        }|                     ||z   ¬¦  «        }|                      |j        ||z   ¦  «         |                     ||z
  ¬¦  «        }|                      |j        ||z
  ¦  «         |                      t          |j        ||z
  ¬¦  «         |r%|                      t          |j        ||z   ¬¦  «         |                      t          |¦  «        |¦  «         |                      t          |||z   ¦  «        ||z   ¦  «         |                     t          |¦  «        ¬¦  «        }|                      |j        |¦  «         |                      t          |j        t          |¦  «        dz   ¬¦  «         dS )z5
        HasRounds.using() -- default_rounds
        rm  rq  )r¹  rK  N)	rh  rR  rÃ  r   r¹  rñ   r%  r\   r�   ©	r}   rV   rÞ  re  rd  rf  rg  rb  rL  s	            r1   Ú&test_has_rounds_using_w_default_roundsz2HandlerCase.test_has_rounds_using_w_default_rounds8  s”  € ð
 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sØ!Ô,ˆð
 �|Š| v¨c¡zˆ|Ñ2Ô2ˆØ×Ò˜Ô,¨f°S©jÑ9Ô9Ð9ð �|Š| v¨c¡zˆ|Ñ2Ô2ˆØ×Ò˜Ô,¨f°S©jÑ9Ô9Ð9ð 	×Ò�* f¤lÀ5ÈÁ9ÐÑMÔMÐMð ð 	RØ×Ò�j¨&¬,ÀuÈSÁyÐÑQÔQÐQð 	×ÒÕ-¨fÑ5Ô5°vÑ>Ô>Ð>Ø×ÒÕ-¨f°f¸S±jÑAÔAÀ6È#Á:ÑNÔNÐNð �}Š}­C°©K¬Kˆ}Ñ8Ô8ˆØ×Ò˜Ô,¨fÑ5Ô5Ð5ð 	×Ò�* g¤mÅCÈÁKÄKÐRWÑDWÐÑXÔXÐXÐXÐXr3   c                 ó"  — |                       ¦   «         \  }}}}}}|j        }|                     ||z   ¬¦  «        }|                      |j        ||z   ¦  «         |                      |j        ||z   ¦  «         |                      |j        ||z   ¦  «         |                     |dz   ||z   |||z
  ¬¦  «        }|                      |j        ||z   ¦  «         |                      |j        |¦  «         |                      |j        ||z
  ¦  «         dS )z-
        HasRounds.using() -- rounds
        rU  rd   )rY   r|   r¹  rR  N)rh  rR  rÃ  r   r^  r¹  r_  rt  s	            r1   Útest_has_rounds_using_w_roundsz*HandlerCase.test_has_rounds_using_w_rounds^  s$  € ð
 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sØ!Ô,ˆð �|Š| 6¨#¡:ˆ|Ñ.Ô.ˆØ×Ò˜Ô0°&¸±*Ñ=Ô=Ð=Ø×Ò˜Ô,¨f°S©jÑ9Ô9Ð9Ø×Ò˜Ô0°&¸±*Ñ=Ô=Ð=ð �|Š| 6¨!¡8¸¸c¹	Ø+1¸eÀC¹ið ñ Iô Iˆà×Ò˜Ô0°%¸±)Ñ<Ô<Ð<Ø×Ò˜Ô,¨fÑ5Ô5Ð5Ø×Ò˜Ô0°%¸±)Ñ<Ô<Ð<Ð<Ð<r3   c                 óî  ‡— |                       ¦   «         \  }Š}}}}ˆfd„}|                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                      t          |d¦  «         |                      t          |d¦  «         d	S )
z:
        HasRounds.using() -- vary_rounds parsing
        c                 ó:   •— ‰                      | ¬¦  «        j        S )N©Úvary_rounds)rÃ  r{  )r›   rÞ  s    €r1   ÚparsezFHandlerCase.test_has_rounds_using_w_vary_rounds_parsing.<locals>.parsez  s   ø€ Ø—<’<¨E�<Ñ2Ô2Ô>Ð>r3   r)   z0.1z10%éè  Ú1000gš™™™™™¹¿gš™™™™™ñ?N)rh  r   rñ   r%  )r}   rV   re  rd  rf  rg  r|  rÞ  s          @r1   Ú+test_has_rounds_using_w_vary_rounds_parsingz7HandlerCase.test_has_rounds_using_w_vary_rounds_parsings  s  ø€ ð
 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sð	?ð 	?ð 	?ð 	?ð 	?ð 	×Ò˜˜˜s™œ SÑ)Ô)Ð)Ø×Ò˜˜˜u™œ sÑ+Ô+Ð+ð 	×Ò˜˜˜u™œ sÑ+Ô+Ð+ð 	×Ò˜˜˜t™œ dÑ+Ô+Ð+Ø×Ò˜˜˜v™œ¨Ñ-Ô-Ð-ð 	×Ò�* e¨TÑ2Ô2Ð2Ø×Ò�* e¨SÑ1Ô1Ð1Ð1Ð1r3   c           	      óø  ‡ ‡	‡
— ‰                       ¦   «         \  }Š
}}}}d„ Š	ˆ	ˆ ˆ
fd„} |d||¦  «          |d||¦  «          ||||z
  ||z   ¦  «          |dt          ||dz
  ¦  «        t          ||dz   ¦  «        ¦  «         |j        dk    r, |d||¦  «          |d||¦  «          |d	||z
  |¦  «         dS  ‰	‰
                     d	¬
¦  «        ¦  «        \  }}‰                      |t          ||dz  ¦  «        ¦  «         ‰                      |t          ||dz  ¦  «        ¦  «         ‰                      |t          ||dz  ¦  «        ¦  «         ‰                      |t          ||dz  ¦  «        ¦  «         dS )z=
        HasRounds.using() -- vary_rounds generation
        c                 ó�   ‡ — t          ˆ fd„t          d¦  «        D ¦   «         ¦  «        }t          |¦  «        t          |¦  «        fS )Nc              3   ó6   •K  — | ]}t          ‰¦  «        V — Œd S r6   )r\   )r=   r>   rÏ   s     €r1   r?   zjHandlerCase.test_has_rounds_using_w_vary_rounds_generation.<locals>.get_effective_range.<locals>.<genexpr>“  s,   øè è € ÐGÐG°QÕ+¨CÑ0Ô0ÐGÐGÐGÐGÐGÐGr3   r}  )Úsetr   rA   rL   )rÏ   Úseens   ` r1   Úget_effective_rangezWHandlerCase.test_has_rounds_using_w_vary_rounds_generation.<locals>.get_effective_range’  sB   ø€ ÝÐGÐGÐGÐG½&À¹,¼,ÐGÑGÔGÑGÔGˆDÝ�t‘9”9�c $™iœiÐ'Ð'r3   c                 ó¬   •— ‰                      | ¬¦  «        } ‰|¦  «        \  }}‰                     ||d¦  «         ‰                     ||d¦  «         d S )Nrz  z"vary_rounds had wrong lower limit:z"vary_rounds had wrong upper limit:)rÃ  r   )	r{  rœ   r�   rL  Ú
seen_lowerÚ
seen_upperr…  r}   rÞ  s	         €€€r1   Úassert_rounds_rangezWHandlerCase.test_has_rounds_using_w_vary_rounds_generation.<locals>.assert_rounds_range–  sc   ø€ Ø—<’<¨K�<Ñ8Ô8ˆDØ%8Ð%8¸Ñ%>Ô%>Ñ"ˆJ˜
Ø×Ò˜Z¨Ð0TÑUÔUÐUØ×Ò˜Z¨Ð0TÑUÔUÐUÐUÐUr3   r   z0%é2   r¸  z1%z49%z50%rz  ç      à?gš™™™™™é?g333333ó?g      ø?N)rh  rL   rA   r·  rÃ  ÚassertGreaterEqualÚassertLessEqual)r}   rV   re  rd  rf  rg  r‰  rœ   r�   r…  rÞ  s   `        @@r1   Ú.test_has_rounds_using_w_vary_rounds_generationz:HandlerCase.test_has_rounds_using_w_vary_rounds_generationŒ  sí  øøø€ ð 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sð	(ð 	(ð 	(ð	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Ð˜A˜v vÑ.Ô.Ð.ØÐ˜D &¨&Ñ1Ô1Ð1ð 	Ð˜C ¨#¡¨v¸©|Ñ<Ô<Ð<ØÐ˜B¥ E¨6°B©;Ñ 7Ô 7½¸UÀFÈRÁKÑ9PÔ9PÑQÔQÐQð Ô &Ò(Ð(àÐ  f¨fÑ5Ô5Ð5ØÐ  v¨vÑ6Ô6Ð6ØÐ  v°¡|°VÑ<Ô<Ð<Ð<Ð<ð /Ð.¨v¯|ª|È¨|Ñ/NÔ/NÑOÔO‰LˆE�5à×#Ò# E­3¨u°f¸s±lÑ+CÔ+CÑDÔDÐDØ× Ò  ­¨E°6¸C±<Ñ(@Ô(@ÑAÔAÐAà×#Ò# E­3¨u°f¸s±lÑ+CÔ+CÑDÔDÐDØ× Ò  ­¨E°6¸C±<Ñ(@Ô(@ÑAÔAÐAÐAÐAr3   c                 óà  — |                       ¦   «         \  }}}}}}|                     |dz   |dz
  ¬¦  «        }|                      ||¬¦  «        }|                      ||¬¦  «        }	|                      ||¬¦  «        }
|                      |                     |¦  «        ¦  «         |                      |                     |	¦  «        ¦  «         |                      |                     |
¦  «        ¦  «         |                      |                     |¦  «        ¦  «         |                      |                     |	¦  «        ¦  «         |                      |                     |
¦  «        ¦  «         dS )zF
        HasRounds.using() -- desired_rounds + needs_update()
        r  rp  rU  N)rh  rÃ  rÕ  ÚassertFalseÚneeds_updater®  )r}   rV   rÞ  re  rd  rf  rg  rL  Ú
small_hashÚmedium_hashÚ
large_hashs              r1   Ú&test_has_rounds_using_and_needs_updatez2HandlerCase.test_has_rounds_using_and_needs_updateµ  s\  € ð 6:×5UÒ5UÑ5WÔ5WÑ2ˆ�˜ ¨¨sà�|Š|¨u°Q©wÈ5ÐQRÉ7ˆ|ÑSÔSˆð ×)Ò)¨&¸Ð)Ñ?Ô?ˆ
Ø×*Ò*¨6¸&Ð*ÑAÔAˆØ×)Ò)¨&¸Ð)Ñ?Ô?ˆ
ð 	×Ò˜×,Ò,¨ZÑ8Ô8Ñ9Ô9Ð9Ø×Ò˜×,Ò,¨[Ñ9Ô9Ñ:Ô:Ð:Ø×Ò˜×,Ò,¨ZÑ8Ô8Ñ9Ô9Ð9ð 	�Š˜×)Ò)¨*Ñ5Ô5Ñ6Ô6Ð6Ø×Ò˜×*Ò*¨;Ñ7Ô7Ñ8Ô8Ð8Ø�Š˜×)Ò)¨*Ñ5Ô5Ñ6Ô6Ð6Ð6Ð6r3   c                 óœ   — | j         }t          |t          ¦  «        rt          |t          j        ¦  «        s|                      d¦  «        ‚d S )Nz)handler doesn't derive from HasManyIdents)rV   rr   ru   rR   rS   ÚHasManyIdentsr?  )r}   rV   s     r1   Úrequire_many_identszHandlerCase.require_many_identsÏ  sP   € Ø”,ˆÝ˜'¥4Ñ(Ô(ð 	Mµ
¸7ÅBÔDTÑ0UÔ0Uð 	MØ—-’-Ð KÑLÔLÐLð	Mð 	Mr3   c                 ó~  — | j         }|                      ¦   «          |                      d|j        v ¦  «         |j        D ]}|                      |t          d¦  «         Œ|                      t          |j        ¦  «        dk    d¦  «         |                      |j        t          d¦  «         |                      |j        |j        v d¦  «         |j	        rrt          |j	        ¦  «        D ]]\  }}|                      |t          d¦  «         |                      |t          d¦  «         |                      ||j        v d	|›�¦  «         Œ^|}|                      ¦   «         d         }|                     |¦  «        }|d=  |dd|j        i|¤Ž  | j        t          |fi |¤Ž  |dd
di|¤Ž  | j        t          |fddi|¤Ž dS )z$validate HasManyIdents configurationÚidentz!cls.ident_values must be unicode:rd   z'cls.ident_values must have 2+ elements:z"cls.default_ident must be unicode:z9cls.default_ident must specify member of cls.ident_valuesz'cls.ident_aliases keys must be unicode:z)cls.ident_aliases values must be unicode:z8cls.ident_aliases must map to cls.ident_values members: rZ   TÚxXxNr7   )rV   r˜  r®  rQ   Úident_valuesr  r    r)  Údefault_identÚident_aliasesr   rª  Ú	parsehashrñ   r  r%  )r}   rÏ   r›   Úaliasrš  rV   r£  rm   s           r1   Útest_30_HasManyIdentsz!HandlerCase.test_30_HasManyIdentsÔ  sW  € àŒlˆØ× Ò Ñ"Ô"Ð"ð 	�Š˜ 3Ô#3Ð3Ñ4Ô4Ð4ð Ô%ð 	Gð 	GˆEØ×!Ò! %­Ø"EñGô Gð Gð Gà�Š�˜CÔ,Ñ-Ô-¨aÒ/ØAñ	Cô 	Cð 	Cð 	×Ò˜cÔ/µØBñ	Dô 	Dð 	Dà�Š˜Ô)¨SÔ-=Ð=ØSñ	Uô 	Uð 	Uð Ôð 	iÝ )¨#Ô*;Ñ <Ô <ð ið i‘��uØ×%Ò% e­WØ&OñQô Qð Qà×%Ò% e­WØ&QñSô Sð Sà—’ ¨Ô)9Ð 9Ð 9Ø`eÐ`eÐ gñiô ið ið ið ˆØ×#Ò#Ñ%Ô% aÔ(ˆØ× Ò  Ñ&Ô&ˆØ�ˆMð 	ˆÐ0Ð0�cÔ'Ð0¨4Ð0Ð0Ð0ð 	ˆÔ�) WÐ5Ð5°Ð5Ð5Ð5ð 	ˆÐ*Ð*˜TÐ* TÐ*Ð*Ð*ð 	ˆÔ�* gÐCÐC°UÐC¸dÐCÐCÐCÐCÐCr3   c                 óø  — |                       ¦   «          | j        }|j        }|j        D ]
}||k    r nŒt	          d|›d|j        ›�¦  «        ‚d„ }|                     ¦   «         }|                      |j        |¦  «         |                     |¬¦  «        }|                      |j        |¦  «         |                      |j        |¦  «         |                       ||¦  «        |¦  «         |                       ||¦  «        |¦  «         |                      t          |j        d¬¦  «         |                     |¬¦  «        }|                      |j        |¦  «         |                      |j        |¦  «         |                      t          |j        ||¬¦  «         |j
        rU|j
                             ¦   «         D ]=\  }}|                     |¬¦  «        }|                      |j        |d|z  ¬	¦  «         Œ<d
S d
S )z=HasManyIdents.using() -- 'default_ident' and 'ident' keywordsz*expected to find alternate ident: default=z values=c                 óB   — t          | ¦  «        }  | d¬¦  «        j        S )NT)rZ   )r[   rš  rÓ   s    r1   Úeffective_identz?HandlerCase.test_has_many_idents_using.<locals>.effective_ident  s%   € Ý  Ñ%Ô%ˆCØ�3 DÐ)Ñ)Ô)Ô/Ð/r3   )r�  r›  )rš  )r�  rš  z	alias %r:©rë   N)r˜  rV   r�  rœ  rø   rÃ  r   rñ   r%  r  rž  r`  )r}   rV   Ú
orig_identÚ	alt_identr¤  rÞ  r   rš  s           r1   Útest_has_many_idents_usingz&HandlerCase.test_has_many_idents_using  sH  € à× Ò Ñ"Ô"Ð"ð ”,ˆØÔ*ˆ
Ø Ô-ð 	Eð 	EˆIØ˜JÒ&Ð&Ø�ð 'õ !�.Ø", * *¨gÔ.BÐ.Bð"Dñ Eô Eð Eð	0ð 	0ð 	0ð
 —’‘”ˆØ×Ò˜Ô-¨zÑ:Ô:Ð:ð —’¨Y�Ñ7Ô7ˆØ×Ò˜Ô-¨yÑ9Ô9Ð9Ø×Ò˜Ô.°
Ñ;Ô;Ð;ð 	×Ò˜˜¨Ñ0Ô0°)Ñ<Ô<Ð<Ø×Ò˜˜¨Ñ1Ô1°:Ñ>Ô>Ð>ð 	×Ò�* g¤mÀ5ÐÑIÔIÐIð —’ Y�Ñ/Ô/ˆØ×Ò˜Ô-¨yÑ9Ô9Ð9Ø×Ò˜Ô.°
Ñ;Ô;Ð;ð 	×Ò�) W¤]À)ÐS\ÐÑ]Ô]Ð]ð Ô ð 	WØ 'Ô 5× ;Ò ;Ñ =Ô =ð Wð W‘��uØ Ÿš¨U˜Ñ3Ô3�Ø× Ò  Ô!5°uÀ+ÐPUÑBUÐ ÑVÔVÐVÐVð	Wð 	WðWð Wr3   c                 ól  ‡— | j         Š‰j        €|                      d‰j        ¦  «         dS ‰j        s|                      ‰j        ¦  «         d‰j        vr|                      ‰j        ¦  «         dS ˆfd„}|                       |d¦  «        ‰j        ¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |                       |d¦  «        d¦  «         |  	                    t          |d¦  «         dS )	zH
        validate 'truncate_error' setting & related attributes
        NÚtruncate_errorc                 ó:   •— ‰                      | ¬¦  «        j        S )N©rª  )rÃ  rª  )r›   Úhashers    €r1   Úparse_valuez<HandlerCase.test_truncate_error_setting.<locals>.parse_valueS  s   ø€ Ø—<’<¨u�<Ñ5Ô5ÔDÐDr3   TÚtrueFÚfalserK  )rV   Útruncate_sizer  rQ   rª  r�  Útruncate_verify_rejectr®  r   rñ   r%  )r}   r®  r­  s     @r1   Útest_truncate_error_settingz'HandlerCase.test_truncate_error_setting;  sa  ø€ ð ”ˆØÔÐ'Ø×ÒÐ-¨vÔ/BÑCÔCÐCØˆFð
 Ô$ð 	<Ø×Ò˜VÔ:Ñ;Ô;Ð;ð  6Ô#6Ð6Ð6Ø�OŠO˜FÔ1Ñ2Ô2Ð2ØˆFð	Eð 	Eð 	Eð 	Eð 	Eà×Ò˜˜ TÑ*Ô*¨FÔ,AÑBÔBÐBØ×Ò˜˜ TÑ*Ô*¨DÑ1Ô1Ð1Ø×Ò˜˜ VÑ,Ô,¨dÑ3Ô3Ð3Ø×Ò˜˜ UÑ+Ô+¨UÑ3Ô3Ð3Ø×Ò˜˜ WÑ-Ô-¨uÑ5Ô5Ð5Ø×Ò�* k°5Ñ9Ô9Ð9Ð9Ð9r3   c                 óŠ  — | j         }|j        �0|                      |j        d¦  «         |                      d¦  «        ‚d}d}|                      |¦  «        }|j         }|                      |                      ||¦  «        |d¬¦  «         |dd…         |z   }|                      |                      ||¦  «        d	¦  «         dS )
zO
        test no password size limits enforced (if truncate_size=None)
        Nrd   ztruncate_size is seta   too many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretstoo many secretsrF  zverify rejected correct secretr¥  rþ   z full password not used in digest)	rV   r±  rŒ  r?  rÇ  r¯  r   r­  r�  )r}   r­  r¢  r¥  r£  Úverify_successÚ
alt_secrets          r1   Útest_secret_wo_truncate_sizez(HandlerCase.test_secret_wo_truncate_size\  så   € ð
 ”ˆØÔÐ+Ø×#Ò# FÔ$8¸!Ñ<Ô<Ð<Ø—-’-Ð 6Ñ7Ô7Ð7ð )ˆØˆØ�Š˜vÑ&Ô&ˆð $Ô/Ð/ˆØ×Ò˜Ÿš¨°Ñ5Ô5°~Ø=ð 	ñ 	?ô 	?ð 	?ð ˜C˜R˜C”[ 3Ñ&ˆ
Ø×Ò˜Ÿš¨
°DÑ9Ô9Ø;ñ	=ô 	=ð 	=ð 	=ð 	=r3   c                 ó¨  — | j         }|j        }|s|                      d¦  «        ‚t          j        }d|j        v r9|                     d¬¦  «        }|                     d¬¦  «        }t          j        }n|j        rd}|}n|}d}d}d}t          ||d	z   ¦  «        }|dd
…         }	|dd
…         |z   }
|	dd
…         |z   }|j
         }|o|j         }|s|sJ ‚||fD ]�}|                      |	|¬¦  «        }|                      |                      |	||¬¦  «        |¦  «         |                      |                      |||¬¦  «        d¦  «         |                      |                      |||¬¦  «        |¦  «         Œž|rš|                      ||¬¦  «        }|                      |                      |||¬¦  «        |¦  «         |                      |                      |
||¬¦  «        |¦  «         |                      |                      |	||¬¦  «        ¦  «         |r;|                      || j        ||¬¦  «        }|                      |j        |¦  «         dS dS )zQ
        test password size limits raise truncate_error (if appropriate)
        ztruncate_size not setrª  Fr¬  TNztoo many secretsrF  rd   rþ   rU   z truncate_size value is too large)rV   r±  r?  r   ÚPasswordSizeErrorrQ   rÃ  ÚPasswordTruncateErrorrª  r   r¯  r²  rÇ  r   r­  r�  r®  rñ   r+  )r}   rV   r±  Úsize_error_typeÚwithout_errorÚ
with_errorrx   r¥  Úlong_secretÚshort_secretÚalt_long_secretÚalt_short_secretÚshort_verify_successÚlong_verify_successÚcand_hasherÚ
short_hashÚ	long_hashrö   s                     r1   Útest_secret_w_truncate_sizez'HandlerCase.test_secret_w_truncate_size|  s6  € ð ”,ˆØÔ-ˆØð 	9Ø—-’-Ð 7Ñ8Ô8Ð8õ Ô/ˆØ˜wÔ3Ð3Ð3Ø#ŸMšM¸˜MÑ?Ô?ˆMØ Ÿš°d˜Ñ;Ô;ˆJÝ!Ô7ˆOˆOØÔ#ð 	Ø ˆMØ ˆJˆJð $ˆMØˆJð "ˆØˆÝ# D¨-¸©/Ñ:Ô:ˆØ" 3 B 3Ô'ˆØ% c r cÔ*¨SÑ0ˆØ'¨¨¨Ô,¨sÑ2Ðð $+Ô#6Ð6ÐØ2ð AØ")Ô"@Ð@ð 	ð Ð* 
Ð*Ð*Ð*Ø)¨:Ð6ð 	2ð 	2ˆKð Ÿš¨¸{˜ÑKÔKˆJð ×Ò˜TŸ^š^¨L¸*Ø3>ð ,ñ @ô @à1ñ3ô 3ð 3ð ×Ò˜TŸ^š^Ð,<¸jØ4>ð ,ñ @ô @à?ñAô Að Að ×Ò˜TŸ^š^¨K¸Ø4?ð ,ñ Aô Aà0ñ2ô 2ð 2ð 2ð ð 	Cð Ÿš¨¸]˜ÑKÔKˆIð ×Ò˜TŸ^š^¨K¸Ø4Að ,ñ Cô Cà1ñ3ô 3ð 3ð ×Ò˜TŸ^š^¨O¸YØ4Að ,ñ Cô Cà1ñ3ô 3ð 3ð �OŠO˜DŸNšN¨<¸Ø3@ð +ñ Bô Bñ Cô Cð Cð ð 	:ð ×#Ò# O°T´_Ø$/¸ð $ñ Eô EˆCà×Ò˜Sœ\¨=Ñ9Ô9Ð9Ð9Ð9ð	:ð 	:r3   c                 óÈ  — | j         du }| j         dv }d}d}|                      |¦  «        }|r7| j        j        s+|                      |                      ||¦  «        d¦  «         n*|                      |                      ||¦  «        d¦  «         |                      |¦  «        }|r7| j        j        s+|                      |                      ||¦  «        d¦  «         n*|                      |                      ||¦  «        d¦  «         |                      ||¦  «        }|s| j        j        r | j        s|  	                    ||d¦  «         d	S |  
                    ||d¦  «         d	S )
ztest password case sensitivityT)Tzverify-onlyr–  ÚTESTz%verify() should not be case sensitivez!verify() should be case sensitivez&genhash() should not be case sensitivez"genhash() should be case sensitiveN)Úsecret_case_insensitiverÇ  rV   r¯  r®  r­  r�  rÓ  r÷  r   rø  )r}   Úhash_insensitiveÚverify_insensitiverœ   r�   Úh1Úh2s          r1   Útest_61_secret_case_sensitivez)HandlerCase.test_61_secret_case_sensitiveé  sÙ  € àÔ7¸4Ð?ÐØ!Ô9ð >Mð MÐð ˆØˆØ�_Š_˜UÑ#Ô#ˆØð 	B d¤lÔ&>ð 	BØ�OŠO˜DŸNšN¨5°"Ñ5Ô5ØCñEô Eð Eð Eð ×Ò˜TŸ^š^¨E°2Ñ6Ô6Ø@ñBô Bð Bð �_Š_˜UÑ#Ô#ˆØð 	B d¤lÔ&>ð 	BØ�OŠO˜DŸNšN¨5°"Ñ5Ô5ØCñEô Eð Eð Eð ×Ò˜TŸ^š^¨E°2Ñ6Ô6Ø@ñBô Bð Bð �_Š_˜U BÑ'Ô'ˆØð 	F ¤Ô 8ð 	FÀÔA\ð 	FØ×Ò˜R ØEñGô Gð Gð Gð Gð ×Ò  BØ DñFô Fð Fð Fð Fr3   c                 óÎ  — |                       ¦   «         d         }|                      t          | j        d¦  «         |                      t          | j        d|¦  «         |                      t          | j        d|¦  «         |                      t          | j        d¦  «         |                      t          | j        d|¦  «         |                      t          | j        d|¦  «         dS )z&test non-string passwords are rejectedrd   N)rª  rñ   r  rÇ  rÓ  r­  rÌ  s     r1   Útest_62_secret_borderz!HandlerCase.test_62_secret_border	  sÆ   € à×#Ò#Ñ%Ô% aÔ(ˆð 	×Ò�) T¤_°dÑ;Ô;Ð;Ø×Ò�) T¤_°d¸DÑAÔAÐAØ×Ò�) T¤^°T¸4Ñ@Ô@Ð@ð 	×Ò�) T¤_°aÑ8Ô8Ð8Ø×Ò�) T¤_°a¸Ñ>Ô>Ð>Ø×Ò�) T¤^°Q¸Ñ=Ô=Ð=Ð=Ð=r3   c                 óD  — ddl m} ddlm} dd|z   z  }|                      ¦   «         d         }|                      || j        ||¦  «        }|                      |j        |¦  «         |                      || j	        |¦  «         |                      || j
        ||¦  «         dS )z"test MAX_PASSWORD_SIZE is enforcedr   )r¹  )ÚMAX_PASSWORD_SIZEr2  rd   N)Úpasslib.excr¹  r>  rÓ  rª  rñ   rÓ  r   r+  rÇ  r­  )r}   r¹  rÓ  r¢  r£  rö   s         r1   Útest_63_large_secretz HandlerCase.test_63_large_secret	  s¿   € à1Ð1Ð1Ð1Ð1Ð1Ø3Ð3Ð3Ð3Ð3Ð3Ø˜Ð+Ñ+Ñ,ˆØ×#Ò#Ñ%Ô% aÔ(ˆØ×ÒÐ 1°4´?ÀFÈDÑQÔQˆØ×Ò˜œÐ'8Ñ9Ô9Ð9Ø×ÒÐ+¨T¬_¸fÑEÔEÐEØ×ÒÐ+¨T¬^¸VÀTÑJÔJÐJÐJÐJr3   c                 ó.  — | j         }|s|                      d¦  «        ‚t          d¦  «        }t          |t          ¦  «        r&ddlm}  ||¦  «        }|                     d¦  «        }|D ])}|                      t          | j
        ||z   |z   ¦  «         Œ*dS )z1test forbidden characters not allowed in passwordznone listedrî  r   )Úiter_byte_charsÚasciiN)rš  r?  r   rr   r8  Úpasslib.utils.compatr×  r…   rñ   r%  rÇ  )r}   Úcharsrx   r×  r  s        r1   Útest_64_forbidden_charsz#HandlerCase.test_64_forbidden_chars)	  sµ   € àÔ)ˆØð 	/Ø—-’- Ñ.Ô.Ð.Ý�‰yŒyˆÝ�e�UÑ#Ô#ð 	(Ø<Ð<Ð<Ð<Ð<Ð<Ø#�O EÑ*Ô*ˆEØ—;’;˜wÑ'Ô'ˆDØð 	Lð 	LˆAØ×Ò�j¨$¬/¸4À!¹8Àd¹?ÑKÔKÐKÐKð	Lð 	Lr3   c                 óN   — |                       |i ¦  «        }t          |¦  «         S r6   )r¿  r   ©r}   r¢  s     r1   Úis_secret_8bitzHandlerCase.is_secret_8bit9	  s(   € Ø×&Ò& v¨rÑ2Ô2ˆÝ  Ñ(Ô(Ð(Ð(r3   c                 ó¤   — t           rH| j        dk    r=t          |t          ¦  «        r(	 |                     d¦  «         n# t
          $ r Y dS w xY wdS )zl
        check if we're expecting potential verify failure due to crypt.crypt() encoding limitation
        r˜  rƒ   TF)r	   r`   rr   r8  r�   r‘   rÝ  s     r1   Úexpect_os_crypt_failurez#HandlerCase.expect_os_crypt_failure=	  sh   € õ ð 	�4”< :Ò-Ð-µ*¸VÅUÑ2KÔ2KÐ-ðØ—’˜gÑ&Ô&Ð&Ð&øÝ%ð ð ð Ø�t�tðøøøàˆus   ©? ¿
AÁAc                 óœ  — |                       | j        p| j        d¦  «         d}|                      ¦   «         D ]÷\  }}|                      |¦  «        rd}|                       |                      |¦  «        d|›�¦  «         |                      |¦  «        }	 |                      ||d|›d|›�¦  «         |                      ||¦  «        }|  	                    |t          d|›�¦  «         | j        j        r| j        rŒÄ|                      ||d|›d|›d	|›�¦  «         Œå# t          $ r |s‚ Y Œôw xY w|st!          d
| j        z  ¦  «         dS dS )ztest known hasheszOtest must set at least one of 'known_correct_hashes' or 'known_correct_configs'FTz$identify() failed to identify hash: z&verify() of known hash failed: secret=r¬  ú*genhash() failed to return native string: z1genhash() failed to reproduce known hash: secret=rõ  z%s: no 8-bit secrets testedN)r®  rŸ  r   r¦  rÞ  rÍ  rà  r±  rÓ  r  r�   rV   r¯  r÷  r   r   r   rÊ   )r}   Úsaw8bitr¢  r£  rà  rõ   s         r1   Útest_70_hasheszHandlerCase.test_70_hashesH	  sè  € ð 	�Š˜Ô1ÐO°TÔ5Oð5ñ	6ô 	6ð 	6ð
 ˆØ ×2Ò2Ñ4Ô4ð 	ð 	‰LˆF�DØ×"Ò" 6Ñ*Ô*ð Ø�ð �OŠO˜D×,Ò,¨TÑ2Ô2Ð2Ø<@¸DÐBñDô Dð Dð '+×&BÒ&BÀ6Ñ&JÔ&JÐ#ðð ×!Ò! &¨$¨$Ø:@¸&¸&À$À$ð1Hñ Iô Ið Ið Ÿš¨°Ñ6Ô6�Ø×%Ò% f­c¨cØFLÀfÐNñPô Pð Pà”<Ô+ð °Ô0Kð ØØ× Ò  ¨¨à�V�V˜T˜T˜T 6 6ð1+ñ ,ô ,ð ,ð ,øõ 'ð ð ð Ø.ð Øðð ðøøøð
 ð 	AÝÐ.°´Ñ?Ñ@Ô@Ð@Ð@Ð@ð	Að 	As   ÂA%DÃ= DÄD.Ä-D.c                 óÄ  — | j         s|                      d¦  «        ‚| j         D ]»\  }}}|                      |                      |¦  «        d|›�¦  «         |                      ||d|›d|›�¦  «         |                      ||¦  «        }|                      |t          d|›�¦  «         | j        j	        r| j
        rŒ˜|                      ||d|›d|›d|›d|›�¦  «         Œ¼d	S )
ztest known alternate hasheszno alternate hashes providedz.identify() failed to identify alternate hash: z0verify() of known alternate hash failed: secret=r¬  râ  z;genhash() failed to normalize known alternate hash: secret=z, alt=rõ  N)r¡  r?  r®  rÍ  r±  rÓ  r  r�   rV   r¯  r÷  r   )r}   r¥  r¢  r£  rõ   s        r1   Útest_71_alternateszHandlerCase.test_71_alternatest	  sD  € àÔ*ð 	@Ø—-’-Ð >Ñ?Ô?Ð?Ø!%Ô!<ð 	;ð 	;ÑˆC�˜ð �OŠO˜D×,Ò,¨TÑ2Ô2Ð2à�ðñô ð ð
 ×Ò˜f c cØ>D¸f¸fÀcÀcð,Kñ Lô Lð Lð —_’_ V¨SÑ1Ô1ˆFØ×!Ò! &­#¨#ØBHÀ&ÐJñLô Lð LàŒ|Ô'ð ¨DÔ,Gð ØØ×Ò˜V T Tà%˜v˜v s s s¨D¨D¨D°&°&ð-:ñ ;ô ;ð ;ð ;ð#	;ð 	;r3   c                 ól  — | j         j        s0|                      | j        d¦  «         |                      d¦  «        ‚| j        s|                      d¦  «        ‚| j        rt          j        dt          ¬¦  «         | j        D ]±\  }}}|  	                    |  
                    |¦  «        d|›�¦  «         |                      t          | j        ||d|›�¬¦  «         |                      ||¦  «        }|                      |t           d	|›�¦  «         |                      ||d
|›d|›d|›d|›�¦  «         Œ²dS )ztest known config stringsz&handler should not have config stringszhash has no settingszno config strings providedrÜ   r"  z3identify() failed to identify known config string: z)verify() failed to reject config string: ©rï   râ  z=genhash() failed to reproduce known hash from config: secret=z	, config=r¬  rõ  N)rV   rQ   r�  r   r?  Úfilter_config_warningsrâ   rã   r   r®  rÍ  rñ   r%  r­  rÓ  r  r�   r   )r}   r¤  r¢  r£  rõ   s        r1   Útest_72_configszHandlerCase.test_72_configs�	  s”  € ð Œ|Ô(ð 	8Ø×Ò˜TÔ7ØDñFô Fð Fà—-’-Ð 6Ñ7Ô7Ð7àÔ)ð 	>à—-’-Ð <Ñ=Ô=Ð=ð Ô&ð 	KÝÔ# HÕ7IÐJÑJÔJÐJØ$(Ô$>ð 	>ð 	>Ñ ˆF�F˜Dð �OŠO˜D×,Ò,¨VÑ4Ô4Ð4à�ðñô ð ð
 ×Ò�j¨$¬.¸&À&À&à�ðð ñ ô ð ð
 —_’_ V¨VÑ4Ô4ˆFØ×!Ò! &­#¨#ØBHÀ&ÐJñLô Lð Là×Ò˜V T Tà%˜v˜v v v v¨t¨t¨t°V°Vð-=ñ >ô >ð >ð >ð!	>ð 	>r3   c           	      óF  — | j         s|                      d¦  «        ‚| j         D ]|}|                      |                      |¦  «        d|›�¦  «         |                      t
          | j        d|d|›�¬¦  «         |                      t
          | j        d|d|›�¬¦  «         Œ}dS )z)test known unidentifiably-mangled stringszno unidentified hashes providedz=identify() incorrectly identified known unidentifiable hash: rî  z8verify() failed to throw error for unidentifiable hash: rè  z9genhash() failed to throw error for unidentifiable hash: N)Úknown_unidentified_hashesr?  r�  rÍ  rñ   r%  r­  rÓ  rÌ  s     r1   Útest_73_unidentifiedz HandlerCase.test_73_unidentified°	  sã   € àÔ-ð 	CØ—-’-Ð AÑBÔBÐBØÔ2ð 	&ð 	&ˆDð ×Ò˜T×-Ò-¨dÑ3Ô3Ð3à"˜dð%ñ&ô &ð &ð
 ×Ò�j¨$¬.¸&À$À$à"˜dð%ð ñ &ô &ð &ð
 ×Ò�j¨$¬/¸6À4À4à"˜dð%ð ñ &ô &ð &ð &ð	&ð 	&r3   c           	      óF  — | j         s|                      d¦  «        ‚| j         D ]|}|                      |                      |¦  «        d|›�¦  «         |                      t
          | j        d|d|›�¬¦  «         |                      t
          | j        d|d|›�¬¦  «         Œ}dS )z-test known identifiable-but-malformed stringszno malformed hashes providedz4identify() failed to identify known malformed hash: rî  z3verify() failed to throw error for malformed hash: rè  z4genhash() failed to throw error for malformed hash: N)Úknown_malformed_hashesr?  r®  rÍ  rñ   r%  r­  rÓ  rÌ  s     r1   Útest_74_malformedzHandlerCase.test_74_malformedÅ	  sá   € àÔ*ð 	@Ø—-’-Ð >Ñ?Ô?Ð?ØÔ/ð 	&ð 	&ˆDð �OŠO˜D×,Ò,¨TÑ2Ô2Ð2à"˜dð%ñ&ô &ð &ð
 ×Ò�j¨$¬.¸&À$À$à"˜dð%ð ñ &ô &ð &ð
 ×Ò�j¨$¬/¸6À4À4à"˜dð%ð ñ &ô &ð &ð &ð	&ð 	&r3   c                 óª  — | j         r|                      d¦  «        ‚| j        s|                      d¦  «        ‚| j        D �]\  }}|| j        j        k    rx|                      |                      |¦  «        d|›�¦  «         |                      d|¦  «         |                      d|¦  «        }|  	                    |t          d|›�¦  «         ŒŽ|                      |                      |¦  «        d|›d|›�¦  «         |                      t          | j        d|d|›d|›�¬	¦  «         |                      t          | j        d|d
|›d|›�¬	¦  «         �ŒdS )ztest known foreign hashesúnot applicablezno foreign hashes providedz*identify() failed to identify known hash: rî  râ  z4identify() incorrectly identified hash belonging to rÄ   z5verify() failed to throw error for hash belonging to rè  z6genhash() failed to throw error for hash belonging to N)Úaccepts_all_hashesr?  Úknown_other_hashesrV   rÐ   r®  rÍ  r­  rÓ  r  r�   r�  rñ   r%  )r}   rÐ   r£  rõ   s       r1   Útest_75_foreignzHandlerCase.test_75_foreignÚ	  s´  € àÔ"ð 	2Ø—-’-Ð 0Ñ1Ô1Ð1ØÔ&ð 	>Ø—-’-Ð <Ñ=Ô=Ð=ØÔ1ð 	:ñ 	:‰JˆD�$ð
 �t”|Ô(Ò(Ð(à—’ × 0Ò 0°Ñ 6Ô 6Ð 6ØFJÀdÐLñNô Nð Nð —’˜v tÑ,Ô,Ð,ØŸš¨°Ñ6Ô6�Ø×%Ò% f­c¨cØFLÀfÐNñPô Pð Pð Pð
 × Ò  ×!1Ò!1°$Ñ!7Ô!7Ð!7à $   d dð,ñ-ô -ð -ð
 ×!Ò!¥*¨d¬n¸fÀdÀdà-1¨T¨T°4°4ð:ð "ñ ;ô ;ð ;ð
 ×!Ò!¥*¨d¬o¸vÀtÀtà-1¨T¨T°4°4ð9ð "ñ :ô :ð :ñ :ð9	:ð 	:r3   c                 óÜ  — |                       t          | j        d¦  «         |                       t          | j        dd¦  «         |                       t          | j        dd¦  «         |                       t          | j        d¦  «         |                       t          | j        dd¦  «         |                       t          | j        dd¦  «         t          d¦  «        dfD ]å}| j        rk|                      |                      |¦  «        ¦  «         |                      d|¦  «         |                      d|¦  «        }|                      |d¦  «         Œt|  	                    |                      |¦  «        d¦  «         |                       t          | j        d|d¬	¦  «         |                       t          | j        d|d
¬	¦  «         Œæ|                      d¦  «         |                      d¦  «         dS )z#test non-string hashes are rejectedNrî  rd   r–   r3   rÒ  z,identify() incorrectly identified empty hashz$verify() failed to reject empty hashrè  z%genhash() failed to reject empty hashu   Ã¢Â‚Â¬Ã‚Â¥$u   abcÂ‘ )rñ   r  rÍ  r­  rÓ  r   ró  r®  r´  r�  r%  )r}   r£  rõ   s      r1   Útest_76_hash_borderzHandlerCase.test_76_hash_border 
  sø  € ð
 	×Ò�) TÔ%5°tÑ<Ô<Ð<Ø×Ò�) T¤^°V¸TÑBÔBÐBð 	×Ò�) T¤_°f¸dÑCÔCÐCð
 	×Ò�) TÔ%5°qÑ9Ô9Ð9Ø×Ò�) T¤^°V¸QÑ?Ô?Ð?Ø×Ò�) T¤_°f¸aÑ@Ô@Ð@õ
 �r‘U”U˜C�Lð 	Eð 	EˆDØÔ&ð Eà—’ × 0Ò 0°Ñ 6Ô 6Ñ7Ô7Ð7Ø—’˜v tÑ,Ô,Ð,ØŸš¨°Ñ6Ô6�Ø×.Ò.¨v°yÑAÔAÐAÐAð × Ò  ×!1Ò!1°$Ñ!7Ô!7ØBñDô Dð Dà×!Ò!¥*¨d¬n¸fÀdØBð "ñ Dô Dð Dà×!Ò!¥*¨d¬o¸vÀtØCð "ñ Eô Eð Eð Eð 	×ÒÐ0Ñ1Ô1Ð1Ø×Ò˜Ñ'Ô'Ð'Ð'Ð'r3   c                 óN   — t          | j        d¦  «        st          d¦  «        ‚d S )NrŸ  zparsehash() not implemented)rP   rV   r   r  s    r1   Úrequire_parsehashzHandlerCase.require_parsehash2
  s/   € Ý�t”| [Ñ1Ô1ð 	:ÝÐ8Ñ9Ô9Ð9ð	:ð 	:r3   c                 óÞ  — |                       ¦   «          | j        }|                      d¦  «        }|                     |¦  «        }|                      |t
          ¦  «         |                     |d¬¦  «        }|                     ¦   «         }|                     dd¦  «         |                      ||¦  «         |                     |d¬¦  «        }|                     ¦   «         }t          rt          j        dd	t          ¬
¦  «         dD ]N}||v rH|                      ||         ||         ¦  «         |                      ||         ¦  «         ||         ||<   ŒO|                      ||¦  «         dS )z
        parsehash()
        rî  F)Úchecksumrû  NT)ÚsanitizerÜ   z(.*unequal comparison failed to convert.*r"  )r  rû  )rù  rV   rÇ  rŸ  r  r&  Úcopyrð   r   r!   râ   rã   ÚUnicodeWarningrø  Úassert_is_masked)	r}   rV   r£  rõ   Úresult2Úcorrect2Úresult3Úcorrect3Úkeys	            r1   Útest_70_parsehashzHandlerCase.test_70_parsehash6
  su  € ð 	×ÒÑ Ô Ð Ø”,ˆð �Š˜vÑ&Ô&ˆØ×"Ò" 4Ñ(Ô(ˆØ×Ò˜f¥dÑ+Ô+Ð+ð
 ×#Ò# D°5Ð#Ñ9Ô9ˆØ—;’;‘=”=ˆØ�Š�Z Ñ&Ô&Ð&Ø×Ò˜ (Ñ+Ô+Ð+ð
 ×#Ò# D°4Ð#Ñ8Ô8ˆØ—;’;‘=”=ˆÝð 	=õ Ô# HÐ.XÝ-;ð=ñ =ô =ð =à'ð 	-ð 	-ˆCØ�gˆ~ˆ~Ø×#Ò# G¨C¤L°(¸3´-Ñ@Ô@Ð@Ø×%Ò% g¨c¤lÑ3Ô3Ð3Ø '¨¤�˜‘øØ×Ò˜ (Ñ+Ô+Ð+Ð+Ð+r3   c                 óô   — |€dS |                       |t          ¦  «         t          |¦  «        dk     r|n	|dd…         }t          |¦  «        t          dg¦  «        k    rdS |                      d|z  ¦  «        ‚)zQ
        check value properly masked by :func:`passlib.utils.mask_value`
        NrB  é   Ú*Tzvalue not masked: %r)r  r    r)  rƒ  Úfail)r}   r›   rM  s      r1   rÿ  zHandlerCase.assert_is_masked]
  s{   € ð ˆ=ØˆFØ×Ò˜e¥WÑ-Ô-Ð-õ ˜5‘z”z A’~�~ˆeˆe¨5°°°¬9ˆÝˆs‰8Œ8•s˜C˜5‘z”zÒ!Ð!Ø�4Ø�iŠiÐ.°Ñ6Ñ7Ô7Ð7r3   c                 óì   — |                       ¦   «          | j        }|s|                      d¦  «        ‚| j        D ]9\  }}| j                             |¦  «        }|                      ||d|z  ¦  «         Œ:dS )z.
        parsehash() -- known outputs
        zno samples presentzhash=%r:N)rù  Úknown_parsehash_resultsr?  rV   rŸ  r   )r}   r  r£  Úcorrectrõ   s        r1   Útest_71_parsehash_resultsz%HandlerCase.test_71_parsehash_resultsk
  s”   € ð 	×ÒÑ Ô Ð ØÔ.ˆØð 	6Ø—-’-Ð 4Ñ5Ô5Ð5ð "Ô9ð 	Að 	A‰MˆD�'Ø”\×+Ò+¨DÑ1Ô1ˆFØ×Ò˜V W¨j¸4Ñ.?Ñ@Ô@Ð@Ð@ð	Að 	Ar3   c                 óˆ  ‡— | j         j        r|                      d¦  «        ‚ddlm} | j        }|dk    r|                      d¦  «        ‚|                      |¬¦  «        }d„ Š|rt          j        ¦   «         j	        }nd}|  
                    |¬¦  «        }|                      | |¦  «        }t                               d	| j        ||t          |¦  «        d
                     ˆfd„|D ¦   «         ¦  «        ¦  «          |¦   «         }||z   }	d}
 |¦   «         |	k    rø|                     ¦   «         }|d         }|d         }|d         }|d         }|r||d<    | j        |fi |¤Ž}|D ]™} ‰|¦  «        } |||fi |¤Ž}|dk    rŒ|du s|du sJ ‚|s!|                      d|›d|›d|›d|›�¦  «        ‚|                     ¦   «         dk     r6 |||fi |¤Ž}|r*|dk    r$|                      d|›d|›d|›d|›d|›�
¦  «        ‚Œš|
dz  }
 |¦   «         |	k    °øt                               d| j        | |¦   «         |z
  |
¦  «         dS )a  fuzz testing -- random passwords and options

        This test attempts to perform some basic fuzz testing of the hash,
        based on whatever information can be found about it.
        It does as much as it can within a fixed amount of time
        (defaults to 1 second, but can be overridden via $PASSLIB_TEST_FUZZ_TIME).
        It tests the following:

        * randomly generated passwords including extended unicode chars
        * randomly selected rounds values (if rounds supported)
        * randomly selected salt sizes (if salts supported)
        * randomly selected identifiers (if multiple found)
        * runs output of selected backend against other available backends
          (if any) to detect errors occurring between different backends.
        * runs output against other "external" verifiers such as OS crypt()

        :param report_thread_state:
            if true, writes state of loop to current_thread().passlib_fuzz_state.
            used to help debug multi-threaded fuzz test issues (below)
        rò  r   r    údisabled by test mode©Úthreadedc                 óN   — | j         p| j                             ¦   «         d         S r  )r  rÌ   Ú
splitlines)Úvs    r1   Úvnamez-HandlerCase.test_77_fuzz_input.<locals>.vnameš
  s"   € Ø”IÐ+ ¤×7Ò7Ñ9Ô9¸!Ô<Ð<r3   z	fuzz test)rÐ   z.%s: %s: started; max_time=%r verifiers=%d (%s)r8  c              3   ó.   •K  — | ]} ‰|¦  «        V — Œd S r6   r7   )r=   r  r  s     €r1   r?   z1HandlerCase.test_77_fuzz_input.<locals>.<genexpr>ª
  s+   øè è € Ð8Ð8¨˜E˜E !™HœHÐ8Ð8Ð8Ð8Ð8Ð8r3   r¢  rû  rÆ  rÅ  r   TFzfailed to verify against z verifier: secret=z config=rô  r)   z(was able to verify wrong password using z: wrong_secret=z real_secret=rd   z!%s: %s: done; elapsed=%r count=%rN)rV   r¯  r?  r>  r   Úmax_fuzz_timeÚget_fuzz_verifiersrˆ  Úcurrent_threadrÐ   rZ  ÚFuzzHashGeneratorr§   ÚdebugrÇ   r)  r:  ÚgeneraterÇ  rò   r»   )r}   r  r   Úmax_timeÚ	verifiersÚthread_namer   Ú	generatorr8   Ústopr¾   Úoptsr¢  rû  rÆ  rä   r£  rÉ  rÐ   rõ   r  s                       @r1   Útest_77_fuzz_inputzHandlerCase.test_77_fuzz_input|
  s/  ø€ ð* Œ<Ô#ð 	2Ø—-’-Ð 0Ñ1Ô1Ð1ð 	'Ð&Ð&Ð&Ð&Ð&ØÔ%ˆØ�qŠ=ˆ=Ø—-’-Ð 7Ñ8Ô8Ð8Ø×+Ò+°XÐ+Ñ>Ô>ˆ	ð	=ð 	=ð 	=ð ð 	&Ý#Ô2Ñ4Ô4Ô9ˆKˆKà%ˆKØ�nŠn +ˆnÑ.Ô.ˆØ×*Ò*¨4°Ñ5Ô5ˆ	õ 	�	Š	ÐBØÔ(¨+°xÅÀYÁÄØ—)’)Ð8Ð8Ð8Ð8¨iÐ8Ñ8Ô8Ñ8Ô8ñ	:ô 	:ð 	:ð �‘”ˆØ�xÑˆØˆØˆd‰fŒf˜Šnˆnà×%Ò%Ñ'Ô'ˆDØ˜(”^ˆFØ˜”MˆEØ˜JÔ'ˆHØ�y”/ˆCØð *Ø&)�˜Ñ#ð #�4”? 6Ð6Ð6¨XÐ6Ð6ˆDð
 $ð Yð Y�Ø�u˜V‘}”}�Ø˜ ¨Ð4Ð4°Ð4Ð4�Ø˜VÒ#Ð#ØØ �~�~¨°5¨¨¨Ð8Øð PØ×/Ò/Ð/à15°°°v°v°v¸x¸x¸xÈÈð1Oñ Pô Pð Pð
 —:’:‘<”< "Ò$Ð$Ø#˜V E¨4Ð7Ð7°3Ð7Ð7�FØð Y &¨FÒ"2Ð"2Ø"×3Ò3Ð3à37°4°4¸¸¸ÀÀÀÈÈÈÐRVÐRVð5Xñ Yô Yð Yøð �Q‰JˆEðE ˆd‰fŒf˜ŠnˆnõH 	�	Š	Ð5ØÔ(¨+°t°t±v´vÀ±~Àuñ	Nô 	Nð 	Nð 	Nð 	Nr3   c                 ó¦  ‡ ‡‡‡‡	‡
— ‰                       d¦  «         ddlŠ	‰ j        j        r‰                      d¦  «        ‚‰ j        }|dk     s‰ j        dk    r‰                      d¦  «        ‚ ‰	j        ¦   «         ŠdgŠˆˆˆ fd„Š
ˆ ˆ	ˆ
fd„Šˆfd	„t          |¦  «        D ¦   «         }‰ j        |z  d
z  }d}|D ]R}| 	                    |¦  «         | 
                    ¦   «         sŒ,t                               d|j        |¦  «         |dz  }ŒS‰d         r ‰                      d‰d         |fz  ¦  «        ‚|r‰                      d||fz  ¦  «        ‚dS )zómultithreaded fuzz testing -- random password & options using multiple threads

        run test_77 simultaneously in multiple threads
        in an attempt to detect any concurrency issues
        (e.g. the bug fixed by pybcrypt 0.3)
        rF   r   Nrò  rd   r  c                  ó®   •— 	 ‰                      d¬¦  «         d S # t          $ r Y d S  ‰5  ‰ dxx         dz  cc<   d d d ¦  «         n# 1 swxY w Y   ‚ xY w)NTr  r   rd   )r#  r   )ÚfailedÚfailed_lockr}   s   €€€r1   r~   z3HandlerCase.test_78_fuzz_threading.<locals>.wrapperí
  sº   ø€ ðØ×'Ò'°Ð'Ñ6Ô6Ð6Ð6Ð6øÝð ð ð Ø��ðØ ð #ð #Ø˜1�I�I”I ‘N�I�I‘Ið#ð #ð #ñ #ô #ð #ð #ð #ð #ð #ð #øøøð #ð #ð #ð #àøøøs0   ƒ ›
A¨A«A¼AÁA	ÁAÁA	ÁAc                 óÌ   •— t          ‰¦  «        }d| |j        |j        ‰j        fz  } ‰j        ‰|¬¦  «        }|                     d¦  «         |                     ¦   «          |S )NzFuzz-Thread-%d ('%s:%s.%s'))ÚtargetrÐ   T)ru   r  rÌ   rS  ÚThreadÚ	setDaemonr8   )ÚnrÏ   rÐ   Úthreadr}   rˆ  r~   s       €€€r1   Úlaunchz2HandlerCase.test_78_fuzz_threading.<locals>.launchö
  sl   ø€ Ý�t‘*”*ˆCØ0°A°s´~ÀsÄ|Ø48Ô4Hð4Jñ JˆDà%�YÔ%¨W¸4Ð@Ñ@Ô@ˆFØ×Ò˜TÑ"Ô"Ð"Ø�LŠL‰NŒNˆNØˆMr3   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r7   r7   )r=   r,  r.  s     €r1   ú
<listcomp>z6HandlerCase.test_78_fuzz_threading.<locals>.<listcomp>þ
  s!   ø€ Ð;Ð;Ð; �6�6˜!‘9”9Ð;Ð;Ð;r3   r  z%s timed out after %f secondszH%d/%d threads failed concurrent fuzz testing (see error log for details)zP%d/%d threads stalled during concurrent fuzz testing (see error log for details))rC  rˆ  rV   r¯  r?  Úfuzz_thread_countr  r‰  r   r:  Úis_aliver§   ÚerrorrÐ   r	  )r}   Úthread_countÚthreadsÚtimeoutÚstalledr-  r&  r'  r.  rˆ  r~   s   `     @@@@@r1   Útest_78_fuzz_threadingz"HandlerCase.test_78_fuzz_threadingÕ
  só  øøøøøø€ ð 	×Ò˜vÑ&Ô&Ð&ØÐÐÐð Œ<Ô#ð 	2Ø—-’-Ð 0Ñ1Ô1Ð1ØÔ-ˆØ˜!ÒÐ˜tÔ1°QÒ6Ð6Ø—-’-Ð 7Ñ8Ô8Ð8ð %�i”nÑ&Ô&ˆØ�ˆð
	ð 	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	ð 	ð <Ð;Ð;Ð;¥f¨\Ñ&:Ô&:Ð;Ñ;Ô;ˆð Ô$ |Ñ3°aÑ7ˆØˆØð 	ð 	ˆFØ�KŠK˜Ñ Ô Ð Ø—?’?Ñ$Ô$ð Øå�IŠIÐ5°v´{ÀGÑLÔLÐLØ�q‰LˆGˆGð �!Œ9ð 	QØ—)’)ð 4Ø7=¸a´yÀ,Ð6OñPñ Qô Qð Qàð 	OØ—)’)ð 4Ø7>ÀÐ6MñNñ Oô Oð Oð	Oð 	Or3   c                 ó²   — t          t          j                             d¦  «        pd¦  «        }|r|S t	          d¬¦  «        rdS t	          d¬¦  «        rdS dS )z'amount of time to spend on fuzz testingÚPASSLIB_TEST_FUZZ_TIMEr   rD   r¶  rE   rd   é   )Úfloatr*   rO  rP  r$   ©r}   r›   s     r1   r  zHandlerCase.max_fuzz_time  sg   € õ •b”j—n’nÐ%=Ñ>Ô>ÐCÀ!ÑDÔDˆØð 	ØˆLÝ˜7Ð#Ñ#Ô#ð 	Ø�1Ý˜9Ð%Ñ%Ô%ð 	Ø�1à�1r3   c                 óŽ   — t          t          j                             d¦  «        pd¦  «        }|r|S t	          d¬¦  «        rdS dS )z+number of threads for threaded fuzz testingÚPASSLIB_TEST_FUZZ_THREADSr   rD   r¶  r£   )r¬   r*   rO  rP  r$   r=  s     r1   r1  zHandlerCase.fuzz_thread_count$  sO   € õ •B”J—N’NÐ#>Ñ?Ô?ÐDÀ1ÑEÔEˆØð 	ØˆLÝ˜7Ð#Ñ#Ô#ð 	Ø�1à�2r3   )Úfuzz_verifier_defaultc                 ó8  ‡— | j         Šg }| j        D ]1} t          | |¦  «        ¦   «         }|�|                     |¦  «         Œ2t	          ‰d¦  «        rFt          d¦  «        r7|s5ˆfd„}t          ‰¦  «        D ] }|                      ||¦  «        ¦  «         Œ!|S )zÙreturn list of password verifiers (including external libs)

        used by fuzz testing.
        verifiers should be callable with signature
        ``func(password: unicode, hash: ascii str) -> ok: bool``.
        Nre   rF   c                 óD   •‡ — ˆ ˆfd„}d‰ z   dz   |_         ‰ dz   |_        |S )Nc                 óâ   •— ‰                      ¦   «         }	 ‰                     ‰¦  «         ‰                     | |¦  «        ‰                     |¦  «         S # ‰                     |¦  «         w xY wr6   )r^   r_   rÉ  )r¢  r£  Úorig_backendr`   rV   s      €€r1   r­   z;HandlerCase.get_fuzz_verifiers.<locals>.maker.<locals>.funcM  so   ø€ Ø#*×#6Ò#6Ñ#8Ô#8�Lð:Ø×+Ò+¨GÑ4Ô4Ð4Ø&Ÿ~š~¨f°dÑ;Ô;à×+Ò+¨LÑ9Ô9Ð9Ð9ø˜×+Ò+¨LÑ9Ô9Ð9Ð9øøøs   —*A ÁA.Úcheck_Ú_backendú-backend)rÌ   r  )r`   r­   rV   s   ` €r1   Úmakerz-HandlerCase.get_fuzz_verifiers.<locals>.makerL  sF   øø€ ð:ð :ð :ð :ð :ð :ð !)¨7Ñ 2°ZÑ ?�”Ø&¨Ñ3�”Ø�r3   )rV   Úfuzz_verifiersrÎ   ru  rP   r$   rj   )r}   r  r  Úmethod_namer­   rH  r`   rV   s          @r1   r  zHandlerCase.get_fuzz_verifiers8  sØ   ø€ ð ”,ˆØˆ	ð  Ô.ð 	'ð 	'ˆKØ-•7˜4 Ñ-Ô-Ñ/Ô/ˆDØÐØ× Ò  Ñ&Ô&Ð&øõ
 �7˜JÑ'Ô'ð 	1­I°fÑ,=Ô,=ð 	1Àhð 	1ð
ð 
ð 
ð 
ð 
õ -¨WÑ5Ô5ð 1ð 1�Ø× Ò    w¡¤Ñ0Ô0Ð0Ð0àÐr3   c                 óN   ‡ — ˆ fd„}‰ j         r‰ j         dz   |_        nd|_        |S )Nc                 ó"   •—  ‰j         | |fi |¤ŽS r6   )r­  )r¢  r£  rä   r}   s      €r1   Úcheck_defaultz8HandlerCase.fuzz_verifier_default.<locals>.check_default^  s   ø€ Ø!�4”> &¨$Ð6Ð6°#Ð6Ð6Ð6r3   rG  r}   )r`   r  )r}   rM  s   ` r1   r@  z!HandlerCase.fuzz_verifier_default\  sF   ø€ ð	7ð 	7ð 	7ð 	7ð 	7àŒ<ð 	+Ø$(¤L°:Ñ$=ˆMÔ!Ð!à$*ˆMÔ!ØÐr3   c                   ó‚   — e Zd ZdZ ed¦  «        ZdZ eddd¬¦  «        Zi Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )úHandlerCase.FuzzHashGeneratorz½
        helper which takes care of generating random
        passwords & configuration options to test hash with.
        separate from test class so we can create one per thread.
        u   qwertyASDF1234<>.@*#! Ã¡É™Ð‘â„“rƒ   Úrandom_roundsÚrandom_salt_sizeÚrandom_ident)rY   r  rš  c                 ó:   — || _         |j        | _        || _        d S r6   )r–  rV   r   )r}   r–  r   s      r1   r  z&HandlerCase.FuzzHashGenerator.__init__‡  s   € ØˆDŒIØœ<ˆDŒLØˆDŒHˆHˆHr3   c                 óš   ‡ — ˆ fd„}‰                       ¦   «         \  }}t          || |‰ j        ¦  «         |‰ j        ¦  «        ¬¦  «        S )z¬
            generate random password and options for fuzz testing.
            :returns:
                `(secret, other_secret, settings_kwds, context_kwds)`
            c                 ó~   •— i }|                       ¦   «         D ]$\  }} t          ‰|¦  «        ¦   «         }|�|||<   Œ%|S r6   )r`  rÎ   )Úmaprd  r  rá  r›   r}   s        €r1   Úgendictz7HandlerCase.FuzzHashGenerator.generate.<locals>.gendict’  sO   ø€ Ø�Ø!$§¢¡¤ð )ð )‘I�C˜Ø/�G D¨$Ñ/Ô/Ñ1Ô1�EØÐ(Ø#(˜˜C™øØ�
r3   )r¢  rû  rÆ  rÅ  )Úrandom_password_pairr&  Úsettings_mapÚcontext_map)r}   rW  r¢  rû  s   `   r1   r  z&HandlerCase.FuzzHashGenerator.generateŒ  so   ø€ ðð ð ð ð ð !×5Ò5Ñ7Ô7‰MˆF�EÝ˜vØ#Ø!( ¨Ô):Ñ!;Ô!;Ø ' ¨Ô(8Ñ 9Ô 9ðñ ô ð r3   c                 ót   — | j                              ||¦  «        }t          t          |||¦  «        ¦  «        S )z)generate random int w/ gauss distirbution)r   Únormalvariater¬   rž   )r}   rœ   r�   ÚmuÚsigmar›   s         r1   Úrandintgaussz*HandlerCase.FuzzHashGenerator.randintgauss£  s3   € à”H×*Ò*¨2¨uÑ5Ô5ˆEÝ•u˜U E¨5Ñ1Ô1Ñ2Ô2Ð2r3   c                 óÞ   — | j         }t          |¦  «        sd S |j        p|j        }|j        }|j        dk    r|}nt          |dz  |j        ¦  «        }|                      ||||dz  ¦  «        S )Nr¸  r  r‹  )rV   r   r¹  r|   r·  rA   rR  r_  ©r}   rV   rE   rœ   r�   s        r1   rP  z+HandlerCase.FuzzHashGenerator.random_rounds¬  s   € Ø”lˆGÝ" 7Ñ+Ô+ð Ø�tØÔ,ÐB°Ô0BˆGØÔ&ˆEØÔ" fÒ,Ð,Ø��å˜G A™I wÔ'9Ñ:Ô:�Ø×$Ò$ U¨E°7¸GÀB¹JÑGÔGÐGr3   c                 ó®   — | j         }t          |¦  «        r	d|j        v sd S |j        }|j        }|j        p|dz  }|                      ||||dz  ¦  «        S )Nr  r  r‹  )rV   r   rQ   r  r  r  r_  ra  s        r1   rQ  z.HandlerCase.FuzzHashGenerator.random_salt_size¸  sj   € Ø”lˆGÝ! 'Ñ*Ô*ð ¨{¸gÔ>RÐ/RÐ/RØ�tØÔ/ˆGØÔ)ˆEØÔ)Ð6¨W°Q©YˆEØ×$Ò$ U¨E°7¸GÀB¹JÑGÔGÐGr3   c                 óÞ   — | j         }| j        }d|j        vst          |d¦  «        sd S |                     ¦   «         dk     rd S t          |d|¦  «        }|                     |j        ¦  «        S )Nrš  rœ  r‹  rp   )r   rV   rQ   rP   r»   rÎ   r¨  rœ  )r}   r   rV   s      r1   rR  z*HandlerCase.FuzzHashGenerator.random_identÁ  sp   € Ø”(ˆCØ”lˆGØ˜gÔ2Ð2Ð2½'À'È>Ñ:ZÔ:ZÐ2Ø�tØ�zŠz‰|Œ|˜bÒ Ð Ø�tå˜g y°'Ñ:Ô:ˆGØ—:’:˜gÔ2Ñ3Ô3Ð3r3   c                 óZ  — |                       ¦   «         }	 |                       ¦   «         }|                      ||¦  «        rnŒ,| j        }|                     dd¦  «        r|                     | j        ¦  «        }|                     dd¦  «        r|                     | j        ¦  «        }||fS )z=generate random password, and non-matching alternate passwordTr   rd   )Úrandom_passwordÚaccept_password_pairr   Úrandintr…   Úpassword_encoding)r}   r¢  rû  r   s       r1   rX  z2HandlerCase.FuzzHashGenerator.random_password_pairÏ  s°   € à×)Ò)Ñ+Ô+ˆFðØ×,Ò,Ñ.Ô.�Ø×,Ò,¨V°UÑ;Ô;ð Øðð ”(ˆCØ�{Š{˜1˜QÑÔð ?ØŸš tÔ'=Ñ>Ô>�Ø�{Š{˜1˜QÑÔð =ØŸš TÔ%;Ñ<Ô<�Ø˜5�=Ð r3   c                 óp  — | j         }|                     ¦   «         dk     rt          d¦  «        S | j        }|j        o|j        }|pd}|dk     s|                     ¦   «         dk     r'|                      dt          |d¦  «        dd¦  «        }n&|                      dt          |d¦  «        d	d
¦  «        }t          || j	        |¦  «        }|rkt          |t          ¦  «        rVt          |                     d¦  «        ¦  «        |k    r0|dd…         }t          |                     d¦  «        ¦  «        |k    °0|S )z*generate random passwords for fuzz testingg-Cëâ6?r–   i?B rŠ  r‹  rd   é   éc   éF   é   rƒ   Nrþ   )r   r»   r   rV   rª  r±  r_  rA   r   Úpassword_alphabetrr   r    r)  r…   )r}   r   rV   r±  r+  Úsizerõ   s          r1   re  z-HandlerCase.FuzzHashGenerator.random_passwordÝ  s8  € ð ”(ˆCØ�zŠz‰|Œ|˜eÒ#Ð#Ý˜‘u”u�ð ”lˆGØ#Ô2ÐL°wÔ7LˆMØ$Ð.¨ˆHð ˜"Š}ˆ} §
¢
¡¤¨rÒ 1Ð 1à×(Ò(¨­C°¸"Ñ,=Ô,=¸rÀ2ÑFÔF��ð ×(Ò(¨­S°¸2Ñ->Ô->ÀÀBÑGÔG�õ    TÔ%;¸TÑBÔBˆFð ð )¥¨FµGÑ!<Ô!<ð )Ý˜&Ÿ-š-¨Ñ0Ô0Ñ1Ô1°MÒAÐAØ# C R Cœ[�Fõ ˜&Ÿ-š-¨Ñ0Ô0Ñ1Ô1°MÒAÐAð ˆMr3   c                 ó   — ||k    S )z-verify fuzz pair contains different passwordsr7   )r}   r¢  rû  s      r1   rf  z2HandlerCase.FuzzHashGenerator.accept_password_pairû  s   € à˜U’?Ð"r3   N)rÌ   r  r  r  r   rn  rh  r&  rY  rZ  r  r  r_  rP  rQ  rR  rX  re  rf  r7   r3   r1   r  rO  i  sí   € € € € € ð	ð 	ð ˜AÐNÑOÔOÐð $Ðð
 �t ?Ø&8Ø"0ð2ñ 2ô 2ˆð
 ˆð	ð 	ð 	ð
	ð 	ð 	ð.	3ð 	3ð 	3ð
	Hð 
	Hð 
	Hð	Hð 	Hð 	Hð		4ð 		4ð 		4ð	!ð 	!ð 	!ð	ð 	ð 	ð<	#ð 	#ð 	#ð 	#ð 	#r3   r  c                 óB  — | j         }|j        su|                      t          |d¦  «        ¦  «         |                      t          |d¦  «        ¦  «         |                      | j        ¦  «         |                      d¦  «        ‚|                     ¦   «         }|                      |t          d¬¦  «         |  	                    | 
                    |¦  «        d|z  ¬¦  «         |                      ¦   «                              | j        ¦  «        d         }|                     |¦  «        }|                      |t          d¬¦  «         |  	                    | 
                    |¦  «        d|z  ¬¦  «         |                      t          d|j        |¦  «         	 |                     |¦  «        }d	}n# t          $ r}d	}|}Y d	}~nd	}~ww xY w|€4|                      |t          d
¬¦  «         |                      ||¦  «         n>|                      |t          ¦  «         |                      dt          |¦  «        ¦  «         |                     ¦   «         }| j        r|                      ||¦  «         n|€|                      ||¦  «         |                     |¦  «        }	| j        r|                      |	|¦  «         n|                      |	|¦  «         |                     |dz   ¦  «        }
| j        s|€|                      |
|¦  «         d	S |                      |
|¦  «         d	S )z.disable() / .enable() methodsÚdisableÚenablerò  z#disable() must return native stringr¥  z0identify() didn't recognize disable() result: %rrd   zcannot restore original hashNz"enable() must return native stringrK  )rV   r¯  r�  rP   r÷  r?  rr  r  r�   r®  rË  rZ  r¨  rô  ÚassertRaisesRegexr%  rs  r   r  rø  )r}   rV   Údisabled_defaultrî  Údisabled_stubrõ   r3  ÚeÚdisabled_default2Údisabled_stub2Údisabled_others              r1   Útest_disable_and_enablez#HandlerCase.test_disable_and_enable  s  € ð
 ”,ˆØÔ"ð 	2Ø×Ò�W W¨iÑ8Ô8Ñ9Ô9Ð9Ø×Ò�W W¨hÑ7Ô7Ñ8Ô8Ð8Ø×Ò˜TÔ8Ñ9Ô9Ð9Ø—-’-Ð 0Ñ1Ô1Ð1ð #Ÿ?š?Ñ,Ô,ÐØ×ÒÐ.µØ"Gð 	ñ 	Iô 	Ið 	Ià�Š˜×(Ò(Ð)9Ñ:Ô:ØNÐRbÑcð 	ñ 	eô 	eð 	eð �~Š~ÑÔ×&Ò& tÔ'>Ñ?Ô?ÀÔBˆØŸš¨Ñ-Ô-ˆØ×Ò˜m­SØ"Gð 	ñ 	Iô 	Ið 	Ià�Š˜×(Ò(¨Ñ7Ô7ØNÐR_Ñ`ð 	ñ 	bô 	bð 	bð 	×Ò�zÐ+IØ&œ~Ð/?ñ	Aô 	Að 	Að	Ø—^’^ MÑ2Ô2ˆFØˆEˆEøÝð 	ð 	ð 	ØˆFØˆEˆEˆEˆEˆEˆEøøøøð	øøøð ˆ=à×!Ò! &­#Ø&Jð "ñ Lô Lð Là×Ò˜V TÑ*Ô*Ð*Ð*ð ×!Ò! %­Ñ4Ô4Ð4Ø×ÒÐ;½SÀ¹Z¼ZÑHÔHÐHð $ŸOšOÑ-Ô-ÐØÔ&ð 	Bà×ÒÐ 1Ð3CÑDÔDÐDÐDØˆ]à×ÒÐ.Ð0@ÑAÔAÐAð !Ÿš¨Ñ.Ô.ˆØÔ&ð 	<à×Ò °Ñ>Ô>Ð>Ð>ð ×Ò˜^¨]Ñ;Ô;Ð;ð !Ÿš¨°©Ñ6Ô6ˆØÔ&ð 	<¨%¨-à×Ò °Ñ>Ô>Ð>Ð>Ð>ð ×Ò˜^¨]Ñ;Ô;Ð;Ð;Ð;s   ÆF. Æ.
GÆ8GÇG©NF)FNNr6   ©NN)F)nrÌ   r  r  r  rV   r`   rŸ  r   r¡  rì  rï  rô  r   rö  rÊ  ró  r÷  ré  r#   rš  Ú_HandlerCase__unittest_skipÚpropertyrÇ   r`  r¦  rª  r±  r´  r½  r¿  rÇ  r­  rÍ  rÐ  rÓ  rÕ  r×  rØ  rß  rÛ  râ  r×   rì  rï  rò  rü  rþ  r   r  r  r
  r  r  r!  r)  r0  r3  r6  r=  r@  rI  rN  rP  rS  rV  rX  rh  rj  rn  rr  ru  rw  r  rŽ  r•  r˜  r¡  r¨  r³  r·  rÇ  rÏ  rÑ  rÕ  rÛ  rÞ  rà  rä  ræ  rê  rí  rð  rõ  r÷  r  rù  r  rÿ  r  r#  r8  r  r1  rI  r  r@  rH  r  r{  r  r   s   @r1   r'   r'   ÿ  så  ø€ € € € € ðð ð2 €Gð €Gð Ðð Ðð  Ðð !#Ðð  Ðð
ð ð Ðð 	
ˆˆ&‰	Œ	Ø	ˆˆ/ÑÔØ ð€Oð $Ðð Ðð #Ðð #Ðð ðð ñ „]ðð €Oàðð ñ „Xðð ðð ñ „[ðð.ð .ð .ð-ð -ð -ð -ð&Nð Nð Nð0ð 0ð 0ð&ð ð ð
Wð Wð Wð Wð$Fð Fð Fð Fð
+ð +ð +ð.ð .ð .ð
<ð <ð <ð

3ð 
3ð 
3ð 
3ð$ 5Ðàð
*ð 
*ñ „[ð
*ð ðð ñ „[ðð,  ÐðCð Cð CðJð Jð Jð Jð JðBOð Oð Oð@'ð 'ð 'ðR4ð 4ð 4ð56ð 56ð 56ð 56ðn7ð 7ð 7ð!8ð !8ð !8ðF'>ð '>ð '>ðX=ð =ð =ðEð Eð Eð
'dð 'dð 'dðR ð	<ð 	<ñ „Xð	<ð1ð 1ð 1ð*0ð 0ð 0ð43,ð 3,ð 3,ðl %*Ð!ðð ð ðJð Jð Jð6 ðð ñ „XððYð Yð Yð(-6ð -6ð -6ðdCð Cð CðZð Zð Zð<Tð Tð Tð 4ð 4ð 4ð,):ð ):ð ):ð ):ð ):ðV;ð ;ð ;ð46Tð 6Tð 6Tðp:\ð :\ð :\ðx$Yð $Yð $YðL=ð =ð =ð*2ð 2ð 2ð2'Bð 'Bð 'BðR7ð 7ð 7ð4Mð Mð Mð
/Dð /Dð /Dðf/Wð /Wð /Wðh:ð :ð :ðB=ð =ð =ð@h:ð h:ð h:ðZ$Fð $Fð $FðL>ð >ð >ð	Kð 	Kð 	KðLð Lð Lð )ð )ð )ð	ð 	ð 	ð*Að *Að *AðX;ð ;ð ;ð2!>ð !>ð !>ðF&ð &ð &ð*&ð &ð &ð*$:ð $:ð $:ðL)(ð )(ð )(ð` !Ðð:ð :ð :ð%,ð %,ð %,ðN8ð 8ð 8ðAð Að Að"WNð WNð WNð WNðr<Oð <Oð <OðD ð
ð 
ñ „Xð
ð ðð ñ „Xðð" 0€Nð"ð "ð "ð "ðHð ð ðT#ð T#ð T#ð T#ð T#˜Fñ T#ô T#ð T#ð|V<ð V<ð V<ð V<ð V<ð V<ð V<r3   r'   c                   ó²   ‡ — e Zd ZdZg ZdZdZdZˆ fd„Ze	d„ ¦   «         Z
ed„ ¦   «         Zd„ Ze	ˆ fd	„¦   «         Zd
„ Zd„ Zd„ Zed„ ¦   «         Zd„ Zd„ Zˆ xZS )rÜ  a³  helper used by create_backend_case() which adds additional features
    to test the os_crypt backend.

    * if crypt support is missing, inserts fake crypt support to simulate
      a working safe_crypt, to test passlib's codepath as fully as possible.

    * extra tests to verify non-conformant crypt implementations are handled
      correctly.

    * check that native crypt support is detected correctly for known platforms.
    Tr˜  Fc                 óÌ   •— | j         dk    sJ ‚| j                             d¦  «        s|                      ¦   «          t	          t
          | ¦  «                             ¦   «          d S )Nr˜  )r`   rV   rf   Ú_patch_safe_cryptrÅ   rÜ  r×   rÚ   s    €r1   r×   zOsCryptMixin.setUpˆ  sb   ø€ ØŒ|˜zÒ)Ð)Ð)Ð)ØŒ|×'Ò'¨
Ñ3Ô3ð 	%à×"Ò"Ñ$Ô$Ð$Ý�l˜DÑ!Ô!×'Ò'Ñ)Ô)Ð)Ð)Ð)r3   c                 óz   — t          | j        ¦  «        }|                     ¦   «          t          |d¦  «        }||fS )z‘
        return (handler, backend) pair to use for faking crypt.crypt() support for hash.
        backend will be None if none availabe.
        r˜  )r[   rV   r^   rn   )rÏ   rV   Úalt_backends      r1   Ú_get_safe_crypt_handler_backendz,OsCryptMixin._get_safe_crypt_handler_backend�  sC   € õ ! ¤Ñ-Ô-ˆð 	×ÒÑÔÐõ & g¨zÑ:Ô:ˆØ˜Ð#Ð#r3   c                 ó:   — |                       ¦   «         d         duS )z®
        test if there's a fallback handler to test against if os_crypt can't support
        a specified secret (may be explicitly set to False for some subclasses)
        r   N)r…  r  s    r1   Úhas_os_crypt_fallbackz"OsCryptMixin.has_os_crypt_fallbackŸ  s    € ð ×3Ò3Ñ5Ô5°aÔ8ÀÐDÐDr3   c                 óü   ‡— |                       ¦   «         \  }}|st          d¦  «        ‚|                     ¦   «         Š‰                     |¦  «         ˆfd„}ddlm} |                      |d|¦  «         d| _        dS )zïif crypt() doesn't support current hash alg, this patches
        safe_crypt() so that it transparently uses another one of the handler's
        backends, so that we can go ahead and test as much of code path
        as possible.
        z,handler has no available alternate backends!c                 ób   •— ‰                      | |¦  «        }t          |t          ¦  «        sJ ‚|S r6   )rÒ  rr   r�   )r¢  r£  Úalt_handlers     €r1   Ú
crypt_stubz2OsCryptMixin._patch_safe_crypt.<locals>.crypt_stub¶  s3   ø€ Ø×&Ò& v¨tÑ4Ô4ˆDÝ˜d¥CÑ(Ô(Ð(Ð(Ð(ØˆKr3   r   NÚ_cryptT)r…  rø   rÃ  r_   r>  ÚutilsrÙ   Úusing_patched_crypt)r}   rV   r„  r‹  ÚmodrŠ  s        @r1   r‚  zOsCryptMixin._patch_safe_crypt§  s§   ø€ ð  $×CÒCÑEÔEÑˆ�Øð 	QÝ Ð!OÑPÔPÐPð —m’m‘o”oˆØ×Ò Ñ,Ô,Ð,ð	ð 	ð 	ð 	ð 	ð
 	$Ð#Ð#Ð#Ð#Ð#Ø�Š�s˜H jÑ1Ô1Ð1Ø#'ˆÔ Ð Ð r3   c                 óè   •— |dk    sJ ‚t          t          | ¦  «                             |¦  «        }ddlm} || j        k    r/|r-t          d¦  «        r|                      ¦   «         d         rdS dS |S )z|
        make sure os_crypt backend is tested
        when it's known os_crypt will be faked by _patch_safe_crypt()
        r˜  r   )Ú	has_cryptrF   rd   Nz hash not supported by os crypt())rÅ   rÜ  rØ  r>  r‘  r×  r$   r…  )rÏ   r`   Úreasonr‘  rÊ   s       €r1   rØ  z%OsCryptMixin._get_skip_backend_reason¿  s’   ø€ ð ˜*Ò$Ð$Ð$Ð$Ý•| SÑ)Ô)×BÒBÀ7ÑKÔKˆà+Ð+Ð+Ð+Ð+Ð+Ø�SÔ/Ò/Ð/°IÐ/Ý˜Ñ Ô ð : S×%HÒ%HÑ%JÔ%JÈ1Ô%Mð :ð �tà9Ð9àˆr3   c                 ór   ‡— ddl m} ˆfd„Š|j        ‰_        d‰_        |                      |d‰¦  «         ‰S )zÇ
        patch passlib.utils.safe_crypt() so it returns mock value for duration of test.
        returns function whose .return_value controls what's returned.
        this defaults to None.
        r   Nc                 óJ   •— | dk    r‰                      | |¦  «        S ‰j        S )Nr–  )Ú__wrapped__Úreturn_value)r¢  r¤  Ú
mock_crypts     €r1   r—  z0OsCryptMixin._use_mock_crypt.<locals>.mock_cryptà  s-   ø€ à˜ÒÐØ!×-Ò-¨f°fÑ=Ô=Ð=à!Ô.Ð.r3   rŒ  )r>  r�  rŒ  r•  r–  rÙ   )r}   r�  r—  s     @r1   Ú_use_mock_cryptzOsCryptMixin._use_mock_cryptØ  s`   ø€ ð 	$Ð#Ð#Ð#Ð#Ð#ð	/ð 	/ð 	/ð 	/ð 	/ð "%¤ˆ
ÔØ"&ˆ
Ôà�Š�s˜H jÑ1Ô1Ð1àÐr3   c                 ó  ‡ ‡‡‡— ‰                       ¦   «         d         Št          j        fŠ‰                      ¦   «         Šˆˆˆˆ fd„} |d‰dd…         z   ¦  «          |‰dd…         ¦  «          |‰dz   ¦  «         dS )ztest with faulty crypt()rd   c                 óÂ   •— | ‰_         ‰                     ‰‰j        d‰¦  «         ‰                     ‰‰j        d¦  «         ‰                     ‰‰j        d‰¦  «         d S r  )r–  rñ   rÓ  rÇ  r­  )r›   Ú	exc_typesr£  r—  r}   s    €€€€r1   r–  z/OsCryptMixin.test_80_faulty_crypt.<locals>.testô  se   ø€ ð ',ˆJÔ#Ø×Ò˜i¨¬¸&À$ÑGÔGÐGØ×Ò˜i¨¬¸&ÑAÔAÐAØ×Ò˜i¨¬¸ÀÑFÔFÐFÐFÐFr3   z$xr  Nrþ   rF  )rª  r   ÚInternalBackendErrorr˜  )r}   r–  r›  r£  r—  s   ` @@@r1   Útest_80_faulty_cryptz!OsCryptMixin.test_80_faulty_cryptî  sµ   øøøø€ à×#Ò#Ñ%Ô% aÔ(ˆÝÔ-Ð/ˆ	Ø×)Ò)Ñ+Ô+ˆ
ð	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	Gð 	ˆˆT�D˜˜˜”H‰_ÑÔÐØˆˆT�#�2�#ŒY‰ŒˆØˆˆT�C‰ZÑÔÐÐÐr3   c                 ó  — |                       ¦   «         }d|_        | j        rl|                      d¦  «        }|                      d|¦  «        }|                      ||¦  «         |                      |                      d|¦  «        ¦  «         dS ddlm	} |  
                    ¦   «         d         }|                      || j        d¦  «         |                      || j        d|¦  «         |                      || j        d|¦  «         dS )ztest per-call crypt() fallbackNrî  r   )rœ  rd   )r˜  r–  r‡  rÇ  rÓ  r   r®  r­  rÔ  rœ  rª  rñ   )r}   r—  rÍ  rÎ  Úerr_typer£  s         r1   Útest_81_crypt_fallbackz#OsCryptMixin.test_81_crypt_fallback   s  € ð ×)Ò)Ñ+Ô+ˆ
Ø"&ˆ
ÔàÔ%ð 	Fà—’ Ñ(Ô(ˆBØ—’ ¨Ñ,Ô,ˆBØ×Ò˜R Ñ$Ô$Ð$Ø�OŠO˜DŸNšN¨6°2Ñ6Ô6Ñ7Ô7Ð7Ð7Ð7ð EÐDÐDÐDÐDÐDØ×'Ò'Ñ)Ô)¨!Ô,ˆDØ×Ò˜h¨¬¸Ñ@Ô@Ð@Ø×Ò˜h¨¬¸ÀÑFÔFÐFØ×Ò˜h¨¬¸ÀÑEÔEÐEÐEÐEr3   c                 óÚ  — t          | j        d¦  «        r|                      d¦  «        ‚| j         }| j        j        }t
          j        }| j        D ]\  }}t          j	        ||¦  «        r nŒ|                      d|›d|›d�¦  «        ‚|€|                      d|›d|›d�¦  «        ‚||k    rdS |r|  
                    d|›d	|›�¦  «         dS |  
                    d
|›d	|›�¦  «         dS )a'  
        test platform-specific crypt() support detection

        NOTE: this is mainly just a sanity check to ensure the runtime
              detection is functioning correctly on some known platforms,
              so that we can feel more confident it'll work right on unknown ones.
        rN   znot applicable to wrapperszno data for z" platform (current host support = ú)Nzvaried support on z	expected z( platform would have native support for zdid not expect )rP   rV   r?  rŽ  rÐ   ÚsysÚplatformÚplatform_crypt_supportr—   rë  r	  )r}   Úusing_backendrÐ   r¤  ÚpatternÚexpecteds         r1   Útest_82_crypt_supportz"OsCryptMixin.test_82_crypt_support  s\  € õ �4”< Ñ/Ô/ð 	>Ø—-’-Ð <Ñ=Ô=Ð=ð !Ô4Ð4ˆØŒ|Ô ˆÝ”<ˆØ!%Ô!<ð 	;ð 	;ÑˆG�XÝŒx˜ Ñ*Ô*ð Ø�ðð —-’-�-Ø!)  ¨=¨=¨=ð!:ñ ;ô ;ð ;ð
 ÐØ—-’-�-Ø!)  ¨=¨=¨=ð!:ñ ;ô ;ð ;ð �}Ò$Ð$ØˆDØð 	(Ø�IŠIˆIØ�x�x  ð'ñ (ô (ð (ð (ð (ð �IŠIˆIØ�x�x  ð'ñ (ô (ð (ð (ð (r3   c                 óŽ   ‡ ‡‡‡— ‰ j         }‰ j        st          |d¦  «        rdS ddlmŠ ddlmŠ ‰ j        j        Šˆˆˆˆ fd„}|S )ztest results against OS crypt()rp   Nr   )Úcrypt)Ú_safe_crypt_lockc                 óª   •— ‰                      |¦  «        sdS t          | ‰¦  «        } ‰5   ‰| |¦  «        |k    cddd¦  «         S # 1 swxY w Y   dS )zstdlib-cryptr   N)Úcrypt_supports_variantr   )r¢  r£  r¬  r«  Úencodingr}   s     €€€€r1   Úcheck_cryptz5OsCryptMixin.fuzz_verifier_crypt.<locals>.check_cryptS  s«   ø€ à×.Ò.¨tÑ4Ô4ð Ø�vå" 6¨8Ñ4Ô4ˆFØ!ð 3ð 3Ø�u˜V TÑ*Ô*¨dÒ2ð3ð 3ð 3ð 3ñ 3ô 3ð 3ð 3ð 3ð 3ð 3ð 3øøøð 3ð 3ð 3ð 3ð 3ð 3s   «AÁAÁA)rV   rŽ  rP   r«  r>  r¬  r  rh  )r}   rV   r°  r¬  r«  r¯  s   `  @@@r1   Úfuzz_verifier_cryptz OsCryptMixin.fuzz_verifier_cryptE  s‘   øøøø€ ð
 ”,ˆØÔ#ð 	¥w¨w¸	Ñ'BÔ'Bð 	Ø�4ð 	 ÐÐÐÐÐØ2Ð2Ð2Ð2Ð2Ð2ØÔ)Ô;ˆð	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð 	3ð Ðr3   c                 ó   — dS )z~
        fuzzy_verified_crypt() helper --
        used to determine if os crypt() supports a particular hash variant.
        Tr7   rÌ  s     r1   r®  z#OsCryptMixin.crypt_supports_variant^  s	   € ð
 ˆtr3   )rÌ   r  r  r  r¥  Ú_OsCryptMixin__unittest_skipr`   rŽ  r×   r`  r…  r  r‡  r‚  rØ  r˜  r�  r   r�  r©  r±  r®  r  r   s   @r1   rÜ  rÜ  f  s8  ø€ € € € € ð
ð 
ð"  Ðð
 €Oð €Gð  Ðð
*ð *ð *ð *ð *ð ð$ð $ñ „[ð$ð ðEð Eñ „XðEð(ð (ð (ð0 ðð ð ð ñ „[ðð0ð ð ð,ð ð ð$Fð Fð Fð* ð)(ð )(ñ Ôð)(ð^ð ð ð2ð ð ð ð ð ð r3   rÜ  c                   ó`   — e Zd ZdZdZdZdZdZd„ Zd„ Z	d„ Z
d„ Z G d	„ d
ej        ¦  «        ZdS )ÚUserHandlerMixina(  helper for handlers w/ 'user' context kwd; mixin for HandlerCase

    this overrides the HandlerCase test harness methods
    so that a username is automatically inserted to hash/verify
    calls. as well, passing in a pair of strings as the password
    will be interpreted as (secret,user)
    ÚuserTFc                 ó®  — | j         }d}|                     || j        ¬¦  «        }| j        rg|                      t
          |j        |¦  «         |                      t
          |j        ||¦  «         |                      t
          |j        ||¦  «         dS |                     |¦  «         |                     ||¦  «         |                     ||¦  «         dS )ztest user context keywordrî  ©r¶  N)rV   r£  Údefault_userÚrequires_userrñ   r  rÒ  rÉ  )r}   rV   Úpasswordr£  s       r1   Útest_80_userzUserHandlerMixin.test_80_user€  sË   € à”,ˆØˆØ�|Š|˜H¨4Ô+<ˆ|Ñ=Ô=ˆàÔð 	+Ø×Ò�i¨¬°xÑ@Ô@Ð@Ø×Ò�i¨¬¸(ÀDÑIÔIÐIØ×Ò�i¨¬¸À4ÑHÔHÐHÐHÐHð �LŠL˜Ñ"Ô"Ð"Ø�OŠO˜H dÑ+Ô+Ð+Ø�NŠN˜8 TÑ*Ô*Ð*Ð*Ð*r3   c                 ól  — | j                              ¦   «         }|                     ¦   «         }|                      dt	          |¬¦  «        ¬¦  «        }| j        r.|                      |                      d||¬¦  «        d¦  «         dS |                      |                      d||¬¦  «        d¦  «         dS )ztest user case sensitivityrî  r¸  )rÅ  z!user should not be case sensitivezuser should be case sensitiveN)	r¹  rœ   r�   rÇ  r&  Úuser_case_insensitiver®  r­  r�  )r}   rœ   r�   r£  s       r1   Útest_81_user_casez"UserHandlerMixin.test_81_user_case�  sÅ   € àÔ!×'Ò'Ñ)Ô)ˆØ—’‘”ˆØ�Š˜v­t¸Ð/?Ñ/?Ô/?ˆÑ@Ô@ˆØÔ%ð 	>Ø�OŠO˜DŸNšN¨6°4¸e˜NÑDÔDØ?ñAô Að Að Að Að ×Ò˜TŸ^š^¨F°D¸u˜^ÑEÔEØ<ñ>ô >ð >ð >ð >r3   c                 ó  — |                       ¦   «         }|                      d|d¬¦  «        }|                      d|d¬¦  «        }|                      ||¦  «         |                      d|d¬¦  «        }|                      ||¦  «         dS )ztest user used as saltrî  Úadminr¸  ÚrootN)rÕ  rÓ  r   rø  )r}   r¤  rÍ  rÎ  Úh3s        r1   Útest_82_user_saltz"UserHandlerMixin.test_82_user_saltœ  sŠ   € à×%Ò%Ñ'Ô'ˆØ�_Š_˜V V°'ˆ_Ñ:Ô:ˆØ�_Š_˜V V°'ˆ_Ñ:Ô:ˆØ×Ò˜˜RÑ Ô Ð Ø�_Š_˜V V°&ˆ_Ñ9Ô9ˆØ×Ò˜B Ñ#Ô#Ð#Ð#Ð#r3   c                 ón   — t          |t          ¦  «        r|\  }}n| j        s|S | j        }d|vr||d<   |S )zinsert username into kwdsr¶  )rr   r$  rº  r¹  )r}   r¢  rm   r¶  s       r1   r¿  z!UserHandlerMixin.populate_contextª  sP   € å�f�eÑ$Ô$ð 	%Ø!‰LˆF�D�DØÔ#ð 	%ØˆMàÔ$ˆDØ˜ÐÐØˆD�‰LØˆr3   c                   ó’   — e Zd Zej        j                             ¦   «         Ze                     d¬¦  «          ed¦  «        Z	d„ Z
dS )ú"UserHandlerMixin.FuzzHashGeneratorÚrandom_userr¸  Ú	asdQWE123c                 ó°   — | j         }| j        j        s|                     ¦   «         dk     rd S t	          || j        |                     dd¦  «        ¦  «        S )Nr)   r  r£   )r   r–  rº  r»   r   Úuser_alphabetrg  )r}   r   s     r1   rÈ  z.UserHandlerMixin.FuzzHashGenerator.random_userÀ  sP   € Ø”(ˆCØ”9Ô*ð ¨s¯zªz©|¬|¸bÒ/@Ð/@Ø�tÝ˜c 4Ô#5°s·{²{À1ÀRÑ7HÔ7HÑIÔIÐIr3   N)rÌ   r  r  r'   r  rZ  rý  rÁ  r   rË  rÈ  r7   r3   r1   r  rÇ  ¹  sc   € € € € € à!Ô3Ô?×DÒDÑFÔFˆØ×Ò ÐÑ.Ô.Ð.à˜˜+™œˆð	Jð 	Jð 	Jð 	Jð 	Jr3   r  N)rÌ   r  r  r  r¹  rº  r¾  Ú _UserHandlerMixin__unittest_skipr¼  r¿  rÄ  r¿  r'   r  r7   r3   r1   rµ  rµ  i  sª   € € € € € ðð ð €LØ€MØ!Ðð
 €Oð
+ð +ð +ð 
>ð 
>ð 
>ð$ð $ð $ð
ð 
ð 
ðJð Jð Jð Jð J˜KÔ9ñ Jô Jð Jð Jð Jr3   rµ  c                   óp   — e Zd ZdZdZ ed¦  «        d ed¦  «        gZ G d„ dej        ¦  «        Zd„ Z	d	S )
ÚEncodingHandlerMixina   helper for handlers w/ 'encoding' context kwd; mixin for HandlerCase

    this overrides the HandlerCase test harness methods
    so that an encoding can be inserted to hash/verify
    calls by passing in a pair of strings as the password
    will be interpreted as (secret,encoding)
    Tr–  s   testu   Â¬Âºc                   ó$   — e Zd Z ed¦  «        ZdS )ú&EncodingHandlerMixin.FuzzHashGeneratoru   qwerty1234<>.@*#! Â¬N)rÌ   r  r  r   rn  r7   r3   r1   r  rÐ  ß  s!   € € € € € à˜AÐ8Ñ9Ô9ÐÐÐr3   r  c                 óf   — t          |t          ¦  «        r|\  }}|                     d|¦  «         |S )zinsert encoding into kwdsr¯  )rr   r$  Ú
setdefault)r}   r¢  rm   r¯  s       r1   r¿  z%EncodingHandlerMixin.populate_contextã  s7   € å�f�eÑ$Ô$ð 	2Ø%ÑˆF�HØ�OŠO˜J¨Ñ1Ô1Ð1Øˆr3   N)
rÌ   r  r  r  Ú$_EncodingHandlerMixin__unittest_skipr   rö  r'   r  r¿  r7   r3   r1   rÎ  rÎ  Ê  s…   € € € € € ðð ð €Oð
 	
ˆˆ&‰	Œ	ØØ	ˆˆ.ÑÔð€Oð:ð :ð :ð :ð :˜KÔ9ñ :ô :ð :ðð ð ð ð r3   rÎ  c                   ó8   ‡ — e Zd ZdZdˆ fd„	Zˆ fd„Zˆ fd„Zˆ xZS )rÞ   z@catch_warnings() wrapper which clears warning registry & filtersÚalwaysú.*c                 ó�   •—  t          t          | ¦  «        j        di |¤Ž || _        |rt	          j        |¦  «        nd | _        d S )Nr7   )rÅ   rÞ   r  Ú_reset_filterr—   ÚcompileÚ_reset_registry)r}   Úreset_filterÚreset_registryrm   rÊ   s       €r1   r  zreset_warnings.__init__ó  sQ   ø€ Ø,��n˜dÑ#Ô#Ô,Ð4Ð4¨tÐ4Ð4Ð4Ø)ˆÔØ=KÐU�rœz¨.Ñ9Ô9Ð9ÐQUˆÔÐÐr3   c                 óî  •— t          t          | ¦  «                             ¦   «         }| j        r,t	          j        ¦   «          t	          j        | j        ¦  «         | j        }|r�i x}| _        t          t          j                             ¦   «         ¦  «        D ][\  }}|�|                     |¦  «        sŒt          |dd ¦  «        }|r+|                     ¦   «         ||<   |                     ¦   «          Œ\|S ©NÚ__warningregistry__)rÅ   rÞ   rß   rØ  râ   ÚresetwarningsÚsimplefilterrÚ  Ú_orig_registryr#  r£  Úmodulesr`  rë  rÎ   rý  Úclear)r}   r  r§  ÚbackuprÐ   r�  ÚregrÊ   s          €r1   rß   zreset_warnings.__enter__ø  sì   ø€ å•N DÑ)Ô)×3Ò3Ñ5Ô5ˆð Ôð 	6ÝÔ"Ñ$Ô$Ð$ÝÔ! $Ô"4Ñ5Ô5Ð5ð Ô&ˆØð 	 Ø+-Ð-ˆF�TÔ(Ý!¥#¤+×"3Ò"3Ñ"5Ô"5Ñ6Ô6ð  ð  ‘	��cØ�; g§m¢m°DÑ&9Ô&9�;ØÝ˜cÐ#8¸$Ñ?Ô?�Øð  Ø#&§8¢8¡:¤:�F˜4‘LØ—I’I‘K”K�KøØˆ
r3   c                 óÂ  •— | j         }|r·| j        }t          t          j                             ¦   «         ¦  «        D ]„\  }}|�|                     |¦  «        sŒt          |dd ¦  «        }|r|                     ¦   «          | 	                    |¦  «        }|r)|€t          |d|¦  «         Œo|                     |¦  «         Œ… t          t          | ¦  «        j        |Ž  d S rÞ  )rÚ  râ  r#  r£  rã  r`  rë  rÎ   rä  rP  r  rÁ  rÅ   rÞ   rá   )	r}   r  r§  rå  rÐ   r�  ræ  ra   rÊ   s	           €r1   rá   zreset_warnings.__exit__  sê   ø€ àÔ&ˆØð 	)àÔ(ˆFÝ!¥#¤+×"3Ò"3Ñ"5Ô"5Ñ6Ô6ð )ð )‘	��cØ�; g§m¢m°DÑ&9Ô&9�;ØÝ˜cÐ#8¸$Ñ?Ô?�Øð  Ø—I’I‘K”K�KØ—z’z $Ñ'Ô'�Øð )Ø�{Ý Ð%:¸DÑAÔAÐAÐAàŸ
š
 4Ñ(Ô(Ð(øØ,��n˜dÑ#Ô#Ô,¨hÐ7Ð7Ð7Ð7r3   )rÕ  rÖ  r  r   s   @r1   rÞ   rÞ   ð  s{   ø€ € € € € ØJÐJðVð Vð Vð Vð Vð Vð
ð ð ð ð ð.8ð 8ð 8ð 8ð 8ð 8ð 8ð 8ð 8r3   rÞ   r}  r6   r|  )Nrd   r£   )r´   rµ   )jr  Ú
__future__r   Úbinasciir   r‹  Ú	functoolsr   r   rT  rƒ  rf  rÌ   r§   r»   r—   r*   r£  rq  rˆ  r-   rÔ  r   r   rÙ  r	   r
   râ   r   Úpasslibr   r   Úpasslib.registryÚregistryÚpasslib.tests.backportsr   rŠ  r   r   r   r   r>  r   r   r   r   rQ  r   r   r   r   r   r   r   r   r   r    r!   r"   Úpasslib.utils.decorr#   Úpasslib.utils.handlersr�  rä  rS   Ú__all__Úgoogle.appengineÚgooglerE  ÚImportErrorr2   rC   ÚTICK_RESOLUTIONrJ   rK   rO  rP  ra  rœ   rI   r$   rW   r\   rb   rj   rn   r[   ry   rŒ  r�   r%   r&   r”   r™   rž   r¢   r³   rÁ   r  r�  r'   rÜ  rµ  rÎ  r‡  rÞ   r7   r3   r1   ú<module>rö     s�  ðØ #Ð #ð &Ð %Ð %Ð %Ð %Ð %à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø €€€Ø €€€Ð'�gÔ'¨Ñ1Ô1�Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø 
€
€
€
Ø €€€Ø Ð Ð Ð Ø €€€Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø €€€Ø Ð Ð Ð Ð Ð ð Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø #Ð #Ð #Ð #Ð #Ð #Ø ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]Ð ]ð5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð QÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ -Ð -Ð -Ð -Ð -Ð -Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ðð ð €ð ØÐÐÐð €C€Cøð ð ð ð Ø
€C€C€Cðøøøð
ð ð ð+ð +ð +ð (Ð'¨Ñ-Ô-€ð
 +Ð*Ð*€Ø×Ò˜rœzŸ~š~Ð.AØ.7ñ 9ô  9ß9>º¹¼ÇÂÁÄñJô J€
ðð ð ð ð8
Nð 
Nð 
Nð<ð <ð <ð <ð

"ð 
"ð 
"ðð ð ð ðð ð ð
ð ð ðXð Xð Xð( Ôðð ñ Ôðð@ð ð ðð ð ð

,ð 
,ð 
,ð0ð 0ð 0ðð ð ðð ð ðð ð ð ð$ð ð ð ð$y'ð y'ð y'ð y'ð y'ˆyñ y'ô y'ð y'ðF   Ð+Ð ð	ð 	ð 	ð^%<ð ^%<ð ^%<ð ^%<ð ^%<�(ñ ^%<ô ^%<ð ^%<ðNK}ð }ð }ð }ð }�;ñ }ô }ð }ðF[Jð [Jð [Jð [Jð [J�{ñ [Jô [Jð [JðBð ð ð ð ˜;ñ ô ð ðL18ð 18ð 18ð 18ð 18�XÔ,ñ 18ô 18ð 18ð 18ð 18s   ÃC ÃCÃC