U
    2ÜŸjz ã                   @   sì   d Z ddl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
 ddlmZ ddlmZ ed	ƒZedkrpd
Zer¸ddlmZ ddlmZ ddlmZ ddlmZmZmZ eƒ  ¡ ZndZdd„ ZG dd„ dejƒZG dd„ dejƒZ dS )z&
Tests for L{twisted.conch.ssh.keys}.
é    N)Údedent)Úkeydata)Ú	randbytes)ÚFilePath)ÚrequireModule)ÚunittestÚcryptographyz Cannot run without cryptography.)Údefault_backend)Úhashes)Úpadding)ÚcommonÚkeysÚsexpyFc                 C   s   t s
d| _| S )Nz$ed25519 not supported on this system)ÚED25519_SUPPORTEDÚskip)Úf© r   ú@/tmp/pip-unpacked-wheel-4b529toj/twisted/conch/test/test_keys.pyÚskipWithoutEd25519$   s    r   c                   @   sü  e Zd ZedkreZdd„ Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Z d8d9„ Z!d:d;„ Z"d<d=„ Z#d>d?„ Z$d@dA„ Z%dBdC„ Z&dDdE„ Z'dFdG„ Z(dHdI„ Z)dJdK„ Z*dLdM„ Z+dNdO„ Z,dPdQ„ Z-dRdS„ Z.e/dTdU„ ƒZ0dVdW„ Z1dXdY„ Z2dZd[„ Z3d\d]„ Z4d^d_„ Z5e/d`da„ ƒZ6dbdc„ Z7ddde„ Z8dfdg„ Z9e/dhdi„ ƒZ:djdk„ Z;dldm„ Z<dndo„ Z=dpdq„ Z>e/drds„ ƒZ?dtdu„ Z@dvdw„ ZAdxdy„ ZBdzd{„ ZCd|d}„ ZDd~d„ ZEd€d�„ ZFe/d‚dƒ„ ƒZGe/d„d…„ ƒZHd†d‡„ ZIdˆd‰„ ZJdŠd‹„ ZKdŒd�„ ZLdŽd�„ ZMd�d‘„ ZNd’d“„ ZOd”d•„ ZPd–d—„ ZQd˜d™„ ZRdšd›„ ZSe/dœd�„ ƒZTdždŸ„ ZUd d¡„ ZVd¢d£„ ZWd¤d¥„ ZXd¦d§„ ZYd¨d©„ ZZdªd«„ Z[d¬d­„ Z\e/d®d¯„ ƒZ]e/d°d±„ ƒZ^dS )²ÚKeyTestsNc              	   C   s~  t jjtjd tjd tjd tjd tjd tjd d�j| _t jjtjd tjd tjd tjd	 tjd
 d�j| _	t jj
tjd
 tjd tjd tjd d�j| _t jj
tjd
 tjd tjd tjd d�j| _t jj
tjd
 tjd tjd tjd d�j| _t�r.t jjtjd tjd d�j| _d| _d| _|  tddd„ ¡ |  ¡ | _t| jdƒ�}| tj¡ W 5 Q R X d S )NÚnÚeÚdÚpÚqÚu)r   r   r   r   r   r   ÚyÚgÚx)r   r   r   r   r   ÚprivateValueÚcurve)r   r   r   r    ÚaÚk)r!   r"   s     ssh-rsa   ~Y£×ýWÆpu@Ø1¡SóOÚEô/xñšáG3ÙÖUŒÙ‹�ŠÁ‘ØdÉç²É,'=QgçxµjÛIÀÞ¯b×@ÊrÎ£zM1q5Þú{wjKNˆËCå‰Ãùi–‘ÛÊ}ÛRTùDJHÏló[‚¢�“ýŽÎ|û^nÔíâÑŠ·aY›B�¤Ç¾7µ9j¤.‡÷ðÚ×Òù9pý?òN›Ï/)
>AÂµjùUWÔ®‡Bæ™t¢y�˜¢ªfË†åkãÎàuë“NˆÉ“YÃ.V±L44`CÇ¦6¯úY’ú¤%Õ 4^¹rYº ù.‰%H¾ƒA–s7      ssh-dss   (?Çë†;ÕTFA´ßÄE@4,d¼	Ù®Ý[í-‚nQŒf›èájrg„p<ZsecureRandomc                 S   s   d|  S )Nó   ÿr   )r   r   r   r   Ú<lambda>h   ó    z KeyTests.setUp.<locals>.<lambda>Úwb)r   ÚKeyÚ_fromRSAComponentsr   ÚRSADataÚ
_keyObjectÚrsaObjZ_fromDSAComponentsÚDSADataÚdsaObjZ_fromECComponentsÚECDatanistp256ÚecObjZECDatanistp384ÚecObj384ZECDatanistp521ÚecObj521r   Z_fromEd25519ComponentsÚEd25519DataÚ
ed25519ObjÚrsaSignatureÚdsaSignatureÚpatchr   ÚmktempÚkeyFileÚopenÚwriteÚprivateRSA_lsh)Úselfr   r   r   r   ÚsetUp.   s\    ú
û
ü
ü
ü
 ÿ
ÿÿ
zKeyTests.setUpc                 C   s   t  | j¡ d S ©N)ÚosÚunlinkr8   ©r<   r   r   r   ÚtearDownm   s    zKeyTests.tearDownc                 C   s˜   |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ t	r”|   t | j
¡ ¡ d¡ dS )zU
        The L{keys.Key.size} method returns the size of key object in bits.
        é   é   é   i€  i	  N)ÚassertEqualr   r'   r+   Úsizer-   r/   r0   r1   r   r3   rA   r   r   r   Ú	test_sizep   s    zKeyTests.test_sizec                 C   sâ  |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj	¡d¡ |   tj tj
¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj tj¡d¡ |   tj d¡d¡ |   tj d¡d¡ |   tj d	¡d
¡ d
S )z_
        Test that the _guessStringType method guesses string types
        correctly.
        Zpublic_opensshZprivate_opensshZ
public_lshZprivate_lshÚagentv3s      ssh-rsa   Úblobs      ssh-dss   s	   not a keyN)rF   r   r'   Z_guessStringTyper   ÚpublicRSA_opensshÚpublicDSA_opensshÚpublicECDSA_opensshÚpublicSKECDSA_opensshÚpublicEd25519_opensshÚpublicSKEd25519_opensshÚprivateRSA_opensshÚprivateRSA_openssh_newÚprivateDSA_opensshÚprivateDSA_openssh_newÚprivateECDSA_opensshÚprivateECDSA_openssh_newÚprivateEd25519_openssh_newÚpublicRSA_lshÚpublicDSA_lshr;   ÚprivateDSA_lshÚprivateRSA_agentv3ÚprivateDSA_agentv3rA   r   r   r   Útest__guessStringType|   sž     ÿ ÿ ÿ ÿþþ ÿ ÿ ÿ ÿ ÿþþ ÿ ÿ ÿ ÿ
þ
þzKeyTests.test__guessStringTypec                 C   s0   |   tjtjjtj¡ |   tjtjjtj¡ dS )z=
        OpenSSH certificates are not yet supported.
        N)ÚassertRaisesr   ÚBadKeyErrorr'   Ú
fromStringr   ZpublicSKEd25519_cert_opensshZpublicSKECDSA_cert_opensshrA   r   r   r   Útest_OpenSSH_cert_not_supportedÄ   s    ýýz(KeyTests.test_OpenSSH_cert_not_supportedc           	      C   sÈ   t j tj¡}t j tj¡}|  | ¡ | ¡ ¡ t j tj¡}t j tj	¡}|  | ¡ | ¡ ¡ t j tj
¡}t j tj¡}|  | ¡ | ¡ ¡ trÄt j tj¡}t j tj¡}|  | ¡ | ¡ ¡ dS )zn
        The L{keys.Key.public} method returns a public key for both
        public and private keys.
        N)r   r'   r`   r   rQ   rK   rF   ÚpublicrS   rL   rU   rM   r   rW   rO   )	r<   ZprivateRSAKeyZpublicRSAKeyZprivateDSAKeyZpublicDSAKeyZprivateECDSAKeyZpublicECDSAKeyZprivateEd25519KeyZpublicEd25519Keyr   r   r   Útest_publicÓ   s    zKeyTests.test_publicc                 C   sÀ   t j tj¡}t j tj¡}t j tj¡}|  | ¡  	¡ ¡ |  
| 	¡ ¡ |  | ¡  	¡ ¡ |  
| 	¡ ¡ |  | ¡  	¡ ¡ |  
| 	¡ ¡ tr¼t j tj¡}|  | ¡  	¡ ¡ |  
| 	¡ ¡ dS )zg
        The L{keys.Key.isPublic} method returns True for public keys
        otherwise False.
        N)r   r'   r`   r   rQ   rS   rU   Ú
assertTruerb   ÚisPublicÚassertFalser   rW   )r<   ÚrsaKeyÚdsaKeyZecdsaKeyÚ
ed25519Keyr   r   r   Útest_isPublicë   s    zKeyTests.test_isPublicc                 C   s    |   |||¡ |  |||¡ d S r>   )Ú_testPublicFromStringÚ_testPrivateFromString)r<   rb   ÚprivateÚtypeÚdatar   r   r   Ú_testPublicPrivateFromStringÿ   s    z%KeyTests._testPublicPrivateFromStringc                 C   s   |   |||¡ |  |¡ d S r>   )rk   Ú_testSKFromString)r<   rb   rn   ro   r   r   r   Ú_testPublicSKFromString  s    z KeyTests._testPublicSKFromStringc                 C   sT   t j |¡}|  | ¡ ¡ |  | ¡ |¡ | ¡  ¡ D ]\}}|  || |¡ q6d S r>   )	r   r'   r`   rd   re   rF   rn   ro   Úitems)r<   rb   rn   ro   Ú	publicKeyr"   Úvr   r   r   rk     s
    zKeyTests._testPublicFromStringc                 C   sT   t j |¡}|  | ¡ ¡ |  | ¡ |¡ | ¡ D ]\}}|  | ¡ | |¡ q2d S r>   )	r   r'   r`   rf   re   rF   rn   rs   ro   )r<   rm   rn   ro   Z
privateKeyr"   ru   r   r   r   rl     s
    zKeyTests._testPrivateFromStringc                 C   s   t j |¡}|  |j¡ d S r>   )r   r'   r`   rd   Ú_sk)r<   rb   rt   r   r   r   rq     s    zKeyTests._testSKFromStringc                 C   s¨   |   tjtjdtj¡ |   tjtjdtj¡ |  t	j
jtjdd�t	j
 tj¡¡ |   tjtjdtj¡ |  tjdtj¡ tr¤|  tjdtj¡ |   tjtjdtj¡ dS )zN
        Test that keys are correctly generated from OpenSSH strings.
        ÚECÚRSAó	   encrypted©Ú
passphraseÚDSAÚEd25519N)rp   r   rM   rU   r.   rK   rQ   r)   rF   r   r'   r`   ÚprivateRSA_openssh_encryptedrL   rS   r,   rr   rN   ÚSKECDatanistp256r   rP   ÚSKEd25519DatarO   rW   r2   rA   r   r   r   Útest_fromOpenSSH  sT    üü ÿüüýýüzKeyTests.test_fromOpenSSHc                 C   s   d}|   tjtjj|d¡ dS )z.
        Tests for invalid key types.
        s   -----BEGIN FOO PRIVATE KEY-----
MIGkAgEBBDAtAi7I8j73WCX20qUM5hhHwHuFzYWYYILs2Sh8UZ+awNkARZ/Fu2LU
LLl5RtOQpbWgBwYFK4EEACKhZANiAATU17sA9P5FRwSknKcFsjjsk0+E3CeXPYX0
Tk/M0HK3PpWQWgrO8JdRHP9eFE9O/23P8BumwFt7F/AvPlCzVd35VfraFT0o4cCW
G0RqpQ+np31aKmeJshkcYALEchnU+tQ=
-----END EC PRIVATE KEY-----N)r^   r   r_   r'   Z_fromString_PRIVATE_OPENSSH©r<   ZbadKeyr   r   r   Útest_fromOpenSSHErrorsJ  s       ÿzKeyTests.test_fromOpenSSHErrorsc                 C   s(   d}|   tj |¡tj |d ¡¡ dS )zP
        If key strings have trailing whitespace, it should be ignored.
        ó›  -----BEGIN DSA PRIVATE KEY-----
MIIBuwIBAAKBgQDylESNuc61jq2yatCzZbenlr9llG+p9LhIpOLUbXhhHcwC6hrh
EZIdCKqTO0USLrGoP5uS9UHAUoeN62Z0KXXWTwOWGEQn/syyPzNJtnBorHpNUT9D
Qzwl1yUa53NNgEctpo4NoEFOx8PuU6iFLyvgHCjNn2MsuGuzkZm7sI9ZpQIVAJiR
9dPc08KLdpJyRxz8T74b4FQRAoGAGBc4Z5Y6R/HZi7AYM/iNOM8su6hrk8ypkBwR
a3Dbhzk97fuV3SF1SDrcQu4zF7c4CtH609N5nfZs2SUjLLGPWln83Ysb8qhh55Em
AcHXuROrHS/sDsnqu8FQp86MaudrqMExCOYyVPE7jaBWW+/JWFbKCxmgOCSdViUJ
esJpBFsCgYEA7+jtVvSt9yrwsS/YU1QGP5wRAiDYB+T5cK4HytzAqJKRdC5qS4zf
C7R0eKcDHHLMYO39aPnCwXjscisnInEhYGNblTDyPyiyNxAOXuC8x7luTmwzMbNJ
/ow0IqSj0VF72VJN9uSoPpFd4lLT0zN8v42RWja0M8ohWNf+YNJluPgCFE0PT4Vm
SUrCyZXsNh6VXwjs3gKQ
-----END DSA PRIVATE KEY-----ó   
N)rF   r   r'   r`   ©r<   ZprivateDSADatar   r   r   Ú test_fromOpenSSH_with_whitespaceX  s
    
þz)KeyTests.test_fromOpenSSH_with_whitespacec                 C   sH   t jjtjdd�}|  | ¡ d¡ t jjtjd dd�}|  ||¡ dS )zž
        Newer versions of OpenSSH generate encrypted keys which have a longer
        IV than the older versions.  These newer keys are also loaded.
        s   testxprz   rx   r…   N)r   r'   r`   r   Z privateRSA_openssh_encrypted_aesrF   rn   )r<   ÚkeyÚkey2r   r   r   Útest_fromNewerOpenSSHo  s     ÿ ÿzKeyTests.test_fromNewerOpenSSHc                 C   sˆ   t jt jft jt jft jt jft jt jft j	t j
ffD ]$\}}|  tj |¡tj |¡¡ q6|  tjjt jdd�tjjt jdd�¡ dS )zý
        OpenSSH 6.5 introduced a newer "openssh-key-v1" private key format
        (made the default in OpenSSH 7.8).  Loading keys in this format
        produces identical results to loading the same keys in the old
        PEM-based format.
        ry   rz   N)r   rQ   rR   rS   rT   rU   rV   ÚprivateECDSA_openssh384ZprivateECDSA_openssh384_newÚprivateECDSA_openssh521ZprivateECDSA_openssh521_newrF   r   r'   r`   Z privateRSA_openssh_encrypted_newr~   )r<   ÚoldÚnewr   r   r   Útest_fromOpenSSH_v1_format}  s"    




û ÿ ÿüz#KeyTests.test_fromOpenSSH_v1_formatc              	   C   s,   d}|   tj |¡tj | dd¡¡¡ dS )zp
        Test that keys are correctly generated from OpenSSH strings with
        Windows line endings.
        r„   r…   s   
N)rF   r   r'   r`   Úreplacer†   r   r   r   Ú%test_fromOpenSSH_windows_line_endings•  s
    
þz.KeyTests.test_fromOpenSSH_windows_line_endingsc                 C   s@   t  ddddgggg¡}| jtjtjjdt |¡ d d� dS )	za
        C{BadKeyError} exception is raised when public key has an unknown
        type.
        s
   public-keyó   bad-keyó   pó   2ó   {ó   })ro   N)	r   Úpackr^   r   r_   r'   r`   Úbase64Ú	b64encode©r<   Zsexpr   r   r   Ú!test_fromLSHPublicUnsupportedType«  s    ýz*KeyTests.test_fromLSHPublicUnsupportedTypec                 C   s0   t  ddddgggg¡}|  tjtjj|¡ dS )zb
        C{BadKeyError} exception is raised when private key has an unknown
        type.
        s   private-keyr’   r“   r”   N)r   r—   r^   r   r_   r'   r`   rš   r   r   r   Ú"test_fromLSHPrivateUnsupportedType¸  s    ýz+KeyTests.test_fromLSHPrivateUnsupportedTypec                 C   s   |   tjtjdtj¡ dS )zR
        RSA public and private keys can be generated from a LSH strings.
        rx   N)rp   r   rX   r;   r)   rA   r   r   r   Útest_fromLSHRSAÅ  s    üzKeyTests.test_fromLSHRSAc                 C   s   |   tjtjdtj¡ dS )zH
        DSA public and private key can be generated from LSHs.
        r|   N)rp   r   rY   rZ   r,   rA   r   r   r   Útest_fromLSHDSAÐ  s    üzKeyTests.test_fromLSHDSAc                 C   s<   |   tjdtj¡ |   tjdtj¡ |  tjtj	j
d¡ dS )zO
        Test that keys are correctly generated from Agent v3 strings.
        rx   r|   s$      ssh-foo               N)rl   r   r[   r)   r\   r,   r^   r   r_   r'   r`   rA   r   r   r   Útest_fromAgentv3Û  s    ýzKeyTests.test_fromAgentv3c                 C   sR   t  | j¡}|jdd ¡ d�}|  t jj|dd�|¡ | jt jt jj|dd� dS )zf
        L{keys.Key.fromString} applies Normalization Form KC to Unicode
        passphrases.
        Úopensshõ   verschlÃ¼sseltrz   õ   verschluÌˆsseltõ   unassigned ï¿¿N)	r   r'   r+   ÚtoStringÚencoderF   r`   r^   ÚPassphraseNormalizationError©r<   rˆ   Zkey_datar   r   r   Ú*test_fromStringNormalizesUnicodePassphraseç  s     ÿüz3KeyTests.test_fromStringNormalizesUnicodePassphrasec                 C   sâ   |   tjtjjd¡ |   tjtjjdd¡ | j tjtjjtjdd� |   tjtjjt | j¡j	ddd�¡ |   tjtjjd¡ | j tjtjjdd	d� | j tjtjjd
d	d� | j tjtjjdd	d� | j tjtjjdd	d� dS )zW
        keys.Key.fromString should raise BadKeyError when the key is invalid.
        r%   Úbad_types   unencryptedrz   r    ry   s   -----BEGIN RSA KEY-----
wA==
sÅ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: weird type

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----Ú	encryptedsÏ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: FOO-123-BAR,01234567

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----sÌ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,01234

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----sÍ  -----BEGIN ENCRYPTED RSA KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,01234

4Ed/a9OgJWHJsne7yOGWeWMzHYKsxuP9w1v0aYcp+puS75wvhHLiUnNwxz0KDi6n
T3YkKLBsoCWS68ApR2J9yeQ6R+EyS+UQDrO9nwqo3DB5BT3Ggt8S1wE7vjNLQD0H
g/SJnlqwsECNhh8aAx+Ag0m3ZKOZiRD5mCkcDQsZET7URSmFytDKOjhFn3u6ZFVB
sXrfpYc6TJtOQlHd/52JB6aAbjt6afSv955Z7enIi+5yEJ5y7oYQTaE5zrFMP7N5
9LbfJFlKXxEddy/DErRLxEjmC+t4svHesoJKc2jjjyNPiOoGGF3kJXea62vsjdNV
gMK5Eged3TBVIk2dv8rtJUvyFeCUtjQ1UJZIebScRR47KrbsIpCmU8I4/uHWm5hW
0mOwvdx1L/mqx/BHqVU9Dw2COhOdLbFxlFI92chkovkmNk4P48ziyVnpm7ME22sE
vfCMsyirdqB1mrL4CSM7FXONv+CgfBfeYVkYW8RfJac9U1L/O+JNn7yee414O/rS
hRYw4UdWnH6Gg6niklVKWNY0ZwUZC8zgm2iqy8YCYuneS37jC+OEKP+/s6HSKuqk
2bzcl3/TcZXNSM815hnFRpz0anuyAsvwPNRyvxG2/DacJHL1f6luV4B0o6W410yf
qXQx01DLo7nuyhJqoH3UGCyyXB+/QUs0mbG2PAEn3f5dVs31JMdbt+PrxURXXjKk
4cexpUcIpqqlfpIRe3RD0sDVbH4OXsGhi2kiTfPZu7mgyFxKopRbn1KwU1qKinfY
EU9O4PoTak/tPT+5jFNhaP+HrURoi/pU8EAUNSktl7xAkHYwkN/9Cm7DeBghgf3n
8+tyCGYDsB5utPD0/Xe9yx0Qhc/kMm4xIyQDyA937dk3mUvLC9vulnAP8I+Izim0
fZ182+D1bWwykoD0997mUHG/AUChWR01V1OLwRyPv2wUtiS8VNG76Y2aqKlgqP1P
V+IvIEqR4ERvSBVFzXNF8Y6j/sVxo8+aZw+d0L1Ns/R55deErGg3B8i/2EqGd3r+
0jps9BqFHHWW87n3VyEB3jWCMj8Vi2EJIfa/7pSaViFIQn8LiBLf+zxG5LTOToK5
xkN42fReDcqi3UNfKNGnv4dsplyTR2hyx65lsj4bRKDGLKOuB1y7iB0AGb0LtcAI
dcsVlcCeUquDXtqKvRnwfIMg+ZunyjqHBhj3qgRgbXbT6zjaSdNnih569aTg0Vup
VykzZ7+n/KVcGLmvX0NesdoI7TKbq4TnEIOynuG5Sf+2GpARO5bjcWKSZeN/Ybgk
gccf8Cqf6XWqiwlWd0B7BR3SymeHIaSymC45wmbgdstrbk7Ppa2Tp9AZku8M2Y7c
8mY9b+onK075/ypiwBm4L4GRNTFLnoNQJXx0OSl4FNRWsn6ztbD+jZhu8Seu10Jw
SEJVJ+gmTKdRLYORJKyqhDet6g7kAxs4EoJ25WsOnX5nNr00rit+NkMPA7xbJT+7
CfI51GQLw7pUPeO2WNt6yZO/YkzZrqvTj5FEwybkUyBv7L0gkqu9wjfDdUw0fVHE
xEm4DxjEoaIp8dW/JOzXQ2EF+WaSOgdYsw3Ac+rnnjnNptCdOEDGP6QBkt+oXj4P
-----END RSA PRIVATE KEY-----N)
r^   r   r_   r'   r`   r   rX   ZEncryptedKeyErrorr+   r¤   rA   r   r   r   Útest_fromStringErrorsú  sT    üý  ÿß$ß$ß$ßzKeyTests.test_fromStringErrorsc                 C   sV   |   tj | j¡tj tj¡¡ |  tj	tjj| jd¡ | jtj	tjj| jdd� dS )z5
        Test that fromFile works correctly.
        r©   Zunencryptedrz   N)
rF   r   r'   ZfromFiler8   r`   r   r;   r^   r_   rA   r   r   r   Útest_fromFile£  s     ÿ   ÿzKeyTests.test_fromFilec                 C   s.   t jjddd�j}t  |¡}|  |j|¡ dS )zJ
        Test that the PublicKey object is initialized correctly.
        é   é   ©r   r   N)r   r'   r(   r*   rF   )r<   Úobjrˆ   r   r   r   Ú	test_init¯  s    
zKeyTests.test_initc                 C   s†   t  | j¡}t  | j¡}t  t jjddd�j¡}t  | j¡}|  ||k¡ |  ||k¡ |  ||k¡ |  |tk¡ |  |dk¡ dS )z?
        Test that Key objects are compared correctly.
        r­   r®   r¯   N)	r   r'   r+   r(   r*   r-   rd   rf   Úobject©r<   Zrsa1Zrsa2Zrsa3Zdsar   r   r   Ú
test_equal·  s    zKeyTests.test_equalc                 C   s†   t  | j¡}t  | j¡}t  t jjddd�j¡}t  | j¡}|  ||k¡ |  ||k¡ |  ||k¡ |  |tk¡ |  |dk¡ dS )zC
        Test that Key objects are not-compared correctly.
        r­   r®   r¯   N)	r   r'   r+   r(   r*   r-   rf   rd   r²   r³   r   r   r   Útest_notEqualÅ  s    zKeyTests.test_notEqualc                 C   s   t  d¡}|  t|j¡ dS )zO
        The L{keys.Key.data} method raises RuntimeError for bad keys.
        r%   N)r   r'   r^   ÚRuntimeErrorro   r‚   r   r   r   Útest_dataErrorÓ  s    
zKeyTests.test_dataErrorc                 C   s4   |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ dS )z‚
        Test that the fingerprint method returns fingerprint in
        L{FingerprintFormats.MD5-HEX} format by default.
        ú/85:25:04:32:58:55:96:9f:57:ee:fb:a8:1a:ea:69:daú/63:15:b3:0e:e6:4f:50:de:91:48:3d:01:6b:b3:13:c1N)rF   r   r'   r+   Úfingerprintr-   rA   r   r   r   Útest_fingerprintdefaultÚ  s    þþz KeyTests.test_fingerprintdefaultc                 C   s@   |   t | j¡ tjj¡d¡ |   t | j¡ tjj¡d¡ dS )z‡
        fingerprint method generates key fingerprint in
        L{FingerprintFormats.MD5-HEX} format if explicitly specified.
        r¸   r¹   N)rF   r   r'   r+   rº   ÚFingerprintFormatsZMD5_HEXr-   rA   r   r   r   Útest_fingerprint_md5_hexè  s    þþz!KeyTests.test_fingerprint_md5_hexc                 C   s@   |   t | j¡ tjj¡d¡ |   t | j¡ tjj¡d¡ dS )z�
        fingerprint method generates key fingerprint in
        L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
        z,FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=z,Wz5o2YbKyxOEcJn1au/UaALSVruUzfz0vaLI1xiIGyY=N)rF   r   r'   r+   rº   r¼   ZSHA256_BASE64r-   rA   r   r   r   Útest_fingerprintsha256ö  s    þþzKeyTests.test_fingerprintsha256c              	   C   sB   |   tj¡�}t | j¡ d¡ W 5 Q R X |  d|jjd ¡ dS )zk
        A C{BadFingerPrintFormat} error is raised when unsupported
        formats are requested.
        zsha256-basez+Unsupported fingerprint format: sha256-baser   N)	r^   r   ZBadFingerPrintFormatr'   r+   rº   rF   Ú	exceptionÚargs)r<   Úemr   r   r   Útest_fingerprintBadFormat  s     
ÿz"KeyTests.test_fingerprintBadFormatc                 C   s  |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |   t | j¡ ¡ tj	d ¡ t
rÊ|   t | j¡ ¡ d¡ |   t | j¡ ¡ d¡ |  tt d	¡j¡ |  tt d	¡j¡ |  tt | ¡j¡ |  tt | ¡j¡ d	S )
zS
        Test that the type method returns the correct type for an object.
        rx   ó   ssh-rsar|   ó   ssh-dssrw   r    r}   ó   ssh-ed25519N)rF   r   r'   r+   rn   ZsshTyper-   r/   r   r.   r   r3   r^   r¶   rA   r   r   r   Ú	test_type  s      ÿzKeyTests.test_typec                 C   sÔ   |   t | j¡ ¡ dddg¡ |   t | j¡ ¡ dg¡ |   t | j¡ ¡ dg¡ |   tj tj	¡ ¡ dg¡ t
r¨|   t | j¡ ¡ dg¡ |   tj tj¡ ¡ dg¡ |  tt d	¡j¡ |  tt | ¡j¡ d	S )
z�
        L{keys.Key.supportedSignatureAlgorithms} returns the appropriate
        public key signature algorithms for each key type.
        ó   rsa-sha2-512ó   rsa-sha2-256rÃ   rÄ   s   ecdsa-sha2-nistp256s"   sk-ecdsa-sha2-nistp256@openssh.comrÅ   ó   sk-ssh-ed25519@openssh.comN)rF   r   r'   r+   ZsupportedSignatureAlgorithmsr-   r/   r`   r   rN   r   r3   rP   r^   r¶   rA   r   r   r   Ú!test_supportedSignatureAlgorithms#  s>    þ ÿþÿüþÿüz*KeyTests.test_supportedSignatureAlgorithmsc                 C   s"   t  d¡}|  tjtjj|¡ dS )ze
        A C{BadKeyError} error is raised whey the blob has an unsupported
        key type.
        ó   ssh-badN)r   ÚNSr^   r   r_   r'   r`   ©r<   ZbadBlobr   r   r   Útest_fromBlobUnsupportedTypeG  s    
z%KeyTests.test_fromBlobUnsupportedTypec                 C   sj   t jd t jd dœ}t d¡t |d ¡ t |d ¡ }tj |¡}|  | 	¡ ¡ |  
|| ¡ ¡ dS )zQ
        A public RSA key is correctly generated from a public key blob.
        r   r   r¯   rÃ   N)r   r)   r   rÌ   ÚMPr   r'   r`   rd   re   rF   ro   )r<   ZrsaPublicDataÚrsaBlobrg   r   r   r   Útest_fromBlobRSAP  s    þÿþÿzKeyTests.test_fromBlobRSAc                 C   s–   t jd t jd t jd t jd dœ}t d¡t |d ¡ t |d ¡ t |d ¡ t |d ¡ }tj |¡}|  | 	¡ ¡ |  
|| ¡ ¡ dS )zQ
        A public DSA key is correctly generated from a public key blob.
        r   r   r   r   )r   r   r   r   rÄ   N)r   r,   r   rÌ   rÏ   r   r'   r`   rd   re   rF   ro   )r<   ZdsaPublicDataÚdsaBlobrh   r   r   r   Útest_fromBlobDSAc  s$    üÿþýüÿzKeyTests.test_fromBlobDSAc                 C   s¦   ddl m} tjd tjd tjd dœ}t |d ¡t |d dd… ¡ t d	| |d d
¡ | |d d
¡ ¡ }tj 	|¡}|  
| ¡ ¡ |  || ¡ ¡ dS )zA
        Key.fromString generates ECDSA keys from blobs.
        r   ©Úutilsr   r   r    ©r   r   r    éøÿÿÿNó   é    )r   rÕ   r   r.   r   rÌ   Úint_to_bytesr   r'   r`   rd   re   rF   ro   )r<   rÕ   ZecPublicDataÚecblobÚeckeyr   r   r   Útest_fromBlobECDSAz  s(    ýÿÿþÿþÿ
zKeyTests.test_fromBlobECDSAc                 C   s¶   ddl m} tjd tjd tjd dœ}t tjd ¡t tjd dd… ¡ t d	| |d d
¡ | |d d
¡ ¡ }tj 	|¡}|  
| ¡ ¡ |  
|j¡ |  || ¡ ¡ dS )zC
        It can load public SK-ECDSA key from blob format.
        r   rÔ   r   r   r    rÖ   r×   NrØ   rÙ   )r   rÕ   r   r   r   rÌ   rÚ   r   r'   r`   rd   re   rv   rF   ro   )r<   rÕ   ZskEcPublicDataZskEcblobZskEckeyr   r   r   Útest_fromBlobSKECDSA”  s*    ýÿÿþÿþÿ
zKeyTests.test_fromBlobSKECDSAc                 C   sT   dt jd i}t d¡t |d ¡ }tj |¡}|  | ¡ ¡ |  	|| 
¡ ¡ dS )zU
        A public Ed25519 key is correctly generated from a public key blob.
        r!   rÅ   N)r   r2   r   rÌ   r   r'   r`   rd   re   rF   ro   )r<   Zed25519PublicDataÚed25519Blobri   r   r   r   Útest_fromBlobEd25519¯  s     ÿzKeyTests.test_fromBlobEd25519c                 C   s`   dt jd i}t d¡t |d ¡ }tj |¡}|  | ¡ ¡ |  |j	¡ |  
|| ¡ ¡ dS )zX
        A public SK-Ed25519 key is correctly generated from a public key blob.
        r!   rÉ   N)r   r€   r   rÌ   r   r'   r`   rd   re   rv   rF   ro   )r<   ZskEd25519PublicDataZskEd25519BlobZskEd25519Keyr   r   r   Útest_fromBlobSKEd25519¿  s     ÿÿzKeyTests.test_fromBlobSKEd25519c                 C   s"   t  d¡}|  tjtjj|¡ dS )zh
        C{BadKeyError} is raised when loading a private blob with an
        unsupported type.
        rË   N)r   rÌ   r^   r   r_   r'   Ú_fromString_PRIVATE_BLOBrÍ   r   r   r   Ú#test_fromPrivateBlobUnsupportedTypeÑ  s    
z,KeyTests.test_fromPrivateBlobUnsupportedTypec                 C   s²   t  d¡t  tjd ¡ t  tjd ¡ t  tjd ¡ t  tjd ¡ t  tjd ¡ t  tjd ¡ }tj |¡}|  | 	¡ ¡ |  
tj| ¡ ¡ |  
|tj | ¡ ¡¡ dS )	zS
        A private RSA key is correctly generated from a private key blob.
        rÃ   r   r   r   r   r   r   N)r   rÌ   rÏ   r   r)   r   r'   râ   rf   re   rF   ro   ÚprivateBlob)r<   rÐ   rg   r   r   r   Útest_fromPrivateBlobRSAÚ  s*    ÿþýüûúÿ
 ÿz KeyTests.test_fromPrivateBlobRSAc                 C   s¢   t  d¡t  tjd ¡ t  tjd ¡ t  tjd ¡ t  tjd ¡ t  tjd ¡ }tj |¡}|  | 	¡ ¡ |  
tj| ¡ ¡ |  
|tj | ¡ ¡¡ dS )zS
        A private DSA key is correctly generated from a private key blob.
        rÄ   r   r   r   r   r   N)r   rÌ   rÏ   r   r,   r   r'   râ   rf   re   rF   ro   rä   )r<   rÒ   rh   r   r   r   Útest_fromPrivateBlobDSAð  s&    ÿþýüûÿ	 ÿz KeyTests.test_fromPrivateBlobDSAc                 C   sÚ   ddl m} ddlm} |jtjd tjd | ¡ d�}t 	tjd ¡t 	tjd dd	… ¡ t 	| 
tƒ ¡ |jj|jj¡¡ t tjd
 ¡ }tj |¡}|  | ¡ ¡ |  tj| ¡ ¡ |  |tj | ¡ ¡¡ d	S )zR
        A private EC key is correctly generated from a private key blob.
        r   ©Úserialization)Úecr   r   rÖ   r    r×   Nr   )Úcryptography.hazmat.primitivesrè   Ú)cryptography.hazmat.primitives.asymmetricré   ZEllipticCurvePublicNumbersr   r.   Z	SECP256R1r   rÌ   Ú
public_keyr	   Úpublic_bytesÚEncodingÚX962ÚPublicFormatÚUncompressedPointrÏ   r   r'   râ   rf   re   rF   ro   rä   )r<   rè   ré   ÚpublicNumbersrÛ   rÜ   r   r   r   Útest_fromPrivateBlobECDSA  s0    ýÿþÿþøÿz"KeyTests.test_fromPrivateBlobECDSAc                 C   s|   t  d¡t  tjd ¡ t  tjd tjd  ¡ }tj |¡}|  | ¡ ¡ |  	tj| 
¡ ¡ |  	|tj | ¡ ¡¡ dS )zW
        A private Ed25519 key is correctly generated from a private key blob.
        rÅ   r!   r"   N)r   rÌ   r   r2   r   r'   râ   rf   re   rF   ro   rä   )r<   rß   ri   r   r   r   Útest_fromPrivateBlobEd25519#  s    ÿþÿ ÿz$KeyTests.test_fromPrivateBlobEd25519c                 C   sJ   |   t | j¡ ¡ t d¡t | j ¡ j	j
¡ t | j ¡ j	j¡ ¡ dS )zL
        Return the over-the-wire SSH format of the RSA public key.
        rÃ   N)rF   r   r'   r+   rJ   r   rÌ   rÏ   Úprivate_numbersÚpublic_numbersr   r   rA   r   r   r   Útest_blobRSA6  s    ÿþþzKeyTests.test_blobRSAc                 C   sd   | j  ¡ j}|  t | j ¡ ¡ t d¡t 	|j
j¡ t 	|j
j¡ t 	|j
j¡ t 	|j¡ ¡ dS )zL
        Return the over-the-wire SSH format of the DSA public key.
        rÄ   N)r-   rõ   rö   rF   r   r'   rJ   r   rÌ   rÏ   Úparameter_numbersr   r   r   r   ©r<   rò   r   r   r   Útest_blobDSAA  s    ÿþý
üþzKeyTests.test_blobDSAc                 C   s”   ddl m} | jjjd d }|  t | j¡ ¡ t	 
tjd ¡t	 
tjd dd… ¡ t	 
d| | j ¡ jj|¡ | | j ¡ jj|¡ ¡ ¡ dS )	zK
        Return the over-the-wire SSH format of the EC public key.
        r   rÔ   é   é   r    r×   NrØ   )r   rÕ   r/   r    Zkey_sizerF   r   r'   rJ   r   rÌ   r   r.   rÚ   rõ   rö   r   r   )r<   rÕ   Z
byteLengthr   r   r   Útest_blobECP  s,    ÿ ÿÿ ÿüÿþþzKeyTests.test_blobECc                 C   sR   ddl m} | j ¡  |jj|jj¡}|  t	 
| j¡ ¡ t d¡t |¡ ¡ dS )zP
        Return the over-the-wire SSH format of the Ed25519 public key.
        r   rç   rÅ   N)rê   rè   r3   rì   rí   rî   ÚRawrð   rF   r   r'   rJ   r   rÌ   )r<   rè   ÚpublicBytesr   r   r   Útest_blobEd25519f  s    
 ÿþzKeyTests.test_blobEd25519c                 C   s   t  d¡}|  t|j¡ dS )zx
        C{RuntimeError} is raised when the blob is requested for a Key
        which is not wrapping anything.
        N)r   r'   r^   r¶   rJ   r‚   r   r   r   Útest_blobNoKeyv  s    
zKeyTests.test_blobNoKeyc                 C   sx   | j  ¡ }|  t | j ¡ ¡ t d¡t |j	j
¡ t |j	j¡ t |j¡ t |j¡ t |j¡ t |j¡ ¡ dS )zn
        L{keys.Key.privateBlob} returns the SSH protocol-level format of an
        RSA private key.
        rÃ   N)r+   rõ   rF   r   r'   rä   r   rÌ   rÏ   rö   r   r   r   Ziqmpr   r   )r<   Znumbersr   r   r   Útest_privateBlobRSA  s"    
ÿþ
ý
ü
û
úþzKeyTests.test_privateBlobRSAc                 C   sv   | j  ¡ j}|  t | j ¡ ¡ t d¡t 	|j
j¡ t 	|j
j¡ t 	|j
j¡ t 	|j¡ t 	| j  ¡ j¡ ¡ dS )zm
        L{keys.Key.privateBlob} returns the SSH protocol-level format of a DSA
        private key.
        rÄ   N)r-   rõ   rö   rF   r   r'   rä   r   rÌ   rÏ   rø   r   r   r   r   r   rù   r   r   r   Útest_privateBlobDSA�  s    ÿþý
üûþzKeyTests.test_privateBlobDSAc              
   C   s~   ddl m} |  t | j¡ ¡ t t	j
d ¡t t	j
d dd… ¡ t | j ¡  |jj|jj¡¡ t | j ¡ j¡ ¡ dS )zj
        L{keys.Key.privateBlob} returns the SSH ptotocol-level format of EC
        private key.
        r   rç   r    r×   N)rê   rè   rF   r   r'   r/   rä   r   rÌ   r   r.   rì   rí   rî   rï   rð   rñ   rÏ   rõ   Zprivate_value)r<   rè   r   r   r   Útest_privateBlobEC¡  s     ÿ
þÿþøþzKeyTests.test_privateBlobECc                 C   s|   ddl m} | j ¡  |jj|jj¡}| j |jj|j	j| 
¡ ¡}|  t | j¡ ¡ t d¡t |¡ t || ¡ ¡ dS )zr
        L{keys.Key.privateBlob} returns the SSH protocol-level format of an
        Ed25519 private key.
        r   rç   rÅ   N)rê   rè   r3   rì   rí   rî   rþ   rð   Zprivate_bytesZPrivateFormatZNoEncryptionrF   r   r'   rä   r   rÌ   )r<   rè   rÿ   ZprivateBytesr   r   r   Útest_privateBlobEd25519µ  s$    
 ÿýÿþþz KeyTests.test_privateBlobEd25519c                 C   s   t  d¡}|  t|j¡ dS )zV
        Raises L{RuntimeError} if the underlying key object does not exists.
        N)r   r'   r^   r¶   rä   r‚   r   r   r   Útest_privateBlobNoKeyObjectÍ  s    
z$KeyTests.test_privateBlobNoKeyObjectc                 C   s„   t j tj¡}|  | d¡ ¡ tj¡ |  	|jddd� 
d¡dk¡ |  | ¡  d¡tjdd… ¡ |  | ¡ jddd	�tj¡ dS )
zO
        L{keys.Key.toString} serializes an RSA key in OpenSSH format.
        r    ry   rz   s   DEK-Infor   Nr×   ó   comment©Úcomment)r   r'   r`   r   r[   rF   r¤   ÚstriprQ   rd   Úfindrb   rK   ©r<   rˆ   r   r   r   Útest_toOpenSSHRSAÕ  s    ÿ ÿþzKeyTests.test_toOpenSSHRSAc                 C   s„   t j tj¡}|jddd�}|jdddd�}|  d| ¡ d ¡ |  d| ¡ d ¡ |  |t j |¡¡ |  |t jj|dd�¡ d	S )
zT
        L{keys.Key.toString} serializes an RSA key in OpenSSH's v1 format.
        r    Úv1©Úsubtyperª   ©r  r{   ó#   -----BEGIN OPENSSH PRIVATE KEY-----r   rz   N)r   r'   r`   r   rQ   r¤   rF   Ú
splitlines©r<   rˆ   Znew_key_dataZnew_enc_key_datar   r   r   Útest_toOpenSSHRSA_v1_formatæ  s      
ÿ 
ÿ ÿz$KeyTests.test_toOpenSSHRSA_v1_formatc                 C   sf   t j tj¡}|  | d¡ ¡ tj¡ |  | 	¡ jddd�tj
¡ |  | 	¡  d¡tj
dd… ¡ dS )zN
        L{keys.Key.toString} serializes a DSA key in OpenSSH format.
        r    r  r  Nr×   )r   r'   r`   r   rZ   rF   r¤   r
  rS   rb   rL   r  r   r   r   Útest_toOpenSSHDSAø  s    þ ÿzKeyTests.test_toOpenSSHDSAc                 C   s„   t j tj¡}|jddd�}|jdddd�}|  d| ¡ d ¡ |  d| ¡ d ¡ |  |t j |¡¡ |  |t jj|dd�¡ d	S )
zS
        L{keys.Key.toString} serializes a DSA key in OpenSSH's v1 format.
        r    r  r  rª   r  r  r   rz   N)r   r'   r`   r   rS   r¤   rF   r  r  r   r   r   Útest_toOpenSSHDSA_v1_format  s      
ÿ 
ÿ ÿz$KeyTests.test_toOpenSSHDSA_v1_formatc                 C   sN   t j tj¡}|  | ¡ jddd�tj¡ |  | ¡  d¡tjdd… ¡ dS )zQ
        L{keys.Key.toString} serializes an ECDSA key in OpenSSH format.
        r    r  r  Nr×   )	r   r'   r`   r   rU   rF   rb   r¤   rM   r  r   r   r   Útest_toOpenSSHECDSA  s    þ ÿzKeyTests.test_toOpenSSHECDSAc                 C   s„   t j tj¡}|jddd�}|jdddd�}|  d| ¡ d ¡ |  d| ¡ d ¡ |  |t j |¡¡ |  |t jj|dd�¡ d	S )
zV
        L{keys.Key.toString} serializes an ECDSA key in OpenSSH's v1 format.
        r    r  r  rª   r  r  r   rz   N)r   r'   r`   r   rU   r¤   rF   r  r  r   r   r   Útest_toOpenSSHECDSA_v1_format%  s      
ÿ 
ÿ ÿz&KeyTests.test_toOpenSSHECDSA_v1_formatc                 C   s”   t j tj¡}| d¡}|jddd�}|  d| ¡ d ¡ |  d| ¡ d ¡ |  |t j |¡¡ |  |t jj|dd�¡ |  ||jddd�¡ dS )	zX
        L{keys.Key.toString} serializes an Ed25519 key in OpenSSH's v1 format.
        r    rª   rz   r  r   r  r  N)r   r'   r`   r   rW   r¤   rF   r  r  r   r   r   Útest_toOpenSSHEd255197  s"    
 
ÿ 
ÿ ÿzKeyTests.test_toOpenSSHEd25519c                 C   s&   t j tj¡}| jt|jddd� dS )z­
        L{keys.Key.toString} refuses to serialize an Ed25519 key in
        OpenSSH's old PEM format, as no encoding of Ed25519 is defined for
        that format.
        r    ZPEMr  N)r   r'   r`   r   rW   r^   Ú
ValueErrorr¤   r  r   r   r   Ú test_toOpenSSHEd25519_PEM_formatK  s    z)KeyTests.test_toOpenSSHEd25519_PEM_formatc                 C   s>   t j tj¡}|  | d¡tj¡ |  | ¡  d¡tj	¡ dS )zK
        L{keys.Key.toString} serializes an RSA key in LSH format.
        ÚlshN)
r   r'   r`   r   rQ   rF   r¤   r;   rb   rX   r  r   r   r   Útest_toLSHRSAU  s    zKeyTests.test_toLSHRSAc                 C   s>   t j tj¡}|  | d¡tj¡ |  | ¡  d¡tj	¡ dS )zJ
        L{keys.Key.toString} serializes a DSA key in LSH format.
        r  N)
r   r'   r`   r   rS   rF   r¤   rZ   rb   rY   r  r   r   r   Útest_toLSHDSA]  s    zKeyTests.test_toLSHDSAc                 C   s&   t j tj¡}|  | d¡tj¡ dS )zP
        L{keys.Key.toString} serializes an RSA key in Agent v3 format.
        rI   N)r   r'   r`   r   rQ   rF   r¤   r[   r  r   r   r   Útest_toAgentv3RSAe  s    zKeyTests.test_toAgentv3RSAc                 C   s&   t j tj¡}|  | d¡tj¡ dS )zO
        L{keys.Key.toString} serializes a DSA key in Agent v3 format.
        rI   N)r   r'   r`   r   rS   rF   r¤   r\   r  r   r   r   Útest_toAgentv3DSAl  s    zKeyTests.test_toAgentv3DSAc                 C   sP   t  | j¡}|jddd�}|  t jj|d ¡ d�|¡ | jt j|jddd� dS )zd
        L{keys.Key.toString} applies Normalization Form KC to Unicode
        passphrases.
        r    r¢   rz   r¡   r£   N)	r   r'   r+   r¤   rF   r`   r¥   r^   r¦   r§   r   r   r   Ú(test_toStringNormalizesUnicodePassphrases  s    þüz1KeyTests.test_toStringNormalizesUnicodePassphrasec                 C   s   |   tjt | j¡jd¡ dS )zm
        L{keys.Key.toString} raises L{keys.BadKeyError} when passed an invalid
        format type.
        r©   N)r^   r   r_   r'   r+   r¤   rA   r   r   r   Útest_toStringErrors‡  s    zKeyTests.test_toStringErrorsc              	   C   s�   d}t j tj¡}| |¡}|  | ¡  ||¡¡ |  | ||¡¡ t	 
|¡\}}|  |d¡ |  |j ¡  t	 
|¡d |t ¡ t ¡ ¡¡ dS )zR
        Signed data can be verified using RSA (with SHA-1, the default).
        ó	   some-datarÃ   r   N)r   r'   r`   r   rQ   Úsignrd   rb   Úverifyr   ÚgetNSrF   ÚassertIsNoner*   rì   r   ÚPKCS1v15r
   ÚSHA1©r<   ro   rˆ   Ú	signatureÚsignatureTyper   r   r   Útest_signAndVerifyRSAŽ  s    

   ÿÿzKeyTests.test_signAndVerifyRSAc              	   C   s”   d}t j tj¡}|j|dd�}|  | ¡  ||¡¡ |  | ||¡¡ t	 
|¡\}}|  |d¡ |  |j ¡  t	 
|¡d |t ¡ t ¡ ¡¡ dS )zE
        Signed data can be verified using RSA with SHA-256.
        r$  rÈ   ©r-  r   N)r   r'   r`   r   rQ   r%  rd   rb   r&  r   r'  rF   r(  r*   rì   r   r)  r
   ÚSHA256r+  r   r   r   Útest_signAndVerifyRSASHA256   s    
   ÿÿz$KeyTests.test_signAndVerifyRSASHA256c              	   C   s”   d}t j tj¡}|j|dd�}|  | ¡  ||¡¡ |  | ||¡¡ t	 
|¡\}}|  |d¡ |  |j ¡  t	 
|¡d |t ¡ t ¡ ¡¡ dS )zE
        Signed data can be verified using RSA with SHA-512.
        r$  rÇ   r/  r   N)r   r'   r`   r   rQ   r%  rd   rb   r&  r   r'  rF   r(  r*   rì   r   r)  r
   ÚSHA512r+  r   r   r   Útest_signAndVerifyRSASHA512²  s    
   ÿÿz$KeyTests.test_signAndVerifyRSASHA512c                 C   sH   d}t j tj¡}| |¡}|  | ¡  ||¡¡ |  | ||¡¡ dS )z8
        Signed data can be verified using DSA.
        r$  N)	r   r'   r`   r   rS   r%  rd   rb   r&  ©r<   ro   rˆ   r,  r   r   r   Útest_signAndVerifyDSAÄ  s
    
zKeyTests.test_signAndVerifyDSAc                 C   sÈ   d}t j tj¡}| |¡}t j tj¡}| |¡}t j tj¡}| |¡}|  | 	¡  
||¡¡ |  | 
||¡¡ |  | 	¡  
||¡¡ |  | 
||¡¡ |  | 	¡  
||¡¡ |  | 
||¡¡ dS )z7
        Signed data can be verified using EC.
        r$  N)r   r'   r`   r   rU   r%  r‹   rŒ   rd   rb   r&  )r<   ro   rˆ   r,  Zkey384Zsignature384Zkey521Zsignature521r   r   r   Útest_signAndVerifyECÎ  s    


zKeyTests.test_signAndVerifyECc                 C   sH   d}t j tj¡}| |¡}|  | ¡  ||¡¡ |  | ||¡¡ dS )z<
        Signed data can be verified using Ed25519.
        r$  N)	r   r'   r`   r   rW   r%  rd   rb   r&  r4  r   r   r   Útest_signAndVerifyEd25519ã  s
    
z"KeyTests.test_signAndVerifyEd25519c                 C   sL   t j tj¡}| jt j|jddd� t j tj¡}| jt j|jddd� dS )z·
        L{keys.Key.sign} raises L{keys.BadSignatureAlgorithmError} when
        asked to sign with a public key algorithm that doesn't make sense
        with the given key.
        s	   some datarÄ   r/  N)	r   r'   r`   r   rQ   r^   ZBadSignatureAlgorithmErrorr%  rU   r  r   r   r   Útest_signWithWrongAlgorithmî  s    üüz$KeyTests.test_signWithWrongAlgorithmc                 C   sN   t j tj¡}|  | | jd¡¡ |  | | jd¡¡ |  | | j	d¡¡ dS )zC
        A known-good RSA signature verifies successfully.
        r%   ó   aN)
r   r'   r`   r   rK   rd   r&  r4   rf   r5   r  r   r   r   Útest_verifyRSA  s    zKeyTests.test_verifyRSAc                 C   sN   t j tj¡}|  | | jd¡¡ |  | | jd¡¡ |  | | j	d¡¡ dS )zC
        A known-good DSA signature verifies successfully.
        r%   r9  N)
r   r'   r`   r   rL   rd   r&  r5   rf   r4   r  r   r   r   Útest_verifyDSA  s    zKeyTests.test_verifyDSAc                 C   s.   t j tj¡}|  | | jdd… d¡¡ dS )z€
        Some commercial SSH servers send DSA keys as 2 20-byte numbers;
        they are still verified as valid keys.
        iØÿÿÿNr%   )r   r'   r`   r   rL   rd   r&  r5   r  r   r   r   Útest_verifyDSANoPrefix  s    zKeyTests.test_verifyDSANoPrefixc                 C   s   |   tt | j¡ƒd¡ dS )zn
        The repr of a L{keys.Key} contains all of the RSA components for an RSA
        private key.
        a\  <RSA Private Key (2048 bits)
attr d:
	21:4c:08:66:a2:28:d5:b4:fb:8e:0f:72:1b:85:09:
	00:b9:f2:4e:37:f0:1c:57:4b:e3:51:7f:9e:23:a7:
	e4:3a:98:55:1b:ea:8b:7a:98:1e:bc:d8:ba:b1:f9:
	89:12:18:60:ac:e8:cc:0b:4e:09:5a:40:6a:ba:2f:
	99:f8:b3:24:60:84:b9:ce:69:95:9a:f9:e2:fc:1f:
	51:4d:27:15:db:2b:27:ad:ef:b4:69:ac:be:7d:10:
	eb:86:47:70:73:b4:00:87:95:15:3b:37:f9:e7:14:
	e7:80:bb:68:1e:1b:e6:dd:bb:73:63:b9:67:e6:b2:
	27:7f:cf:cf:30:9b:c2:98:fd:d9:18:36:2f:36:2e:
	f1:3d:81:7a:9f:e1:03:2d:47:db:34:51:62:39:dd:
	4f:e9:ac:a8:8b:d9:d6:f3:84:c4:17:b9:71:9d:06:
	08:42:78:4d:bb:c5:2a:f4:c3:58:cd:55:2b:ed:be:
	33:5f:04:ea:7b:e6:04:24:63:f2:2d:d7:3d:1b:6c:
	d5:9c:63:43:2f:92:88:8d:3e:6e:da:18:37:d8:0f:
	25:67:89:1d:b9:46:34:5e:c9:ce:c4:8b:ed:92:5a:
	33:07:0f:df:86:08:f9:92:e9:db:eb:38:08:36:c9:
	cd:cd:0a:01:48:5b:39:3e:7a:ca:c6:80:a9:dc:d4:
	39
attr e:
	01:00:01
attr n:
	00:d5:6a:ac:78:23:d6:d6:1b:ec:25:a1:50:c4:77:
	63:50:84:45:01:55:42:14:2a:2a:e0:d0:60:ee:d4:
	e9:a3:ad:4a:fa:39:06:5e:84:55:75:5f:00:36:bf:
	6f:aa:2a:3f:83:26:37:c1:69:2e:5b:fd:f0:f3:d2:
	7d:d6:98:cd:3a:40:78:d5:ca:a8:18:c0:11:93:24:
	09:0c:81:4c:8f:f7:9c:ed:13:16:6a:a4:04:e9:49:
	77:c3:e4:55:64:b3:79:68:9e:2c:08:eb:ac:e8:04:
	2d:21:77:05:a7:8e:ef:53:30:0d:a5:e5:bb:3d:6a:
	e2:09:36:6f:fd:34:d3:7d:6f:46:ff:87:da:a9:29:
	27:aa:ff:ad:f5:85:e6:3e:1a:b8:7a:1d:4a:b1:ea:
	c0:5a:f7:30:df:1f:c2:a4:e4:ef:3f:91:49:96:40:
	d5:19:77:2d:37:c3:5e:ec:9d:a6:3a:44:a5:c2:a4:
	29:dd:d5:ba:9c:3d:45:b3:c6:2c:18:64:d5:ba:3d:
	df:ab:7f:cd:42:ac:a7:f1:18:0b:a0:58:15:62:0b:
	a4:2a:6e:43:c3:e4:04:9f:35:a3:47:8e:46:ed:33:
	a5:65:bd:bc:3b:29:6e:02:0b:57:df:74:e8:13:b4:
	37:35:7e:83:5f:20:26:60:a6:dc:ad:8b:c6:6c:79:
	98:f7
attr p:
	00:d9:70:06:d8:e2:bc:d4:78:91:50:94:d4:c1:1b:
	89:38:6c:46:64:5a:51:a0:9a:07:3d:48:8f:03:51:
	cc:6b:12:8e:7d:1a:b1:65:e7:71:75:39:e0:32:05:
	75:8d:18:4c:af:93:b1:49:b1:66:5f:78:62:7a:d1:
	0c:ca:e6:4d:43:b3:9c:f4:6b:7d:e6:0c:98:dc:cf:
	21:62:8e:d5:2e:12:de:04:ae:d7:24:6e:83:31:a2:
	15:a2:44:3d:22:a9:62:26:22:b9:b2:ed:54:0a:9d:
	08:83:a7:07:0d:ff:19:18:8e:d8:ab:1d:da:48:9c:
	31:68:11:a1:66:6d:e3:d8:1d
attr q:
	00:fb:44:17:8b:a4:36:be:1e:37:1d:a7:f6:61:6c:
	04:c4:aa:dd:78:3e:07:8c:1e:33:02:ae:03:14:87:
	83:7a:e5:9e:7d:08:67:a8:f2:aa:bf:12:70:cf:72:
	a9:a7:c7:0b:1d:88:d5:20:fd:9c:63:ca:47:30:55:
	4e:8b:c4:cf:f4:7f:16:a4:92:12:74:a1:09:c2:c4:
	6e:9c:8c:33:ef:a5:e5:f7:e0:2b:ad:4f:5c:11:aa:
	1a:84:37:5b:fd:7a:ea:c3:cd:7c:b0:c8:e4:1f:54:
	63:b5:c7:af:df:f4:09:a7:fc:c7:25:fc:5c:e9:91:
	d7:92:c5:98:1e:56:d3:b1:23
attr u:
	00:85:4b:1b:7a:9b:12:10:37:9e:1f:ad:5e:da:fe:
	c6:96:fe:df:35:6b:b9:34:e2:16:97:92:26:09:bd:
	bd:70:20:03:a7:35:bd:2d:1b:a0:d2:07:47:2b:d4:
	de:a8:a8:07:07:1b:b8:04:20:a7:27:41:3c:6c:39:
	39:e9:41:ce:e7:17:1d:d1:4c:5c:bc:3d:d2:26:26:
	fe:6a:d6:fd:48:72:ae:46:fa:7b:c3:d3:19:60:44:
	1d:a5:13:a7:80:f5:63:29:d4:7a:5d:06:07:16:5d:
	f6:8b:3d:cb:64:3a:e2:84:5a:4d:8c:06:2d:2d:9d:
	1c:eb:83:4c:78:3d:79:54:ce>N)rF   Úreprr   r'   r+   rA   r   r   r   Útest_reprPrivateRSA  s    þzKeyTests.test_reprPrivateRSAc                 C   s    |   tt | j¡ ¡ ƒd¡ dS )zm
        The repr of a L{keys.Key} contains all of the RSA components for an RSA
        public key.
        a\  <RSA Public Key (2048 bits)
attr e:
	01:00:01
attr n:
	00:d5:6a:ac:78:23:d6:d6:1b:ec:25:a1:50:c4:77:
	63:50:84:45:01:55:42:14:2a:2a:e0:d0:60:ee:d4:
	e9:a3:ad:4a:fa:39:06:5e:84:55:75:5f:00:36:bf:
	6f:aa:2a:3f:83:26:37:c1:69:2e:5b:fd:f0:f3:d2:
	7d:d6:98:cd:3a:40:78:d5:ca:a8:18:c0:11:93:24:
	09:0c:81:4c:8f:f7:9c:ed:13:16:6a:a4:04:e9:49:
	77:c3:e4:55:64:b3:79:68:9e:2c:08:eb:ac:e8:04:
	2d:21:77:05:a7:8e:ef:53:30:0d:a5:e5:bb:3d:6a:
	e2:09:36:6f:fd:34:d3:7d:6f:46:ff:87:da:a9:29:
	27:aa:ff:ad:f5:85:e6:3e:1a:b8:7a:1d:4a:b1:ea:
	c0:5a:f7:30:df:1f:c2:a4:e4:ef:3f:91:49:96:40:
	d5:19:77:2d:37:c3:5e:ec:9d:a6:3a:44:a5:c2:a4:
	29:dd:d5:ba:9c:3d:45:b3:c6:2c:18:64:d5:ba:3d:
	df:ab:7f:cd:42:ac:a7:f1:18:0b:a0:58:15:62:0b:
	a4:2a:6e:43:c3:e4:04:9f:35:a3:47:8e:46:ed:33:
	a5:65:bd:bc:3b:29:6e:02:0b:57:df:74:e8:13:b4:
	37:35:7e:83:5f:20:26:60:a6:dc:ad:8b:c6:6c:79:
	98:f7>N)rF   r=  r   r'   r+   rb   rA   r   r   r   Útest_reprPublicRSAm  s    þzKeyTests.test_reprPublicRSAc                 C   s.   |   tt | j¡ ¡ ƒtdƒjf tj	Ž¡ dS )zl
        The repr of a L{keys.Key} contains all the OpenSSH format for an ECDSA
        public key.
        zÓ                <Elliptic Curve Public Key (256 bits)
                curve:
                	ecdsa-sha2-nistp256
                x:
                	{x}
                y:
                	{y}>
                N)
rF   r=  r   r'   r/   rb   r   Úformatr   r.   rA   r   r   r   Útest_reprPublicECDSAŒ  s    ÿ
öþzKeyTests.test_reprPublicECDSAc                 C   s*   |   tt | j¡ƒtdƒjf tjŽ¡ dS )zm
        The repr of a L{keys.Key} contains all the OpenSSH format for an ECDSA
        private key.
        a                  <Elliptic Curve Private Key (256 bits)
                curve:
                	ecdsa-sha2-nistp256
                privateValue:
                	{privateValue}
                x:
                	{x}
                y:
                	{y}>
                N)	rF   r=  r   r'   r/   r   r@  r   r.   rA   r   r   r   Útest_reprPrivateECDSA   s    ÿôþzKeyTests.test_reprPrivateECDSAc                 C   s$   |   tt | j¡ ¡ ƒtdƒ¡ dS )zn
        The repr of a L{keys.Key} contains all the OpenSSH format for an
        Ed25519 public key.
        zÜ                <Ed25519 Public Key (256 bits)
                attr a:
                	f1:16:d1:15:4a:1e:15:0e:19:5e:19:46:b5:f2:44:
                	0d:b2:52:a0:ae:2a:6b:23:13:73:45:fd:40:d9:57:
                	7b:8b>N)rF   r=  r   r'   r3   rb   r   rA   r   r   r   Útest_reprPublicEd25519¶  s    ÿþzKeyTests.test_reprPublicEd25519c                 C   s    |   tt | j¡ƒtdƒ¡ dS )zo
        The repr of a L{keys.Key} contains all the OpenSSH format for an
        Ed25519 private key.
        aŠ                  <Ed25519 Private Key (256 bits)
                attr a:
                	f1:16:d1:15:4a:1e:15:0e:19:5e:19:46:b5:f2:44:
                	0d:b2:52:a0:ae:2a:6b:23:13:73:45:fd:40:d9:57:
                	7b:8b
                attr k:
                	37:2f:25:da:8d:d4:a8:9a:78:7c:61:f0:98:01:c6:
                	f4:5e:6d:67:05:69:31:37:4c:69:0d:05:55:bb:c9:
                	44:58>N)rF   r=  r   r'   r3   r   rA   r   r   r   Útest_reprPrivateEd25519È  s    ÿþz KeyTests.test_reprPrivateEd25519)_Ú__name__Ú
__module__Ú__qualname__r   ÚskipCryptographyr   r=   rB   rH   r]   ra   rc   rj   rp   rr   rk   rl   rq   r�   rƒ   r‡   rŠ   r�   r‘   r›   rœ   r�   rž   rŸ   r¨   r«   r¬   r±   r´   rµ   r·   r»   r½   r¾   rÂ   rÆ   rÊ   rÎ   rÑ   rÓ   rÝ   rÞ   r   rà   rá   rã   rå   ræ   ró   rô   r÷   rú   rý   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r!  r"  r#  r.  r1  r3  r5  r6  r7  r8  r:  r;  r<  r>  r?  rA  rB  rC  rD  r   r   r   r   r   *   sÈ   ?H1 *$	
	

	


	


		P
r   c                   @   s4   e Zd ZdZedkreZdd„ Zdd„ Zdd„ Z	dS )	ÚPersistentRSAKeyTestsz1
    Tests for L{keys._getPersistentRSAKey}.
    Nc                 C   sF   t |  ¡ ƒ}| d¡}tj|dd�}|  | ¡ d¡ |  | ¡ ¡ dS )z‡
        L{keys._getPersistentRSAKey} will put the key in
        C{directory}/C{filename}, with the key length of C{keySize}.
        ú	mykey.pemrD   ©ZkeySizeN)	r   r7   Úchildr   Ú_getPersistentRSAKeyrF   rG   rd   Úexists©r<   ÚtempDirr8   rˆ   r   r   r   Útest_providedArgumentsç  s
    
z,PersistentRSAKeyTests.test_providedArgumentsc                 C   s|   t |  ¡ ƒ}| d¡}tj|dd�}|  | ¡ d¡ |  | ¡ ¡ | 	¡ }tj|dd�}|  | ¡ d¡ |  | 	¡ |¡ dS )zm
        L{keys._getPersistentRSAKey} will not regenerate the key if the key
        already exists.
        rJ  rD   rK  rC   N)
r   r7   rL  r   rM  rF   rG   rd   rN  Z
getContent)r<   rP  r8   rˆ   Z
keyContentr   r   r   Útest_noRegenerationó  s    
z)PersistentRSAKeyTests.test_noRegenerationc                 C   s>   t |  ¡ ƒ}| d¡}tj|dd�}d|_|  | ¡ d¡ dS )z
        If the key generated by L{keys.getPersistentRSAKey} is set to None
        the key size should then become 0.
        rJ  rD   rK  Nr   )r   r7   rL  r   rM  r*   rF   rG   rO  r   r   r   Útest_keySizeZero  s
    
z&PersistentRSAKeyTests.test_keySizeZero)
rE  rF  rG  Ú__doc__r   rH  r   rQ  rR  rS  r   r   r   r   rI  ß  s   rI  )!rT  r˜   r?   Útextwrapr   Ztwisted.conch.testr   Ztwisted.pythonr   Ztwisted.python.filepathr   Ztwisted.python.reflectr   Ztwisted.trialr   r   rH  Zcryptography.hazmat.backendsr	   rê   r
   rë   r   Ztwisted.conch.sshr   r   r   Zed25519_supportedr   r   ZTestCaser   rI  r   r   r   r   Ú<module>   sD                B