
    Ϫfw!              	       r   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y$)%z
SSH key exchange handling.
    )sha1sha256sha384sha512)	Attribute	Interfaceimplementer)errorc                   0    e Zd ZdZ ed      Z ed      Zy)_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     8/usr/lib/python3/dist-packages/twisted/conch/ssh/_kex.pyr   r      s)     	J 	=Mr   r   c                   0    e Zd ZdZ ed      Z ed      Zy)_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   "   s)    
 	2E
 	'Ir   r   c                       e Zd ZdZy)#_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y)_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y)_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Mr   r    c                       e Zd ZdZdZeZy)_Curve25519SHA256LibSSHzN
    As L{_Curve25519SHA256}, but with a pre-standardized algorithm name.
       Nr"   r   r   r   r%   r%   P   s     JMr   r%   c                       e Zd ZdZdZeZy)_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Mr   r(   c                       e Zd ZdZdZeZy)_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y)_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y)_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y)_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Mr   r4   c                   ,    e Zd ZdZdZeZ ed      ZdZ	y)_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      s)    
 JM
	E Ir   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    | 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      s0     >)!El^TUU,''r   c                 >    t         j                  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OOr   c                 >    t         j                  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DDr   c                 0    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                 H    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        j                         t              D ]  }|j                  d      r6|j                  dd      }|j                  |j                         ||         }n$|j                  d      r|j                         }nd}|rqj                  |        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    l0K0V0V 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     s     =<2G"'')M]+ ,""7+*227HEOKK	;7I $$%9:002IIl+, 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 < < Y "~ $. .  01  2 01  2 01  2  01  2 01  2 ()  * ()  * %&  '6 ,-%<%>-C-E+?+A$2$4#:#:#:	($PE$r   