§
    HŠtj¬5  ã                   ó  — d Z ddlmZ ddlZ ej        e¦  «        ZddlmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmc mZ ddgZd	Zd
ZdZdZdZdd„Z G d„ dej        ej        ¦  «        Z G d„ dej        e¦  «        Z G d„ de¦  «        Z dS )z0passlib.handlers.md5_crypt - md5-crypt algorithmé    )Úmd5N)Ú
safe_cryptÚ
test_cryptÚrepeat_string)Úh64)ÚunicodeÚuÚ	md5_cryptÚapr_md5_cryptó    s   $1$s   $apr1$))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   é   Fc                 ó"  ‡— t          | t          ¦  «        r|                      d¦  «        } t          | t          ¦  «        s
J d¦   «         ‚t          | v r$t
          j                             t          ¦  «        ‚t          | ¦  «        }t          |t          ¦  «        s
J d¦   «         ‚|                     d¦  «        }t          |¦  «        dk     s
J d¦   «         ‚|rt          }nt          }t          | |z   | z   ¦  «                             ¦   «         }t          | |z   |z   ¦  «        }|j        } |t          ||¦  «        ¦  «         |}| dd…         }	|r ||dz  rt          n|	¦  «         |dz  }|°|                     ¦   «         }
| | z   }| |z   }| |||| z   || z   ||z   gŠˆfd	„t           D ¦   «         }|
}d
}|rU|D ]K\  }}t          |t          ||z   ¦  «                             ¦   «         z   ¦  «                             ¦   «         }ŒL|dz  }|°U|dd…         D ]K\  }}t          |t          ||z   ¦  «                             ¦   «         z   ¦  «                             ¦   «         }ŒLt#          j        |t&          ¦  «                             d¦  «        S )a†  perform raw md5-crypt calculation

    this function provides a pure-python implementation of the internals
    for the MD5-Crypt algorithms; it doesn't handle any of the
    parsing/validation of the hash strings themselves.

    :arg pwd: password chars/bytes to hash
    :arg salt: salt chars to use
    :arg use_apr: use apache variant

    :returns:
        encoded checksum chars
    zutf-8zpwd not unicode or byteszsalt not unicodeÚasciir   zsalt too largeNr   c                 ó6   •— g | ]\  }}‰|         ‰|         f‘ŒS © r"   )Ú.0ÚevenÚoddÚpermss      €úX/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/passlib/handlers/md5_crypt.pyú
<listcomp>z"_raw_md5_crypt.<locals>.<listcomp>ª   s*   ø€ ÐJÐJÐJ©9¨4°ˆe�DŒk˜5 œ:Ð&ÐJÐJÐJó    é   é   )Ú
isinstancer   ÚencodeÚbytesÚ_BNULLÚuhÚexcÚNullPasswordErrorr
   ÚlenÚ
_APR_MAGICÚ
_MD5_MAGICr   ÚdigestÚupdater   Ú_c_digest_offsetsr   Úencode_transposed_bytesÚ_transpose_mapÚdecode)ÚpwdÚsaltÚuse_aprÚpwd_lenÚmagicÚdbÚa_ctxÚa_ctx_updateÚiÚevencharÚdaÚpwd_pwdÚpwd_saltÚdataÚdcÚblocksr$   r%   r&   s                     @r'   Ú_raw_md5_cryptrL   ,   sÃ  ø€ õ4 �#•wÑÔð "Ø�jŠj˜Ñ!Ô!ˆÝ�c�5Ñ!Ô!Ð=Ð=Ð#=Ñ=Ô=Ð!Ý�€}€}ÝŒf×&Ò&¥yÑ1Ô1Ð1Ý�#‰hŒh€Gõ �d�GÑ$Ô$Ð8Ð8Ð&8Ñ8Ô8Ð$Ø�;Š;�wÑÔ€DÝˆt‰9Œ9�qŠ=ˆ=ˆ=Ð*‰=Œ=ˆ=ð ð Ýˆˆåˆõ
 
ˆS�4‰Z˜#ÑÑ	Ô	×	%Ò	%Ñ	'Ô	'€Bõ ��e‘˜dÑ"Ñ#Ô#€EØ”<€Lð €L•˜r 7Ñ+Ô+Ñ,Ô,Ð,ð 	€AØ�2�A�2Œw€HØ
ð Øˆ˜q 1™uÐ2•V�V¨(Ñ3Ô3Ð3Ø	ˆa‰ˆð ð ð
 
�Š‰Œ€Bð\ �#‰g€GØ�4‰x€HØ�'˜8 X¨c¡\°4¸±8¸TÀ'¹\ÐJ€Eð KÐJÐJÐJÕ8IÐJÑJÔJ€Dð 
€BØ€FØ
ð Øð 	=ð 	=‰IˆD�#Ý�S�3˜r D™y™>œ>×0Ò0Ñ2Ô2Ñ2Ñ3Ô3×:Ò:Ñ<Ô<ˆBˆBØ�!‰ˆð ð ð ˜#˜2˜#”Yð 9ð 9‰	ˆˆcÝ�•s˜2 ™9‘~”~×,Ò,Ñ.Ô.Ñ.Ñ/Ô/×6Ò6Ñ8Ô8ˆˆõ
 Ô& r­>Ñ:Ô:×AÒAÀ'ÑJÔJÐJr)   c                   óV   — e Zd ZdZdZdZej        ZdZ	ej        Z
ed„ ¦   «         Zd„ ZdS )Ú_MD5_Commonz+common code for md5_crypt and apr_md5_crypt)r=   Ú	salt_sizeé   r   c                 óZ   — t          j        || j        | ¬¦  «        \  }} | ||¬¦  «        S )N)Úhandler)r=   Úchecksum)r0   Ú	parse_mc2Úident)ÚclsÚhashr=   Úchks       r'   Úfrom_stringz_MD5_Common.from_stringÒ   s3   € å”L  s¤y¸#Ð>Ñ>Ô>‰	ˆˆcØˆs˜ sÐ+Ñ+Ô+Ð+r)   c                 óL   — t          j        | j        | j        | j        ¦  «        S ©N)r0   Ú
render_mc2rU   r=   rS   )Úselfs    r'   Ú	to_stringz_MD5_Common.to_string×   s   € ÝŒ}˜TœZ¨¬°D´MÑBÔBÐBr)   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Úsetting_kwdsÚchecksum_sizer0   ÚHASH64_CHARSÚchecksum_charsÚmax_salt_sizeÚ
salt_charsÚclassmethodrY   r^   r"   r)   r'   rN   rN   À   sh   € € € € € Ø5Ð5ð
 )€Là€MØ”_€Nà€MØ”€Jð ð,ð ,ñ „[ð,ðCð Cð Cð Cð Cr)   rN   c                   óh   — e Zd ZdZd Z ed¦  «        ZdZed„ ¦   «         Z	d„ Z
ed„ ¦   «         Zd„ ZdS )	r
   a•  This class implements the MD5-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 0-8 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type salt_size: int
    :param salt_size:
        Optional number of characters to use when autogenerating new salts.
        Defaults to 8, but can be any value between 0 and 8.
        (This is mainly needed when generating Cisco-compatible hashes,
        which require ``salt_size=4``).

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    z$1$)Úos_cryptÚbuiltinc                 ó^   — t          dd¦  «        r|                      | j        ¦  «         dS dS )NÚtestz$1$test$pi/xDtU5WFVRqYS6BMU8X/TF)r   Ú_set_calc_checksum_backendÚ_calc_checksum_os_crypt©rV   s    r'   Ú_load_backend_os_cryptz md5_crypt._load_backend_os_crypt  s6   € å�fÐ>Ñ?Ô?ð 	Ø×*Ò*¨3Ô+FÑGÔGÐGØ�4à�5r)   c                 ó4  — | j         | j        z   }t          ||¦  «        }|€|                      |¦  «        S |                     |¦  «        r#t          |¦  «        t          |¦  «        dz   k    r!t          j                             | ||¦  «        ‚|dd …         S )Nr*   iêÿÿÿ)	rU   r=   r   Ú_calc_checksum_builtinÚ
startswithr3   r0   r1   ÚCryptBackendError)r]   ÚsecretÚconfigrW   s       r'   rp   z!md5_crypt._calc_checksum_os_crypt  s‘   € Ø”˜dœiÑ'ˆÝ˜& &Ñ)Ô)ˆØˆ<ð ×.Ò.¨vÑ6Ô6Ð6Ø�Š˜vÑ&Ô&ð 	?­#¨d©)¬)µs¸6±{´{ÀRÑ7GÒ*GÐ*GÝ”&×*Ò*¨4°¸Ñ>Ô>Ð>Ø�C�D�DŒzÐr)   c                 ó:   — |                       | j        ¦  «         dS )NT)ro   rt   rq   s    r'   Ú_load_backend_builtinzmd5_crypt._load_backend_builtin%  s   € à×&Ò& sÔ'AÑBÔBÐBØˆtr)   c                 ó,   — t          || j        ¦  «        S r[   ©rL   r=   ©r]   rw   s     r'   rt   z md5_crypt._calc_checksum_builtin*  s   € Ý˜f d¤iÑ0Ô0Ð0r)   N)r_   r`   ra   rb   Únamer	   rU   Úbackendsri   rr   rp   rz   rt   r"   r)   r'   r
   r
   à   sŽ   € € € € € ðð ð@ €DØˆAˆe‰HŒH€Eð '€Hð
 ðð ñ „[ðð	ð 	ð 	ð ðð ñ „[ðð1ð 1ð 1ð 1ð 1r)   c                   ó2   — e Zd ZdZd Z ed¦  «        Zd„ ZdS )r   ap  This class implements the Apr-MD5-Crypt password hash, and follows the :ref:`password-hash-api`.

    It supports a variable-length salt.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 0-8 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include
        ``salt`` strings that are too long.

        .. versionadded:: 1.6
    z$apr1$c                 ó0   — t          || j        d¬¦  «        S )NT)r>   r|   r}   s     r'   Ú_calc_checksumzapr_md5_crypt._calc_checksumQ  s   € Ý˜f d¤i¸Ð>Ñ>Ô>Ð>r)   N)r_   r`   ra   rb   r~   r	   rU   r‚   r"   r)   r'   r   r   1  sA   € € € € € ðð ð2 €DØˆAˆh‰KŒK€Eð
?ð ?ð ?ð ?ð ?r)   )F)!rb   Úhashlibr   ÚloggingÚ	getLoggerr_   ÚlogÚpasslib.utilsr   r   r   Úpasslib.utils.binaryr   Úpasslib.utils.compatr   r	   Úpasslib.utils.handlersÚutilsÚhandlersr0   Ú__all__r/   r5   r4   r8   r:   rL   ÚHasSaltÚGenericHandlerrN   ÚHasManyBackendsr
   r   r"   r)   r'   ú<module>r‘      s“  ðØ 6Ð 6ð
 Ð Ð Ð Ð Ð Ø €€€Ð'�gÔ'¨Ñ1Ô1�ð @Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø $Ð $Ð $Ð $Ð $Ð $Ø +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ð #ð Øð€ð 
€Ø€
Ø€
ðÐ ð H€ðOKð OKð OKð OKðhCð Cð Cð Cð C�"”*˜bÔ/ñ Cô Cð Cð@K1ð K1ð K1ð K1ð K1�Ô" Kñ K1ô K1ð K1ðb!?ð !?ð !?ð !?ð !?�Kñ !?ô !?ð !?ð !?ð !?r)   