
    tfw!              	       L   d Z ddlmZmZmZmZ ddlmZmZm	Z	 ddl
mZ  G d de          Z G d de          Z G d	 d
e          Z G d de          Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e	e           G d d                      Z e             e             e             e             e             e             e             e            dZd Zd Zd  Zd! Zd" Zd# Zd$S )%z
SSH key exchange handling.
    )sha1sha256sha384sha512)	Attribute	Interfaceimplementer)errorc                   >    e Zd ZdZ ed          Z ed          ZdS )_IKexAlgorithmzB
    An L{_IKexAlgorithm} describes a key exchange algorithm.
    zAn L{int} giving the preference of the algorithm when negotiating key exchange. Algorithms with lower precedence values are more preferred.zqA callable hash algorithm constructor (e.g. C{hashlib.sha256}) suitable for use with this key exchange algorithm.N)__name__
__module____qualname____doc__r   
preferencehashProcessor     U/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/ssh/_kex.pyr   r      sH          	 J I	= MMMr   r   c                   >    e Zd ZdZ ed          Z ed          ZdS )_IFixedGroupKexAlgorithmzu
    An L{_IFixedGroupKexAlgorithm} describes a key exchange algorithm with a
    fixed prime / generator group.
    zdAn L{int} giving the prime number used in Diffie-Hellman key exchange, or L{None} if not applicable.zAn L{int} giving the generator number used in Diffie-Hellman key exchange, or L{None} if not applicable. (This is not related to Python generator functions.)N)r   r   r   r   r   prime	generatorr   r   r   r   r   "   sH         
 I	2 E
 		' IIIr   r   c                       e Zd ZdZdS )#_IEllipticCurveExchangeKexAlgorithmz
    An L{_IEllipticCurveExchangeKexAlgorithm} describes a key exchange algorithm
    that uses an elliptic curve exchange between the client and server.
    Nr   r   r   r   r   r   r   r   r   4   s           r   r   c                       e Zd ZdZdS )_IGroupExchangeKexAlgorithmz
    An L{_IGroupExchangeKexAlgorithm} describes a key exchange algorithm
    that uses group exchange between the client and server.

    A prime / generator group should be chosen at run time based on the
    requested size. See RFC 4419.
    Nr   r   r   r   r   r   ;   s           r   r   c                       e Zd ZdZdZeZdS )_Curve25519SHA256z
    Elliptic Curve Key Exchange using Curve25519 and SHA256. Defined in
    U{https://datatracker.ietf.org/doc/draft-ietf-curdle-ssh-curves/}.
       Nr   r   r   r   r   r   r   r   r   r   r    r    E   $         
 JMMMr   r    c                       e Zd ZdZdZeZdS )_Curve25519SHA256LibSSHzN
    As L{_Curve25519SHA256}, but with a pre-standardized algorithm name.
       Nr"   r   r   r   r%   r%   P   s$          JMMMr   r%   c                       e Zd ZdZdZeZdS )_ECDH256aX  
    Elliptic Curve Key Exchange with SHA-256 as HASH. Defined in
    RFC 5656.

    Note that C{ecdh-sha2-nistp256} takes priority over nistp384 or nistp512.
    This is the same priority from OpenSSH.

    C{ecdh-sha2-nistp256} is considered preety good cryptography.
    If you need something better consider using C{curve25519-sha256}.
       Nr"   r   r   r   r(   r(   Z   s$        	 	 JMMMr   r(   c                       e Zd ZdZdZeZdS )_ECDH384zT
    Elliptic Curve Key Exchange with SHA-384 as HASH. Defined in
    RFC 5656.
       N)r   r   r   r   r   r   r   r   r   r   r+   r+   k   r#   r   r+   c                       e Zd ZdZdZeZdS )_ECDH512zT
    Elliptic Curve Key Exchange with SHA-512 as HASH. Defined in
    RFC 5656.
       N)r   r   r   r   r   r   r   r   r   r   r.   r.   v   r#   r   r.   c                       e Zd ZdZdZeZdS )_DHGroupExchangeSHA256zc
    Diffie-Hellman Group and Key Exchange with SHA-256 as HASH. Defined in
    RFC 4419, 4.2.
       Nr"   r   r   r   r1   r1      r#   r   r1   c                       e Zd ZdZdZeZdS )_DHGroupExchangeSHA1za
    Diffie-Hellman Group and Key Exchange with SHA-1 as HASH. Defined in
    RFC 4419, 4.1.
       N)r   r   r   r   r   r   r   r   r   r   r4   r4      s$         
 JMMMr   r4   c                   4    e Zd ZdZdZeZ ed          ZdZ	dS )_DHGroup14SHA1z
    Diffie-Hellman key exchange with SHA-1 as HASH and Oakley Group 14
    (2048-bit MODP Group). Defined in RFC 4253, 8.2.
       i  32317006071311007300338913926423828248817941241140239112842009751400741706634354222619689417363569347117901737909704191754605873209195028853758986185622153212175412514901774520270235796078236248884246189477587641105928646099411723245426622522193230540919037680524235519125679715870117001058055877651038861847280257976054903569732561526167081339361799541336476559160368317896729073178384589680639671900977202194168647225871031411336429319536193471636533209717077448227988588565369208645296636077250268955505928362751121174096972998068410554359584866583291642136218231078990999448652468262416972035911852507045361090559r&   N)
r   r   r   r   r   r   r   intr   r   r   r   r   r7   r7      sA         
 JMC
	 E IIIr   r7   )   curve25519-sha256s   curve25519-sha256@libssh.orgs$   diffie-hellman-group-exchange-sha256s"   diffie-hellman-group-exchange-sha1s   diffie-hellman-group14-sha1s   ecdh-sha2-nistp256s   ecdh-sha2-nistp384s   ecdh-sha2-nistp521c                 \    | t           vrt          j        d|            t           |          S )aY  
    Get a description of a named key exchange algorithm.

    @param kexAlgorithm: The key exchange algorithm name.
    @type kexAlgorithm: L{bytes}

    @return: A description of the key exchange algorithm named by
        C{kexAlgorithm}.
    @rtype: L{_IKexAlgorithm}

    @raises ConchError: if the key exchange algorithm is not found.
    z$Unsupported key exchange algorithm: )_kexAlgorithmsr
   
ConchErrorkexAlgorithms    r   getKexrA      s4     >))TlTTUUU,''r   c                 P    t                               t          |                     S )a  
    Returns C{True} if C{kexAlgorithm} is an elliptic curve.

    @param kexAlgorithm: The key exchange algorithm name.
    @type kexAlgorithm: C{str}

    @return: C{True} if C{kexAlgorithm} is an elliptic curve,
        otherwise C{False}.
    @rtype: C{bool}
    )r   
providedByrA   r?   s    r   isEllipticCurverD      s      /99&:N:NOOOr   c                 P    t                               t          |                     S )a+  
    Returns C{True} if C{kexAlgorithm} has a fixed prime / generator group.

    @param kexAlgorithm: The key exchange algorithm name.
    @type kexAlgorithm: L{bytes}

    @return: C{True} if C{kexAlgorithm} has a fixed prime / generator group,
        otherwise C{False}.
    @rtype: L{bool}
    )r   rC   rA   r?   s    r   isFixedGrouprF      s      $..vl/C/CDDDr   c                 .    t          |           }|j        S )a  
    Get the hash algorithm callable to use in key exchange.

    @param kexAlgorithm: The key exchange algorithm name.
    @type kexAlgorithm: L{bytes}

    @return: A callable hash algorithm constructor (e.g. C{hashlib.sha256}).
    @rtype: C{callable}
    )rA   r   r@   kexs     r   getHashProcessorrJ      s     

Cr   c                 <    t          |           }|j        |j        fS )z
    Get the generator and the prime to use in key exchange.

    @param kexAlgorithm: The key exchange algorithm name.
    @type kexAlgorithm: L{bytes}

    @return: A L{tuple} containing L{int} generator and L{int} prime.
    @rtype: L{tuple}
    )rA   r   r   rH   s     r   getDHGeneratorAndPrimerL      s      

C=#)##r   c                     ddl m}  ddlm} ddlm}  |             }t                                          t                    D ]}|	                    d          rE|
                    dd          }|                    |                                ||                   }n,|	                    d          r|                                }nd}|s                    |           t          fd	
          S )z
    Get a list of supported key exchange algorithm names in order of
    preference.

    @return: A C{list} of supported key exchange algorithm names.
    @rtype: C{list} of L{bytes}
    r   )default_backend)ec)_curveTables   ecdhs   ecdsar;   Tc                     |          j         S )N)r   )r@   kexAlgorithmss    r   <lambda>z*getSupportedKeyExchanges.<locals>.<lambda>$  s    l0K0V r   )key)cryptography.hazmat.backendsrN   )cryptography.hazmat.primitives.asymmetricrO   twisted.conch.ssh.keysrP   r=   copylist
startswithreplace+elliptic_curve_exchange_algorithm_supportedECDHx25519_supportedpopsorted)rN   rO   rP   backendkeyAlgorithmkeyAlgorithmDsa	supportedrR   s          @r   getSupportedKeyExchangesre     s8    =<<<<<<<<<<<222222oG"''))M]++ , ,""7++ 	*227HEEOKK		;7 II $$%9:: 	0022III 	,l+++VVVV   r   N)r   hashlibr   r   r   r   zope.interfacer   r   r	   twisted.conchr
   r   r   r   r   r    r%   r(   r+   r.   r1   r4   r7   r=   rA   rD   rF   rJ   rL   re   r   r   r   <module>ri      s  
 
 1 0 0 0 0 0 0 0 0 0 0 0 < < < < < < < < < <          Y   "    ~   $    .       .    011       21 011       21 011       21  011       21 011       21 ())       *) ())       *) %&&       '&6 ,+--%<%<%>%>-C-C-E-E+?+?+A+A$2N$4$4#8::#8::#8::	 	( ( ($P P PE E E  $ $ $    r   