§
    Ètºf’ù  ã                  óÎ  — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlZddlmZ ddlmZ dd	lmZ dd
lmZmZ ddlmZmZmZmZmZ ddl m!Z!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7 	 ddl8m9Z9m:Z: n# e;$ r ddl8m<Z9m=Z: Y nw xY w ej>        ¦   «          ej?        ¦   «          ej@        ¦   «         dœZAddddœZBejC        ZCejD        ZD G d„ deE¦  «        ZF G d„ deE¦  «        ZG G d „ d!eE¦  «        ZH G d"„ d#eE¦  «        ZI G d$„ d%e5¦  «        ZJ G d&„ d'eE¦  «        ZKd(„ ZL G d)„ d*¦  «        ZMd-d,„ZNdS ).z0
Handling of RSA, DSA, ECDSA, and Ed25519 keys.
é    )ÚannotationsN)Ú	b64encodeÚdecodebytesÚencodebytes)Úmd5Úsha256)ÚAny)Ú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)ÚNamedConstantÚNames)Ú_mutuallyExclusiveArguments)Údecode_dss_signatureÚencode_dss_signature)Údecode_rfc6979_signatureÚencode_rfc6979_signature)s   ecdsa-sha2-nistp256s   ecdsa-sha2-nistp384s   ecdsa-sha2-nistp521s   nistp256s   nistp384s   nistp521)s	   secp256r1s	   secp384r1s	   secp521r1c                  ó   — e Zd ZdZdS )ÚBadKeyErrorzj
    Raised when a key isn't what we expected from it.

    XXX: we really need to check for bad keys
    N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__© ó    úU/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/ssh/keys.pyr(   r(   D   s   € € € € € ðð ð ð r/   r(   c                  ó   — e Zd ZdZdS )ÚBadSignatureAlgorithmErrorzi
    Raised when a public key signature algorithm name isn't defined for this
    public key format.
    Nr)   r.   r/   r0   r2   r2   L   ó   € € € € € ðð ð ð r/   r2   c                  ó   — e Zd ZdZdS )ÚEncryptedKeyErrorzb
    Raised when an encrypted key is presented to fromString/fromFile without
    a password.
    Nr)   r.   r/   r0   r5   r5   S   r3   r/   r5   c                  ó   — e Zd ZdZdS )ÚBadFingerPrintFormatzS
    Raises when unsupported fingerprint formats are presented to fingerprint.
    Nr)   r.   r/   r0   r7   r7   Z   s   € € € € € ðð ð ð r/   r7   c                  ó:   — e Zd ZdZ e¦   «         Z e¦   «         ZdS )ÚFingerprintFormatsaä  
    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{twisted.python.constants.NamedConstant}

    @cvar SHA256_BASE64: Named constant representing fingerprint format
        generated using sha256[RFC4634] algorithm in base64 encoding
    @type SHA256_BASE64: L{twisted.python.constants.NamedConstant}
    N)r*   r+   r,   r-   r    ÚMD5_HEXÚSHA256_BASE64r.   r/   r0   r9   r9   `   s0   € € € € € ð
ð 
ð ˆm‰oŒo€GØ!�M‘O”O€M€M€Mr/   r9   c                  ó   — e Zd ZdZdS )ÚPassphraseNormalizationErrorzŒ
    Raised when a passphrase contains Unicode characters that cannot be
    normalized using the available Unicode character database.
    Nr)   r.   r/   r0   r=   r=   q   r3   r/   r=   c                óÎ   — t          | t          ¦  «        rOt          d„ | D ¦   «         ¦  «        rt          ¦   «         ‚t	          j        d| ¦  «                             d¦  «        S | S )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  óF   K  — | ]}t          j        |¦  «        d k    V — ŒdS )ÚCnN)ÚunicodedataÚcategory)Ú.0Úcs     r0   ú	<genexpr>z'_normalizePassphrase.<locals>.<genexpr>Ž   s2   è è € ÐCÐC°1�{Ô# AÑ&Ô&¨$Ò.ÐCÐCÐCÐCÐCÐCr/   ÚNFKCzUTF-8)Ú
isinstanceÚstrÚanyr=   rA   Ú	normalizeÚencode©Ú
passphrases    r0   Ú_normalizePassphraserN   x   sl   € õ& �*�cÑ"Ô"ð 	õ ÐCÐC¸
ÐCÑCÔCÑCÔCð 	1õ /Ñ0Ô0Ð0ÝÔ$ V¨ZÑ8Ô8×?Ò?ÀÑHÔHÐHàÐr/   c                  óp  — e Zd ZdZed5d„¦   «         Zed5d„¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Z	ed„ ¦   «         Z
ed	„ ¦   «         Zed
„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed„ ¦   «         Zed6d„¦   «         Zed7d„¦   «         Zed7d„¦   «         Zed7d„¦   «         Zed7d„¦   «         Zd„ Zd8d„Zd9d„Zd„ Zd„ Zej        fd„Zd:d „Zd!„ Zd"„ Z d#„ Z!d$„ Z"d;d&„Z#d'„ Z$d(„ Z% e&d)d*gd)d+gg¦  «        d6d,„¦   «         Z'd7d-„Z(d5d.„Z)d7d/„Z*d<d0„Z+d1„ Z,d2„ Z-d7d3„Z.d4„ Z/dS )=ÚKeyau  
    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                ó¨   — t          |d¦  «        5 }|                      |                     ¦   «         ||¦  «        cddd¦  «         S # 1 swxY w Y   dS )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ÚtyperM   Úfs        r0   ÚfromFilezKey.fromFile    s�   € õ$ �(˜DÑ!Ô!ð 	> QØ—>’> !§&¢&¡(¤(¨D°*Ñ=Ô=ð	>ð 	>ð 	>ð 	>ñ 	>ô 	>ð 	>ð 	>ð 	>ð 	>ð 	>ð 	>øøøð 	>ð 	>ð 	>ð 	>ð 	>ð 	>s   ‘)AÁAÁAc                ó®  — t          |t          ¦  «        r|                     d¦  «        }t          |¦  «        }|€|                      |¦  «        }|€t          d|›�¦  «        ‚t          | d|                     ¦   «         › �d¦  «        }|€t          d|› �¦  «        ‚|j        j	        dk    r|rt          d¦  «        ‚ ||¦  «        S  |||¦  «        S )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)
rG   rH   rK   rN   Ú_guessStringTyper(   ÚgetattrÚupperÚ__code__Úco_argcount)rV   ÚdatarX   rM   Úmethods        r0   rT   zKey.fromStringµ   sí   € õ. �d�CÑ Ô ð 	(Ø—;’;˜wÑ'Ô'ˆDÝ)¨*Ñ5Ô5ˆ
Øˆ<Ø×'Ò'¨Ñ-Ô-ˆDØˆ<ÝÐB¸$ÐBÐBÑCÔCÐCÝ˜Ð;¨T¯ZªZ©\¬\Ð;Ð;¸TÑBÔBˆØˆ>ÝÐA¸4ÐAÐAÑBÔBÐBØŒ?Ô&¨!Ò+Ð+Øð 7Ý!Ð"5Ñ6Ô6Ð6Ø�6˜$‘<”<Ðà�6˜$ 
Ñ+Ô+Ð+r/   c           
     ó  — t          j        |¦  «        \  }}|dk    rVt          j        |d¦  «        \  }}} | t          j        ||¦  «                             t          ¦   «         ¦  «        ¦  «        S |dk    rnt          j        |d¦  «        \  }}}}	} | t          j        |	t          j	        |||¬¦  «        ¬¦  «                             t          ¦   «         ¦  «        ¦  «        S |t          v rM | t          j                             t          |         t          j        |d¦  «        d         ¦  «        ¦  «        S |dk    r,t          j        |¦  «        \  }
}|                      |
¦  «        S t          d	|› �¦  «        ‚)
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-rsar^   ó   ssh-dssé   ©ÚpÚqÚg©ÚyÚparameter_numbersé   ó   ssh-ed25519úunknown blob type: )r   ÚgetNSÚgetMPr   ÚRSAPublicNumbersÚ
public_keyr   r   ÚDSAPublicNumbersÚDSAParameterNumbersÚ_curveTabler   ÚEllipticCurvePublicKeyÚfrom_encoded_pointÚ_fromEd25519Componentsr(   )rV   ÚblobÚkeyTypeÚrestÚeÚnrk   rl   rm   ro   Úas              r0   Ú_fromString_BLOBzKey._fromString_BLOBÝ   s‚  € õD œ TÑ*Ô*‰ˆ�Ø�jÒ Ð Ýœ d¨AÑ.Ô.‰JˆAˆq�$Ø�3•sÔ+¨A¨qÑ1Ô1×<Ò<½_Ñ=NÔ=NÑOÔOÑPÔPÐPØ˜
Ò"Ð"Ý%œ|¨D°!Ñ4Ô4ÑˆAˆq�!�Q˜Ø�3ÝÔ$Ø­3Ô+BÀQÈ!ÈqÐ+QÑ+QÔ+Qðñ ô ç’*�_Ñ.Ô.Ñ/Ô/ñô ð ð
 �Ð#Ð#Ø�3ÝÔ)×<Ò<Ý Ô(­&¬,°t¸QÑ*?Ô*?ÀÔ*Bñô ñô ð ð
 ˜Ò&Ð&Ý”l 4Ñ(Ô(‰GˆAˆtØ×-Ò-¨aÑ0Ô0Ð0åÐ=°GÐ=Ð=Ñ>Ô>Ð>r/   c                óþ  — t          j        |¦  «        \  }}|dk    r7t          j        |d¦  «        \  }}}}}}	}|                      |||||	¬¦  «        S |dk    r6t          j        |d¦  «        \  }}	}
}}}|                      ||
||	|¬¦  «        S |t
          v r“t
          |         }t          j        |d¦  «        \  }}	}|t          |j                             d¦  «                 k    rt          d	|›d
|›�¦  «        ‚t          j        |¦  «        \  }}|  
                    |	||¬¦  «        S |dk    r:t          j        |d¦  «        \  }}}|dd…         }|                      ||¬¦  «        S t          d|› �¦  «        ‚)a6  
        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
        rg   é   ©r‚   r�   Údrk   rl   rh   é   ©ro   rm   rk   rl   Úxr^   ÚasciizECDSA curve name z does not match key type )ÚencodedPointÚcurveÚprivateValuerr   Né    )Úkrs   )r   rt   ru   Ú_fromRSAComponentsÚ_fromDSAComponentsrz   Ú
_secToNistÚnamerK   r(   Ú_fromECEncodedPointr}   )rV   r~   r   r€   r‚   r�   rˆ   Úurk   rl   rm   ro   r‹   rŽ   Ú	curveNamer�   rƒ   Úcombinedr‘   s                      r0   Ú_fromString_PRIVATE_BLOBzKey._fromString_PRIVATE_BLOB  s¹  € õ\ œ TÑ*Ô*‰ˆ�à�jÒ Ð Ý%+¤\°$¸Ñ%:Ô%:Ñ"ˆAˆq�!�Q˜˜1˜dØ×)Ò)¨A°°a¸1ÀÐ)ÑBÔBÐBØ˜
Ò"Ð"Ý"(¤,¨t°QÑ"7Ô"7ÑˆAˆq�!�Q˜˜4Ø×)Ò)¨A°°a¸1ÀÐ)ÑBÔBÐBØ�Ð#Ð#Ý Ô(ˆEÝ!'¤¨d°AÑ!6Ô!6ÑˆI�q˜$Ø�J u¤z×'8Ò'8¸Ñ'AÔ'AÔBÒBÐBÝ!�kà!*  ¨G¨Gð5ñô ð õ "(¤¨dÑ!3Ô!3ÑˆL˜$Ø×*Ò*Ø g¸Lð +ñ ô ð ð ˜Ò&Ð&õ !'¤¨T°1Ñ 5Ô 5ÑˆAˆx˜Ø˜˜"˜”ˆAØ×-Ò-¨a°1Ð-Ñ5Ô5Ð5åÐ=°GÐ=Ð=Ñ>Ô>Ð>r/   c                óî   — |                      d¦  «        r% | t          |t          ¦   «         ¦  «        ¦  «        S t          |                     ¦   «         d         ¦  «        }|                      |¦  «        S )a”  
        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-sha2rq   )Ú
startswithr   r   r   Úsplitr„   )rV   rd   r~   s      r0   Ú_fromString_PUBLIC_OPENSSHzKey._fromString_PUBLIC_OPENSSHa  sg   € ð  �?Š?˜=Ñ)Ô)ð 	EØ�3Õ*¨4µÑ1BÔ1BÑCÔCÑDÔDÐDÝ˜4Ÿ:š:™<œ<¨œ?Ñ+Ô+ˆØ×#Ò# DÑ)Ô)Ð)r/   c           	     ó  — |                      ¦   «                              ¦   «         }t          d                     |dd…         ¦  «        ¦  «        }|                     d¦  «        st          d¦  «        ‚|t          d¦  «        d…         }t          j        |d¦  «        \  }}}}t          j
        d|dd	…         ¦  «        d
         }	|	dk    rt          d¦  «        ‚t          j        |d	d…         d¦  «        \  }
}}
|dk    �ro|st          d¦  «        ‚|dv r+t          j        }d}t          |dd…         ¦  «        dz  }|}nt          d|›�¦  «        ‚|dk    rWt          j        |¦  «        \  }}t          j
        d|dd	…         ¦  «        d
         }t          j        ||||z   |d¬¦  «        }nt          d|›�¦  «        ‚t          |¦  «        |z  d
k    rt          d¦  «        ‚t#           ||d|…         ¦  «        t%          j        ||||z   …         ¦  «        t)          ¦   «         ¬¦  «                             ¦   «         }|                     |¦  «        |                     ¦   «         z   }n|dk    rt          d|›d�¦  «        ‚|}t          j
        d|dd	…         ¦  «        d
         }t          j
        d|d	d…         ¦  «        d
         }||k    rt          d||fz  ¦  «        ‚|                      |dd…         ¦  «        S )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
        r/   rq   éÿÿÿÿó   openssh-key-v1 z"unknown OpenSSH private key formatNé   ú!Lri   r   zDonly OpenSSH private key files containing a single key are supportedr^   ó   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   rt   ÚstructÚunpackr5   r   ÚAESÚintÚbcryptÚkdfr   r   ÚCTRr   Ú	decryptorÚupdateÚfinalizerš   )rV   rd   rM   ÚlinesÚkeyListÚcipherr¶   Ú
kdfOptionsr€   r‚   Ú_ÚencPrivKeyListÚalgorithmClassÚ	blockSizeÚkeySizeÚivSizeÚsaltÚroundsÚdecKeyr¸   ÚprivKeyListÚcheck1Úcheck2s                          r0   Ú_fromPrivateOpenSSH_v1zKey._fromPrivateOpenSSH_v1v  sI  € ð: —
’
‘”×'Ò'Ñ)Ô)ˆÝ˜cŸhšh u¨Q¨r¨T¤{Ñ3Ô3Ñ4Ô4ˆØ×!Ò!Ð"5Ñ6Ô6ð 	DÝÐBÑCÔCÐCØ�#Ð1Ñ2Ô2Ð4Ð4Ô5ˆÝ(.¬°W¸aÑ(@Ô(@Ñ%ˆ��Z ÝŒM˜$  R a R¤Ñ)Ô)¨!Ô,ˆØ�Š6ˆ6Ýð-ñô ð õ
  &œ|¨D°°°¬H°aÑ8Ô8Ñˆˆ>˜1Ø�WÒÑØð Ý'ØIñô ð ð ÐFÐFÐFÝ!+¤�Ø�	Ý˜f Q q SœkÑ*Ô*¨aÑ/�Ø"��å!Ð"G¸VÐ"GÐ"GÑHÔHÐHØ�iÒÐÝ#œ\¨*Ñ5Ô5‘
��dÝœ t¨T°"°1°"¬XÑ6Ô6°qÔ9�ÝœØØØ˜fÑ$Øà&*ðñ ô ��õ "Ð"=°cÐ"=Ð"=Ñ>Ô>Ð>Ý�NÑ#Ô# iÑ/°AÒ5Ð5Ý! -Ñ0Ô0Ð0ÝØ�˜v h w hÔ/Ñ0Ô0Ý”	˜& ¨7°VÑ+;Ð!;Ô<Ñ=Ô=Ý'Ñ)Ô)ðñ ô ÷ Ši‰kŒkð	 ð
 $×*Ò*¨>Ñ:Ô:¸Y×=OÒ=OÑ=QÔ=QÑQˆKˆKà�gŠ~ˆ~Ý!�kØGJÀsÀsÐLñô ð ð )ˆKÝ”˜t [°°!°¤_Ñ5Ô5°aÔ8ˆÝ”˜t [°°1°Ô%5Ñ6Ô6°qÔ9ˆØ�VÒÐÝÐCÀvÈvÐFVÑVÑWÔWÐWØ×+Ò+¨K¸¸¸¬OÑ<Ô<Ð<r/   c                ó`  — |                      ¦   «                              ¦   «         }|d         dd…         }|sd}|dv r_	 t          ||t          ¦   «         ¦  «        }n5# t          $ r t          d¦  «        ‚t          $ r t          d¦  «        ‚w xY w | |¦  «        S t          d|› �¦  «        ‚)	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   Ú	TypeErrorr5   Ú
ValueErrorr(   )rV   rd   rM   r»   ÚkindÚkeys         r0   Ú_fromPrivateOpenSSH_PEMzKey._fromPrivateOpenSSH_PEMÏ  så   € ðJ —
’
‘”×'Ò'Ñ)Ô)ˆØ�QŒx˜˜3˜Ôˆð ð 	ØˆJØÐ*Ð*Ð*ðLÝ*¨4°½_Ñ=NÔ=NÑOÔO��øÝð ð ð Ý'ØFñô ð õ ð Lð Lð LÝ!Ð"JÑKÔKÐKðLøøøà�3�s‘8”8ˆOåÐ8°$Ð8Ð8Ñ9Ô9Ð9s   Á A Á2Bc                óÊ   — |                      ¦   «                              ¦   «         d         dd…         dk    r|                      ||¦  «        S |                      ||¦  «        S )aø  
        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Ô   )rV   rd   rM   s      r0   Ú_fromString_PRIVATE_OPENSSHzKey._fromString_PRIVATE_OPENSSH  s_   € ð, �:Š:‰<Œ<×"Ò"Ñ$Ô$ QÔ'¨¨3¨Ô/°:Ò=Ð=à×-Ò-¨d°JÑ?Ô?Ð?ð ×.Ò.¨t°ZÑ@Ô@Ð@r/   c                ó*  — t          j        t          |dd…         ¦  «        ¦  «        }|d         dk    sJ ‚i }|d         dd…         D ]4\  }}t          j        t          j        |¦  «        ¦  «        d         ||<   Œ5|d         d         dk    r1|                      |d         |d         |d	         |d
         ¬¦  «        S |d         d         dk    r#|                      |d         |d         ¬¦  «        S t          d|d         d         › �¦  «        ‚)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
        rq   r    r   ó
   public-keyNó   dsaó   yó   gó   pó   q©ro   rm   rk   rl   ó   rsa-pkcs1-sha1ó   nó   e©r‚   r�   úunknown lsh key type )	r   Úparser   r   ru   ÚNSr“   r’   r(   ©rV   rd   ÚsexpÚkdr•   s        r0   Ú_fromString_PUBLIC_LSHzKey._fromString_PUBLIC_LSH%  s  € õ" Œ{�; t¨A¨b¨D¤zÑ2Ô2Ñ3Ô3ˆØ�AŒw˜-Ò'Ð'Ð'Ð'ØˆØ˜qœ' ! " "œ+ð 	8ð 	8‰JˆD�$Ý”|¥F¤I¨d¡O¤OÑ4Ô4°QÔ7ˆBˆt‰HˆHØ�Œ7�1Œ:˜ÒÐØ×)Ò)Ø�T”(˜b œh¨"¨T¬(°b¸´hð *ñ ô ð ð �!ŒW�QŒZÐ,Ò,Ð,Ø×)Ò)¨B¨t¬H¸¸4¼Ð)ÑAÔAÐAåÐB°d¸1´g¸a´jÐBÐBÑCÔCÐCr/   c                ó2  — t          j        |¦  «        }|d         dk    sJ ‚i }|d         dd…         D ]4\  }}t          j        t          j        |¦  «        ¦  «        d         ||<   Œ5|d         d         dk    rbt          |¦  «        dk    sJ t          |¦  «        ¦   «         ‚|                      |d         |d         |d	         |d
         |d         ¬¦  «        S |d         d         dk    r‹t          |¦  «        dk    sJ t          |¦  «        ¦   «         ‚|d	         |d
         k    r|d
         |d	         c|d	<   |d
<   |                      |d         |d         |d         |d	         |d
         ¬¦  «        S t          d|d         d         › �¦  «        ‚)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-keyrq   NrÙ   r‰   rÚ   rÛ   rÜ   rÝ   ó   xrŠ   ó	   rsa-pkcs1r¨   rà   rá   ó   dr‡   rã   )	r   rä   r   ru   rå   r°   r“   r’   r(   ræ   s        r0   Ú_fromString_PRIVATE_LSHzKey._fromString_PRIVATE_LSHE  sœ  € õ" Œ{˜4Ñ Ô ˆØ�AŒw˜.Ò(Ð(Ð(Ð(ØˆØ˜qœ' ! " "œ+ð 	8ð 	8‰JˆD�$Ý”|¥F¤I¨d¡O¤OÑ4Ô4°QÔ7ˆBˆt‰HˆHØ�Œ7�1Œ:˜ÒÐÝ�r‘7”7˜a’<�<�<¥ R¡¤‘<”<�<Ø×)Ò)Ø�T”(˜b œh¨"¨T¬(°b¸´hÀ"ÀTÄ(ð *ñ ô ð ð �!ŒW�QŒZ˜<Ò'Ð'Ý�r‘7”7˜a’<�<�<¥ R¡¤‘<”<�<Ø�$Œx˜"˜Tœ(Ò"Ð"Ø%'¨¤X¨r°$¬xÐ"��4‘˜"˜T™(Ø×)Ò)Ø�T”(˜b œh¨"¨T¬(°b¸´hÀ"ÀTÄ(ð *ñ ô ð õ
 ÐB°d¸1´g¸a´jÐBÐBÑCÔCÐCr/   c                óÐ  — t          j        |¦  «        \  }}|dk    r�t          j        |¦  «        \  }}t          j        |¦  «        \  }}t          j        |¦  «        \  }}t          j        |¦  «        \  }}t          j        |¦  «        \  }}|                      |||||¬¦  «        S |dk    r¥t          j        |¦  «        \  }}t          j        |¦  «        \  }	}t          j        |¦  «        \  }
}t          j        |¦  «        \  }}t          j        |¦  «        \  }}t          j        |¦  «        \  }}|                      |
||	|||¬¦  «        S t          d|› �¦  «        ‚)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
        rh   rŠ   rg   ©r‚   r�   rˆ   rk   rl   r—   rÏ   )r   rt   ru   r“   r’   r(   )rV   rd   r   rk   rl   rm   ro   r‹   r�   rˆ   r‚   r—   s               r0   Ú_fromString_AGENTV3zKey._fromString_AGENTV3k  sU  € õ< œ TÑ*Ô*‰ˆ�Ø�jÒ Ð Ý”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtØ×)Ò)¨A°°a¸1ÀÐ)ÑBÔBÐBØ˜
Ò"Ð"Ý”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtÝ”l 4Ñ(Ô(‰GˆAˆtØ×)Ò)¨A°°a¸1ÀÀQÐ)ÑGÔGÐGåÐ;°'Ð;Ð;Ñ<Ô<Ð<r/   c                óì  — |                      d¦  «        s|                      d¦  «        rdS |                      d¦  «        rdS |                      d¦  «        rdS |                      d¦  «        rd	S |                      d
¦  «        s*|                      d¦  «        s|                      d¦  «        rCt          j        |¦  «        \  }}d}|r|dz  }t          j        |¦  «        \  }}|°|dk    rdS dS dS )z¢
        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
   -----BEGINÚprivate_opensshó   {Ú
public_lshó   (Úprivate_lshs      ssh-s
      ecdsa-s      ssh-ed25519r   rq   ri   Úagentv3r~   N)rœ   r   rt   ru   )rV   rd   Úignoredr€   Úcounts        r0   r_   zKey._guessStringTypeœ  s%  € ð �?Š?˜7Ñ#Ô#ð 	 t§¢°~Ñ'FÔ'Fð 	Ø#Ð#Ø�_Š_˜]Ñ+Ô+ð 	Ø$Ð$Ø�_Š_˜TÑ"Ô"ð 	Ø�<Ø�_Š_˜TÑ"Ô"ð 	Ø �=à�OŠOÐ3Ñ4Ô4ð	à�ŠÐ8Ñ9Ô9ð	ð �ŠÐ=Ñ>Ô>ð	õ
 #œL¨Ñ.Ô.‰MˆG�TØˆEØð 3Ø˜‘
�Ý &¤¨TÑ 2Ô 2‘�˜ð ð 3ð �qŠyˆyØ �yà�vð	ð 	r/   c                óv  — t          j        ||¬¦  «        }|€"|                     t          ¦   «         ¦  «        }nut          j        |||t          j        ||¦  «        t          j        ||¦  «        t          j        ||¦  «        |¬¦  «        }	|	                     t          ¦   «         ¦  «        } | |¦  «        S )aÔ  
        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‚   N)rk   rl   rˆ   Údmp1Údmq1ÚiqmpÚpublic_numbers)	r   rv   rw   r   ÚRSAPrivateNumbersÚrsa_crt_dmp1Úrsa_crt_dmq1Úrsa_crt_iqmpÚprivate_key)
rV   r‚   r�   rˆ   rk   rl   r—   ÚpublicNumbersÚ	keyObjectÚprivateNumberss
             r0   r’   zKey._fromRSAComponents¼  sµ   € õ6 Ô,¨q°AÐ6Ñ6Ô6ˆØˆ9à%×0Ò0µÑ1BÔ1BÑCÔCˆIˆIå Ô2ØØØÝÔ% a¨Ñ+Ô+ÝÔ% a¨Ñ+Ô+ÝÔ% a¨Ñ+Ô+Ø,ðñ ô ˆNð '×2Ò2µ?Ñ3DÔ3DÑEÔEˆIàˆs�9‰~Œ~Ðr/   c                ó$  — t          j        |t          j        |||¬¦  «        ¬¦  «        }|€"|                     t	          ¦   «         ¦  «        }n7t          j        ||¬¦  «        }|                     t	          ¦   «         ¦  «        } | |¦  «        S )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.
        rj   rn   N)r‹   r  )r   rx   ry   rw   r   ÚDSAPrivateNumbersr  )	rV   ro   rk   rl   rm   r‹   r  r	  r
  s	            r0   r“   zKey._fromDSAComponentsé  s�   € õ. Ô,Ø¥3Ô#:¸QÀ!ÀqÐ#IÑ#IÔ#Ið
ñ 
ô 
ˆð ˆ9à%×0Ò0µÑ1BÔ1BÑCÔCˆIˆIå Ô2°QÀ}ÐUÑUÔUˆNØ&×2Ò2µ?Ñ3DÔ3DÑEÔEˆIàˆs�9‰~Œ~Ðr/   c                ó  — t          j        ||t          |         ¬¦  «        }|€"|                     t	          ¦   «         ¦  «        }n7t          j        ||¬¦  «        }|                     t	          ¦   «         ¦  «        } | |¦  «        S )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‹   ro   rŽ   N)Úprivate_valuer  )r   ÚEllipticCurvePublicNumbersrz   rw   r   ÚEllipticCurvePrivateNumbersr  )rV   r‹   ro   rŽ   r�   r  r	  r
  s           r0   Ú_fromECComponentszKey._fromECComponents  s�   € õ$ Ô5Ø�1�K¨Ô.ð
ñ 
ô 
ˆð Ðà%×0Ò0µÑ1BÔ1BÑCÔCˆIˆIåÔ;Ø*¸=ðñ ô ˆNð '×2Ò2µ?Ñ3DÔ3DÑEÔEˆIàˆs�9‰~Œ~Ðr/   c                óÎ   — |€,t           j                             t          |         |¦  «        }n-t          j        |t          |         t          ¦   «         ¦  «        } | |¦  «        S )aa  
        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|   rz   Úderive_private_keyr   )rV   r�   rŽ   r�   r	  s        r0   r–   zKey._fromECEncodedPoint,  sd   € ð  ÐåÔ1×DÒDÝ˜EÔ" Lñô ˆIˆIõ Ô-Ø�k¨%Ô0µ/Ñ2CÔ2Cñô ˆIð ˆs�9‰~Œ~Ðr/   c                óÀ   — t           �t          €t          d¦  «        ‚|€t                                |¦  «        }nt                               |¦  «        } | |¦  «        S )a  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}
        Nz)Ed25519 keys not supported on this system)ÚEd25519PublicKeyÚEd25519PrivateKeyr(   Úfrom_public_bytesÚfrom_private_bytes)rV   rƒ   r‘   r	  s       r0   r}   zKey._fromEd25519ComponentsH  sZ   € õ Ð#Õ'8Ð'@ÝÐIÑJÔJÐJàˆ9Ý(×:Ò:¸1Ñ=Ô=ˆIˆIå)×<Ò<¸QÑ?Ô?ˆIàˆs�9‰~Œ~Ðr/   c                ó   — || _         dS )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.
        N)Ú
_keyObject)Úselfr	  s     r0   Ú__init__zKey.__init___  s   € ð $ˆŒˆˆr/   ÚotherÚobjectÚreturnÚboolc                óâ   — t          |t          ¦  «        rT|                      ¦   «         |                     ¦   «         k    o)|                      ¦   «         |                     ¦   «         k    S t          S )zN
        Return True if other represents an object with the same key.
        )rG   rP   rX   rd   ÚNotImplemented)r  r  s     r0   Ú__eq__z
Key.__eq__i  sQ   € õ �e�SÑ!Ô!ð 	"Ø—9’9‘;”; %§*¢*¡,¤,Ò.ÐN°4·9²9±;´;À%Ç*Â*Á,Ä,Ò3NÐNå!Ð!r/   rH   c                ój  — |                       ¦   «         dk    r¦|                      ¦   «         }|d                              d¦  «        }|                      ¦   «         rd|dd…         › d�}nd|dd…         › d�}t	          |                     ¦   «         ¦  «        D ]\  }}|dk    r	|d	|› �z  }Œ|d
|› d|› �z  }Œ |dz   S dt          |                       ¦   «         ¦  «        ›d|                      ¦   «         rdpd›d|                      ¦   «         ›d�g}t	          |                      ¦   «                              ¦   «         ¦  «        D ]Ë\  }}|                     d|› d�¦  «         |                       ¦   «         dk    r|nt          j
        |¦  «        dd…         }|ru|dd…         }|dd…         }d}	t          |¦  «        D ]}
|	t          |
¦  «        d›d�z   }	Œt          |¦  «        dk     r
|	dd…         }	|                     d|	z   ¦  «         |°uŒÌ|d         dz   |d<   d
                     |¦  «        S )z@
        Return a pretty representation of this object.
        ÚECrŽ   r\   z<Elliptic Curve Public Key (éýÿÿÿNz bits)z<Elliptic Curve Private Key (z	
curve:
	ú
z:
	z>
ú<ú z
Public KeyzPrivate Keyz (zattr ú:ÚEd25519ri   é   Ú Ú02xr    ú	ú>)rX   rd   ÚdecodeÚisPublicÚsortedÚitemsr   ÚsizeÚappendr   ÚMPr   Úordr°   r¯   )r  rd   r•   Úoutr‘   Úvr»   ÚbyÚmÚorD   s              r0   Ú__repr__zKey.__repr__r  so  € ð �9Š9‰;Œ;˜$ÒÐØ—9’9‘;”;ˆDØ˜”=×'Ò'¨Ñ0Ô0ˆDà�}Š}‰Œð HØF°T¸"¸#¸#´YÐFÐFÐF��àG°d¸2¸3¸3´iÐGÐGÐG�å˜tŸzšz™|œ|Ñ,Ô,ð ,ð ,‘��1Ø˜’<�<ØÐ0¨$Ð0Ð0Ñ0�C�CàÐ+ Ð+Ð+¨Ð+Ð+Ñ+�C�Cà˜‘;Ðð õ( ! §¢¡¤Ñ-Ô-Ð-Ð-Ø—M’M‘O”OÐ4¨ÐE¸ÐEÐEØ—I’I‘K”K�K�Kð	ðˆEõ ˜tŸyšy™{œ{×0Ò0Ñ2Ô2Ñ3Ô3ð +ð +‘��1Ø—’˜\ Q˜\˜\˜\Ñ*Ô*Ð*ØŸ)š)™+œ+¨Ò2Ð2�Q�Q½¼	À!¹¼ÀQÀRÀRÔ8H�Øð +Ø˜3˜B˜3œ�AØ˜B˜C˜Cœ�BØ�AÝ& q™\œ\ð 1ð 1˜Ø¥3 q¡6¤6Ð 0Ð 0Ð 0Ð 0Ñ0˜˜Ý˜1‘v”v ’{�{Ø˜c˜r˜cœF˜Ø—L’L ¨¡Ñ*Ô*Ð*ð ð +øð ˜bœ	 C™ˆE�"‰IØ—9’9˜UÑ#Ô#Ð#r/   c                ó„   — t          | j        t          j        t          j        t          j        t          j	        f¦  «        S )zl
        Check if this instance is a public key.

        @return: C{True} if this is a public key.
        )
rG   r  r   ÚRSAPublicKeyr   ÚDSAPublicKeyr   r{   r   r  ©r  s    r0   r3  zKey.isPublicž  s8   € õ ØŒOåÔ ÝÔ ÝÔ)ÝÔ(ð	ñ
ô 
ð 	
r/   c                óz   — |                       ¦   «         r| S t          | j                             ¦   «         ¦  «        S )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.
        )r3  rP   r  rw   rC  s    r0   Úpublicz
Key.public®  s5   € ð �=Š=‰?Œ?ð 	5ØˆKå�t”×1Ò1Ñ3Ô3Ñ4Ô4Ð4r/   c                óÌ  — |t           j        u rMt          t          t	          |                      ¦   «         ¦  «                             ¦   «         ¦  «        ¦  «        S |t           j        u rjt          d                     d„ t          t          |                      ¦   «         ¦  «                             ¦   «         ¦  «        D ¦   «         ¦  «        ¦  «        S t          d|› �¦  «        ‚)aO  
        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}
        ó   :c                ó6   — g | ]}t          j        |¦  «        ‘ŒS r.   )ÚbinasciiÚhexlify)rC   r‹   s     r0   ú
<listcomp>z#Key.fingerprint.<locals>.<listcomp>Þ  s#   € ÐWÐWÐW¨Q•XÔ% aÑ(Ô(ÐWÐWÐWr/   z Unsupported fingerprint format: )r9   r;   r   r   r   r~   Údigestr:   r¯   r   r   r7   )r  Úformats     r0   ÚfingerprintzKey.fingerprint¼  sÅ   € ð: Õ'Ô5Ð5Ð5Ý¥	­&°·²±´Ñ*=Ô*=×*DÒ*DÑ*FÔ*FÑ GÔ GÑHÔHÐHØÕ)Ô1Ð1Ð1ÝØ—	’	ØWÐWµ)½CÀÇ	Â	ÁÄÑ<LÔ<L×<SÒ<SÑ<UÔ<UÑ2VÔ2VÐWÑWÔWñô ñô ð õ 'Ð'RÈ&Ð'RÐ'RÑSÔSÐSr/   ú&Literal['RSA', 'DSA', 'EC', 'Ed25519']c                ó˜  — t          | j        t          j        t          j        f¦  «        rdS t          | j        t
          j        t
          j        f¦  «        rdS t          | j        t          j	        t          j
        f¦  «        rdS t          | j        t          j        t          j        f¦  «        rdS t          d| j        ›�¦  «        ‚)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ÚDSAr&  r,  zunknown type of object: )rG   r  r   rA  ÚRSAPrivateKeyr   rB  ÚDSAPrivateKeyr   r{   ÚEllipticCurvePrivateKeyr   r  r  ÚRuntimeErrorrC  s    r0   rX   zKey.typeä  s¿   € õ �d”o­Ô(8½#Ô:KÐ'LÑMÔMð 	OØ�5Ý˜œ­#Ô*:½CÔ<MÐ)NÑOÔOð 	OØ�5ÝØŒO�bÔ7½Ô9SÐTñ
ô 
ð 		Oð �4ÝØŒO�gÔ6½Ô8QÐRñ
ô 
ð 	Oð �9åÐM¸$¼/ÐMÐMÑNÔNÐNr/   c                óÒ   — |                       ¦   «         dk    r2dt          | j        j        j                             d¦  «                 z   S ddddœ|                       ¦   «                  S )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}
        r&  rô   rŒ   rg   rh   rr   )rQ  rR  r,  )rX   r”   r  rŽ   r•   rK   rC  s    r0   ÚsshTypezKey.sshTypeû  sk   € ð �9Š9‰;Œ;˜$ÒÐà¥¨D¬OÔ,AÔ,F×,MÒ,MÈgÑ,VÔ,VÔ!WÑWðð
 "Ø!Ø)ðð ð �iŠi‰kŒkô	ð r/   c                ód   — |                       ¦   «         dk    rg d¢S |                      ¦   «         gS )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-256rg   )rX   rX  rC  s    r0   ÚsupportedSignatureAlgorithmsz Key.supportedSignatureAlgorithms  s4   € ð �9Š9‰;Œ;˜%ÒÐØAÐAÐAÐAà—L’L‘N”NÐ#Ð#r/   c                ó   — |                       ¦   «         dk    rs||                      ¦   «         k    rY|                      ¦   «         }|dk    rt          j        ¦   «         S |dk    rt          j        ¦   «         S t          j        ¦   «         S dS t          j        ¦   «         t          j        ¦   «         t          j        ¦   «         t          j        ¦   «         t          j        ¦   «         dœ                     |                       ¦   «         |f¦  «        S )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.
        r&  é   i€  N))rQ  rg   )rQ  r[  )rQ  rZ  )rR  rh   )r,  rr   )	rX   rX  r6  r   ÚSHA256ÚSHA384ÚSHA512ÚSHA1Úget)r  ÚsignatureTyperÃ   s      r0   Ú_getHashAlgorithmzKey._getHashAlgorithm  sÌ   € ð �9Š9‰;Œ;˜$ÒÐà §¢¡¤Ò.Ð.ØŸ)š)™+œ+�Ø˜c’>�>Ý!œ=™?œ?Ð*Ø ’^�^Ý!œ=™?œ?Ð*å!œ=™?œ?Ð*à�tõ &,¤[¡]¤]Ý*0¬-©/¬/Ý*0¬-©/¬/Ý%+¤[¡]¤]Ý-3¬]©_¬_ðð ÷ Šc�4—9’9‘;”; Ð.Ñ/Ô/ð0r/   c                ó²   — | j         €dS |                      ¦   «         dk    r| j         j        j        S |                      ¦   «         dk    rdS | j         j        S )zv
        Return the size of the object we wrap.

        @return: The size of the key.
        @rtype: L{int}
        Nr   r&  r,  r^  )r  rX   rŽ   Úkey_sizerC  s    r0   r6  zKey.size:  sU   € ð Œ?Ð"Ø�1Ø�YŠY‰[Œ[˜DÒ Ð Ø”?Ô(Ô1Ð1Ø�YŠY‰[Œ[˜IÒ%Ð%Ø�3ØŒÔ'Ð'r/   údict[str, Any]c           	     ó$  — t          | j        t          j        ¦  «        r(| j                             ¦   «         }|j        |j        dœS t          | j        t          j        ¦  «        rb| j                             ¦   «         }|j        j        |j        j        |j	        |j
        |j        t          j        |j        |j
        ¦  «        dœS t          | j        t          j        ¦  «        rC| j                             ¦   «         }|j        |j        j        |j        j
        |j        j        dœS t          | j        t          j        ¦  «        r]| j                             ¦   «         }|j        |j        j        |j        j        j        |j        j        j
        |j        j        j        dœS t          | j        t(          j        ¦  «        r;| j                             ¦   «         }|j        |j        |                      ¦   «         dœS t          | j        t(          j        ¦  «        rK| j                             ¦   «         }|j        j        |j        j        |j        |                      ¦   «         dœS t          | j        t2          j        ¦  «        r;d| j                             t8          j        j        t8          j        j        ¦  «        iS t          | j        t2          j         ¦  «        r—| j         !                    ¦   «                              t8          j        j        t8          j        j        ¦  «        | j         "                    t8          j        j        t8          j#        j        t9          j$        ¦   «         ¦  «        dœS tK          d	| j        › �¦  «        ‚)
z_
        Return the values of the public key as a dictionary.

        @rtype: L{dict}
        râ   rñ   rÞ   )r‹   ro   rm   rk   rl   r  )r‹   ro   r�   rŽ   rƒ   )rƒ   r‘   zUnexpected key type: )&rG   r  r   rA  r  r‚   r�   rS  Úprivate_numbersrˆ   rk   rl   r  r   rB  ro   rp   rm   rT  r‹   r   r{   rX  rU  r  r   r  Úpublic_bytesr   ÚEncodingÚRawÚPublicFormatr  rw   Úprivate_bytesÚPrivateFormatÚNoEncryptionrV  )r  Úrsa_pub_numbersÚrsa_priv_numbersÚdsa_pub_numbersÚdsa_priv_numbersÚec_pub_numbersÚec_priv_numberss          r0   rd   zKey.dataI  s:  € õ �d”o¥sÔ'7Ñ8Ô8ð D	JØ"œo×<Ò<Ñ>Ô>ˆOà$Ô&Ø$Ô&ðð ð õ ˜œ­Ô):Ñ;Ô;ð >	JØ#œ×>Ò>Ñ@Ô@Ðà%Ô4Ô6Ø%Ô4Ô6Ø%Ô'Ø%Ô'Ø%Ô'åÔ%Ð&6Ô&8Ð:JÔ:LÑMÔMðð ð õ ˜œ­Ô)9Ñ:Ô:ð 3	JØ"œo×<Ò<Ñ>Ô>ˆOà$Ô&Ø$Ô6Ô8Ø$Ô6Ô8Ø$Ô6Ô8ð	ð ð õ ˜œ­Ô):Ñ;Ô;ð +	JØ#œ×>Ò>Ñ@Ô@Ðà%Ô'Ø%Ô4Ô6Ø%Ô4ÔFÔHØ%Ô4ÔFÔHØ%Ô4ÔFÔHðð ð õ ˜œ­Ô)BÑCÔCð "	JØ!œ_×;Ò;Ñ=Ô=ˆNà#Ô%Ø#Ô%ØŸš™œðð ð õ
 ˜œ­Ô)CÑDÔDð 	JØ"œo×=Ò=Ñ?Ô?ˆOà$Ô3Ô5Ø$Ô3Ô5Ø /Ô =ØŸš™œð	ð ð õ ˜œ­Ô)AÑBÔBð 	Jà�T”_×1Ò1Ý!Ô*Ô.µÔ0JÔ0Nñô ðð õ
 ˜œ­Ô)BÑCÔCð 	Jà”_×/Ò/Ñ1Ô1×>Ò>Ý!Ô*Ô.µÔ0JÔ0Nñô ð ”_×2Ò2Ý!Ô*Ô.Ý!Ô/Ô3Ý!Ô.Ñ0Ô0ñô ð		ð 	ð 	õ ÐH°t´ÐHÐHÑIÔIÐIr/   c                óÚ  — |                       ¦   «         }|                      ¦   «         }|dk    rJt          j        d¦  «        t          j        |d         ¦  «        z   t          j        |d         ¦  «        z   S |dk    r€t          j        d¦  «        t          j        |d         ¦  «        z   t          j        |d         ¦  «        z   t          j        |d	         ¦  «        z   t          j        |d
         ¦  «        z   S |dk    r¡| j        j        j        dz   dz  }t          j        |d         ¦  «        t          j        |d         dd…         ¦  «        z   t          j        dt          j	        |d         |¦  «        z   t          j	        |d
         |¦  «        z   ¦  «        z   S |dk    r/t          j        d¦  «        t          j        |d         ¦  «        z   S t          d|› �¦  «        ‚)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  rg   r�   r‚   rR  rh   rk   rl   rm   ro   r&  é   r¨   rŽ   éøÿÿÿNó   r‹   r,  rr   rƒ   úunknown key type: )rX   rd   r   rå   r8  r  rŽ   rg  r
   r   r(   )r  rX   rd   Ú
byteLengths       r0   r~   zKey.blob•  s¿  € ð@ �yŠy‰{Œ{ˆØ�yŠy‰{Œ{ˆØ�5Š=ˆ=Ý”9˜ZÑ(Ô(­6¬9°T¸#´YÑ+?Ô+?Ñ?Å&Ä)ÈDÐQTÌIÑBVÔBVÑVÐVØ�UŠ]ˆ]å”	˜*Ñ%Ô%Ý”)˜D œIÑ&Ô&ñ'å”)˜D œIÑ&Ô&ñ'õ ”)˜D œIÑ&Ô&ñ'õ ”)˜D œIÑ&Ô&ñ	'ðð �TŠ\ˆ\Øœ/Ô/Ô8¸1Ñ<ÀÑBˆJå”	˜$˜wœ-Ñ(Ô(Ý”)˜D œM¨"¨#¨#Ô.Ñ/Ô/ñ0å”)ØÝÔ(¨¨c¬°JÑ?Ô?ñ@åÔ(¨¨c¬°JÑ?Ô?ñ@ñô ñðð �YÒÐÝ”9˜^Ñ,Ô,­v¬y¸¸c¼Ñ/CÔ/CÑCÐCåÐ9°4Ð9Ð9Ñ:Ô:Ð:r/   c                ó”  — |                       ¦   «         }|                      ¦   «         }|dk    rÑt          j        |d         |d         ¦  «        }t	          j        d¦  «        t	          j        |d         ¦  «        z   t	          j        |d         ¦  «        z   t	          j        |d         ¦  «        z   t	          j        |¦  «        z   t	          j        |d         ¦  «        z   t	          j        |d         ¦  «        z   S |dk    r›t	          j        d	¦  «        t	          j        |d         ¦  «        z   t	          j        |d         ¦  «        z   t	          j        |d
         ¦  «        z   t	          j        |d         ¦  «        z   t	          j        |d         ¦  «        z   S |dk    r¸| j                             ¦   «          	                    t          j        j        t          j        j        ¦  «        }t	          j        |d         ¦  «        t	          j        |d         dd…         ¦  «        z   t	          j        |¦  «        z   t	          j        |d         ¦  «        z   S |dk    rSt	          j        d¦  «        t	          j        |d         ¦  «        z   t	          j        |d         |d         z   ¦  «        z   S t          d|› �¦  «        ‚)a1  
        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  rk   rl   rg   r‚   r�   rˆ   rR  rh   rm   ro   r‹   r&  rŽ   rz  Nr�   r,  rr   rƒ   r‘   r|  )rX   rd   r   r  r   rå   r8  r  rw   rk  r   rl  ÚX962rn  ÚUncompressedPointr(   )r  rX   rd   r  ÚencPubs        r0   ÚprivateBlobzKey.privateBlobÑ  sz  € ðR �yŠy‰{Œ{ˆØ�yŠy‰{Œ{ˆØ�5Š=ˆ=ÝÔ# D¨¤I¨t°C¬yÑ9Ô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Ô1×>Ò>ÝÔ&Ô+ÝÔ*Ô<ñô ˆFõ
 ”	˜$˜wœ-Ñ(Ô(Ý”)˜D œM¨"¨#¨#Ô.Ñ/Ô/ñ0å”)˜FÑ#Ô#ñ$õ ”)˜D Ô0Ñ1Ô1ñ2ðð �YÒÐå”	˜.Ñ)Ô)Ý”)˜D œIÑ&Ô&ñ'å”)˜D œI¨¨S¬	Ñ1Ñ2Ô2ñ3ðõ Ð9°4Ð9Ð9Ñ:Ô:Ð:r/   ÚextraÚcommentrM   c                ór  — |�5t          j        dt          d¬¦  «         |                      ¦   «         r|}n|}t	          |t
          ¦  «        r|                     d¦  «        }t          |¦  «        }t          | d| 	                    ¦   «         › �d¦  «        }|€t          d|› �¦  «        ‚ ||||¬¦  «        S )	a  
        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¢   )Ú
stacklevelr\   Ú
_toString_r|  )Úsubtyper„  rM   )ÚwarningsÚwarnÚDeprecationWarningr3  rG   rH   rK   rN   r`   ra   r(   )r  rX   rƒ  rˆ  r„  rM   re   s          r0   ÚtoStringzKey.toString$  sÕ   € ðZ ÐåŒMðIõ #Øðñ ô ð ð �}Š}‰Œð #Ø��à"�
Ý�g�sÑ#Ô#ð 	.Ø—n’n WÑ-Ô-ˆGÝ)¨*Ñ5Ô5ˆ
Ý˜Ð:¨D¯JªJ©L¬LÐ:Ð:¸DÑAÔAˆØˆ>ÝÐ9°4Ð9Ð9Ñ:Ô:Ð:Øˆv˜g¨wÀ:ÐNÑNÔNÐNr/   c                ó²  — |                       ¦   «         dk    rU|sd}| j                             t          j        j        t          j        j        ¦  «        dz   |z                        ¦   «         S t          |  	                    ¦   «         ¦  «         
                    dd¦  «        }|sd}|                      ¦   «         dz   |z   dz   |z                        ¦   «         S )a  
        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.
        r&  r/   ó    ó   
)rX   r  rk  r   rl  ÚOpenSSHrn  r­   r   r~   ÚreplacerX  )r  r„  Úb64Datas      r0   Ú_toPublicOpenSSHzKey._toPublicOpenSSHf  sÐ   € ð �9Š9‰;Œ;˜$ÒÐØð Ø�à”×,Ò,Ý!Ô*Ô2µMÔ4NÔ4Vñô ð ñð ñ	÷
 Še‰gŒgðõ ˜dŸiši™kœkÑ*Ô*×2Ò2°5¸#Ñ>Ô>ˆØð 	ØˆGØ—’‘” Ñ%¨Ñ/°$Ñ6¸Ñ@×GÒGÑIÔIÐIr/   c           	     ó0  ‡— |r_t           j        }d}d}|j        dz  }d}|}t          j        |¦  «        }	d}
t          j        |	¦  «        t          j        d|
¦  «        z   }nd}d}d}d}t          j        d	¦  «        }||z   |  	                    ¦   «         z   t          j        |pd¦  «        z   }d
}t          |¦  «        |z  r-|dz  }|t          |dz  f¦  «        z  }t          |¦  «        |z  °-|r£t          j        ||	||z   d¦  «        }t           ||d|…         ¦  «        t          j        ||||z   …         ¦  «        t#          ¦   «         ¬¦  «                             ¦   «         }|                     |¦  «        |                     ¦   «         z   }n|}dt          j        |¦  «        z   t          j        |¦  «        z   t          j        |¦  «        z   t          j        dd¦  «        z   t          j        |                      ¦   «         ¦  «        z   t          j        |¦  «        z   }t-          |¦  «                             dd¦  «        Šdgˆfd„t1          d
t          ‰¦  «        d¦  «        D ¦   «         z   dgz   }d                     |¦  «        dz   S )aP  
        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¤   r/   ri   r   rq   éÿ   Nr«   r¡   r�  s#   -----BEGIN OPENSSH PRIVATE KEY-----c                ó*   •— g | ]}‰||d z   …         ‘ŒS )é@   r.   )rC   Úir’  s     €r0   rK  z,Key._toPrivateOpenSSH_v1.<locals>.<listcomp>¹  s&   ø€ ÐGÐGÐG qˆw�q˜1˜r™6�zÔ"ÐGÐGÐGr/   r˜  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„  rM   r½   Ú
cipherNameÚkdfNamerÂ   rÃ   rÄ   rÅ   rÆ   r¾   ÚcheckrÈ   ÚpadByteÚencKeyrž  rÀ   r~   r»   r’  s                       @r0   Ú_toPrivateOpenSSH_v1zKey._toPrivateOpenSSH_v1€  sÂ  ø€ ð ð 	õ  ”^ˆFØ&ˆJØˆGØÔ)¨QÑ.ˆIØˆGØˆFÝÔ)¨&Ñ1Ô1ˆDØˆFÝœ 4™œ­6¬;°t¸VÑ+DÔ+DÑDˆJˆJà ˆJØˆGØˆIØˆJÝÔ& qÑ)Ô)ˆØ˜e‘m d×&6Ò&6Ñ&8Ô&8Ñ8½6¼9ÀWÀ^ÐPSÑ;TÔ;TÑTˆØˆÝ�+ÑÔ Ñ*ð 	4Ø�q‰LˆGØ�5 '¨D¡.Ð!2Ñ3Ô3Ñ3ˆKõ �+ÑÔ Ñ*ð 	4ð ð 		)Ý”Z 
¨D°'¸FÑ2BÀCÑHÔHˆFÝØ��v˜h˜w˜hÔ'Ñ(Ô(Ý”	˜& ¨7°VÑ+;Ð!;Ô<Ñ=Ô=Ý'Ñ)Ô)ðñ ô ÷ Ši‰kŒkð	 ð
 '×-Ò-¨kÑ:Ô:¸Y×=OÒ=OÑ=QÔ=QÑQˆNˆNà(ˆNàÝŒi˜
Ñ#Ô#ñ$åŒi˜Ñ Ô ñ!õ Œi˜
Ñ#Ô#ñ$õ Œk˜$ Ñ"Ô"ñ	#õ
 Œi˜Ÿ	š	™œÑ$Ô$ñ%õ Œi˜Ñ'Ô'ñ(ð 	õ ˜dÑ#Ô#×+Ò+¨E°3Ñ7Ô7ˆà3Ð4ØGÐGÐGÐG­E°!µS¸±\´\À2Ñ,FÔ,FÐGÑGÔGñHà3Ð4ñ5ð 	ð
 �zŠz˜%Ñ Ô  5Ñ(Ð(r/   c                óL  — |st          j        ¦   «         }nt          j        |¦  «        }|                      ¦   «         dk    r:| j                             t           j        j        t           j        j	        |¦  «        S |                      ¦   «         dk    sJ ‚t          d¦  «        ‚)a,  
        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.
        r,  zBcannot serialize Ed25519 key to OpenSSH PEM format; use v1 instead)r   rq  ÚBestAvailableEncryptionrX   r  ro  rl  ÚPEMrp  ÚTraditionalOpenSSLrÑ   )r  rM   rž  s      r0   Ú_toPrivateOpenSSH_PEMzKey._toPrivateOpenSSH_PEM¾  sŸ   € ð ð 	Jå%Ô2Ñ4Ô4ˆIˆIå%Ô=¸jÑIÔIˆIØ�9Š9‰;Œ;˜)Ò#Ð#Ø”?×0Ò0ÝÔ&Ô*ÝÔ+Ô>Øñô ð ð —9’9‘;”; )Ò+Ð+Ð+Ð+ÝØWñô ð r/   c                ó$  — |                       ¦   «         r|                      |¬¦  «        S |dk    s|€/|                      ¦   «         dk    r|                      ||¬¦  «        S |�|dk    r|                      |¬¦  «        S t          d|› �¦  «        ‚)	ar  
        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„  Úv1Nr,  )r„  rM   r¨  rL   zunknown subtype )r3  r“  rX   r¥  rª  rÑ   )r  rˆ  r„  rM   s       r0   Ú_toString_OPENSSHzKey._toString_OPENSSHÚ  s    € ð& �=Š=‰?Œ?ð 	;Ø×(Ò(°Ð(Ñ9Ô9Ð9à˜Š_ˆ_  °T·Y²Y±[´[ÀIÒ5MÐ5MØ×,Ò,°WÈÐ,ÑTÔTÐTØˆ_ ¨5Ò 0Ð 0Ø×-Ò-¸Ð-ÑDÔDÐDåÐ9°Ð9Ð9Ñ:Ô:Ð:r/   c                ó~  — |                       ¦   «         }|                      ¦   «         }|                      ¦   «         �rK|dk    r_t          j        dddt          j        |d         ¦  «        dd…         gdt          j        |d	         ¦  «        dd…         gggg¦  «        }n½|d
k    r¥t          j        dddt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gggg¦  «        }nt          d|› �¦  «        ‚dt          |¦  «         	                    dd¦  «        z   dz   S |dk    �rO|d         |d         }}t          j        ||¦  «        }t          j        dddt          j        |d         ¦  «        dd…         gdt          j        |d	         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gdt          j        |¦  «        dd…         gdt          j        |¦  «        dd…         gdt          j        |d         |dz
  z  ¦  «        dd…         gdt          j        |d         |dz
  z  ¦  «        dd…         gd t          j        |¦  «        dd…         gg	gg¦  «        S |d
k    rÇt          j        dddt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gdt          j        |d         ¦  «        dd…         gd!t          j        |d"         ¦  «        dd…         gggg¦  «        S t          d|› d#�¦  «        ‚)$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‚   ri   Nrá   r�   rR  rÙ   rÜ   rk   rÝ   rl   rÛ   rm   rÚ   ro   rÏ   r÷   r�  r/   ó   }rë   rí   rî   rˆ   ó   arq   ó   bó   crì   r‹   ú')rd   rX   r3  r   rœ  r   r8  r(   r   r‘  r   r  )r  Úkwargsrd   rX   ÚkeyDatark   rl   r  s           r0   Ú_toString_LSHzKey._toString_LSH÷  sÎ  € ð �yŠy‰{Œ{ˆØ�yŠy‰{Œ{ˆØ�=Š=‰?Œ?ñ G	?Ø�uŠ}ˆ}Ýœ*ð *à 1Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @ððð	ñô ��ð ˜’�Ýœ*ð *à &Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @ðð	ðñô ��õ "Ð"<°dÐ"<Ð"<Ñ=Ô=Ð=Ø�+ gÑ.Ô.×6Ò6°u¸cÑBÔBÑBÀTÑIÐIà�uŠ}‰}Ø˜C”y $ s¤)�1�ÝÔ'¨¨1Ñ-Ô-�Ý”zð +à ,Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°¡|¤|°A°B°BÔ'7Ð 8Ø!%¥v¤y°¡|¤|°A°B°BÔ'7Ð 8Ø!%¥v¤y°°c´¸aÀ!¹eÑ1DÑ'EÔ'EÀaÀbÀbÔ'IÐ JØ!%¥v¤y°°c´¸aÀ!¹eÑ1DÑ'EÔ'EÀaÀbÀbÔ'IÐ JØ!%¥v¤y°¡¤°q°r°rÔ':Ð ;ð
ððñô ð ð$ ˜’�Ý”zð +à &Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @Ø!%¥v¤y°°c´Ñ';Ô';¸A¸B¸BÔ'?Ð @ðð
ðñô ð õ  "Ð"=°dÐ"=Ð"=Ð"=Ñ>Ô>Ð>r/   c                ó  — |                       ¦   «         }|                      ¦   «         sÖ|                      ¦   «         dk    r-|d         |d         |d         |d         |d         |d         f}n=|                      ¦   «         dk    r%|d         |d         |d	         |d
         |d         f}t          j        |                      ¦   «         ¦  «        d                     t          t          j        |¦  «        ¦  «        z   S dS )zŒ
        Return a private Secure Shell Agent v3 key.  See
        _fromString_AGENTV3 for the key format.

        @rtype: L{bytes}
        rQ  r�   rˆ   r‚   r—   rk   rl   rR  rm   ro   r‹   r/   N)	rd   r3  rX   r   rå   rX  r¯   Úmapr8  )r  r´  rd   Úvaluess       r0   Ú_toString_AGENTV3zKey._toString_AGENTV3I  sâ   € ð �yŠy‰{Œ{ˆØ�}Š}‰Œð 	PØ�yŠy‰{Œ{˜eÒ#Ð#à˜”IØ˜”IØ˜”IØ˜”IØ˜”IØ˜”Ið��ð —’‘” Ò%Ð%Ø˜sœ) T¨#¤Y°°S´	¸4À¼9ÀdÈ3ÄiÐP�Ý”9˜TŸ\š\™^œ^Ñ,Ô,¨s¯xªx½½F¼IÀvÑ8NÔ8NÑ/OÔ/OÑOÐOð	Pð 	Pr/   c                óô  — |                       ¦   «         }|€|                      ¦   «         }|                      |¦  «        }|€t          d|› d|› d�¦  «        ‚|dk    rC| j                             |t          j        ¦   «         |¦  «        }t          j	        |¦  «        }�nÂ|dk    rb| j                             ||¦  «        }t          |¦  «        \  }}t          j	        t          |d¦  «        t          |d¦  «        z   ¦  «        }�nZ|dk    �r!| j                             |t          j        |¦  «        ¦  «        }	t          |	¦  «        \  }}t          |¦  «        }
t          |¦  «        }t          |
d	         ¦  «        t          u rt          |
d	         ¦  «        }n|
d	         }|d
z  rd|
z   }
t          |d	         ¦  «        t          u rt          |d	         ¦  «        }n|d	         }|d
z  rd|z   }t          j	        t          j	        |
¦  «        t          j	        |¦  «        z   ¦  «        }n2|dk    r,t          j	        | j                             |¦  «        ¦  «        }t          j	        |¦  «        |z   S )a¥  
        Sign some data with this key.

        SECSH-TRANS RFC 4253 Section 6.6.

        @type data: L{bytes}
        @param data: The data to sign.

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

        @rtype: L{bytes}
        @return: A signature for the given data.
        Nzpublic key signature algorithm z is not defined for z keysrQ  rR  é   r&  r   é€   ó    r,  )rX   rX  re  r2   r  Úsignr   ÚPKCS1v15r   rå   r#   r   r   ÚECDSArH   r9  )r  rd   rd  r   ÚhashAlgorithmÚsigÚretÚrÚsÚ	signaturerR   ÚsbÚrcompÚscomps                 r0   r¿  zKey.sign_  sS  € ð  —)’)‘+”+ˆØÐ ð
 !ŸLšL™NœNˆMà×.Ò.¨}Ñ=Ô=ˆØÐ Ý,ð.°-ð .ð .Ø&ð.ð .ð .ñô ð ð
 �eÒÐØ”/×&Ò& t­WÔ-=Ñ-?Ô-?ÀÑOÔOˆCÝ”)˜C‘.”.ˆC‰Cà˜ÒÐØ”/×&Ò& t¨]Ñ;Ô;ˆCÝ)¨#Ñ.Ô.‰FˆQ�õ
 ”)�L¨¨BÑ/Ô/µ,¸qÀ"Ñ2EÔ2EÑEÑFÔFˆC‰Cà˜Š_‰_Øœ×,Ò,¨Tµ2´8¸MÑ3JÔ3JÑKÔKˆIÝ)¨)Ñ4Ô4‰FˆQ�å˜a‘”ˆBÝ˜a‘”ˆBõ �B�q”E‰{Œ{�cÐ!Ð!Ý˜B˜qœE™
œ
��à˜1œ�ð �t‰|ð "Ø˜r‘\�å�B�q”E‰{Œ{�cÐ!Ð!Ý˜B˜qœE™
œ
��à˜1œ�à�t‰|ð "Ø˜r‘\�å”)�FœI b™MœM­F¬I°b©M¬MÑ9Ñ:Ô:ˆCˆCà˜	Ò!Ð!Ý”)˜DœO×0Ò0°Ñ6Ô6Ñ7Ô7ˆCÝŒy˜Ñ'Ô'¨#Ñ-Ð-r/   c                ól  — t          |¦  «        dk    rdt          j        |¦  «        }}nt          j        |¦  «        \  }}|                      |¦  «        }|€dS |                      ¦   «         }|dk    r`| j        }|                      ¦   «         s|                     ¦   «         }t          j        |¦  «        d         |t          j
        ¦   «         |f}�nÃ|dk    r¦t          j        |¦  «        d         }t                               |dd…         d	¦  «        }	t                               |dd…         d	¦  «        }
t          |	|
¦  «        }| j        }|                      ¦   «         s|                     ¦   «         }|||f}�n|d
k    rÀt          j        |¦  «        d         }t          j        |d¦  «        \  }}}t                               |d	¦  «        }	t                               |d	¦  «        }
t          |	|
¦  «        }| j        }|                      ¦   «         s|                     ¦   «         }||t          j        |¦  «        f}nQ|dk    rK| j        }|                      ¦   «         s|                     ¦   «         }t          j        |¦  «        d         |f}	  |j        |Ž  dS # t"          $ r Y dS w xY w)a  
        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.
        é(   rh   NFrQ  r   rR  r¼  Úbigr&  r^   r,  T)r°   r   rå   rt   re  rX   r  r3  rw   r   rÀ  r´   Ú
from_bytesr$   r   rÁ  Úverifyr   )r  rÇ  rd   rd  rÂ  r   r‘   ÚargsÚconcatenatedSignaturerÅ  rÆ  ÚrstrÚsstrr€   s                 r0   rÏ  z
Key.verify«  s�  € õ ˆy‰>Œ>˜RÒÐà'1µ6´9¸YÑ3GÔ3G˜9ˆMˆMå'-¤|°IÑ'>Ô'>Ñ$ˆM˜9à×.Ò.¨}Ñ=Ô=ˆØÐ Ø�5à—)’)‘+”+ˆØ�eÒÐØ”ˆAØ—=’=‘?”?ð #Ø—L’L‘N”N�å”˜YÑ'Ô'¨Ô*ØÝÔ Ñ"Ô"Øð	ˆD‰Dð ˜ÒÐÝ$*¤L°Ñ$;Ô$;¸AÔ$>Ð!Ý—’Ð4°S°b°SÔ9¸5ÑAÔAˆAÝ—’Ð4°R°S°SÔ9¸5ÑAÔAˆAÝ,¨Q°Ñ2Ô2ˆIØ”ˆAØ—=’=‘?”?ð #Ø—L’L‘N”N�Ø˜t ]Ð3ˆD‰Dà˜Š_ˆ_Ý$*¤L°Ñ$;Ô$;¸AÔ$>Ð!Ý%œ|Ð,AÀ1ÑEÔEÑˆD�$˜Ý—’˜t UÑ+Ô+ˆAÝ—’˜t UÑ+Ô+ˆAÝ,¨Q°Ñ2Ô2ˆIà”ˆAØ—=’=‘?”?ð #Ø—L’L‘N”N�à˜t¥R¤X¨mÑ%<Ô%<Ð=ˆDˆDà˜	Ò!Ð!Ø”ˆAØ—=’=‘?”?ð #Ø—L’L‘N”N�Ý”L Ñ+Ô+¨AÔ.°Ð5ˆDð	ØˆAŒH�dˆOˆOð �4øõ  ð 	ð 	ð 	Ø�5�5ð	øøøs   Ê
J% Ê%
J3Ê2J3)NN)NNNN)N)r  r  r   r!  )r   rH   )r   rO  )r   rh  )NNN)0r*   r+   r,   r-   ÚclassmethodrZ   rT   r„   rš   rž   rË   rÔ   rÖ   ré   rï   rò   r_   r’   r“   r  r–   r}   r  r$  r?  r3  rE  r9   r:   rN  rX   rX  r\  re  r6  rd   r~   r‚  r"   rŒ  r“  r¥  rª  r­  r¶  rº  r¿  rÏ  r.   r/   r0   rP   rP   —   s   € € € € € ðð ð ð>ð >ð >ñ „[ð>ð( ð%,ð %,ð %,ñ „[ð%,ðN ð6?ð 6?ñ „[ð6?ðp ðH?ð H?ñ „[ðH?ðT ð*ð *ñ „[ð*ð( ðV=ð V=ñ „[ðV=ðp ð6:ð 6:ñ „[ð6:ðp ðAð Añ „[ðAð8 ðDð Dñ „[ðDð> ð#Dð #Dñ „[ð#DðJ ð.=ð .=ñ „[ð.=ð` ðð ñ „[ðð> ð*ð *ð *ñ „[ð*ðX ð ð  ð  ñ „[ð ðD ðð ð ñ „[ðð> ðð ð ñ „[ðð6 ðð ð ñ „[ðð,$ð $ð $ð"ð "ð "ð "ð*$ð *$ð *$ð *$ðX
ð 
ð 
ð 5ð 5ð 5ð "4Ô!;ð &Tð &Tð &Tð &TðPOð Oð Oð Oð.ð ð ð0
$ð 
$ð 
$ð0ð 0ð 0ð6(ð (ð (ðJJð JJð JJð JJðX:;ð :;ð :;ðxQ;ð Q;ð Q;ðf !Ð à�iÐ Ø�lÐ#ð	
ñô ð:Oð :Oð :Oñô ð:OðxJð Jð Jð Jð4<)ð <)ð <)ð <)ð|ð ð ð ð8;ð ;ð ;ð ;ð:P?ð P?ð P?ðdPð Pð Pð,J.ð J.ð J.ð J.ðXDð Dð Dð Dð Dr/   rP   é   c                ó^  — |                       ¦   «                              d¬¦  «         |                      ¦   «         st          j        d|t          ¦   «         ¬¦  «        }|                     t          j        j	        t          j
        j        t          j        ¦   «         ¬¦  «        }|                      |¦  «         |                      d¦  «        5 }t          j        |                     ¦   «         dt          ¦   «         ¬¦  «        }t#          |¦  «        cddd¦  «         S # 1 swxY w Y   dS )	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_exponentrg  r¬   )ÚencodingrM  Úencryption_algorithmrR   N)Úpasswordr¬   )ÚparentÚmakedirsÚexistsr   Úgenerate_private_keyr   ro  r   rl  r¨  rp  r©  rq  Ú
setContentrS   r   rU   rP   )ÚlocationrÃ   Ú
privateKeyÚpemÚkeyFiles        r0   Ú_getPersistentRSAKeyrå  ò  sY  € ð  ‡O‚OÑÔ×Ò°tÐÑ<Ô<Ð<ð �?Š?ÑÔð !ÝÔ-Ø!¨G½_Ñ=NÔ=Nð
ñ 
ô 
ˆ
ð ×&Ò&Ý"Ô+Ô/Ý Ô.ÔAÝ!.Ô!;Ñ!=Ô!=ð 'ñ 
ô 
ˆð 	×Ò˜CÑ Ô Ð ð 
�Š�tÑ	Ô	ð  Ý"Ô7Ø�LŠL‰NŒN Tµ?Ñ3DÔ3Dð
ñ 
ô 
ˆ
õ �:‰Œð	ð ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð s   ÃAD"Ä"D&Ä)D&)rÕ  )Or-   Ú
__future__r   rI  r±   rA   r‰  Úbase64r   r   r   Úhashlibr   r   Útypingr	   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.constantsr    r!   Útwisted.python.deprecater"   Ú/cryptography.hazmat.primitives.asymmetric.utilsr#   r$   ÚImportErrorr%   r&   Ú	SECP256R1Ú	SECP384R1Ú	SECP521R1rz   r”   r  r  Ú	Exceptionr(   r2   r5   r7   r9   r=   rN   rP   rå  r.   r/   r0   ú<module>rþ     s   ðð
ð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø Ð Ð Ð Ø €€€Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø Ð Ð Ð Ð Ð Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 8Ð 8Ð 8Ð 8Ð 8Ð 8Ø @Ð @Ð @Ð @Ð @Ð @Ð @Ð @Ø TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TÐ TØ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Lðð ð ð ð ð ð ð ð &Ð %Ð %Ð %Ð %Ð %à +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø 1Ð 1Ð 1Ð 1Ð 1Ð 1Ø $Ð $Ð $Ð $Ð $Ð $Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø @Ð @Ð @Ð @Ð @Ð @ð	ðð ð ð ð ð ð ð ð øð ð ð ð ðð ð ð ð ð ð ð ð ð ðøøøð )˜BœL™NœNØ(˜BœL™NœNØ(˜BœL™NœNðð €ð ØØðð €
ð Ô+Ð ØÔ-Ð ðð ð ð ð �)ñ ô ð ðð ð ð ð  ñ ô ð ðð ð ð ð ˜	ñ ô ð ðð ð ð ð ˜9ñ ô ð ð$ð $ð $ð $ð $˜ñ $ô $ð $ð"ð ð ð ð  9ñ ô ð ðð ð ð>Xð Xð Xð Xð Xñ Xô Xð Xðv2(ð (ð (ð (ð (ð (s   Â B) Â)B9Â8B9