o
    ¼>hz ć                   @   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u r8d
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   ś|/var/www/vedio/testing/chatpythonscript.ninositsolution.com/env/lib/python3.10/site-packages/twisted/conch/test/test_keys.pyŚskipWithoutEd25519$   s   r   c                   @   sü  e Zd Zedu 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 d    d S 1 sĀw   Y  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<ŚsecureRandomc                 S   s   d|  S )Nó   ’r   )r   r   r   r   Ś<lambda>h   s    z KeyTests.setUp.<locals>.<lambda>Śwb)r   ŚKeyŚ_fromRSAComponentsr   ŚRSADataŚ
_keyObjectŚrsaObjŚ_fromDSAComponentsŚDSADataŚdsaObjŚ_fromECComponentsŚECDatanistp256ŚecObjŚECDatanistp384ŚecObj384ŚECDatanistp521ŚecObj521r   Ś_fromEd25519ComponentsŚEd25519DataŚ
ed25519ObjŚrsaSignatureŚdsaSignatureŚpatchr   ŚmktempŚkeyFileŚopenŚwriteŚprivateRSA_lsh)Śselfr   r   r   r   ŚsetUp.   st   śłūśüūüūüū’ž’’
"’zKeyTests.setUpc                 C   s   t  | j” d S ©N)ŚosŚunlinkr=   ©rA   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	rL|   t | j
” ” d” dS dS )zU
        The L{keys.Key.size} method returns the size of key object in bits.
        é   é   é   i  i	  N)ŚassertEqualr   r'   r+   Śsizer.   r1   r3   r5   r   r8   rF   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.
        Śpublic_opensshŚprivate_opensshŚ
public_lshŚprivate_lshŚagentv3s      ssh-rsa   Śblobs      ssh-dss   s	   not a keyN)rK   r   r'   Ś_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_agentv3rF   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   ŚpublicSKEd25519_cert_opensshŚpublicSKECDSA_cert_opensshrF   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rdt j tj”}t j tj”}|  | ” | ” ” dS dS )zn
        The L{keys.Key.public} method returns a public key for both
        public and private keys.
        N)r   r'   rj   r   r[   rU   rK   Śpublicr]   rV   r_   rW   r   ra   rY   )	rA   ŚprivateRSAKeyŚpublicRSAKeyŚprivateDSAKeyŚpublicDSAKeyŚprivateECDSAKeyŚpublicECDSAKeyŚprivateEd25519KeyŚ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 dS )zg
        The L{keys.Key.isPublic} method returns True for public keys
        otherwise False.
        N)r   r'   rj   r   r[   r]   r_   Ś
assertTruern   ŚisPublicŚassertFalser   ra   )rA   ŚrsaKeyŚdsaKeyŚecdsaKeyŚ
ed25519Keyr   r   r   Śtest_isPublicė   s   żzKeyTests.test_isPublicc                 C   s    |   |||” |  |||” d S rC   )Ś_testPublicFromStringŚ_testPrivateFromString)rA   rn   ŚprivateŚtypeŚdatar   r   r   Ś_testPublicPrivateFromString’   s   z%KeyTests._testPublicPrivateFromStringc                 C   s   |   |||” |  |” d S rC   )r   Ś_testSKFromString)rA   rn   r   r   r   r   r   Ś_testPublicSKFromString  s   z KeyTests._testPublicSKFromStringc                 C   sT   t j |”}|  | ” ” |  | ” |” | ”  ” D ]\}}|  || |” qd S rC   )	r   r'   rj   rx   ry   rK   r   r   Śitems)rA   rn   r   r   Ś	publicKeyr"   Śvr   r   r   r     s   ’zKeyTests._testPublicFromStringc                 C   sT   t j |”}|  | ” ” |  | ” |” | ” D ]\}}|  | ” | |” qd S rC   )	r   r'   rj   rz   ry   rK   r   r   r   )rA   r   r   r   Ś
privateKeyr"   r   r   r   r   r     s   ’zKeyTests._testPrivateFromStringc                 C   s   t j |”}|  |j” d S rC   )r   r'   rj   rx   Ś_sk)rA   rn   r   r   r   r   r     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rT|  tjdtj” |   tjtjdtj” dS dS )zN
        Test that keys are correctly generated from OpenSSH strings.
        ŚECŚRSAó	   encrypted©Ś
passphraseŚDSAŚEd25519N)r   r   rW   r_   r0   rU   r[   r)   rK   r   r'   rj   ŚprivateRSA_openssh_encryptedrV   r]   r-   r   rX   ŚSKECDatanistp256r   rZ   ŚSKEd25519DatarY   ra   r7   rF   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)rh   r   ri   r'   Ś_fromString_PRIVATE_OPENSSH©rA   Ś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)rK   r   r'   rj   ©rA   Ś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   testxpr   r   r   N)r   r'   rj   r   Ś privateRSA_openssh_encrypted_aesrK   r   )rA   Ś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 |”” q|  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.
        r   r   N)r   r[   r\   r]   r^   r_   r`   ŚprivateECDSA_openssh384ŚprivateECDSA_openssh384_newŚprivateECDSA_openssh521ŚprivateECDSA_openssh521_newrK   r   r'   rj   Ś privateRSA_openssh_encrypted_newr   )rA   Ś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)rK   r   r'   rj   Ś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ó   {ó   })r   N)	r   Śpackrh   r   ri   r'   rj   Śbase64Ś	b64encode©rA   Ś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“   rh   r   ri   r'   rj   r·   r   r   r   Ś"test_fromLSHPrivateUnsupportedTypeø  s   żz+KeyTests.test_fromLSHPrivateUnsupportedTypec                 C   ó   |   tjtjdtj” dS )zR
        RSA public and private keys can be generated from a LSH strings.
        r   N)r   r   rb   r@   r)   rF   r   r   r   Śtest_fromLSHRSAÅ  ó   üzKeyTests.test_fromLSHRSAc                 C   r»   )zH
        DSA public and private key can be generated from LSHs.
        r   N)r   r   rc   rd   r-   rF   r   r   r   Śtest_fromLSHDSAŠ  r½   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.
        r   r   s$      ssh-foo               N)r   r   re   r)   rf   r-   rh   r   ri   r'   rj   rF   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Ć¼sseltr   õ   verschluĢsseltõ   unassigned ļææN)	r   r'   r+   ŚtoStringŚencoderK   rj   rh   ŚPassphraseNormalizationError©rA   r¢   Ś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.
        ó    Śbad_types   unencryptedr   rĄ   r   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)
rh   r   ri   r'   rj   r   rb   ŚEncryptedKeyErrorr+   rÄ   rF   r   r   r   Śtest_fromStringErrorsś  sP   üż’ß$ß$ß$
ß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Ė   Śunencryptedr   N)
rK   r   r'   ŚfromFiler=   rj   r   r@   rh   ri   rF   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*   rK   )rA   Ś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.   rx   rz   Śobject©rA   Śrsa1Śrsa2Śrsa3Śdsar   r   r   Ś
test_equal·  ó   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.   rz   rx   r×   rŲ   r   r   r   Śtest_notEqualÅ  rŽ   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'   rh   ŚRuntimeErrorr   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)rK   r   r'   r+   Śfingerprintr.   rF   r   r   r   Śtest_fingerprintdefaultŚ  s   žžz KeyTests.test_fingerprintdefaultc                 C   ó@   |   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)rK   r   r'   r+   rä   ŚFingerprintFormatsŚMD5_HEXr.   rF   r   r   r   Śtest_fingerprint_md5_hexč  ó   žžz!KeyTests.test_fingerprint_md5_hexc                 C   rę   )z
        fingerprint method generates key fingerprint in
        L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
        z,FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=z,Wz5o2YbKyxOEcJn1au/UaALSVruUzfz0vaLI1xiIGyY=N)rK   r   r'   r+   rä   rē   ŚSHA256_BASE64r.   rF   r   r   r   Śtest_fingerprintsha256ö  rź   zKeyTests.test_fingerprintsha256c                 C   sV   |   tj”}t | j” d” W d   n1 sw   Y  |  d|jjd ” dS )zk
        A C{BadFingerPrintFormat} error is raised when unsupported
        formats are requested.
        zsha256-baseNz+Unsupported fingerprint format: sha256-baser   )	rh   r   ŚBadFingerPrintFormatr'   r+   rä   rK   Ś	exceptionŚargs)rA   Ś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
re|   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.
        r   ó   ssh-rsar   ó   ssh-dssr   r    r   ó   ssh-ed25519N)rK   r   r'   r+   r   ŚsshTyper.   r1   r   r0   r   r8   rh   rą   rF   r   r   r   Ś	test_type  s   ’zKeyTests.test_typec                 C   sŅ   |   t | j” ” g d¢” |   t | j” ” dg” |   t | j” ” dg” |   tj tj	” ” dg” t
rS|   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)rK   r   r'   r+   ŚsupportedSignatureAlgorithmsr.   r1   rj   r   rX   r   r8   rZ   rh   rą   rF   r   r   r   Ś!test_supportedSignatureAlgorithms#  s@   ž’ž’üž’üz*KeyTests.test_supportedSignatureAlgorithmsc                 C   ó"   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   ŚNSrh   r   ri   r'   rj   ©rA   ŚbadBlobr   r   r   Śtest_fromBlobUnsupportedTypeG  ó   
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'   rj   rx   ry   rK   r   )rA   ŚrsaPublicDataŚrsaBlobr{   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'   rj   rx   ry   rK   r   )rA   ŚdsaPublicDataŚdsaBlobr|   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   r0   r   rž   Śint_to_bytesr   r'   rj   rx   ry   rK   r   )rA   r  Ś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'   rj   rx   ry   r   rK   r   )rA   r  ŚskEcPublicDataŚskEcblobŚ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   r7   r   rž   r   r'   rj   rx   ry   rK   r   )rA   Śed25519PublicDataŚed25519Blobr~   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'   rj   rx   ry   r   rK   r   )rA   ŚskEd25519PublicDataŚskEd25519BlobŚskEd25519Keyr   r   r   Śtest_fromBlobSKEd25519æ  s   
’’zKeyTests.test_fromBlobSKEd25519c                 C   rü   )zh
        C{BadKeyError} is raised when loading a private blob with an
        unsupported type.
        rż   N)r   rž   rh   r   ri   r'   Ś_fromString_PRIVATE_BLOBr’   r   r   r   Ś#test_fromPrivateBlobUnsupportedTypeŃ  r  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   rz   ry   rK   r   ŚprivateBlob)rA   r  r{   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   rz   ry   rK   r   r"  )rA   r  r|   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'  ŚEllipticCurvePublicNumbersr   r0   Ś	SECP256R1r   rž   Ś
public_keyr	   Śpublic_bytesŚEncodingŚX962ŚPublicFormatŚUncompressedPointr  r   r'   r   rz   ry   rK   r   r"  )rA   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   r7   r   r'   r   rz   ry   rK   r   r"  )rA   r  r~   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)rK   r   r'   r+   rS   r   rž   r  Śprivate_numbersŚpublic_numbersr   r   rF   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.   r5  r6  rK   r   r'   rS   r   rž   r  Śparameter_numbersr   r   r   r   ©rA   r2  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  r1   r    Śkey_sizerK   r   r'   rS   r   rž   r   r0   r  r5  r6  r   r   )rA   r  Ś
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&  r8   r,  r-  r.  ŚRawr0  rK   r   r'   rS   r   rž   )rA   r&  ŚpublicBytesr   r   r   Śtest_blobEd25519f  s   
’žzKeyTests.test_blobEd25519c                 C   ó   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'   rh   rą   rS   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+   r5  rK   r   r'   r"  r   rž   r  r6  r   r   r   Śiqmpr   r   )rA   Ś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.   r5  r6  rK   r   r'   r"  r   rž   r  r8  r   r   r   r   r   r9  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&  rK   r   r'   r1   r"  r   rž   r   r0   r,  r-  r.  r/  r0  r1  r  r5  Śprivate_value)rA   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&  r8   r,  r-  r.  r@  r0  Śprivate_bytesŚPrivateFormatŚNoEncryptionrK   r   r'   r"  r   rž   )rA   r&  rA  ŚprivateBytesr   r   r   Śtest_privateBlobEd25519µ  s"   
’ż’žžz KeyTests.test_privateBlobEd25519c                 C   rC  )zV
        Raises L{RuntimeError} if the underlying key object does not exists.
        N)r   r'   rh   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Ą   r   r   s   DEK-Infor   Nr  ó   comment©Ścomment)r   r'   rj   r   re   rK   rÄ   Śstripr[   rx   Śfindrn   rU   ©rA   r¢   r   r   r   Śtest_toOpenSSHRSAÕ  s   ’’žzKeyTests.test_toOpenSSHRSAc                 C   ó   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   r   N)r   r'   rj   r   r[   rÄ   rK   Ś
splitlines©rA   r¢   Śnew_key_dataŚnew_enc_key_datar   r   r   Śtest_toOpenSSHRSA_v1_formatę  ó   ’’’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Ą   rQ  rR  Nr  )r   r'   rj   r   rd   rK   rÄ   rT  r]   rn   rV   rV  r   r   r   Śtest_toOpenSSHDSAų  s   ž’zKeyTests.test_toOpenSSHDSAc                 C   rX  )
zS
        L{keys.Key.toString} serializes a DSA key in OpenSSH's v1 format.
        rĄ   rY  rZ  rĢ   r\  r]  r   r   N)r   r'   rj   r   r]   rÄ   rK   r^  r_  r   r   r   Śtest_toOpenSSHDSA_v1_format  rc  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Ą   rQ  rR  Nr  )	r   r'   rj   r   r_   rK   rn   rÄ   rW   rV  r   r   r   Śtest_toOpenSSHECDSA  s   ž’zKeyTests.test_toOpenSSHECDSAc                 C   rX  )
zV
        L{keys.Key.toString} serializes an ECDSA key in OpenSSH's v1 format.
        rĄ   rY  rZ  rĢ   r\  r]  r   r   N)r   r'   rj   r   r_   rÄ   rK   r^  r_  r   r   r   Śtest_toOpenSSHECDSA_v1_format%  rc  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Ģ   r   r]  r   rY  rZ  N)r   r'   rj   r   ra   rÄ   rK   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Ą   ŚPEMrZ  N)r   r'   rj   r   ra   rh   Ś
ValueErrorrÄ   rV  r   r   r   Ś test_toOpenSSHEd25519_PEM_formatK  s   z)KeyTests.test_toOpenSSHEd25519_PEM_formatc                 C   ó>   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'   rj   r   r[   rK   rÄ   r@   rn   rb   rV  r   r   r   Śtest_toLSHRSAU  ó   zKeyTests.test_toLSHRSAc                 C   rl  )zJ
        L{keys.Key.toString} serializes a DSA key in LSH format.
        rm  N)
r   r'   rj   r   r]   rK   rÄ   rd   rn   rc   rV  r   r   r   Śtest_toLSHDSA]  ro  zKeyTests.test_toLSHDSAc                 C   ó&   t j tj”}|  | d”tj” dS )zP
        L{keys.Key.toString} serializes an RSA key in Agent v3 format.
        rR   N)r   r'   rj   r   r[   rK   rÄ   re   rV  r   r   r   Śtest_toAgentv3RSAe  ó   zKeyTests.test_toAgentv3RSAc                 C   rq  )zO
        L{keys.Key.toString} serializes a DSA key in Agent v3 format.
        rR   N)r   r'   rj   r   r]   rK   rÄ   rf   rV  r   r   r   Śtest_toAgentv3DSAl  rs  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Ā   r   rĮ   rĆ   N)	r   r'   r+   rÄ   rK   rj   rÅ   rh   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)rh   r   ri   r'   r+   rÄ   rF   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'   rj   r   r[   Śsignrx   rn   Śverifyr   ŚgetNSrK   ŚassertIsNoner*   r,  r   ŚPKCS1v15r
   ŚSHA1©rA   r   r¢   Ś	signatureŚsignatureTyper   r   r   Śtest_signAndVerifyRSA  s   

’’zKeyTests.test_signAndVerifyRSAc              	   C   ó   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.
        rw  rų   ©r  r   N)r   r'   rj   r   r[   rx  rx   rn   ry  r   rz  rK   r{  r*   r,  r   r|  r
   ŚSHA256r~  r   r   r   Śtest_signAndVerifyRSASHA256   ó   
’’z$KeyTests.test_signAndVerifyRSASHA256c              	   C   r  )zE
        Signed data can be verified using RSA with SHA-512.
        rw  r÷   r  r   N)r   r'   rj   r   r[   rx  rx   rn   ry  r   rz  rK   r{  r*   r,  r   r|  r
   ŚSHA512r~  r   r   r   Śtest_signAndVerifyRSASHA512²  r  z$KeyTests.test_signAndVerifyRSASHA512c                 C   óH   d}t j tj”}| |”}|  | ”  ||”” |  | ||”” dS )z8
        Signed data can be verified using DSA.
        rw  N)	r   r'   rj   r   r]   rx  rx   rn   ry  ©rA   r   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.
        rw  N)r   r'   rj   r   r_   rx  r„   r§   rx   rn   ry  )rA   r   r¢   r  Śkey384Śsignature384Śkey521Śsignature521r   r   r   Śtest_signAndVerifyECĪ  s   


zKeyTests.test_signAndVerifyECc                 C   r  )z<
        Signed data can be verified using Ed25519.
        rw  N)	r   r'   rj   r   ra   rx  rx   rn   ry  r  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'   rj   r   r[   rh   ŚBadSignatureAlgorithmErrorrx  r_   rV  r   r   r   Śtest_signWithWrongAlgorithmī  s   ü
üz$KeyTests.test_signWithWrongAlgorithmc                 C   óN   t j tj”}|  | | jd”” |  | | jd”” |  | | j	d”” dS )zC
        A known-good RSA signature verifies successfully.
        rŹ   ó   aN)
r   r'   rj   r   rU   rx   ry  r9   rz   r:   rV  r   r   r   Śtest_verifyRSA  ó   zKeyTests.test_verifyRSAc                 C   r  )zC
        A known-good DSA signature verifies successfully.
        rŹ   r  N)
r   r'   rj   r   rV   rx   ry  r:   rz   r9   rV  r   r   r   Śtest_verifyDSA  r  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'   rj   r   rV   rx   ry  r:   rV  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)rK   Śreprr   r'   r+   rF   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)rK   r  r   r'   r+   rn   rF   r   r   r   Śtest_reprPublicRSAm  s   žzKeyTests.test_reprPublicRSAc                 C   s2   |   tt | j” ” tdjdi 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}>
                Nr   )
rK   r  r   r'   r1   rn   r   Śformatr   r0   rF   r   r   r   Śtest_reprPublicECDSA  s   ’
ö
öžzKeyTests.test_reprPublicECDSAc                 C   s.   |   tt | j”tdjdi 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}>
                Nr   )	rK   r  r   r'   r1   r   r  r   r0   rF   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)rK   r  r   r'   r8   rn   r   rF   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)rK   r  r   r'   r8   r   rF   r   r   r   Śtest_reprPrivateEd25519Č  s   ’žz KeyTests.test_reprPrivateEd25519)_Ś__name__Ś
__module__Ś__qualname__r   ŚskipCryptographyr   rB   rG   rM   rg   rm   rw   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$  r3  r4  r7  r:  r?  rB  rD  rG  rH  rJ  rO  rP  rW  rb  rd  re  rf  rg  rh  rk  rn  rp  rr  rt  ru  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r”  r   r   r   r   r   *   sŹ    ?H1 *$	
	

	


	


		P
r   c                   @   s4   e Zd ZdZedu 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.pemrI   ©ŚkeySizeN)	r   r<   Śchildr   Ś_getPersistentRSAKeyrK   rL   rx   Śexists©rA   ŚtempDirr=   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.
        r§  rI   rØ  rH   N)
r   r<   rŖ  r   r«  rK   rL   rx   r¬  Ś
getContent)rA   r®  r=   r¢   Ś
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.
        r§  rI   rØ  Nr   )r   r<   rŖ  r   r«  r*   rK   rL   r­  r   r   r   Śtest_keySizeZero  s
   
z&PersistentRSAKeyTests.test_keySizeZero)
r¢  r£  r¤  Ś__doc__r   r„  r   rÆ  r²  r³  r   r   r   r   r¦  ß  s    r¦  )!r“  rµ   rD   Śtextwrapr   Śtwisted.conch.testr   Śtwisted.pythonr   Śtwisted.python.filepathr   Śtwisted.python.reflectr   Śtwisted.trialr   r   r„  Ścryptography.hazmat.backendsr	   r(  r
   r)  r   Śtwisted.conch.sshr   r   r   Śed25519_supportedr   r   ŚTestCaser   r¦  r   r   r   r   Ś<module>   sF                B