+
    i?                     @   R t ^ RIHtHt ^ RIHt ^ RIt]P                  ! ]4      t	^ RI
Ht ^ RIHtHtHtHt ^ RIHt ^ RIHtHtHtHtHtHt ^ RIHu Ht . ROtRt ! R R]P@                  ]PB                  4      t" ! R R	]"4      t# ! R R
]PH                  4      t%R# )z1
passlib.handlers.cisco -- Cisco password hashes
)hexlify	unhexlify)md5N)warn)right_pad_string
to_unicoderepeat_stringto_bytes)h64)unicodeujoin_byte_valuesjoin_byte_elemsiter_byte_valuesuascii_to_str	cisco_pix	cisco_asacisco_type7c                   Z   a  ] tR t^$t o RtR t^tRtRt^t	]
P                  tRtR tRtV tR# )r   a6  
This class implements the password hash used by older Cisco PIX firewalls,
and follows the :ref:`password-hash-api`.
It does a single round of hashing, and relies on the username
as the salt.

This class only allows passwords <= 16 bytes, anything larger
will result in a :exc:`~passlib.exc.PasswordSizeError` if passed to :meth:`~cisco_pix.hash`,
and be silently rejected if passed to :meth:`~cisco_pix.verify`.

The :meth:`~passlib.ifc.PasswordHash.hash`,
:meth:`~passlib.ifc.PasswordHash.genhash`, and
:meth:`~passlib.ifc.PasswordHash.verify` methods
all support the following extra keyword:

:param str user:
    String containing name of user account this password is associated with.

    This is *required* in order to correctly hash passwords associated
    with a user account on the Cisco device, as it is used to salt
    the hash.

    Conversely, this *must* be omitted or set to ``""`` in order to correctly
    hash passwords which don't have an associated user account
    (such as the "enable" password).

.. versionadded:: 1.6

.. versionchanged:: 1.7.1

    Passwords > 16 bytes are now rejected / throw error instead of being silently truncated,
    to match Cisco behavior.  A number of :ref:`bugs <passlib-asa96-bug>` were fixed
    which caused prior releases to generate unverifiable hashes in certain cases.
TFc                `   V P                   p\        V\        4      '       d   VP                  R4      pRp\	        V4      V P
                  8  dj   V P                  '       dK   RV P                  V P
                  3,          p\        P                  P                  V P
                  VR7      hV\        ,           pV P                  pV'       dS   \        V\        4      '       d   VP                  R4      pV'       d   \	        V4      ^8  d   V\        V^4      ,          pV'       d   \	        V4      ^8  d   ^ pM^p\        W4      pV'       d	   W,          p\        V4      P!                  4       p\#        R \%        V4       4       4      p\&        P(                  ! V4      P+                  R4      # )a  
This function implements the "encrypted" hash format used by Cisco
PIX & ASA. It's behavior has been confirmed for ASA 9.6,
but is presumed correct for PIX & other ASA releases,
as it fits with known test vectors, and existing literature.

While nearly the same, the PIX & ASA hashes have slight differences,
so this function performs differently based on the _is_asa class flag.
Noteable changes from PIX to ASA include password size limit
increased from 16 -> 32, and other internal changes.
utf-8Nz.Password too long (%s allows at most %d bytes))msgc              3   Z   "   T F!  w  rV^,           ^,          '       g   K  Vx  K#  	  R# 5i)   N ).0ics   &  T/var/www/html/photoedit/myenv/lib/python3.14/site-packages/passlib/handlers/cisco.py	<genexpr>+cisco_pix._calc_checksum.<locals>.<genexpr>   s"      P/@tqQUaKK/@s   +
+ascii)_is_asa
isinstancer   encodelentruncate_sizeuse_defaultsnameuhexcPasswordSizeError_DUMMY_BYTESuserr   r   r   digestr   	enumerater
   encode_bytesdecode)selfsecretasaspoil_digestr   r-   pad_sizer.   s   &&      r   _calc_checksumcisco_pix._calc_checksumg   sW    ll fg&&]]7+F, v;+++   Fyy$"4"456ff..t/A/As.KK  &4. yy$(({{7+#f+*-a00 3v;#HH!&3
 "FV##% ! Py/@ PP
 '..w77    r   N)__name__
__module____qualname____firstlineno____doc__r(   r&   truncate_errortruncate_verify_rejectchecksum_sizer)   HASH64_CHARSchecksum_charsr"   r7   __static_attributes____classdictcell__)__classdict__s   @r   r   r   $   sG     !R DM N!
 M__N G
|8 |8r9   c                   &    ] tR t^tRtR t^ tRtRtR# )r   a  
This class implements the password hash used by Cisco ASA/PIX 7.0 and newer (2005).
Aside from a different internal algorithm, it's use and format is identical
to the older :class:`cisco_pix` class.

For passwords less than 13 characters, this should be identical to :class:`!cisco_pix`,
but will generate a different hash for most larger inputs
(See the `Format & Algorithm`_ section for the details).

This class only allows passwords <= 32 bytes, anything larger
will result in a :exc:`~passlib.exc.PasswordSizeError` if passed to :meth:`~cisco_asa.hash`,
and be silently rejected if passed to :meth:`~cisco_asa.verify`.

.. versionadded:: 1.7

.. versionchanged:: 1.7.1

    Passwords > 32 bytes are now rejected / throw error instead of being silently truncated,
    to match Cisco behavior.  A number of :ref:`bugs <passlib-asa96-bug>` were fixed
    which caused prior releases to generate unverifiable hashes in certain cases.
Tr   N)	r:   r;   r<   r=   r>   r(   r&   r"   rD   r   r9   r   r   r      s    8 D
 M
 Gr9   c                      a a ] tR tRt oRtR tRt]P                  t	^ t
^4t]RV 3R ll4       t]R 4       tRV 3R llt]RR l4       t]R 4       tR tR	 t]RR
 l4       t]! R4      t]R 4       tRtVtV ;t# )r   i)  a  
This class implements the "Type 7" password encoding used by Cisco IOS,
and follows the :ref:`password-hash-api`.
It has a simple 4-5 bit salt, but is nonetheless a reversible encoding
instead of a real hash.

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

:type salt: int
:param salt:
    This may be an optional salt integer drawn from ``range(0,16)``.
    If omitted, one will be chosen at random.

: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`` values that are out of range.

Note that while this class outputs digests in upper-case hexadecimal,
it will accept lower-case as well.

This class also provides the following additional method:

.. automethod:: decode
c                   <a \         \        V `
  ! R/ VB pSe7   VP                  SVP	                  R4      R7      o\        V3R l4      Vn        V# )Nrelaxed)rJ   c                     < S # Nr   salts   r   <lambda>#cisco_type7.using.<locals>.<lambda>f  s    r9   r   )superr   using
_norm_saltgetstaticmethod_generate_salt)clsrN   kwdssubcls	__class__s   &f, r   rR   cisco_type7.usinga  sM    {C.66$$T488I3F$GD$0$>F!r9   c                    \        VR R4      p\        V4      ^8  d    \        P                  P	                  V 4      h\        VR,          4      pV ! W!R,          P                  4       R7      # )r!   hash:N   N:r^   NN)rN   checksum)r   r%   r)   r*   InvalidHashErrorintupper)rW   r]   rN   s   && r   from_stringcisco_type7.from_stringi  sS    $0t9q=&&))#..48}Bx~~'788r9   c                  < \         \        V `
  ! R/ VB  Ve   V P                  V4      pMOV P                  '       d3   V P                  4       pV P                  V4      V8X  g   Q RV: 24       hM\        R4      hWn        R # )Nzgenerated invalid salt: zno salt specifiedr   )rQ   r   __init__rS   r'   rV   	TypeErrorrN   )r2   rN   rX   rZ   s   &&,r   rf   cisco_type7.__init__q  st    k4)1D1??4(D&&(D??4(D0XRV2XX0/00	r9   c                2   \        V\        4      '       g"   \        P                  P	                  VRR4      h^ Tu;8:  d   V P
                  8:  d    V#  RpV'       d0   \        V\        P                  4       V^ 8  d   ^ # V P
                  # \        V4      h)zm
validate & normalize salt value.
.. note::
    the salt for this algorithm is an integer 0-52, not a string
integerrN   z"salt/offset must be in 0..52 range)	r#   ra   r)   r*   ExpectedTypeErrormax_salt_valuer   PasslibHashWarning
ValueError)rW   rN   rJ   r   s   &&& r   rS   cisco_type7._norm_salt|  s     $$$&&**4FCC****K +2b++,q18c&8&88S/!r9   c                 B    \         P                  P                  ^ ^4      # )    )r)   rngrandintr   r9   r   rV   cisco_type7._generate_salt  s    vv~~a$$r9   c                R    R V P                   \        V P                  4      3,          # )z%02d%s)rN   r   r_   )r2   s   &r   	to_stringcisco_type7.to_string  s    499mDMM&BCCCr9   c                    \        V\        4      '       d   VP                  R 4      p\        V P	                  WP
                  4      4      P                  R4      P                  4       # )r   r!   )r#   r   r$   r   _cipherrN   r1   rb   )r2   r3   s   &&r   r7   cisco_type7._calc_checksum  sK     fg&&]]7+Ft||FII67>>wGMMOOr9   c                    V P                  V4      p\        VP                  P                  R4      4      pVP	                  WCP
                  4      pV'       d   VP                  V4      # T# )zdecode hash, returning original password.

:arg hash: encoded password
:param encoding: optional encoding to use (defaults to ``UTF-8``).
:returns: password as unicode
r!   )rc   r   r_   r$   ry   rN   r1   )rW   r]   encodingr2   tmpraws   &&&   r   r1   cisco_type7.decode  sS     t$,,W56ll3		*'/szz(#8S8r9   z5dsfd;kfoA,.iyewrkldJKDHSUBsgvca69834ncxv9873254k;fg87c                   aaa V P                   o\        S4      o\        VVV3R l\        \	        V4      4       4       4      # )z1xor static key against data - encrypts & decryptsc              3   v   <"   T F.  w  rV\        SSV,           S,          ,          4      ,          x  K0  	  R # 5irL   )ord)r   idxvaluekeykey_sizerN   s   &  r   r   &cisco_type7._cipher.<locals>.<genexpr>  s5       
?
 CTCZ834555?s   69)_keyr%   r   r/   r   )rW   datarN   r   r   s   &&f@@r   ry   cisco_type7._cipher  s<     hhs8  
'(8(>? 
 
 	
r9   rM   rL   )F)r   )r:   r;   r<   r=   r>   r(   setting_kwdsr)   UPPER_HEX_CHARSrC   min_salt_valuerl   classmethodrR   rc   rf   rS   rU   rV   rv   r7   r1   r   r   ry   rD   rE   __classcell__)rZ   rF   s   @@r   r   r   )  s     F DL
 ''N NN
   9 9	 " "" % %DP 
9 
9 DED
 
 
r9   )r   r   r   s    )&r>   binasciir   r   hashlibr   logging	getLoggerr:   logwarningsr   passlib.utilsr   r   r   r	   passlib.utils.binaryr
   passlib.utils.compatr   r   r   r   r   r   passlib.utils.handlersutilshandlersr)   __all__r,   HasUserContextStaticHandlerr   r   GenericHandlerr   r   r9   r   <module>r      s    (  g''1  P O $> > # # 
8!!2#3#3 8j'	 '`K
"## K
r9   