ó
    Ö›‘h‡þ  ã                  óÄ  • S r SSKJr  SSKrSSKrSSKrSSKrSSKJrJ	r	J
r
  SSKJrJr  SSKJr  SSKrSSKJrJr  SSKJr  SS	KJr  SS
KJr  SSKJrJr  SSKJrJrJ r J!r!J"r"  SSK#J$r$J%r%J&r&  SSK'J(r(J)r)  SSK*J+r+  SSK,J-r-J.r.  SSK/J0r0  SSK1J2r2  SSK3J4r4J5r5  SSK6J7r7   SSK8J9r9J:r:  \R|                  " 5       \R~                  " 5       \R€                  " 5       S.rASSSS.rB\ R†                  rC\ Rˆ                  rD " S S\E5      rF " S S\E5      rG " S  S!\E5      rH " S" S#\E5      rI " S$ S%\5      rJ " S& S'\E5      rKS( rL " S) S*5      rMS,S+ jrNg! \; a    SSK8J<r9J=r:   N¶f = f)-z0
Handling of RSA, DSA, ECDSA, and Ed25519 keys.
é    )ÚannotationsN)Ú	b64encodeÚdecodebytesÚencodebytes)Úmd5Úsha256)ÚAny)ÚNamedConstantÚNames)Úutils)ÚInvalidSignature)Údefault_backend)ÚhashesÚserialization)ÚdsaÚecÚed25519ÚpaddingÚrsa)ÚCipherÚ
algorithmsÚmodes)Úload_pem_private_keyÚload_ssh_public_key)ÚLiteral)ÚcommonÚsexpy)Úint_to_bytes)Ú	randbytes)Ú	iterbytesÚnativeString)Ú_mutuallyExclusiveArguments)Údecode_dss_signatureÚencode_dss_signature)Údecode_rfc6979_signatureÚencode_rfc6979_signature)ó   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   nistp256s   nistp384s   nistp521)s	   secp256r1s	   secp384r1s	   secp521r1c                  ó   • \ rS rSrSrSrg)ÚBadKeyErroréD   z^
Raised when a key isn't what we expected from it.

XXX: we really need to check for bad keys
© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__Ú__static_attributes__r+   ó    ÚZC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/conch/ssh/keys.pyr)   r)   D   s   † ôr3   r)   c                  ó   • \ rS rSrSrSrg)ÚBadSignatureAlgorithmErroréL   z]
Raised when a public key signature algorithm name isn't defined for this
public key format.
r+   Nr,   r+   r3   r4   r6   r6   L   ó   † ôr3   r6   c                  ó   • \ rS rSrSrSrg)ÚEncryptedKeyErroréS   zV
Raised when an encrypted key is presented to fromString/fromFile without
a password.
r+   Nr,   r+   r3   r4   r:   r:   S   r8   r3   r:   c                  ó   • \ rS rSrSrSrg)ÚBadFingerPrintFormatéZ   zK
Raises when unsupported fingerprint formats are presented to fingerprint.
r+   Nr,   r+   r3   r4   r=   r=   Z   s   † ôr3   r=   c                  ó4   • \ rS rSrSr\" 5       r\" 5       rSrg)ÚFingerprintFormatsé`   a¨  
Constants representing the supported formats of key fingerprints.

@cvar MD5_HEX: Named constant representing fingerprint format generated
    using md5[RFC1321] algorithm in hexadecimal encoding.
@type MD5_HEX: L{constantly.NamedConstant}

@cvar SHA256_BASE64: Named constant representing fingerprint format
    generated using sha256[RFC4634] algorithm in base64 encoding
@type SHA256_BASE64: L{constantly.NamedConstant}
r+   N)	r-   r.   r/   r0   r1   r
   ÚMD5_HEXÚSHA256_BASE64r2   r+   r3   r4   r@   r@   `   s   † ñ
ñ ‹o€GÙ!“OƒMr3   r@   c                  ó   • \ rS rSrSrSrg)ÚPassphraseNormalizationErroréq   z€
Raised when a passphrase contains Unicode characters that cannot be
normalized using the available Unicode character database.
r+   Nr,   r+   r3   r4   rE   rE   q   r8   r3   rE   c                ó¾   • [        U [        5      (       aG  [        S U  5       5      (       a
  [        5       e[        R
                  " SU 5      R                  S5      $ U $ )a¶  
Normalize a passphrase, which may be Unicode.

If the passphrase is Unicode, this follows the requirements of U{NIST
800-63B, section
5.1.1.2<https://pages.nist.gov/800-63-3/sp800-63b.html#memsecretver>}
for Unicode characters in memorized secrets: it applies the
Normalization Process for Stabilized Strings using NFKC normalization.
The passphrase is then encoded using UTF-8.

@type passphrase: L{bytes} or L{unicode} or L{None}
@param passphrase: The passphrase to normalize.

@return: The normalized passphrase, if any.
@rtype: L{bytes} or L{None}
@raises PassphraseNormalizationError: if the passphrase is Unicode and
cannot be normalized using the available Unicode character database.
c              3  óT   #   • U  H  n[         R                  " U5      S :H  v •  M      g7f)ÚCnN)ÚunicodedataÚcategory)Ú.0Úcs     r4   Ú	<genexpr>Ú'_normalizePassphrase.<locals>.<genexpr>Ž   s    é € ÐCº
°1Œ{×#Ò# AÓ&¨$Ö.º
ùs   ‚&(ÚNFKCzUTF-8)Ú
isinstanceÚstrÚanyrE   rJ   Ú	normalizeÚencode©Ú
passphrases    r4   Ú_normalizePassphraserX   x   sS   € ô& �*œc×"Ñ"ô ÑC¹
ÓC×CÑCô /Ó0Ð0Ü×$Ò$ V¨ZÓ8×?Ñ?ÀÓHÐHàÐr3   c                  ó6  • \ rS rSrSr\S0S j5       r\S0S j5       r\S 5       r\S 5       r	\S 5       r
\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S1S j5       r\S2S j5       r\S2S j5       r\S2S j5       r\S2S j5       rS rS3S jrS4S jrS rS r\R:                  4S jrS5S jrS r S r!S r"S r#S6S  jr$S! r%S" r&\'" S#S$/S#S%//5      S1S& j5       r(S2S' jr)S0S( jr*S2S) jr+S7S* jr,S+ r-S, r.S2S8S- jjr/S. r0S/r1g)9ÚKeyé—   a]  
An object representing a key.  A key can be either a public or
private key.  A public key can verify a signature; a private key can
create or verify a signature.  To generate a string that can be stored
on disk, use the toString method.  If you have a private key, but want
the string representation of the public key, use Key.public().toString().
Nc                ó�   • [        US5       nU R                  UR                  5       X#5      sSSS5        $ ! , (       d  f       g= f)aŠ  
Load a key from a file.

@param filename: The path to load key data from.

@type type: L{str} or L{None}
@param type: A string describing the format the key data is in, or
L{None} to attempt detection of the type.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if there is no encryption.

@rtype: L{Key}
@return: The loaded key.
ÚrbN)ÚopenÚ
fromStringÚread)ÚclsÚfilenameÚtyperW   Úfs        r4   ÚfromFileÚKey.fromFile    s0   € ô$ �(˜DÔ! QØ—>‘> !§&¡&£(¨DÓ=÷ "×!×!ús	   � 7·
Ac                ó†  • [        U[        5      (       a  UR                  S5      n[        U5      nUc  U R	                  U5      nUc  [        SU< 35      e[        U SUR                  5        3S5      nUc  [        SU 35      eUR                  R                  S:X  a  U(       a  [        S5      eU" U5      $ U" X5      $ )a€  
Return a Key object corresponding to the string data.
type is optionally the type of string, matching a _fromString_*
method.  Otherwise, the _guessStringType() classmethod will be used
to guess a type.  If the key is encrypted, passphrase is used as
the decryption key.

@type data: L{bytes}
@param data: The key data.

@type type: L{str} or L{None}
@param type: A string describing the format the key data is in, or
L{None} to attempt detection of the type.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if there is no encryption.

@rtype: L{Key}
@return: The loaded key.
úutf-8Nzcannot guess the type of Ú_fromString_zno _fromString method for é   zkey not encrypted)
rQ   rR   rU   rX   Ú_guessStringTyper)   ÚgetattrÚupperÚ__code__Úco_argcount)ra   Údatarc   rW   Úmethods        r4   r_   ÚKey.fromStringµ   s¿   € ô. �dœC× Ñ Ø—;‘;˜wÓ'ˆDÜ)¨*Ó5ˆ
Ø‰<Ø×'Ñ'¨Ó-ˆDØ‰<ÜÐ 9¸$¹ÐBÓCÐCÜ˜ ¨T¯Z©Z«\¨NÐ;¸TÓBˆØ‰>ÜÐ :¸4¸&ÐAÓBÐBØ�?‰?×&Ñ&¨!Ó+ÞÜ!Ð"5Ó6Ð6Ù˜$“<Ðá˜$Ó+Ð+r3   c                óh  • [         R                  " U5      u  p#US:X  aM  [         R                  " US5      u  pEnU " [        R                  " XE5      R                  [        5       5      5      $ US:X  a`  [         R                  " US5      u  pgp‰nU " [        R                  " U	[        R                  " XgUS9S9R                  [        5       5      5      $ U[        ;   aE  U " [        R                  R                  [        U   [         R                  " US5      S   5      5      $ US:X  a1  U R                  [         R                  " US5      S   S	S
9n
SU
l        U
$ US;   aH  [         R                  " U5      u  p³U R!                  U5      n
UR#                  S5      (       a  SU
l        U
$ [%        SU 35      e)a¼  
Return a public key object corresponding to this public key blob.
The format of a RSA public key blob is::
    string 'ssh-rsa'
    integer e
    integer n

The format of a DSA public key blob is::
    string 'ssh-dss'
    integer p
    integer q
    integer g
    integer y

The format of ECDSA-SHA2-* public key blob is::
    string 'ecdsa-sha2-[identifier]'
    integer x
    integer y

    identifier is the standard NIST curve name.

The format of an Ed25519 public key blob is::
    string 'ssh-ed25519'
    string a

@type blob: L{bytes}
@param blob: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if the key type (the first string) is unknown.
ó   ssh-rsarj   ó   ssh-dssé   ©ÚpÚqÚg©ÚyÚparameter_numbersé   ó"   sk-ecdsa-sha2-nistp256@openssh.comr'   )ÚencodedPointÚcurveT)ó   ssh-ed25519ó   sk-ssh-ed25519@openssh.coms   sk-ssh-úunknown blob type: )r   ÚgetNSÚgetMPr   ÚRSAPublicNumbersÚ
public_keyr   r   ÚDSAPublicNumbersÚDSAParameterNumbersÚ_curveTabler   ÚEllipticCurvePublicKeyÚfrom_encoded_pointÚ_fromECEncodedPointÚ_skÚ_fromEd25519ComponentsÚ
startswithr)   )ra   ÚblobÚkeyTypeÚrestÚeÚnrx   ry   rz   r|   Ú	keyObjectÚas               r4   Ú_fromString_BLOBÚKey._fromString_BLOBÝ   s’  € ôD Ÿš TÓ*‰ˆØ�jÓ ÜŸš d¨AÓ.‰JˆA�$Ù”s×+Ò+¨AÓ1×<Ñ<¼_Ó=NÓOÓPÐPà�jÓ Ü%Ÿ|š|¨D°!Ó4ÑˆA�!˜ÙÜ×$Ò$Ø¬3×+BÒ+BÀQÈqÑ+Qñç‘*œ_Ó.Ó/óð ð ”kÓ!ÙÜ×)Ñ)×<Ñ<Ü Ñ(¬&¯,ª,°t¸QÓ*?ÀÑ*Bóóð ð Ð;Ó;Ø×/Ñ/Ü#Ÿ\š\¨$°Ó2°1Ñ5Ø,ð 0ð ˆIð !ˆIŒMØÐàÐEÓEÜ—l’l 4Ó(‰GˆAØ×2Ñ2°1Ó5ˆIØ×!Ñ! *×-Ñ-Ø $�	”ØÐäÐ/°¨yÐ9Ó:Ð:r3   c                ó   • [         R                  " U5      u  p#US:X  a-  [         R                  " US5      u  pEpgp‰nU R                  XEXhU	S9$ US:X  a,  [         R                  " US5      u  p‰p«pÃU R	                  XºX‰US9$ U[
        ;   a„  [
        U   n[         R                  " US5      u  pénU[        UR                  R                  S5         :w  a  [        S	U< S
U< 35      e[         R                  " U5      u  póU R                  X’US9$ US:X  a0  [         R                  " US5      u  nnnUSS nU R                  UUS9$ [        SU 35      e)a  
Return a private key object corresponding to this private key blob.
The blob formats are as follows:

RSA keys::
    string 'ssh-rsa'
    integer n
    integer e
    integer d
    integer u
    integer p
    integer q

DSA keys::
    string 'ssh-dss'
    integer p
    integer q
    integer g
    integer y
    integer x

EC keys::
    string 'ecdsa-sha2-[identifier]'
    string identifier
    string q
    integer privateValue

    identifier is the standard NIST curve name.

Ed25519 keys::
    string 'ssh-ed25519'
    string a
    string k || a


@type blob: L{bytes}
@param blob: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if
    * the key type (the first string) is unknown
    * the curve name of an ECDSA key does not match the key type
rt   é   ©r–   r•   Údrx   ry   ru   é   ©r|   rz   rx   ry   Úxrj   ÚasciizECDSA curve name z does not match key type )r€   r�   ÚprivateValuer‚   Né    )Úkr„   )r   r…   r†   Ú_fromRSAComponentsÚ_fromDSAComponentsr‹   Ú
_secToNistÚnamerU   r)   rŽ   r�   )ra   r’   r“   r”   r–   r•   rž   Úurx   ry   rz   r|   r¡   r�   Ú	curveNamer£   r˜   Úcombinedr¥   s                      r4   Ú_fromString_PRIVATE_BLOBÚKey._fromString_PRIVATE_BLOB$  sf  € ô\ Ÿš TÓ*‰ˆà�jÓ Ü%+§\¢\°$¸Ó%:Ñ"ˆA�!˜˜dØ×)Ñ)¨A°aÀÐ)ÐBÐBØ˜
Ó"Ü"(§,¢,¨t°QÓ"7ÑˆA�!˜Ø×)Ñ)¨A°aÀÐ)ÐBÐBØœÓ#Ü Ñ(ˆEÜ!'§¢¨d°AÓ!6ÑˆI˜$ØœJ u§z¡z×'8Ñ'8¸Ó'AÑBÓBÝ!ã!*ªGð5óð ô "(§¢¨dÓ!3ÑˆLØ×*Ñ*Ø¸Lð +ð ð ð ˜Ó&ô !'§¢¨T°1Ó 5ÑˆAˆx˜Ø˜˜"�ˆAØ×-Ñ-¨a°1Ð-Ð5Ð5äÐ 3°G°9Ð=Ó>Ð>r3   c                ó¼   • UR                  S5      (       a  U " [        U[        5       5      5      $ [        UR	                  5       S   5      nU R                  U5      $ )aL  
Return a public key object corresponding to this OpenSSH public key
string.  The format of an OpenSSH public key string is::
    <key type> <base64-encoded public key blob>

@type data: L{bytes}
@param data: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if the blob type is unknown.
s
   ecdsa-sha2r~   )r‘   r   r   r   Úsplitr™   )ra   rp   r’   s      r4   Ú_fromString_PUBLIC_OPENSSHÚKey._fromString_PUBLIC_OPENSSHo  sN   € ð  �?‰?˜=×)Ñ)ÙÔ*¨4´Ó1BÓCÓDÐDÜ˜4Ÿ:™:›<¨™?Ó+ˆØ×#Ñ# DÓ)Ð)r3   c           	     ó  • UR                  5       R                  5       n[        SR                  USS 5      5      nUR	                  S5      (       d  [        S5      eU[        S5      S n[        R                  " US5      u  pVpx[        R                  " SUSS	 5      S
   n	U	S:w  a  [        S5      e[        R                  " US	S S5      u  p«n
US:w  Ga6  U(       d  [        S5      eUS;   a&  [        R                  nSn[        USS 5      S-  nUnO[        SU< 35      eUS:X  aQ  [        R                  " U5      u  nn[        R                  " SUSS	 5      S
   n[        R                   " UUXï-   USS9nO[        SU< 35      e[        U5      U-  S
:w  a  [        S5      e[#        U" USU 5      [$        R&                  " UXîU-    5      [)        5       S9R+                  5       nUR-                  U5      UR/                  5       -   nOUS:w  a  [        SU< S35      eUn[        R                  " SUSS	 5      S
   n[        R                  " SUS	S 5      S
   nUU:w  a  [        SUU4-  5      eU R1                  USS 5      $ )a‚  
Return a private key object corresponding to this OpenSSH private key
string, in the "openssh-key-v1" format introduced in OpenSSH 6.5.

The format of an openssh-key-v1 private key string is::
    -----BEGIN OPENSSH PRIVATE KEY-----
    <base64-encoded SSH protocol string>
    -----END OPENSSH PRIVATE KEY-----

The SSH protocol string is as described in
U{PROTOCOL.key<https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key>}.

@type data: L{bytes}
@param data: The key data.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if it is not encrypted.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if
    * a passphrase is provided for an unencrypted key
    * the SSH protocol encoding is incorrect
@raises EncryptedKeyError: if
    * a passphrase is not provided for an encrypted key
r3   r~   éÿÿÿÿó   openssh-key-v1 z"unknown OpenSSH private key formatNé   ú!Lrv   r   zDonly OpenSSH private key files containing a single key are supportedrj   ó   noneú0Passphrase must be provided for an encrypted key)s
   aes128-ctrs
   aes192-ctró
   aes256-ctré   rœ   é   zunknown encryption type ó   bcryptT)Úignore_few_roundszunknown KDF type zbad padding©Úbackendzprivate key specifies KDF z but no cipherz#check values do not match: %d != %d)ÚstripÚ
splitlinesr   Újoinr‘   r)   Úlenr   r…   ÚstructÚunpackr:   r   ÚAESÚintÚbcryptÚkdfr   r   ÚCTRr   Ú	decryptorÚupdateÚfinalizer­   )ra   rp   rW   ÚlinesÚkeyListÚcipherrÊ   Ú
kdfOptionsr”   r–   Ú_ÚencPrivKeyListÚalgorithmClassÚ	blockSizeÚkeySizeÚivSizeÚsaltÚroundsÚdecKeyrÌ   ÚprivKeyListÚcheck1Úcheck2s                          r4   Ú_fromPrivateOpenSSH_v1ÚKey._fromPrivateOpenSSH_v1„  sž  € ð: —
‘
“×'Ñ'Ó)ˆÜ˜cŸh™h u¨Q¨r {Ó3Ó4ˆØ×!Ñ!Ð"5×6Ñ6ÜÐBÓCÐCØœ#Ð1Ó2Ð4Ð5ˆÜ(.¯ª°W¸aÓ(@Ñ%ˆ�ZÜ�MŠM˜$  R a Ó)¨!Ñ,ˆØ�‹6Üð-óð ô
  &Ÿ|š|¨D°°¨H°aÓ8Ñˆ˜1Ø�WÔÞÜ'ØIóð ð ÐFÓFÜ!+§¡�Ø�	Ü˜f Q q˜kÓ*¨aÑ/�Ø"‘ä!Ð$<¸V¹JÐ"GÓHÐHØ�iÓÜ#Ÿ\š\¨*Ó5‘
��dÜŸš t¨T°"°1¨XÓ6°qÑ9�ÜŸšØØØÑ$Øà&*ñ‘ô "Ð$5°c±WÐ"=Ó>Ð>Ü�NÓ# iÑ/°AÓ5Ü! -Ó0Ð0ÜÙ˜v h wÐ/Ó0Ü—	’	˜& °VÑ+;Ð<Ó=Ü'Ó)ñ÷ ‰i‹kð	 ð
 $×*Ñ*¨>Ó:¸Y×=OÑ=OÓ=QÑQ‰Kà�g‹~Ý!ÛGJÐLóð ð )ˆKÜ—’˜t [°°! _Ó5°aÑ8ˆÜ—’˜t [°°1Ð%5Ó6°qÑ9ˆØ�VÓÜÐCÀvÈvÐFVÑVÓWÐWØ×+Ñ+¨K¸¸¨OÓ<Ð<r3   c                ó  • UR                  5       R                  5       nUS   SS nU(       d  SnUS;   a   [        X[        5       5      nU " U5      $ [        SU 35      e! [         a    [        S5      e[         a    [        S5      ef = f)	añ  
Return a private key object corresponding to this OpenSSH private key
string, in the old PEM-based format.

The format of a PEM-based OpenSSH private key string is::
    -----BEGIN <key type> PRIVATE KEY-----
    [Proc-Type: 4,ENCRYPTED
    DEK-Info: DES-EDE3-CBC,<initialization value>]
    <base64-encoded ASN.1 structure>
    ------END <key type> PRIVATE KEY------

The ASN.1 structure of a RSA key is::
    (0, n, e, d, p, q)

The ASN.1 structure of a DSA key is::
    (0, p, q, g, y, x)

The ASN.1 structure of a ECDSA key is::
    (ECParameters, OID, NULL)

@type data: L{bytes}
@param data: The key data.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if it is not encrypted.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if
    * a passphrase is provided for an unencrypted key
    * the ASN.1 encoding is incorrect
@raises EncryptedKeyError: if
    * a passphrase is not provided for an encrypted key
r   é   éïÿÿÿN)s   ECs   RSAs   DSAr¹   z&Failed to decode key (Bad Passphrase?)úunknown key type )rÁ   rÂ   r   r   Ú	TypeErrorr:   Ú
ValueErrorr)   )ra   rp   rW   rÏ   ÚkindÚkeys         r4   Ú_fromPrivateOpenSSH_PEMÚKey._fromPrivateOpenSSH_PEMÝ  s¨   € ðJ —
‘
“×'Ñ'Ó)ˆØ�Q‰x˜˜3Ðˆö ØˆJØÐ*Ó*ðLÜ*¨4¼_Ó=NÓO�ñ �s“8ˆOäÐ 1°$°Ð8Ó9Ð9øô ó Ü'ØFóð ô ó LÜ!Ð"JÓKÐKðLús   ·A! Á!*Bc                ó–   • UR                  5       R                  5       S   SS S:X  a  U R                  X5      $ U R                  X5      $ )ax  
Return a private key object corresponding to this OpenSSH private key
string.  If the key is encrypted, passphrase MUST be provided.
Providing a passphrase for an unencrypted key is an error.

@type data: L{bytes}
@param data: The key data.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase the key is encrypted with, or L{None}
if it is not encrypted.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if
    * a passphrase is provided for an unencrypted key
    * the encoding is incorrect
@raises EncryptedKeyError: if
    * a passphrase is not provided for an encrypted key
r   râ   rã   s   OPENSSH)rÁ   rÂ   rß   ré   )ra   rp   rW   s      r4   Ú_fromString_PRIVATE_OPENSSHÚKey._fromString_PRIVATE_OPENSSH  sK   € ð, �:‰:‹<×"Ñ"Ó$ QÑ'¨¨3Ð/°:Ó=à×-Ñ-¨dÓ?Ð?ð ×.Ñ.¨tÓ@Ð@r3   c                ó   • [         R                  " [        USS 5      5      nUS   S:X  d   e0 nUS   SS  H4  u  pA[        R                  " [        R
                  " U5      5      S   X4'   M6     US   S   S:X  a  U R                  US   US   US	   US
   S9$ US   S   S:X  a  U R                  US   US   S9$ [        SUS   S    35      e)aÂ  
Return a public key corresponding to this LSH public key string.
The LSH public key string format is::
    <s-expression: ('public-key', (<key type>, (<name, <value>)+))>

The names for a RSA (key type 'rsa-pkcs1-sha1') key are: n, e.
The names for a DSA (key type 'dsa') key are: y, g, p, q.

@type data: L{bytes}
@param data: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if the key type is unknown
r~   r´   r   ó
   public-keyNó   dsaó   yó   gó   pó   q©r|   rz   rx   ry   ó   rsa-pkcs1-sha1ó   nó   e©r–   r•   úunknown lsh key type )	r   Úparser   r   r†   ÚNSr§   r¦   r)   ©ra   rp   ÚsexpÚkdr©   s        r4   Ú_fromString_PUBLIC_LSHÚKey._fromString_PUBLIC_LSH3  sô   € ô" �{Š{œ; t¨A¨b zÓ2Ó3ˆØ�A‰w˜-Ó'Ð'Ð'ØˆØ˜q™' ! "›+‰JˆDÜ—|’|¤F§I¢I¨d£OÓ4°QÑ7ˆB‹Hñ &à�‰7�1‰:˜ÓØ×)Ñ)Ø�T‘(˜b ™h¨"¨T©(°b¸±hð *ð ð ð �!‰W�Q‰ZÐ,Ó,Ø×)Ñ)¨B¨t©H¸¸4¹Ð)ÐAÐAäÐ 5°d¸1±g¸a±j°\ÐBÓCÐCr3   c                ó^  • [         R                  " U5      nUS   S:X  d   e0 nUS   SS  H4  u  pA[        R                  " [        R                  " U5      5      S   X4'   M6     US   S   S:X  aA  [        U5      S:X  d   [        U5      5       eU R                  US   US   US	   US
   US   S9$ US   S   S:X  a^  [        U5      S:X  d   [        U5      5       eUS	   US
   :”  a  US
   US	   sUS	'   US
'   U R                  US   US   US   US	   US
   S9$ [        SUS   S    35      e)aÓ  
Return a private key corresponding to this LSH private key string.
The LSH private key string format is::
    <s-expression: ('private-key', (<key type>, (<name>, <value>)+))>

The names for a RSA (key type 'rsa-pkcs1-sha1') key are: n, e, d, p, q.
The names for a DSA (key type 'dsa') key are: y, g, p, q, x.

@type data: L{bytes}
@param data: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if the key type is unknown
r   ó   private-keyr~   Nrð   rŸ   rñ   rò   ró   rô   ó   xr    ó	   rsa-pkcs1r¼   r÷   rø   ó   dr�   rú   )	r   rû   r   r†   rü   rÄ   r§   r¦   r)   rý   s        r4   Ú_fromString_PRIVATE_LSHÚKey._fromString_PRIVATE_LSHS  sg  € ô" �{Š{˜4Ó ˆØ�A‰w˜.Ó(Ð(Ð(ØˆØ˜q™' ! "›+‰JˆDÜ—|’|¤F§I¢I¨d£OÓ4°QÑ7ˆB‹Hñ &à�‰7�1‰:˜ÓÜ�r“7˜a“<Ð(¤ R£Ó(�<Ø×)Ñ)Ø�T‘(˜b ™h¨"¨T©(°b¸±hÀ"ÀTÁ(ð *ð ð ð �!‰W�Q‰Z˜<Ó'Ü�r“7˜a“<Ð(¤ R£Ó(�<Ø�$‰x˜"˜T™(Ó"Ø%'¨¡X¨r°$©xÐ"��4‘˜"˜T™(Ø×)Ñ)Ø�T‘(˜b ™h¨"¨T©(°b¸±hÀ"ÀTÁ(ð *ð ð ô
 Ð 5°d¸1±g¸a±j°\ÐBÓCÐCr3   c           	     óº  • [         R                  " U5      u  p!US:X  a‰  [         R                  " U5      u  p1[         R                  " U5      u  pA[         R                  " U5      u  pQ[         R                  " U5      u  pa[         R                  " U5      u  pqU R                  XeX4US9$ US:X  a¡  [         R                  " U5      u  p�[         R                  " U5      u  p‘[         R                  " U5      u  p¡[         R                  " U5      u  p±[         R                  " U5      u  p1[         R                  " U5      u  pAU R	                  X¨X“XKS9$ [        SU 35      e)a'  
Return a private key object corresponsing to the Secure Shell Key
Agent v3 format.

The SSH Key Agent v3 format for a RSA key is::
    string 'ssh-rsa'
    integer e
    integer d
    integer n
    integer u
    integer p
    integer q

The SSH Key Agent v3 format for a DSA key is::
    string 'ssh-dss'
    integer p
    integer q
    integer g
    integer y
    integer x

@type data: L{bytes}
@param data: The key data.

@return: A new key.
@rtype: L{twisted.conch.ssh.keys.Key}
@raises BadKeyError: if the key type (the first string) is unknown
ru   r    rt   ©r–   r•   rž   rx   ry   rª   rä   )r   r…   r†   r§   r¦   r)   )ra   rp   r“   rx   ry   rz   r|   r¡   r•   rž   r–   rª   s               r4   Ú_fromString_AGENTV3ÚKey._fromString_AGENTV3y  s  € ô< Ÿš TÓ*‰ˆØ�jÓ Ü—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAØ×)Ñ)¨A°aÀÐ)ÐBÐBØ˜
Ó"Ü—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAÜ—l’l 4Ó(‰GˆAØ×)Ñ)¨A°aÀÐ)ÐGÐGäÐ 1°'°Ð;Ó<Ð<r3   c                ó*  • UR                  S5      (       d  UR                  S5      (       a  gUR                  S5      (       d  UR                  S5      (       a  [        S5      eUR                  S5      (       d  UR                  S5      (       a  gUR                  S	5      (       a  g
UR                  S5      (       a  gUR                  S5      (       a  gUR                  S5      (       dX  UR                  S5      (       dB  UR                  S5      (       d,  UR                  S5      (       d  UR                  S5      (       aO  [        R                  " U5      u  p#SnU(       a&  US-  n[        R                  " U5      u  p#U(       a  M&  US:”  a  ggg)zz
Guess the type of key in data.  The types map to _fromString_*
methods.

@type data: L{bytes}
@param data: The key data.
s   ssh-ó   ecdsa-sha2-Úpublic_opensshs   sk-ecdsa-sha2-nistp256-cert-v01s   sk-ssh-ed25519-cert-v01z(certificate based keys are not supporteds   sk-ecdsa-sha2-nistp256s   sk-ssh-ed25519s
   -----BEGINÚprivate_opensshó   {Ú
public_lshó   (Úprivate_lshs      ssh-s
      ecdsa-s      ssh-ed25519s&      "sk-ecdsa-sha2-nistp256@openssh.coms      sk-ssh-ed25519@openssh.comr   r~   rv   Úagentv3r’   N)r‘   r)   r   r…   r†   )ra   rp   Úignoredr”   Úcounts        r4   rk   ÚKey._guessStringTypeª  sV  € ð �?‰?˜7×#Ñ# t§¡°~×'FÑ'FØ#ð �?‰?Ð=×>Ñ>À$Ç/Á/Ø&÷C
ñ C
ô ÐHÓIÐIà�?‰?Ð4×5Ñ5¸¿¹Ø÷:
ñ :
ð $à�?‰?˜=×)Ñ)Ø$à�?‰?˜4× Ñ Øà�?‰?˜4× Ñ Ø ð �O‰OÐ3×4Ñ4Ø�‰Ð8×9Ñ9Ø�‰Ð=×>Ñ>Ø�‰ÐQ×RÑRØ�‰ÐL×MÑMä"ŸLšL¨Ó.‰MˆGØˆEÞØ˜‘
�Ü &§¢¨TÓ 2‘�÷ �$ð �q‹yØ àð Nr3   c                óR  • [         R                  " X!S9nUc  UR                  [        5       5      nOo[         R                  " UUU[         R
                  " X45      [         R                  " X55      [         R                  " XE5      US9n	U	R                  [        5       5      nU " U5      $ )aL  
Build a key from RSA numerical components.

@type n: L{int}
@param n: The 'n' RSA variable.

@type e: L{int}
@param e: The 'e' RSA variable.

@type d: L{int} or L{None}
@param d: The 'd' RSA variable (optional for a public key).

@type p: L{int} or L{None}
@param p: The 'p' RSA variable (optional for a public key).

@type q: L{int} or L{None}
@param q: The 'q' RSA variable (optional for a public key).

@type u: L{int} or L{None}
@param u: The 'u' RSA variable. Ignored, as its value is determined by
p and q.

@rtype: L{Key}
@return: An RSA key constructed from the values as given.
)r•   r–   )rx   ry   rž   Údmp1Údmq1ÚiqmpÚpublic_numbers)	r   r‡   rˆ   r   ÚRSAPrivateNumbersÚrsa_crt_dmp1Úrsa_crt_dmq1Úrsa_crt_iqmpÚprivate_key)
ra   r–   r•   rž   rx   ry   rª   ÚpublicNumbersr—   ÚprivateNumberss
             r4   r¦   ÚKey._fromRSAComponentsß  s‘   € ô6 ×,Ò,¨qÑ6ˆØ‰9à%×0Ñ0´Ó1BÓC‰Iä ×2Ò2ØØØÜ×%Ò% aÓ+Ü×%Ò% aÓ+Ü×%Ò% aÓ+Ø,ñˆNð '×2Ñ2´?Ó3DÓEˆIá�9‹~Ðr3   c           	     óö   • [         R                  " U[         R                  " X#US9S9nUc  UR                  [	        5       5      nO-[         R
                  " XVS9nUR                  [	        5       5      nU " U5      $ )a�  
Build a key from DSA numerical components.

@type y: L{int}
@param y: The 'y' DSA variable.

@type p: L{int}
@param p: The 'p' DSA variable.

@type q: L{int}
@param q: The 'q' DSA variable.

@type g: L{int}
@param g: The 'g' DSA variable.

@type x: L{int} or L{None}
@param x: The 'x' DSA variable (optional for a public key)

@rtype: L{Key}
@return: A DSA key constructed from the values as given.
rw   r{   )r¡   r  )r   r‰   rŠ   rˆ   r   ÚDSAPrivateNumbersr"  )	ra   r|   rx   ry   rz   r¡   r#  r—   r$  s	            r4   r§   ÚKey._fromDSAComponents  sm   € ô. ×,Ò,Ø¤3×#:Ò#:¸QÀqÑ#Iñ
ˆð ‰9à%×0Ñ0´Ó1BÓC‰Iä ×2Ò2°QÑUˆNØ&×2Ñ2´?Ó3DÓEˆIá�9‹~Ðr3   c                óÞ   • [         R                  " X[        U   S9nUc  UR                  [	        5       5      nO-[         R
                  " XES9nUR                  [	        5       5      nU " U5      $ )a[  
Build a key from EC components.

@param x: The affine x component of the public point used for verifying.
@type x: L{int}

@param y: The affine y component of the public point used for verifying.
@type y: L{int}

@param curve: NIST name of elliptic curve.
@type curve: L{bytes}

@param privateValue: The private value.
@type privateValue: L{int}
©r¡   r|   r�   )Úprivate_valuer  )r   ÚEllipticCurvePublicNumbersr‹   rˆ   r   ÚEllipticCurvePrivateNumbersr"  )ra   r¡   r|   r�   r£   r#  r—   r$  s           r4   Ú_fromECComponentsÚKey._fromECComponents/  sk   € ô$ ×5Ò5ØœK¨Ñ.ñ
ˆð Ñà%×0Ñ0´Ó1BÓC‰Iä×;Ò;Ø*ñˆNð '×2Ñ2´?Ó3DÓEˆIá�9‹~Ðr3   c                ó¶   • Uc(  [         R                  R                  [        U   U5      nO'[         R                  " U[        U   [        5       5      nU " U5      $ )a  
Build a key from an EC encoded point.

@param encodedPoint: The public point encoded as in SEC 1 v2.0
section 2.3.3.
@type encodedPoint: L{bytes}

@param curve: NIST name of elliptic curve.
@type curve: L{bytes}

@param privateValue: The private value.
@type privateValue: L{int}
)r   rŒ   r�   r‹   Úderive_private_keyr   )ra   r€   r�   r£   r—   s        r4   rŽ   ÚKey._fromECEncodedPointO  sW   € ð  Ñä×1Ñ1×DÑDÜ˜EÑ" Ló‰Iô ×-Ò-Øœk¨%Ñ0´/Ó2CóˆIñ �9‹~Ðr3   c                ó    • [         b  [        c  [        S5      eUc  [         R                  U5      nO[        R	                  U5      nU " U5      $ )zäBuild a key from Ed25519 components.

@param a: The Ed25519 public key, as defined in RFC 8032 section
    5.1.5.
@type a: L{bytes}

@param k: The Ed25519 private key, as defined in RFC 8032 section
    5.1.5.
@type k: L{bytes}
z)Ed25519 keys not supported on this system)ÚEd25519PublicKeyÚEd25519PrivateKeyr)   Úfrom_public_bytesÚfrom_private_bytes)ra   r˜   r¥   r—   s       r4   r�   ÚKey._fromEd25519Componentsk  sK   € ô Ñ#Ô'8Ñ'@ÜÐIÓJÐJà‰9Ü(×:Ñ:¸1Ó=‰Iä)×<Ñ<¸QÓ?ˆIá�9‹~Ðr3   c                ó   • Xl         SU l        g)z¼
Initialize with a private or public
C{cryptography.hazmat.primitives.asymmetric} key.

@param keyObject: Low level key.
@type keyObject: C{cryptography.hazmat.primitives.asymmetric} key.
FN©Ú
_keyObjectr�   )Úselfr—   s     r4   Ú__init__ÚKey.__init__‚  s   € ð $ŒØˆ�r3   c                óÊ   • [        U[        5      (       aI  U R                  5       UR                  5       :H  =(       a!    U R                  5       UR                  5       :H  $ [        $ )z>
Return True if other represents an object with the same key.
)rQ   rZ   rc   rp   ÚNotImplemented)r<  Úothers     r4   Ú__eq__Ú
Key.__eq__�  sD   € ô �eœS×!Ñ!Ø—9‘9“; %§*¡*£,Ñ.×N°4·9±9³;À%Ç*Á*Ã,Ñ3NÐNä!Ð!r3   c                óä  • U R                  5       S:X  aŽ  U R                  5       nUS   R                  S5      nU R                  5       (       a
  SUSS  S3nO	SUSS  S3n[	        UR                  5       5       H   u  pEUS:X  a
  US	U 3-  nM  US
U SU 3-  nM"     US-   $ S[        U R                  5       5      < SU R                  5       =(       a    S=(       d    S< SU R                  5       < S3/n[	        U R                  5       R                  5       5       H³  u  pEUR                  SU S35        U R                  5       S:X  a  UO[        R                  " U5      SS nU(       d  MR  USS nUSS nSn	[        U5       H  n
U	[        U
5      S S3-   n	M     [        U5      S:  a  U	SS n	UR                  SU	-   5        U(       a  Ma  Mµ     US   S-   US'   S
R                  U5      $ )z0
Return a pretty representation of this object.
ÚECr�   rh   z<Elliptic Curve Public Key (éýÿÿÿNz bits)z<Elliptic Curve Private Key (z	
curve:
	Ú
z:
	z>
Ú<Ú z
Public KeyzPrivate Keyz (zattr Ú:ÚEd25519rv   é   Ú Ú02xr´   Ú	Ú>)rc   rp   ÚdecodeÚisPublicÚsortedÚitemsr!   ÚsizeÚappendr   ÚMPr    ÚordrÄ   rÃ   )r<  rp   r©   Úoutr¥   ÚvrÏ   ÚbyÚmÚorM   s              r4   Ú__repr__ÚKey.__repr__–  sã  € ð �9‰9‹;˜$ÓØ—9‘9“;ˆDØ˜‘=×'Ñ'¨Ó0ˆDà�}‰}�‰Ø4°T¸"¸#°Y°K¸vÐF‘à5°d¸2¸3°i°[ÀÐG�ä˜tŸz™z›|Ö,‘�Ø˜“<Ø˜\¨$¨Ð0Ñ0’Cà˜R ˜s %¨ sÐ+Ñ+’Cñ	 -ð ˜‘;Ðð ô( ! §¡£Ö-Ø—M‘M“O×4¨×E¸ÒEØ—I‘I–Kð	ðˆEô ˜tŸy™y›{×0Ñ0Ó2Ö3‘�Ø—‘˜u Q C q˜\Ô*ØŸ)™)›+¨Ó2‘Q¼¿	º	À!»ÀQÀRÐ8H�ß�bØ˜3˜B˜�AØ˜B˜C˜�BØ�AÜ& qž\˜Ø¤3 q£6¨# ,¨aÐ 0Ñ0šñ *ä˜1“v “{Ø˜c˜r˜F˜Ø—L‘L ¨¡Ô*÷ ’bñ 4ð ˜b™	 C™ˆE�"‰IØ—9‘9˜UÓ#Ð#r3   c                ó¦   • [        U R                  [        R                  [        R
                  [        R                  [        R                  45      $ )zT
Check if this instance is a public key.

@return: C{True} if this is a public key.
)
rQ   r;  r   ÚRSAPublicKeyr   ÚDSAPublicKeyr   rŒ   r   r4  ©r<  s    r4   rR  ÚKey.isPublicÂ  sA   € ô Ø�O‰Oä× Ñ Ü× Ñ Ü×)Ñ)Ü×(Ñ(ð	ó
ð 	
r3   c                óv   • U R                  5       (       a  U $ [        U R                  R                  5       5      $ )z´
Returns a version of this key containing only the public key data.
If this is a public key, this may or may not be the same object
as self.

@rtype: L{Key}
@return: A public key.
)rR  rZ   r;  rˆ   rc  s    r4   ÚpublicÚ
Key.publicÒ  s,   € ð �=‰=�?‰?ØˆKä�t—‘×1Ñ1Ó3Ó4Ð4r3   c           
     óÀ  • U[         R                  L a9  [        [        [	        U R                  5       5      R                  5       5      5      $ U[         R                  L am  [        SR                  [        [        U R                  5       5      R                  5       5       Vs/ s H  n[        R                  " U5      PM     sn5      5      $ [        SU 35      es  snf )a¯  
The fingerprint of a public key consists of the output of the
message-digest algorithm in the specified format.
Supported formats include L{FingerprintFormats.MD5_HEX} and
L{FingerprintFormats.SHA256_BASE64}

The input to the algorithm is the public key data as specified by [RFC4253].

The output of sha256[RFC4634] algorithm is presented to the
user in the form of base64 encoded sha256 hashes.
Example: C{US5jTUa0kgX5ZxdqaGF0yGRu8EgKXHNmoT8jHKo1StM=}

The output of the MD5[RFC1321](default) algorithm is presented to the user as
a sequence of 16 octets printed as hexadecimal with lowercase letters
and separated by colons.
Example: C{c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87}

@param format: Format for fingerprint generation. Consists
    hash function and representation format.
    Default is L{FingerprintFormats.MD5_HEX}

@since: 8.2

@return: the user presentation of this L{Key}'s fingerprint, as a
string.

@rtype: L{str}
ó   :z Unsupported fingerprint format: )r@   rC   r!   r   r   r’   ÚdigestrB   rÃ   r    r   ÚbinasciiÚhexlifyr=   )r<  Úformatr¡   s      r4   ÚfingerprintÚKey.fingerprintà  s²   € ð: Ô'×5Ñ5Ò5Ü¤	¬&°·±³Ó*=×*DÑ*DÓ*FÓ GÓHÐHØÔ)×1Ñ1Ò1ÜØ—	‘	Ü2;¼CÀÇ	Á	ÃÓ<L×<SÑ<SÓ<UÔ2VÓWÒ2V¨Q”X×%Ò% aÖ(Ñ2VÑWóóð ô 'Ð)IÈ&ÈÐ'RÓSÐSùò	 Xs   Â" Cc                ó  • [        U R                  [        R                  [        R                  45      (       a  g[        U R                  [
        R                  [
        R                  45      (       a  g[        U R                  [        R                  [        R                  45      (       a  g[        U R                  [        R                  [        R                  45      (       a  g[        SU R                  < 35      e)z«
Return the type of the object we wrap.  Currently this can only be
'RSA', 'DSA', 'EC', or 'Ed25519'.

@rtype: L{str}
@raises RuntimeError: If the object type is unknown.
ÚRSAÚDSArE  rK  zunknown type of object: )rQ   r;  r   ra  ÚRSAPrivateKeyr   rb  ÚDSAPrivateKeyr   rŒ   ÚEllipticCurvePrivateKeyr   r4  r5  ÚRuntimeErrorrc  s    r4   rc   ÚKey.type  s¾   € ô �d—o‘o¬×(8Ñ(8¼#×:KÑ:KÐ'L×MÑMØÜ˜Ÿ™¬#×*:Ñ*:¼C×<MÑ<MÐ)N×OÑOØÜØ�O‰Oœb×7Ñ7¼×9SÑ9SÐT÷
ñ 
ð ÜØ�O‰Oœg×6Ñ6¼×8QÑ8QÐR÷
ñ 
ð äÐ!9¸$¿/¹/Ñ9LÐMÓNÐNr3   c                ó  • U R                   (       a  U R                  5       S:X  a  ggU R                  5       S:X  a9  S[        U R                  R                  R
                  R                  S5         -   $ SSSS	.U R                  5          $ )
a  
Get the type of the object we wrap as defined in the SSH protocol,
defined in RFC 4253, Section 6.6 and RFC 8332, section 4 (this is a
public key format name, not a public key algorithm name). Currently
this can only be b'ssh-rsa', b'ssh-dss', b'ecdsa-sha2-[identifier]'
or b'ssh-ed25519'.

identifier is the standard NIST curve name

@return: The key type format.
@rtype: L{bytes}
rE  r   rƒ   r  r¢   rt   ru   r‚   )rq  rr  rK  )r�   rc   r¨   r;  r�   r©   rU   rc  s    r4   ÚsshTypeÚKey.sshType  s�   € ð �8�8Ø�y‰y‹{˜dÓ"Ø<ð
 1à�9‰9‹;˜$Óà¤¨D¯O©O×,AÑ,A×,FÑ,F×,MÑ,MÈgÓ,VÑ!WÑWðð
 ØØ%ñ
ð �)‰)‹+ñ	ð 	r3   c                óT   • U R                  5       S:X  a  / SQ$ U R                  5       /$ )z 
Get the public key signature algorithms supported by this key.

@return: A list of supported public key signature algorithm names.
@rtype: L{list} of L{bytes}
rq  )ó   rsa-sha2-512ó   rsa-sha2-256rt   )rc   ry  rc  s    r4   ÚsupportedSignatureAlgorithmsÚ Key.supportedSignatureAlgorithms@  s'   € ð �9‰9‹;˜%ÓÚAÐAà—L‘L“NÐ#Ð#r3   c                ó>  • U R                  5       S:X  ao  XR                  5       :X  a[  U R                  5       nUS::  a  [        R                  " 5       $ US::  a  [        R
                  " 5       $ [        R                  " 5       $ gU R                  5       S:X  a  [        R                  " 5       $ [        R                  " 5       [        R                  " 5       [        R                  " 5       [        R                  " 5       S.R                  U R                  5       U45      $ )z•
Return a hash algorithm for this key type given an SSH signature
algorithm name, or L{None} if no such hash algorithm is defined for
this key type.
rE  é   i€  NrK  ))rq  rt   )rq  r}  )rq  r|  )rr  ru   )	rc   ry  rU  r   ÚSHA256ÚSHA384ÚSHA512ÚSHA1Úget)r<  ÚsignatureTyper×   s      r4   Ú_getHashAlgorithmÚKey._getHashAlgorithmL  s¿   € ð �9‰9‹;˜$Óà§¡£Ó.ØŸ)™)›+�Ø˜c“>Ü!Ÿ=š=›?Ð*Ø “^Ü!Ÿ=š=›?Ð*ä!Ÿ=š=›?Ð*àà�9‰9‹;˜)Ó#Ü—=’=“?Ð"ô "(§¢£Ü&,§m¢m£oÜ&,§m¢m£oÜ!'§¢£ñ	
÷
 ‰#ˆt�y‰y‹{˜MÐ*Ó
+ð	,r3   c                óÜ   • U R                   c  gU R                  5       S:X  a   U R                   R                  R                  $ U R                  5       S:X  a  gU R                   R                  $ )zV
Return the size of the object we wrap.

@return: The size of the key.
@rtype: L{int}
r   rE  rK  r�  )r;  rc   r�   Úkey_sizerc  s    r4   rU  ÚKey.sizei  sV   € ð �?‰?Ñ"ØØ�Y‰Y‹[˜DÓ Ø—?‘?×(Ñ(×1Ñ1Ð1Ø�Y‰Y‹[˜IÓ%ØØ�‰×'Ñ'Ð'r3   c           	     ó¦	  • [        U R                  [        R                  5      (       a3  U R                  R	                  5       nUR
                  UR                  S.$ [        U R                  [        R                  5      (       a’  U R                  R                  5       nUR                  R
                  UR                  R                  UR                  UR                  UR                  [        R                  " UR                  UR                  5      S.$ [        U R                  [        R                  5      (       ag  U R                  R	                  5       nUR                  UR                   R"                  UR                   R                  UR                   R                  S.$ [        U R                  [        R$                  5      (       aš  U R                  R                  5       nUR&                  UR                  R                  UR                  R                   R"                  UR                  R                   R                  UR                  R                   R                  S.$ [        U R                  [(        R*                  5      (       aB  U R                  R	                  5       nUR&                  UR                  U R-                  5       S.$ [        U R                  [(        R.                  5      (       aa  U R                  R                  5       nUR                  R&                  UR                  R                  UR0                  U R-                  5       S.$ [        U R                  [2        R4                  5      (       aN  SU R                  R7                  [8        R:                  R<                  [8        R>                  R<                  5      0$ [        U R                  [2        R@                  5      (       a»  U R                  RC                  5       R7                  [8        R:                  R<                  [8        R>                  R<                  5      U R                  RE                  [8        R:                  R<                  [8        RF                  R<                  [8        RH                  " 5       5      S.$ [K        S	U R                   35      e)
zG
Return the values of the public key as a dictionary.

@rtype: L{dict}
rù   r
  rõ   )r¡   r|   rz   rx   ry   r*  )r¡   r|   r£   r�   r˜   )r˜   r¥   zUnexpected key type: )&rQ   r;  r   ra  r  r–   r•   rs  Úprivate_numbersrž   rx   ry   r!  r   rb  r|   r}   rz   rt  r¡   r   rŒ   ry  ru  r+  r   r4  Úpublic_bytesr   ÚEncodingÚRawÚPublicFormatr5  rˆ   Úprivate_bytesÚPrivateFormatÚNoEncryptionrv  )r<  Úrsa_pub_numbersÚrsa_priv_numbersÚdsa_pub_numbersÚdsa_priv_numbersÚec_pub_numbersÚec_priv_numberss          r4   rp   ÚKey.datax  sŠ  € ô �d—o‘o¤s×'7Ñ'7×8Ñ8Ø"Ÿo™o×<Ñ<Ó>ˆOà$×&Ñ&Ø$×&Ñ&ñð ô ˜Ÿ™¬×):Ñ):×;Ñ;Ø#Ÿ™×>Ñ>Ó@Ðà%×4Ñ4×6Ñ6Ø%×4Ñ4×6Ñ6Ø%×'Ñ'Ø%×'Ñ'Ø%×'Ñ'ä×%Ò%Ð&6×&8Ñ&8Ð:J×:LÑ:LÓMñð ô ˜Ÿ™¬×)9Ñ)9×:Ñ:Ø"Ÿo™o×<Ñ<Ó>ˆOà$×&Ñ&Ø$×6Ñ6×8Ñ8Ø$×6Ñ6×8Ñ8Ø$×6Ñ6×8Ñ8ñ	ð ô ˜Ÿ™¬×):Ñ):×;Ñ;Ø#Ÿ™×>Ñ>Ó@Ðà%×'Ñ'Ø%×4Ñ4×6Ñ6Ø%×4Ñ4×FÑF×HÑHØ%×4Ñ4×FÑF×HÑHØ%×4Ñ4×FÑF×HÑHñð ô ˜Ÿ™¬×)BÑ)B×CÑCØ!Ÿ_™_×;Ñ;Ó=ˆNà#×%Ñ%Ø#×%Ñ%ØŸ™›ñð ô
 ˜Ÿ™¬×)CÑ)C×DÑDØ"Ÿo™o×=Ñ=Ó?ˆOà$×3Ñ3×5Ñ5Ø$×3Ñ3×5Ñ5Ø /× =Ñ =ØŸ™›ñ	ð ô ˜Ÿ™¬×)AÑ)A×BÑBà�T—_‘_×1Ñ1Ü!×*Ñ*×.Ñ.´×0JÑ0J×0NÑ0Nóðð ô
 ˜Ÿ™¬×)BÑ)B×CÑCà—_‘_×/Ñ/Ó1×>Ñ>Ü!×*Ñ*×.Ñ.´×0JÑ0J×0NÑ0Nóð —_‘_×2Ñ2Ü!×*Ñ*×.Ñ.Ü!×/Ñ/×3Ñ3Ü!×.Ò.Ó0óñ		ð 	ô Ð!6°t·±Ð6GÐHÓIÐIr3   c                óÐ  • U R                  5       nU R                  5       nUS:X  aJ  [        R                  " S5      [        R                  " US   5      -   [        R                  " US   5      -   $ US:X  a~  [        R                  " S5      [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " US	   5      -   [        R                  " US
   5      -   $ US:X  a©  U R
                  R                  R                  S-   S-  n[        R                  " US   5      [        R                  " US   SS 5      -   [        R                  " S[        R                  " US   U5      -   [        R                  " US
   U5      -   5      -   $ US:X  a0  [        R                  " S5      [        R                  " US   5      -   $ [        SU 35      e)aÝ  
Return the public key blob for this key. The blob is the
over-the-wire format for public keys.

SECSH-TRANS RFC 4253 Section 6.6.

RSA keys::
    string 'ssh-rsa'
    integer e
    integer n

DSA keys::
    string 'ssh-dss'
    integer p
    integer q
    integer g
    integer y

EC keys::
    string 'ecdsa-sha2-[identifier]'
    integer x
    integer y

    identifier is the standard NIST curve name

Ed25519 keys::
    string 'ssh-ed25519'
    string a

@rtype: L{bytes}
rq  rt   r•   r–   rr  ru   rx   ry   rz   r|   rE  é   r¼   r�   éøÿÿÿNó   r¡   rK  r‚   r˜   úunknown key type: )rc   rp   r   rü   rW  r;  r�   r‹  r   r   r)   )r<  rc   rp   Ú
byteLengths       r4   r’   ÚKey.blobÄ  s¥  € ð@ �y‰y‹{ˆØ�y‰y‹{ˆØ�5‹=Ü—9’9˜ZÓ(¬6¯9ª9°T¸#±YÓ+?Ñ?Ä&Ç)Â)ÈDÐQTÉIÓBVÑVÐVØ�U‹]ä—	’	˜*Ó%Ü—)’)˜D ™IÓ&ñ'ä—)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ	'ðð �T‹\ØŸ/™/×/Ñ/×8Ñ8¸1Ñ<ÀÑBˆJä—	’	˜$˜w™-Ó(Ü—)’)˜D ™M¨"¨#Ð.Ó/ñ0ä—)’)ØÜ×(Ò(¨¨c©°JÓ?ñ@ä×(Ò(¨¨c©°JÓ?ñ@óñðð �YÓÜ—9’9˜^Ó,¬v¯yªy¸¸c¹Ó/CÑCÐCäÐ 2°4°&Ð9Ó:Ð:r3   c                óx  • U R                  5       nU R                  5       nUS:X  aÌ  [        R                  " US   US   5      n[        R
                  " S5      [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " U5      -   [        R                  " US   5      -   [        R                  " US   5      -   $ US:X  a˜  [        R
                  " S	5      [        R                  " US   5      -   [        R                  " US   5      -   [        R                  " US
   5      -   [        R                  " US   5      -   [        R                  " US   5      -   $ US:X  aÁ  U R                  R                  5       R                  [        R                  R                  [        R                  R                  5      n[        R
                  " US   5      [        R
                  " US   SS 5      -   [        R
                  " U5      -   [        R                  " US   5      -   $ US:X  aP  [        R
                  " S5      [        R
                  " US   5      -   [        R
                  " US   US   -   5      -   $ [        SU 35      e)aI  
Return the private key blob for this key. The blob is the
over-the-wire format for private keys:

Specification in OpenSSH PROTOCOL.agent

RSA keys::

    string 'ssh-rsa'
    integer n
    integer e
    integer d
    integer u
    integer p
    integer q

DSA keys::

    string 'ssh-dss'
    integer p
    integer q
    integer g
    integer y
    integer x

EC keys::

    string 'ecdsa-sha2-[identifier]'
    integer x
    integer y
    integer privateValue

    identifier is the NIST standard curve name.

Ed25519 keys::

    string 'ssh-ed25519'
    string a
    string k || a
rq  rx   ry   rt   r–   r•   rž   rr  ru   rz   r|   r¡   rE  r�   rŸ  Nr£   rK  r‚   r˜   r¥   r¡  )rc   rp   r   r!  r   rü   rW  r;  rˆ   r�  r   r�  ÚX962r’  ÚUncompressedPointr)   )r<  rc   rp   r  ÚencPubs        r4   ÚprivateBlobÚKey.privateBlob   sZ  € ðR �y‰y‹{ˆØ�y‰y‹{ˆØ�5‹=Ü×#Ò# D¨¡I¨t°C©yÓ9ˆDä—	’	˜*Ó%Ü—)’)˜D ™IÓ&ñ'ä—)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ'ô —)’)˜D“/ñ	"ô
 —)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ'ðð �U‹]ä—	’	˜*Ó%Ü—)’)˜D ™IÓ&ñ'ä—)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ'ô —)’)˜D ™IÓ&ñ	'ô
 —)’)˜D ™IÓ&ñ'ðð �T‹\Ø—_‘_×/Ñ/Ó1×>Ñ>Ü×&Ñ&×+Ñ+Ü×*Ñ*×<Ñ<óˆFô
 —	’	˜$˜w™-Ó(Ü—)’)˜D ™M¨"¨#Ð.Ó/ñ0ä—)’)˜FÓ#ñ$ô —)’)˜D Ñ0Ó1ñ2ðð �YÓä—	’	˜.Ó)Ü—)’)˜D ™IÓ&ñ'ä—)’)˜D ™I¨¨S©	Ñ1Ó2ñ3ðô Ð 2°4°&Ð9Ó:Ð:r3   ÚextraÚcommentrW   c                ó>  • Ub4  [         R                  " S[        SS9  U R                  5       (       a  UnOUn[	        U[
        5      (       a  UR                  S5      n[        U5      n[        U SUR                  5        3S5      nUc  [        SU 35      eU" X4US9$ )	aB  
Create a string representation of this key.  If the key is a private
key and you want the representation of its public key, use
C{key.public().toString()}.  type maps to a _toString_* method.

@param type: The type of string to emit.  Currently supported values
    are C{'OPENSSH'}, C{'LSH'}, and C{'AGENTV3'}.
@type type: L{str}

@param extra: Any extra data supported by the selected format which
    is not part of the key itself.  For public OpenSSH keys, this is
    a comment.  For private OpenSSH keys, this is a passphrase to
    encrypt with.  (Deprecated since Twisted 20.3.0; use C{comment}
    or C{passphrase} as appropriate instead.)
@type extra: L{bytes} or L{unicode} or L{None}

@param subtype: A subtype of the requested C{type} to emit.  Only
    supported for private OpenSSH keys, for which the currently
    supported subtypes are C{'PEM'} and C{'v1'}.  If not given, an
    appropriate default is used.
@type subtype: L{str} or L{None}

@param comment: A comment to include with the key.  Only supported
    for OpenSSH keys.

    Present since Twisted 20.3.0.

@type comment: L{bytes} or L{unicode} or L{None}

@param passphrase: A passphrase to encrypt the key with.  Only
    supported for private OpenSSH keys.

    Present since Twisted 20.3.0.

@type passphrase: L{bytes} or L{unicode} or L{None}

@rtype: L{bytes}
Nz„The 'extra' argument to twisted.conch.ssh.keys.Key.toString was deprecated in Twisted 20.3.0; use 'comment' or 'passphrase' instead.r¶   )Ú
stacklevelrh   Ú
_toString_r¡  )Úsubtyper«  rW   )ÚwarningsÚwarnÚDeprecationWarningrR  rQ   rR   rU   rX   rl   rm   r)   )r<  rc   rª  r¯  r«  rW   rq   s          r4   ÚtoStringÚKey.toStringS  s¡   € ðZ Ñä�MŠMðIô #Øòð �}‰}�‰Ø‘à"�
Ü�gœs×#Ñ#Ø—n‘n WÓ-ˆGÜ)¨*Ó5ˆ
Ü˜ ¨D¯J©J«L¨>Ð:¸DÓAˆØ‰>ÜÐ 2°4°&Ð9Ó:Ð:Ù˜gÀ:ÑNÐNr3   c                ó´  • U R                  5       S:X  ai  U(       d  SnU R                  R                  [        R                  R
                  [        R                  R
                  5      S-   U-   R                  5       $ [        U R                  5       5      R                  SS5      nU(       d  SnU R                  5       S-   U-   S-   U-   R                  5       $ )zÓ
Return a public OpenSSH key string.

See _fromString_PUBLIC_OPENSSH for the string format.

@type comment: L{bytes} or L{None}
@param comment: A comment to include with the key, or L{None} to
omit the comment.
rE  r3   ó    ó   
)rc   r;  r�  r   r�  ÚOpenSSHr’  rÁ   r   r’   Úreplacery  )r<  r«  Úb64Datas      r4   Ú_toPublicOpenSSHÚKey._toPublicOpenSSH•  s»   € ð �9‰9‹;˜$ÓÞØ�à—‘×,Ñ,Ü!×*Ñ*×2Ñ2´M×4NÑ4N×4VÑ4Vóð ñð ñ	÷
 ‰e‹gðô ˜dŸi™i›kÓ*×2Ñ2°5¸#Ó>ˆÞØˆGØ—‘“ Ñ%¨Ñ/°$Ñ6¸Ñ@×GÑGÓIÐIr3   c           	     ó0  • U(       an  [         R                  nSnSnUR                  S-  nSnUn[        R                  " U5      n	Sn
[
        R                  " U	5      [        R                  " SU
5      -   nOSnSnSnSn[        R                  " S	5      nXÌ-   U R                  5       -   [
        R                  " U=(       d    S5      -   nS
n[        U5      U-  (       a,  US-  nU[        US-  45      -  n[        U5      U-  (       a  M,  U(       a�  [        R                  " UW	WW-   S5      n[        W" USU 5      [        R                   " X÷Xx-    5      [#        5       S9R%                  5       nUR'                  U5      UR)                  5       -   nOUnS[
        R                  " U5      -   [
        R                  " U5      -   [
        R                  " U5      -   [        R                  " SS5      -   [
        R                  " U R+                  5       5      -   [
        R                  " U5      -   n[-        U5      R/                  SS5      nS/[1        S
[        U5      S5       Vs/ s H  nUUUS-    PM     sn-   S/-   nSR3                  U5      S-   $ s  snf )a  
Return a private OpenSSH key string, in the "openssh-key-v1" format
introduced in OpenSSH 6.5.

See _fromPrivateOpenSSH_v1 for the string format.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase to encrypt the key with, or L{None}
if it is not encrypted.
rº   r½   r¼   r¤   éd   r·   r¸   r3   rv   r   r~   éÿ   Nr¿   rµ   r·  s#   -----BEGIN OPENSSH PRIVATE KEY-----é@   s!   -----END OPENSSH PRIVATE KEY-----)r   rÇ   Ú
block_sizer   ÚsecureRandomr   rü   rÅ   Úpackr¨  rÄ   ÚbytesrÉ   rÊ   r   r   rË   r   Ú	encryptorrÍ   rÎ   r’   r   r¹  ÚrangerÃ   )r<  r«  rW   rÑ   Ú
cipherNameÚkdfNamerÖ   r×   rØ   rÙ   rÚ   rÒ   ÚcheckrÜ   ÚpadByteÚencKeyrÅ  rÔ   r’   rº  ÚirÏ   s                         r4   Ú_toPrivateOpenSSH_v1ÚKey._toPrivateOpenSSH_v1¯  st  € ö ô  —^‘^ˆFØ&ˆJØˆGØ×)Ñ)¨QÑ.ˆIØˆGØˆFÜ×)Ò)¨&Ó1ˆDØˆFÜŸš 4›¬6¯;ª;°t¸VÓ+DÑD‰Jà ˆJØˆGØˆIØˆJÜ×&Ò& qÓ)ˆØ‘m d×&6Ñ&6Ó&8Ñ8¼6¿9º9ÀWÇ^ÐPSÓ;TÑTˆØˆÜ�+Ó ×*Ø�q‰LˆGØœ5 '¨D¡.Ð!2Ó3Ñ3ˆKô �+Ó ×*Ñ*ö Ü—Z’Z 
¨D°'¸FÑ2BÀCÓHˆFÜÙ�v˜h˜wÐ'Ó(Ü—	’	˜&¨7Ñ+;Ð<Ó=Ü'Ó)ñ÷ ‰i‹kð	 ð
 '×-Ñ-¨kÓ:¸Y×=OÑ=OÓ=QÑQ‰Nà(ˆNàÜ�iŠi˜
Ó#ñ$ä�iŠi˜Ó ñ!ô �iŠi˜
Ó#ñ$ô �kŠk˜$ Ó"ñ	#ô
 �iŠi˜Ÿ	™	›Ó$ñ%ô �iŠi˜Ó'ñ(ð 	ô ˜dÓ#×+Ñ+¨E°3Ó7ˆà3Ð4Ü,1°!´S¸³\À2Ô,FÓGÒ,F qˆw�q˜1˜r™6Ó"Ñ,FÑGñHà3Ð4ñ5ð 	ð
 �z‰z˜%Ó  5Ñ(Ð(ùò Hs   É$Jc                ól  • U(       d  [         R                  " 5       nO[         R                  " U5      nU R                  5       S:w  aM  U R                  R                  [         R                  R                  [         R                  R                  U5      $ U R                  5       S:X  d   e[        S5      e)zü
Return a private OpenSSH key string, in the old PEM-based format.

See _fromPrivateOpenSSH_PEM for the string format.

@type passphrase: L{bytes} or L{None}
@param passphrase: The passphrase to encrypt the key with, or L{None}
if it is not encrypted.
rK  zBcannot serialize Ed25519 key to OpenSSH PEM format; use v1 instead)r   r•  ÚBestAvailableEncryptionrc   r;  r“  r�  ÚPEMr”  ÚTraditionalOpenSSLræ   )r<  rW   rÅ  s      r4   Ú_toPrivateOpenSSH_PEMÚKey._toPrivateOpenSSH_PEMí  s‘   € ö ä%×2Ò2Ó4‰Iä%×=Ò=¸jÓIˆIØ�9‰9‹;˜)Ó#Ø—?‘?×0Ñ0Ü×&Ñ&×*Ñ*Ü×+Ñ+×>Ñ>Øóð ð —9‘9“; )Ó+Ð+Ð+ÜØWóð r3   c                óî   • U R                  5       (       a  U R                  US9$ US:X  d  Uc#  U R                  5       S:X  a  U R                  X#S9$ Ub  US:X  a  U R	                  US9$ [        SU 35      e)a
  
Return a public or private OpenSSH string.  See
L{_fromString_PUBLIC_OPENSSH} and L{_fromPrivateOpenSSH_PEM} for the
string formats.

@param subtype: A subtype to emit.  Only supported for private keys,
    for which the currently supported subtypes are C{'PEM'} and C{'v1'}.
    If not given, an appropriate default is used.
@type subtype: L{str} or L{None}

@param comment: Comment for a public key.
@type comment: L{bytes}

@param passphrase: Passphrase for a private key.
@type passphrase: L{bytes}

@rtype: L{bytes}
)r«  Úv1rK  )r«  rW   rÑ  rV   zunknown subtype )rR  r»  rc   rÍ  rÓ  ræ   )r<  r¯  r«  rW   s       r4   Ú_toString_OPENSSHÚKey._toString_OPENSSH	  s‚   € ð& �=‰=�?‰?Ø×(Ñ(°Ð(Ð9Ð9à˜‹_ ¡°T·Y±Y³[ÀIÓ5MØ×,Ñ,°WÐ,ÐTÐTØ‰_ ¨5Ó 0Ø×-Ñ-¸Ð-ÐDÐDäÐ/°¨yÐ9Ó:Ð:r3   c                ó‚  • U R                  5       nU R                  5       nU R                  5       (       Ga  US:X  aU  [        R                  " SSS[
        R                  " US   5      SS /S[
        R                  " US	   5      SS ////5      nO£US
:X  a�  [        R                  " SSS[
        R                  " US   5      SS /S[
        R                  " US   5      SS /S[
        R                  " US   5      SS /S[
        R                  " US   5      SS ////5      nO[        SU 35      eS[        U5      R                  SS5      -   S-   $ US:X  Ga$  US   US   pe[        R                  " XV5      n[        R                  " SSS[
        R                  " US   5      SS /S[
        R                  " US	   5      SS /S[
        R                  " US   5      SS /S[
        R                  " U5      SS /S[
        R                  " U5      SS /S[
        R                  " US   US-
  -  5      SS /S[
        R                  " US   US-
  -  5      SS /S [
        R                  " U5      SS //	//5      $ US
:X  a«  [        R                  " SSS[
        R                  " US   5      SS /S[
        R                  " US   5      SS /S[
        R                  " US   5      SS /S[
        R                  " US   5      SS /S![
        R                  " US"   5      SS ////5      $ [        SU S#35      e)$z„
Return a public or private LSH key.  See _fromString_PUBLIC_LSH and
_fromString_PRIVATE_LSH for the key formats.

@rtype: L{bytes}
rq  rï   rö   r÷   r–   rv   Nrø   r•   rr  rð   ró   rx   rô   ry   rò   rz   rñ   r|   rä   r  r·  r3   ó   }r  r  r  rž   ó   ar~   ó   bó   cr  r¡   Ú')rp   rc   rR  r   rÃ  r   rW  r)   r   r¹  r   r!  )r<  Úkwargsrp   rc   ÚkeyDatarx   ry   r  s           r4   Ú_toString_LSHÚKey._toString_LSH&  sc  € ð �y‰y‹{ˆØ�y‰y‹{ˆØ�=‰=�?Š?Ø�u‹}ÜŸ*š*ð *à 1Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @ððð	ó‘ð ˜“ÜŸ*š*ð *à &Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @ðð	ðó‘ô "Ð$5°d°VÐ"<Ó=Ð=Øœ+ gÓ.×6Ñ6°u¸cÓBÑBÀTÑIÐIà�uŒ}Ø˜C‘y $ s¡)�1Ü×'Ò'¨Ó-�Ü—z’zð +à ,Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°£|°A°BÐ'7Ð 8Ø!%¤v§y¢y°£|°A°BÐ'7Ð 8Ø!%¤v§y¢y°°c±¸aÀ!¹eÑ1DÓ'EÀaÀbÐ'IÐ JØ!%¤v§y¢y°°c±¸aÀ!¹eÑ1DÓ'EÀaÀbÐ'IÐ JØ!%¤v§y¢y°£°q°rÐ':Ð ;ð
ððóð ð$ ˜“Ü—z’zð +à &Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @Ø!%¤v§y¢y°°c±Ó';¸A¸BÐ'?Ð @ðð
ðóð ô  "Ð$5°d°V¸1Ð"=Ó>Ð>r3   c                óœ  • U R                  5       nU R                  5       (       d§  U R                  5       S:X  a  US   US   US   US   US   US   4nO*U R                  5       S:X  a  US   US   US	   US
   US   4n[        R                  " U R                  5       5      SR                  [        [        R                  W5      5      -   $ g)zl
Return a private Secure Shell Agent v3 key.  See
_fromString_AGENTV3 for the key format.

@rtype: L{bytes}
rq  r•   rž   r–   rª   rx   ry   rr  rz   r|   r¡   r3   N)	rp   rR  rc   r   rü   ry  rÃ   ÚmaprW  )r<  rß  rp   Úvaluess       r4   Ú_toString_AGENTV3ÚKey._toString_AGENTV3x  sÀ   € ð �y‰y‹{ˆØ�}‰}�‰Ø�y‰y‹{˜eÓ#à˜‘IØ˜‘IØ˜‘IØ˜‘IØ˜‘IØ˜‘Ið‘ð —‘“ Ó%Ø˜s™) T¨#¡Y°°S±	¸4À¹9ÀdÈ3ÁiÐP�Ü—9’9˜TŸ\™\›^Ó,¨s¯x©x¼¼F¿I¹IÀvÓ8NÓ/OÑOÐOð r3   c                ó  • U R                  5       nUc  U R                  5       nU R                  U5      nUc  [        SU< SU S35      eUS:X  aH  U R                  R                  U[        R                  " 5       U5      n[        R                  " U5      nGOTUS:X  aV  U R                  R                  X5      n[        U5      u  px[        R                  " [        US5      [        US5      -   5      nOøUS:X  a½  U R                  R                  U[        R                  " U5      5      n	[        U	5      u  px[        U5      n
[        U5      nU
S   nUS	-  (       a  S
U
-   n
US   nUS	-  (       a  S
U-   n[        R                  " [        R                  " U
5      [        R                  " U5      -   5      nO5US:X  a/  [        R                  " U R                  R                  U5      5      n[        R                  " U5      W-   $ )a  
Sign some data with this key.

SECSH-TRANS RFC 4253 Section 6.6.

@param data: The data to sign.

@param signatureType: The SSH public key algorithm name to sign this
    data with, or L{None} to use a reasonable default for the key.

@return: A signature for the given data.
zpublic key signature algorithm z is not defined for z keysrq  rr  é   rE  r   é€   ó    rK  )rc   ry  rˆ  r6   r;  Úsignr   ÚPKCS1v15r   rü   r#   r   r   ÚECDSA)r<  rp   r‡  r“   ÚhashAlgorithmÚsigÚretÚrÚsÚ	signaturer]   ÚsbÚrcompÚscomps                 r4   rì  ÚKey.signŽ  s¶  € ð —)‘)“+ˆØÑ ð
 !ŸL™L›NˆMà×.Ñ.¨}Ó=ˆØÑ Ü,Ø1°-Ñ1Bð CØ&˜i uð.óð ð
 �eÓØ—/‘/×&Ñ& t¬W×-=Ò-=Ó-?ÀÓOˆCÜ—)’)˜C“.ŠCà˜ÓØ—/‘/×&Ñ& tÓ;ˆCÜ)¨#Ó.‰FˆQô
 —)’)œL¨¨BÓ/´,¸qÀ"Ó2EÑEÓF‰Cà˜‹_ØŸ™×,Ñ,¨T´2·8²8¸MÓ3JÓKˆIÜ)¨)Ó4‰FˆQä˜a“ˆBÜ˜a“ˆBà�q‘EˆEð �t�|Ø˜r‘\�à�q‘EˆEà�t�|Ø˜r‘\�ä—)’)œFŸIšI b›M¬F¯IªI°b«MÑ9Ó:‰Cà˜	Ó!Ü—)’)˜DŸO™O×0Ñ0°Ó6Ó7ˆCÜ�yŠy˜Ó'¨#Ñ-Ð-r3   c                ó  • [        U5      S:X  a  S[        R                  " U5      pO[        R                  " U5      u  p1U R	                  U5      nUc  gU R                  5       nUS:X  ac  U R                  nU R                  5       (       d  UR                  5       n[        R                  " U5      S   U[        R                  " 5       U4nGOŸUS:X  a�  [        R                  " U5      S   n[        R                  USS S	5      n	[        R                  USS S	5      n
[        Xš5      nU R                  nU R                  5       (       d  UR                  5       nXU4nGOUS
:X  a´  [        R                  " U5      S   n[        R                  " US5      u  p¼n[        R                  US	5      n	[        R                  US	5      n
[        Xš5      nU R                  nU R                  5       (       d  UR                  5       nX[        R                  " U5      4nORUS:X  aL  U R                  nU R                  5       (       d  UR                  5       n[        R                  " U5      S   U4n WR                   " W6   g! ["         a     gf = f)zÛ
Verify a signature using this key.

@type signature: L{bytes}
@param signature: The signature to verify.

@type data: L{bytes}
@param data: The signed data.

@rtype: L{bool}
@return: C{True} if the signature is valid.
é(   ru   NFrq  r   rr  ré  ÚbigrE  rj   rK  T)rÄ   r   rü   r…   rˆ  rc   r;  rR  rˆ   r   rí  rÈ   Ú
from_bytesr$   r   rî  Úverifyr   )r<  rô  rp   r‡  rï  r“   r¥   ÚargsÚconcatenatedSignaturerò  ró  ÚrstrÚsstrr”   s                 r4   rý  Ú
Key.verifyÏ  s  € ô ˆy‹>˜RÓà'1´6·9²9¸YÓ3G™9ä'-§|¢|°IÓ'>Ñ$ˆMà×.Ñ.¨}Ó=ˆØÑ Øà—)‘)“+ˆØ�eÓØ—‘ˆAØ—=‘=—?‘?Ø—L‘L“N�ä—’˜YÓ'¨Ñ*ØÜ× Ò Ó"Øð	ŠDð ˜ÓÜ$*§L¢L°Ó$;¸AÑ$>Ð!Ü—‘Ð4°S°bÐ9¸5ÓAˆAÜ—‘Ð4°R°SÐ9¸5ÓAˆAÜ,¨QÓ2ˆIØ—‘ˆAØ—=‘=—?‘?Ø—L‘L“N�Ø ]Ð3ŠDà˜‹_Ü$*§L¢L°Ó$;¸AÑ$>Ð!Ü%Ÿ|š|Ð,AÀ1ÓEÑˆD˜Ü—‘˜t UÓ+ˆAÜ—‘˜t UÓ+ˆAÜ,¨QÓ2ˆIà—‘ˆAØ—=‘=—?‘?Ø—L‘L“N�à¤R§X¢X¨mÓ%<Ð=‰Dà˜	Ó!Ø—‘ˆAØ—=‘=—?‘?Ø—L‘L“N�Ü—L’L Ó+¨AÑ.°Ð5ˆDð	Ø�HŠH�d‰Oð øô  ó 	Ùð	ús   É.I> É>
JÊ
Jr:  )NN)NNNN)N)rA  ÚobjectÚreturnÚbool)r  rR   )r  z&Literal['RSA', 'DSA', 'EC', 'Ed25519'])r  zdict[str, Any])NNN)rp   rÄ  r‡  zbytes | Noner  rÄ  )2r-   r.   r/   r0   r1   Úclassmethodre   r_   r™   r­   r±   rß   ré   rì   r   r  r  rk   r¦   r§   r.  rŽ   r�   r=  rB  r^  rR  rf  r@   rB   rn  rc   ry  r~  rˆ  rU  rp   r’   r¨  r"   r³  r»  rÍ  rÓ  r×  rá  ræ  rì  rý  r2   r+   r3   r4   rZ   rZ   —   s-  † ñð ó>ó ð>ð( ó%,ó ð%,ðN ñD;ó ðD;ðL ñH?ó ðH?ðT ñ*ó ð*ð( ñV=ó ðV=ðp ñ6:ó ð6:ðp ñAó ðAð8 ñDó ðDð> ñ#Dó ð#DðJ ñ.=ó ð.=ð` ñ2ó ð2ðh ó*ó ð*ðX ó ó ð ðD óó ðð> óó ðð6 óó ðò,	ô"ô*$òX
ò 5ð "4×!;Ñ!;ô &TôPOò.òB
$ò,ò:(ôJJòX:;òxQ;ñf !à�iÐ Ø�lÐ#ð	
óó:Oóð:OôxJô4<)ô|ô8;ò:P?òdPö,?.õBDr3   rZ   c                ó2  • U R                  5       R                  SS9  U R                  5       (       dƒ  [        R                  " SU[        5       S9nUR                  [        R                  R                  [        R                  R                  [        R                  " 5       S9nU R                  U5        U R                  S5       n[        R                  " UR!                  5       S[        5       S9n[#        U5      sSSS5        $ ! , (       d  f       g= f)	a—  
This function returns a persistent L{Key}.

The key is loaded from a PEM file in C{location}. If it does not exist, a
key with the key size of C{keySize} is generated and saved.

@param location: Where the key is stored.
@type location: L{twisted.python.filepath.FilePath}

@param keySize: The size of the key, if it needs to be generated.
@type keySize: L{int}

@returns: A persistent key.
@rtype: L{Key}
T)ÚignoreExistingDirectoryi  )Úpublic_exponentr‹  rÀ   )Úencodingrm  Úencryption_algorithmr]   N)ÚpasswordrÀ   )ÚparentÚmakedirsÚexistsr   Úgenerate_private_keyr   r“  r   r�  rÑ  r”  rÒ  r•  Ú
setContentr^   r   r`   rZ   )Úlocationr×   Ú
privateKeyÚpemÚkeyFiles        r4   Ú_getPersistentRSAKeyr    sÛ   € ð  ‡O�OÓ×Ñ°tÐÑ<ð �?‰?×ÑÜ×-Ò-Ø!¨G¼_Ó=Nñ
ˆ
ð ×&Ñ&Ü"×+Ñ+×/Ñ/Ü ×.Ñ.×AÑAÜ!.×!;Ò!;Ó!=ð 'ð 
ˆð 	×Ñ˜CÔ ð 
�‰�tÔ	 Ü"×7Ò7Ø�L‰L‹N T´?Ó3Dñ
ˆ
ô �:‹÷	 
×	×	ús   Ã7DÄ
D)i   )Or1   Ú
__future__r   rk  rÅ   rJ   r°  Úbase64r   r   r   Úhashlibr   r   Útypingr	   rÉ   Ú
constantlyr
   r   Úcryptographyr   Úcryptography.exceptionsr   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr   r   r   r   r   Ú&cryptography.hazmat.primitives.ciphersr   r   r   Ú,cryptography.hazmat.primitives.serializationr   r   Útyping_extensionsr   Útwisted.conch.sshr   r   Útwisted.conch.ssh.commonr   Útwisted.pythonr   Útwisted.python.compatr    r!   Útwisted.python.deprecater"   Ú/cryptography.hazmat.primitives.asymmetric.utilsr#   r$   ÚImportErrorr%   r&   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1r‹   r¨   r4  r5  Ú	Exceptionr)   r6   r:   r=   r@   rE   rX   rZ   r  r+   r3   r4   Ú<module>r/     s3  ðñ
õ #ã Û Û Û ß 6Ñ 6ß Ý ã ß +Ý Ý 4Ý 8ß @ß TÕ Tß LÑ L÷õ &ç +Ý 1Ý $ß 9Ý @ð	÷ð ŸLšL›NØŸLšL›NØŸLšL›Nñ€ð ØØñ€
ð ×+Ñ+Ð Ø×-Ñ-Ð ô�)ô ô ô ô˜	ô ô˜9ô ô$˜ô $ô" 9ô ò÷>|ñ |õ~3(øðW7 ó ÷ñ ðús   Â E ÅEÅE