
    Vhz                    >   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
Zer2ddlmZ ddlmZ ddlmZ ddlmZmZmZ  e       j7                         ZndZd Z G d dej<                        Z G d dej<                        Z y)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                      t         sd| _        | S )Nz$ed25519 not supported on this system)ED25519_SUPPORTEDskip)fs    L/home/dcms/DCMS/lib/python3.12/site-packages/twisted/conch/test/test_keys.pyskipWithoutEd25519r   $   s    7H    c                   ~   e Zd ZeeZd Zd Zd Zd Z	d Z
d Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d% Z)d& Z*d' Z+d( Z,d) Z-d* Z.e/d+        Z0d, Z1d- Z2d. Z3d/ Z4d0 Z5e/d1        Z6d2 Z7d3 Z8d4 Z9e/d5        Z:d6 Z;d7 Z<d8 Z=d9 Z>e/d:        Z?d; Z@d< ZAd= ZBd> ZCd? ZDd@ ZEdA ZFe/dB        ZGe/dC        ZHdD ZIdE ZJdF ZKdG ZLdH ZMdI ZNdJ ZOdK ZPdL ZQdM ZRdN ZSe/dO        ZTdP ZUdQ ZVdR ZWdS ZXdT ZYdU ZZdV Z[dW Z\e/dX        Z]e/dY        Z^y)ZKeyTestsNc           	         t         j                  j                  t        j                  d   t        j                  d   t        j                  d   t        j                  d   t        j                  d   t        j                  d         j
                  | _        t         j                  j                  t        j                  d   t        j                  d   t        j                  d   t        j                  d	   t        j                  d
         j
                  | _	        t         j                  j                  t        j                  d
   t        j                  d   t        j                  d   t        j                  d         j
                  | _        t         j                  j                  t        j                  d
   t        j                  d   t        j                  d   t        j                  d         j
                  | _        t         j                  j                  t        j                  d
   t        j                  d   t        j                  d   t        j                  d         j
                  | _        t"        rRt         j                  j%                  t        j&                  d   t        j&                  d         j
                  | _        d| _        d| _        | j/                  t0        dd        | j3                         | _        t7        | j4                  d      5 }|j9                  t        j:                         d d d        y # 1 sw Y   y xY w)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   ~YWpu@1SOE/xG3Ud,'=QgxjIޯb@rΣzM1q5{wjKNCi}RTDJHl[|^nъaYBǾ79j.9p?N/)
>AµjUWԮBtyfˆkuNɓY.VL44`CǦ6Y% 4^rY .%HAs7      ssh-dss   (?;TFAE@4,d	ٮ[-nQfjrgp<secureRandomc                     d| z  S )N    )r"   s    r   <lambda>z KeyTests.setUp.<locals>.<lambda>h   s
    ! r   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   s     r   setUpzKeyTests.setUp.   s   hh11ooc"ooc"ooc"ooc"ooc"ooc" 2 
 * 	 hh11ooc"ooc"ooc"ooc"ooc" 2 
 * 	 XX//$$S)$$S) //?((1	 0 

 * 	
 22$$S)$$S) //?((1	 3 

 * 	 22$$S)$$S) //?((1	 3 

 * 	 "hh==%%c*g.A.A#.F > j O; 	  	
 	

9n.CD{{}$,,% 	,GGG**+	, 	, 	,s   . MM c                 B    t        j                  | j                         y N)osunlinkrC   rG   s    r   tearDownzKeyTests.tearDownm   s    
		$,,r   c                    | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j
                        j	                         d       | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j	                         d       t        r>| j                  t        j                  | j                        j	                         d       yy)zU
        The L{keys.Key.size} method returns the size of key object in bits.
                 i  i	  N)assertEqualr   r-   r1   sizer4   r7   r9   r;   r   r>   rM   s    r   	test_sizezKeyTests.test_sizep   s     	$++.335t<$++.335t<$**-224c:$--0557=$--0557=TXXdoo6;;=sC r   c                 ,
   | j                  t        j                  j                  t        j
                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                        d       | j                  t        j                  j                  t        j                         d       | j                  t        j                  j                  t        j"                        d       | j                  t        j                  j                  t        j$                        d       | j                  t        j                  j                  t        j&                        d       | j                  t        j                  j                  t        j(                        d       | j                  t        j                  j                  t        j*                        d       | j                  t        j                  j                  t        j,                        d       | j                  t        j                  j                  t        j.                        d       | j                  t        j                  j                  d      d       | j                  t        j                  j                  d      d       | j                  t        j                  j                  d	      d
       y
)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)rS   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_lshrF   privateDSA_lshprivateRSA_agentv3privateDSA_agentv3rM   s    r   test__guessStringTypezKeyTests.test__guessStringType|   s   
 	HH%%g&?&?@BR	
 	HH%%g&?&?@BR	
 	HH%%g&A&ABDT	
 	HH%%g&C&CDFV	
 	HH%%g&C&CD	
 	HH%%g&E&EF	
 	HH%%g&@&@ACT	
 	HH%%g&D&DEGX	
 	HH%%g&@&@ACT	
 	HH%%g&D&DEGX	
 	HH%%g&B&BCEV	
 	HH%%g&F&FG	
 	HH%%g&H&HI	
 	2273H3HI<X2273H3HI<XHH%%g&<&<=}	
 	HH%%g&<&<=}	
 	HH%%g&@&@A9	
 	HH%%g&@&@A9	
 	HH%%&TU	
 	HH%%&TU	
 	22<@$Gr   c                     | j                  t        j                  t        j                  j                  t
        j                         | j                  t        j                  t        j                  j                  t
        j                         y)z=
        OpenSSH certificates are not yet supported.
        N)assertRaisesr   BadKeyErrorr-   
fromStringr   publicSKEd25519_cert_opensshpublicSKECDSA_cert_opensshrM   s    r   test_OpenSSH_cert_not_supportedz(KeyTests.test_OpenSSH_cert_not_supported   s`     	HH00	

 	HH..	
r   c                 R   t         j                  j                  t        j                        }t         j                  j                  t        j
                        }| j                  |j                         |j                                t         j                  j                  t        j                        }t         j                  j                  t        j                        }| j                  |j                         |j                                t         j                  j                  t        j                        }t         j                  j                  t        j                        }| j                  |j                         |j                                t        rt         j                  j                  t        j                        }t         j                  j                  t        j                        }| j                  |j                         |j                                yy)zn
        The L{keys.Key.public} method returns a public key for both
        public and private keys.
        N)r   r-   rt   r   rd   r^   rS   publicrf   r_   rh   r`   r   rj   rb   )	rG   privateRSAKeypublicRSAKeyprivateDSAKeypublicDSAKeyprivateECDSAKeypublicECDSAKeyprivateEd25519KeypublicEd25519Keys	            r   test_publiczKeyTests.test_public   sh    ++G,F,FGxx**7+D+DE--/1D1D1FG++G,F,FGxx**7+D+DE--/1D1D1FG((--g.J.JK,,W-H-HI//1>3H3H3JK $ 3 3G4V4V W#xx2273P3PQ.5579I9P9P9RS r   c                    t         j                  j                  t        j                        }t         j                  j                  t        j
                        }t         j                  j                  t        j                        }| j                  |j                         j                                | j                  |j                                | j                  |j                         j                                | j                  |j                                | j                  |j                         j                                | j                  |j                                t        rzt         j                  j                  t        j                        }| j                  |j                         j                                | j                  |j                                yy)zg
        The L{keys.Key.isPublic} method returns True for public keys
        otherwise False.
        N)r   r-   rt   r   rd   rf   rh   
assertTruery   isPublicassertFalser   rj   )rG   rsaKeydsaKeyecdsaKey
ed25519Keys        r   test_isPubliczKeyTests.test_isPublic   s<   
 $$W%?%?@$$W%?%?@88&&w'C'CD0023*+0023*+)2245**,-,,W-O-OPJOOJ--/88:;Z0023 r   c                 P    | j                  |||       | j                  |||       y rJ   )_testPublicFromString_testPrivateFromString)rG   ry   privatetypedatas        r   _testPublicPrivateFromStringz%KeyTests._testPublicPrivateFromString   s&    ""646##GT48r   c                 L    | j                  |||       | j                  |       y rJ   )r   _testSKFromString)rG   ry   r   r   s       r   _testPublicSKFromStringz KeyTests._testPublicSKFromString  s"    ""646v&r   c                 6   t         j                  j                  |      }| j                  |j	                                | j                  |j                         |       |j                         j                         D ]  \  }}| j                  ||   |        y rJ   )	r   r-   rt   r   r   rS   r   r   items)rG   ry   r   r   	publicKeyr&   vs          r   r   zKeyTests._testPublicFromString  sy    HH''/		**,-)40NN$**, 	)DAqT!Wa(	)r   c                 6   t         j                  j                  |      }| j                  |j	                                | j                  |j                         |       |j                         D ](  \  }}| j                  |j                         |   |       * y rJ   )	r   r-   rt   r   r   rS   r   r   r   )rG   r   r   r   
privateKeyr&   r   s          r   r   zKeyTests._testPrivateFromString  sy    XX((1
,,./*D1JJL 	6DAqZ__.q115	6r   c                 x    t         j                  j                  |      }| j                  |j                         y rJ   )r   r-   rt   r   _sk)rG   ry   r   s      r   r   zKeyTests._testSKFromString  s&    HH''/		&r   c                    | j                  t        j                  t        j                  dt        j                         | j                  t        j
                  t        j                  dt        j                         | j                  t        j                  j                  t        j                  d      t        j                  j                  t        j                               | j                  t        j                  t        j                  dt        j                         | j!                  t        j"                  dt        j$                         t&        rn| j!                  t        j(                  dt        j*                         | j                  t        j,                  t        j.                  dt        j0                         yy)zN
        Test that keys are correctly generated from OpenSSH strings.
        ECRSA	   encrypted
passphraseDSAEd25519N)r   r   r`   rh   r6   r^   rd   r/   rS   r   r-   rt   privateRSA_openssh_encryptedr_   rf   r3   r   ra   SKECDatanistp256r   rc   SKEd25519Datarb   rj   r=   rM   s    r   test_fromOpenSSHzKeyTests.test_fromOpenSSH  sT    	))''((""		
 	))%%&&OO		
 	HH44    HH : :;		
 	))%%&&OO		
 	$$))$$	
 ((//%% ----22##	 r   c                 |    d}| j                  t        j                  t        j                  j                  |d       y)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)rr   r   rs   r-   _fromString_PRIVATE_OPENSSHrG   badKeys     r   test_fromOpenSSHErrorszKeyTests.test_fromOpenSSHErrorsJ  s2      	dhhBBFD	
r   c                     d}| j                  t        j                  j                  |      t        j                  j                  |dz                y)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)rS   r   r-   rt   rG   privateDSADatas     r    test_fromOpenSSH_with_whitespacez)KeyTests.test_fromOpenSSH_with_whitespaceX  sB    ! 	HH/HH 67	
r   c                 *   t         j                  j                  t        j                  d      }| j                  |j                         d       t         j                  j                  t        j                  dz   d      }| j                  ||       y)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-   rt   r    privateRSA_openssh_encrypted_aesrS   r   )rG   keykey2s      r   test_fromNewerOpenSSHzKeyTests.test_fromNewerOpenSSHo  s{    
 hh!!44 " 
 	U+xx""44u< # 
 	d#r   c                    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 ]Q  \  }}| j                  t        j                  j                  |      t        j                  j                  |             S | j                  t        j                  j                  t         j                  d      t        j                  j                  t         j                   d             y)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   rd   re   rf   rg   rh   ri   privateECDSA_openssh384privateECDSA_openssh384_newprivateECDSA_openssh521privateECDSA_openssh521_newrS   r   r-   rt    privateRSA_openssh_encrypted_newr   )rG   oldnews      r   test_fromOpenSSH_v1_formatz#KeyTests.test_fromOpenSSH_v1_format}  s    '')G)GH'')G)GH))7+K+KL,,g.Q.QR,,g.Q.QR
 	QHC TXX005txx7J7J37OP	Q 	HH88\    HH44   		
r   c           	          d}| j                  t        j                  j                  |      t        j                  j                  |j	                  dd                   y)zp
        Test that keys are correctly generated from OpenSSH strings with
        Windows line endings.
        r   r   s   
N)rS   r   r-   rt   replacer   s     r   %test_fromOpenSSH_windows_line_endingsz.KeyTests.test_fromOpenSSH_windows_line_endings  sJ    
! 	HH/HH 6 6ug FG	
r   c                     t        j                  ddddgggg      }| j                  t        j                  t        j
                  j                  dt        j                  |      z   dz          y)	za
        C{BadKeyError} exception is raised when public key has an unknown
        type.
        s
   public-key   bad-key   p   2   {   })r   N)	r   packrr   r   rs   r-   rt   base64	b64encoderG   sexps     r   !test_fromLSHPublicUnsupportedTypez*KeyTests.test_fromLSHPublicUnsupportedType  sd    
 zzMJt+EFGHHH((..5 	 	
r   c                     t        j                  ddddgggg      }| j                  t        j                  t        j
                  j                  |       y)zb
        C{BadKeyError} exception is raised when private key has an unknown
        type.
        s   private-keyr   r   r   N)r   r   rr   r   rs   r-   rt   r   s     r   "test_fromLSHPrivateUnsupportedTypez+KeyTests.test_fromLSHPrivateUnsupportedType  sJ    
 zzNZ$,FGHIHH	
r   c                     | j                  t        j                  t        j                  dt        j                         y)zR
        RSA public and private keys can be generated from a LSH strings.
        r   N)r   r   rk   rF   r/   rM   s    r   test_fromLSHRSAzKeyTests.test_fromLSHRSA  .     	))!!""OO		
r   c                     | j                  t        j                  t        j                  dt        j                         y)zH
        DSA public and private key can be generated from LSHs.
        r   N)r   r   rl   rm   r3   rM   s    r   test_fromLSHDSAzKeyTests.test_fromLSHDSA  r   r   c                 2   | j                  t        j                  dt        j                         | j                  t        j                  dt        j
                         | j                  t        j                  t        j                  j                  d       y)zO
        Test that keys are correctly generated from Agent v3 strings.
        r   r   s$      ssh-foo               N)r   r   rn   r/   ro   r3   rr   r   rs   r-   rt   rM   s    r   test_fromAgentv3zKeyTests.test_fromAgentv3  sc     	##G$>$>wW##G$>$>wWHHD	
r   c                 \   t        j                  | j                        }|j                  ddj	                               }| j                  t         j                  j                  |d      |       | j                  t         j                  t         j                  j                  |d       y)zf
        L{keys.Key.fromString} applies Normalization Form KC to Unicode
        passphrases.
        openssh   verschlüsseltr      verschlüsselt   unassigned ￿N)	r   r-   r1   toStringencoderS   rt   rr   PassphraseNormalizationErrorrG   r   key_datas      r   *test_fromStringNormalizesUnicodePassphrasez3KeyTests.test_fromStringNormalizesUnicodePassphrase  s    
 hht{{#<<	6J6Q6Q6S<THH5JKS	

 	--HH*	 	 	
r   c                    | j                  t        j                  t        j                  j                  d       | j                  t        j                  t        j                  j                  dd       | j                  t        j                  t        j                  j                  t
        j                  d       | j                  t        j                  t        j                  j                  t        j                  | j                        j                  dd             | j                  t        j                  t        j                  j                  d       | j                  t        j                  t        j                  j                  dd	       | j                  t        j                  t        j                  j                  d
d	       | j                  t        j                  t        j                  j                  dd	       | j                  t        j                  t        j                  j                  dd	       y)zW
        keys.Key.fromString should raise BadKeyError when the key is invalid.
        r   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)
rr   r   rs   r-   rt   r   rk   EncryptedKeyErrorr1   r   rM   s    r   test_fromStringErrorszKeyTests.test_fromStringErrors  s    	$**DHH,?,?E$**DHH,?,?jQHH!!%	 	 	
 	""HHHHT[[!**9*N	
 	dhh113U	
 	HH!< #C 	 "	
H 	HH!< #C 	 "	
H 	HH!< #C 	 "	
H 	HH!< #C 	 "	
r   c                    | j                  t        j                  j                  | j                        t        j                  j                  t        j                               | j                  t        j                  t        j                  j                  | j                  d       | j                  t        j                  t        j                  j                  | j                  d       y)z5
        Test that fromFile works correctly.
        r   unencryptedr   N)
rS   r   r-   fromFilerC   rt   r   rF   rr   rs   rM   s    r   test_fromFilezKeyTests.test_fromFile  s     	HHdll+TXX-@-@AWAW-X	
 	$**DHH,=,=t||ZXdhh//- 	 	
r   c                     t         j                  j                  dd      j                  }t        j                  |      }| j	                  |j                  |       y)zJ
        Test that the PublicKey object is initialized correctly.
              r   r   N)r   r-   r.   r0   rS   )rG   objr   s      r   	test_initzKeyTests.test_init  sD     hh))A)3>>hhsm-r   c                 
   t        j                  | j                        }t        j                  | j                        }t        j                  t         j                  j                  dd      j                        }t        j                  | j
                        }| j                  ||k(         | j                  ||k(         | j                  ||k(         | j                  |t        k(         | j                  |dk(         y)z?
        Test that Key objects are compared correctly.
        r   r   r   N)	r   r-   r1   r.   r0   r4   r   r   objectrG   rsa1rsa2rsa3dsas        r   
test_equalzKeyTests.test_equal  s     xx$xx$xx33a13=HHIhht{{#%&%(&r   c                 
   t        j                  | j                        }t        j                  | j                        }t        j                  t         j                  j                  dd      j                        }t        j                  | j
                        }| j                  ||k7         | j                  ||k7         | j                  ||k7         | j                  |t        k7         | j                  |dk7         y)zC
        Test that Key objects are not-compared correctly.
        r   r   r   N)	r   r-   r1   r.   r0   r4   r   r   r   r   s        r   test_notEqualzKeyTests.test_notEqual  s     xx$xx$xx33a13=HHIhht{{#&%$'%r   c                 n    t        j                  d      }| j                  t        |j                         y)zO
        The L{keys.Key.data} method raises RuntimeError for bad keys.
        r   N)r   r-   rr   RuntimeErrorr   r   s     r   test_dataErrorzKeyTests.test_dataError  s%     #,4r   c                     | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j
                        j	                         d       y)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)rS   r   r-   r1   fingerprintr4   rM   s    r   test_fingerprintdefaultz KeyTests.test_fingerprintdefault  sZ    
 	HHT[[!--/=	
 	HHT[[!--/=	
r   c                 \   | j                  t        j                  | j                        j	                  t        j
                  j                        d       | j                  t        j                  | j                        j	                  t        j
                  j                        d       y)z
        fingerprint method generates key fingerprint in
        L{FingerprintFormats.MD5-HEX} format if explicitly specified.
        r  r  N)rS   r   r-   r1   r  FingerprintFormatsMD5_HEXr4   rM   s    r   test_fingerprint_md5_hexz!KeyTests.test_fingerprint_md5_hex  sv    
 	HHT[[!--d.E.E.M.MN=	
 	HHT[[!--d.E.E.M.MN=	
r   c                 \   | j                  t        j                  | j                        j	                  t        j
                  j                        d       | j                  t        j                  | j                        j	                  t        j
                  j                        d       y)z
        fingerprint method generates key fingerprint in
        L{FingerprintFormats.SHA256-BASE64} format if explicitly specified.
        z,FBTCOoknq0mHy+kpfnY9tDdcAJuWtCpuQMaV3EsvbUI=z,Wz5o2YbKyxOEcJn1au/UaALSVruUzfz0vaLI1xiIGyY=N)rS   r   r-   r1   r  r  SHA256_BASE64r4   rM   s    r   test_fingerprintsha256zKeyTests.test_fingerprintsha256  sv    
 	HHT[[!--d.E.E.S.ST:	
 	HHT[[!--d.E.E.S.ST:	
r   c                    | j                  t        j                        5 }t        j                  | j                        j                  d       ddd       | j                  dj                  j                  d          y# 1 sw Y   3xY w)zk
        A C{BadFingerPrintFormat} error is raised when unsupported
        formats are requested.
        zsha256-baseNz+Unsupported fingerprint format: sha256-baser   )	rr   r   BadFingerPrintFormatr-   r1   r  rS   	exceptionargs)rG   ems     r   test_fingerprintBadFormatz"KeyTests.test_fingerprintBadFormat  sl    
 t889 	=RHHT[[!--m<	=92<<;L;LQ;O	
	= 	=s   /BB
c                    | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j                         d       | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j                         d       | j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j                         t        j                  d          t        rz| j                  t        j                  | j                        j	                         d       | j                  t        j                  | j                        j                         d       | j                  t        t        j                  d	      j                         | j                  t        t        j                  d	      j
                         | j                  t        t        j                  |       j                         | j                  t        t        j                  |       j
                         y	)
zS
        Test that the type method returns the correct type for an object.
        r      ssh-rsar      ssh-dssr   r$   r      ssh-ed25519N)rS   r   r-   r1   r   sshTyper4   r7   r   r6   r   r>   rr   r   rM   s    r   	test_typezKeyTests.test_type  s    	$++.335u=$++.668*E$++.335u=$++.668*E$**-224d;HHTZZ ((*G,B,B7,K	
 TXXdoo6;;=yITXXdoo6>>@.Q,(;(;<,(>(>?,(;(;<,(>(>?r   c                    | j                  t        j                  | j                        j	                         g d       | j                  t        j                  | j
                        j	                         dg       | j                  t        j                  | j                        j	                         dg       | j                  t        j                  j                  t        j                        j	                         dg       t        r| j                  t        j                  | j                        j	                         dg       | j                  t        j                  j                  t        j                        j	                         dg       | j                  t        t        j                  d      j                         | j                  t        t        j                  |       j                         y)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)rS   r   r-   r1   supportedSignatureAlgorithmsr4   r7   rt   r   ra   r   r>   rc   rr   r   rM   s    r   !test_supportedSignatureAlgorithmsz*KeyTests.test_supportedSignatureAlgorithms#  sn   
 	HHT[[!>>@:	
 	HHT[[!>>@:,	
 	HHTZZ ==?#$	
 	HH--**,23		
 )FFH  ##33..0./	 	,(S(ST,(S(STr   c                     t        j                  d      }| j                  t        j                  t        j
                  j                  |       y)ze
        A C{BadKeyError} error is raised whey the blob has an unsupported
        key type.
           ssh-badN)r   NSrr   r   rs   r-   rt   rG   badBlobs     r   test_fromBlobUnsupportedTypez%KeyTests.test_fromBlobUnsupportedTypeG  s4    
 ))J'$**DHH,?,?Ir   c                    t         j                  d   t         j                  d   d}t        j                  d      t        j                  |d         z   t        j                  |d         z   }t
        j                  j                  |      }| j                  |j                                | j                  ||j                                y)zQ
        A public RSA key is correctly generated from a public key blob.
        r   r   r   r  N)r   r/   r   r"  MPr   r-   rt   r   r   rS   r   )rG   rsaPublicDatarsaBlobr   s       r   test_fromBlobRSAzKeyTests.test_fromBlobRSAP  s    
 %%

 IIj!iic*+,iic*+, 	 $$W-)*6r   c                 H   t         j                  d   t         j                  d   t         j                  d   t         j                  d   d}t        j                  d      t        j                  |d         z   t        j                  |d         z   t        j                  |d         z   t        j                  |d         z   }t
        j                  j                  |      }| j                  |j                                | j                  ||j                                y)zQ
        A public DSA key is correctly generated from a public key blob.
        r   r   r!   r    )r   r   r!   r    r  N)r   r3   r   r"  r'  r   r-   rt   r   r   rS   r   )rG   dsaPublicDatadsaBlobr   s       r   test_fromBlobDSAzKeyTests.test_fromBlobDSAc  s    
 %%%%	
 IIj!iic*+,iic*+, iic*+, iic*+	, 	 $$W-)*6r   c                 *   ddl m} t        j                  d   t        j                  d   t        j                  d   d}t	        j
                  |d         t	        j
                  |d   dd       z   t	        j
                  d	|j                  |d   d
      z   |j                  |d   d
      z         z   }t        j                  j                  |      }| j                  |j                                | j                  ||j                                y)zA
        Key.fromString generates ECDSA keys from blobs.
        r   utilsr"   r    r$   r"   r    r$   N       )r	   r1  r   r6   r   r"  int_to_bytesr   r-   rt   r   r   rS   r   )rG   r1  ecPublicDataecblobeckeys        r   test_fromBlobECDSAzKeyTests.test_fromBlobECDSAz  s     	' '','',++G4
 IIl7+,iiW-bc234ii$$\#%6;<$$\#%6;< 	 ##F+()uzz|4r   c                    ddl m} t        j                  d   t        j                  d   t        j                  d   d}t	        j
                  t        j                  d         t	        j
                  t        j                  d   dd       z   t	        j
                  d	|j                  |d   d
      z   |j                  |d   d
      z         z   }t        j                  j                  |      }| j                  |j                                | j                  |j                         | j                  ||j                                y)zC
        It can load public SK-ECDSA key from blob format.
        r   r0  r"   r    r$   r2  r3  Nr4  r5  )r	   r1  r   r   r   r"  r6  r   r-   rt   r   r   r   rS   r   )rG   r1  skEcPublicDataskEcblobskEckeys        r   test_fromBlobSKECDSAzKeyTests.test_fromBlobSKECDSA  s    	' ))#.))#.--g6
 IIg..w78ii009"#>?@ii$$^C%8"=>$$^C%8"=> 	 ((%%h/((*+$8r   c                 F   dt         j                  d   i}t        j                  d      t        j                  |d         z   }t        j
                  j                  |      }| j                  |j                                | j                  ||j                                y)zU
        A public Ed25519 key is correctly generated from a public key blob.
        r%   r  N)r   r=   r   r"  r   r-   rt   r   r   rS   r   )rG   ed25519PublicDataed25519Blobr   s       r   test_fromBlobEd25519zKeyTests.test_fromBlobEd25519  s     $$S)
 ii/&))<Mc<R2SSXX((5

++-.*JOO,=>r   c                 |   dt         j                  d   i}t        j                  d      t        j                  |d         z   }t        j
                  j                  |      }| j                  |j                                | j                  |j                         | j                  ||j                                y)zX
        A public SK-Ed25519 key is correctly generated from a public key blob.
        r%   r  N)r   r   r   r"  r   r-   rt   r   r   r   rS   r   )rG   skEd25519PublicDataskEd25519BlobskEd25519Keys       r   test_fromBlobSKEd25519zKeyTests.test_fromBlobSKEd25519  s    
 &&s+
 		"?@699$D
 
 xx**=9--/0((),l.?.?.ABr   c                     t        j                  d      }| j                  t        j                  t        j
                  j                  |       y)zh
        C{BadKeyError} is raised when loading a private blob with an
        unsupported type.
        r!  N)r   r"  rr   r   rs   r-   _fromString_PRIVATE_BLOBr#  s     r   #test_fromPrivateBlobUnsupportedTypez,KeyTests.test_fromPrivateBlobUnsupportedType  s4    
 ))J'$**DHH,M,MwWr   c                 T   t        j                  d      t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   }t
        j                  j                  |      }| j                  |j                                | j                  t        j                  |j                                | j                  |t
        j                  j                  |j                                      y)	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-   rJ  r   r   rS   r   privateBlob)rG   r)  r   s      r   test_fromPrivateBlobRSAz KeyTests.test_fromPrivateBlobRSA  s)   
 IIj!ii,-.ii,-. ii,-. ii,-	.
 ii,-. ii,-. 	 227;*+&++-8DHH55f6H6H6JK	
r   c                    t        j                  d      t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   t        j                  t        j                  d         z   }t
        j                  j                  |      }| j                  |j                                | j                  t        j                  |j                                | j                  |t
        j                  j                  |j                                      y)zS
        A private DSA key is correctly generated from a private key blob.
        r  r   r   r!   r    r"   N)r   r"  r'  r   r3   r   r-   rJ  r   r   rS   r   rM  )rG   r-  r   s      r   test_fromPrivateBlobDSAz KeyTests.test_fromPrivateBlobDSA  s   
 IIj!ii,-.ii,-. ii,-. ii,-	.
 ii,-. 	 227;*+&++-8DHH55f6H6H6JK	
r   c                    ddl m} ddlm} |j	                  t
        j                  d   t
        j                  d   |j                               }t        j                  t
        j                  d         t        j                  t
        j                  d   dd	       z   t        j                  |j                  t                     j                  |j                  j                  |j                  j                               z   t        j"                  t
        j                  d
         z   }t$        j&                  j)                  |      }| j+                  |j-                                | j/                  t
        j                  |j1                                | j/                  |t$        j&                  j)                  |j3                                      y	)zR
        A private EC key is correctly generated from a private key blob.
        r   serialization)ecr"   r    r2  r$   r3  Nr#   )cryptography.hazmat.primitivesrS  )cryptography.hazmat.primitives.asymmetricrT  EllipticCurvePublicNumbersr   r6   	SECP256R1r   r"  
public_keyr
   public_bytesEncodingX962PublicFormatUncompressedPointr'  r   r-   rJ  r   r   rS   r   rM  )rG   rS  rT  publicNumbersr8  r9  s         r   test_fromPrivateBlobECDSAz"KeyTests.test_fromPrivateBlobECDSA  s_    	A@55$$S)$$S),,. 6 
 IIg,,W56ii..w7<=>ii(():;HH!**//!..@@ ii..~>?@ 	 11&9)*//> A A%BSBSBU VWr   c                 D   t        j                  d      t        j                  t        j                  d         z   t        j                  t        j                  d   t        j                  d   z         z   }t        j
                  j                  |      }| j                  |j                                | j                  t        j                  |j                                | j                  |t        j
                  j                  |j                                      y)zW
        A private Ed25519 key is correctly generated from a private key blob.
        r  r%   r&   N)r   r"  r   r=   r   r-   rJ  r   r   rS   r   rM  )rG   rB  r   s      r   test_fromPrivateBlobEd25519z$KeyTests.test_fromPrivateBlobEd25519#  s     IIn%ii++C012ii++C073F3Fs3KKLM 	 XX66{C
,,./,,joo.?@99*:P:P:RS	
r   c                    | j                  t        j                  | j                        j	                         t        j                  d      t        j                  | j                  j                         j                  j                        z   t        j                  | j                  j                         j                  j                        z          y)zL
        Return the over-the-wire SSH format of the RSA public key.
        r  N)rS   r   r-   r1   r\   r   r"  r'  private_numberspublic_numbersr   r   rM   s    r   test_blobRSAzKeyTests.test_blobRSA6  s     	HHT[[!&&(IIj!ii335DDFFGHii335DDFFGH	
r   c                 (   | j                   j                         j                  }| j                  t	        j
                  | j                         j                         t        j                  d      t        j                  |j                  j                        z   t        j                  |j                  j                        z   t        j                  |j                  j                        z   t        j                  |j                        z          y)zL
        Return the over-the-wire SSH format of the DSA public key.
        r  N)r4   rd  re  rS   r   r-   r\   r   r"  r'  parameter_numbersr   r   r!   r    rG   r_  s     r   test_blobDSAzKeyTests.test_blobDSAA  s     335DDHHT[[!&&(IIj!ii7799:;ii7799:; ii7799:; ii(	)	
r   c                    ddl m} | j                  j                  j                  dz   dz  }| j                  t        j                  | j                        j                         t        j                  t        j                  d         t        j                  t        j                  d   dd       z   t        j                  d|j                  | j                  j                         j                  j                   |      z   |j                  | j                  j                         j                  j"                  |      z         z          y)	zK
        Return the over-the-wire SSH format of the EC public key.
        r   r0        r$   r3  Nr4  )r	   r1  r7   r$   key_sizerS   r   r-   r\   r   r"  r   r6   r6  rd  re  r"   r    )rG   r1  
byteLengths      r   test_blobECzKeyTests.test_blobECP  s     	'jj&&//!39
HHTZZ %%'IIg,,W56ii..w7<=>ii$$JJ..0??AA: $$JJ..0??AA:	
	
r   c                    ddl m} | j                  j                         j	                  |j
                  j                  |j                  j                        }| j                  t        j                  | j                        j                         t        j                  d      t        j                  |      z          y)zP
        Return the over-the-wire SSH format of the Ed25519 public key.
        r   rR  r  N)rU  rS  r>   rY  rZ  r[  Rawr]  rS   r   r-   r\   r   r"  )rG   rS  publicBytess      r   test_blobEd25519zKeyTests.test_blobEd25519f  s    
 	Aoo002??""&&(B(B(F(F
 	HHT__%**,IIn%		+(>>	
r   c                 n    t        j                  d      }| j                  t        |j                         y)zx
        C{RuntimeError} is raised when the blob is requested for a Key
        which is not wrapping anything.
        N)r   r-   rr   r   r\   r   s     r   test_blobNoKeyzKeyTests.test_blobNoKeyv  s%    
 $,4r   c                    | j                   j                         }| j                  t        j                  | j                         j                         t        j                  d      t        j                  |j                  j                        z   t        j                  |j                  j                        z   t        j                  |j                        z   t        j                  |j                        z   t        j                  |j                        z   t        j                  |j                        z          y)zn
        L{keys.Key.privateBlob} returns the SSH protocol-level format of an
        RSA private key.
        r  N)r1   rd  rS   r   r-   rM  r   r"  r'  re  r   r   r   iqmpr   r   )rG   numberss     r   test_privateBlobRSAzKeyTests.test_privateBlobRSA  s    
 ++--/HHT[[!--/IIj!ii..0012ii..0012 ii		"# ii%	&
 ii		"# ii		"#		
r   c                    | j                   j                         j                  }| j                  t	        j
                  | j                         j                         t        j                  d      t        j                  |j                  j                        z   t        j                  |j                  j                        z   t        j                  |j                  j                        z   t        j                  |j                        z   t        j                  | j                   j                         j                        z          y)zm
        L{keys.Key.privateBlob} returns the SSH protocol-level format of a DSA
        private key.
        r  N)r4   rd  re  rS   r   r-   rM  r   r"  r'  rh  r   r   r!   r    r"   ri  s     r   test_privateBlobDSAzKeyTests.test_privateBlobDSA  s    
 335DDHHT[[!--/IIj!ii7799:;ii7799:; ii7799:; ii(	)
 ii3357789	
r   c           
      b   ddl m} | j                  t        j                  | j
                        j                         t        j                  t        j                  d         t        j                  t        j                  d   dd       z   t        j                  | j
                  j                         j                  |j                  j                  |j                  j                               z   t        j"                  | j
                  j%                         j&                        z          y)zj
        L{keys.Key.privateBlob} returns the SSH ptotocol-level format of EC
        private key.
        r   rR  r$   r3  N)rU  rS  rS   r   r-   r7   rM  r   r"  r   r6   rY  rZ  r[  r\  r]  r^  r'  rd  private_value)rG   rS  s     r   test_privateBlobECzKeyTests.test_privateBlobEC  s    
 	AHHTZZ ,,.IIg,,W56ii..w7<=>ii

%%'44!**//!..@@ ii

224BBCD	
r   c                 X   ddl m} | j                  j                         j	                  |j
                  j                  |j                  j                        }| j                  j                  |j
                  j                  |j                  j                  |j                               }| j                  t        j                  | j                        j                         t        j                   d      t        j                   |      z   t        j                   ||z         z          y)zr
        L{keys.Key.privateBlob} returns the SSH protocol-level format of an
        Ed25519 private key.
        r   rR  r  N)rU  rS  r>   rY  rZ  r[  rr  r]  private_bytesPrivateFormatNoEncryptionrS   r   r-   rM  r   r"  )rG   rS  rs  privateBytess       r   test_privateBlobEd25519z KeyTests.test_privateBlobEd25519  s     	Aoo002??""&&(B(B(F(F
 44""&&''++&&(
 	HHT__%113IIn%ii$%ii{234	
r   c                 n    t        j                  d      }| j                  t        |j                         y)zV
        Raises L{RuntimeError} if the underlying key object does not exists.
        N)r   r-   rr   r   rM  r   s     r   test_privateBlobNoKeyObjectz$KeyTests.test_privateBlobNoKeyObject  s'     $,(:(:;r   c                 >   t         j                  j                  t        j                        }| j                  |j                  d      j                         t        j                         | j                  |j                  dd      j                  d      dkD         | j                  |j                         j                  d      t        j                  dd        | j                  |j                         j                  dd	      t        j                         y)
zO
        L{keys.Key.toString} serializes an RSA key in OpenSSH format.
        r   r   r   s   DEK-Infor   Nr3     commentcomment)r   r-   rt   r   rn   rS   r   striprd   r   findry   r^   rG   r   s     r   test_toOpenSSHRSAzKeyTests.test_toOpenSSHRSA  s     hh!!'"<"<=i0668':T:TULL|L<AA+NQRR	
 	JJL!!),g.G.G.L	
 	JJL!!)Z!@%%	
r   c                    t         j                  j                  t        j                        }|j                  dd      }|j                  ddd      }| j                  d|j                         d          | j                  d|j                         d          | j                  |t         j                  j                  |             | j                  |t         j                  j                  |d             y	)
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-   rt   r   rd   r   rS   
splitlinesrG   r   new_key_datanew_enc_key_datas       r   test_toOpenSSHRSA_v1_formatz$KeyTests.test_toOpenSSHRSA_v1_format       hh!!'"<"<=||It|<<<	4K<X2L4K4K4Ma4P	
 	24D4O4O4QRS4T	
 	dhh11,?@$$%5+$N	
r   c                    t         j                  j                  t        j                        }| j                  |j                  d      j                         t        j                         | j                  |j                         j                  dd      t        j                         | j                  |j                         j                  d      t        j                  dd        y)zN
        L{keys.Key.toString} serializes a DSA key in OpenSSH format.
        r   r  r  Nr3  )r   r-   rt   r   rm   rS   r   r  rf   ry   r_   r  s     r   test_toOpenSSHDSAzKeyTests.test_toOpenSSHDSA  s     hh!!'"8"89i0668':T:TUJJL!!)Z!@%%	
 	JJL!!),g.G.G.L	
r   c                    t         j                  j                  t        j                        }|j                  dd      }|j                  ddd      }| j                  d|j                         d          | j                  d|j                         d          | j                  |t         j                  j                  |             | j                  |t         j                  j                  |d             y	)
zS
        L{keys.Key.toString} serializes a DSA key in OpenSSH's v1 format.
        r   r  r  r   r  r  r   r   N)r   r-   rt   r   rf   r   rS   r  r  s       r   test_toOpenSSHDSA_v1_formatz$KeyTests.test_toOpenSSHDSA_v1_format  r  r   c                 \   t         j                  j                  t        j                        }| j                  |j                         j                  dd      t        j                         | j                  |j                         j                  d      t        j                  dd        y)zQ
        L{keys.Key.toString} serializes an ECDSA key in OpenSSH format.
        r   r  r  Nr3  )	r   r-   rt   r   rh   rS   ry   r   r`   r  s     r   test_toOpenSSHECDSAzKeyTests.test_toOpenSSHECDSA  s     hh!!'">">?JJL!!)Z!@''	
 	JJL!!),g.I.I#2.N	
r   c                    t         j                  j                  t        j                        }|j                  dd      }|j                  ddd      }| j                  d|j                         d          | j                  d|j                         d          | j                  |t         j                  j                  |             | j                  |t         j                  j                  |d             y	)
zV
        L{keys.Key.toString} serializes an ECDSA key in OpenSSH's v1 format.
        r   r  r  r   r  r  r   r   N)r   r-   rt   r   rh   r   rS   r  r  s       r   test_toOpenSSHECDSA_v1_formatz&KeyTests.test_toOpenSSHECDSA_v1_format%  s     hh!!'">">?||It|<<<	4K<X2L4K4K4Ma4P	
 	24D4O4O4QRS4T	
 	dhh11,?@$$%5+$N	
r   c                 8   t         j                  j                  t        j                        }|j                  d      }|j                  dd      }| j                  d|j                         d          | j                  d|j                         d          | j                  |t         j                  j                  |             | j                  |t         j                  j                  |d             | j                  ||j                  dd             y)	zX
        L{keys.Key.toString} serializes an Ed25519 key in OpenSSH's v1 format.
        r   r   r   r  r   r  r  N)r   r-   rt   r   rj   r   rS   r  r  s       r   test_toOpenSSHEd25519zKeyTests.test_toOpenSSHEd255197  s    
 hh!!'"D"DE||I.<<	k<J2L4K4K4Ma4P	
 	24D4O4O4QRS4T	
 	dhh11,?@$$%5+$N	
 	s||It|'LMr   c                     t         j                  j                  t        j                        }| j                  t        |j                  dd       y)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   PEMr  N)r   r-   rt   r   rj   rr   
ValueErrorr   r  s     r    test_toOpenSSHEd25519_PEM_formatz)KeyTests.test_toOpenSSHEd25519_PEM_formatK  s9     hh!!'"D"DE*cllIuMr   c                 6   t         j                  j                  t        j                        }| j                  |j                  d      t        j                         | j                  |j                         j                  d      t        j                         y)zK
        L{keys.Key.toString} serializes an RSA key in LSH format.
        lshN)
r   r-   rt   r   rd   rS   r   rF   ry   rk   r  s     r   test_toLSHRSAzKeyTests.test_toLSHRSAU  d     hh!!'"<"<=e,g.D.DE..u5w7L7LMr   c                 6   t         j                  j                  t        j                        }| j                  |j                  d      t        j                         | j                  |j                         j                  d      t        j                         y)zJ
        L{keys.Key.toString} serializes a DSA key in LSH format.
        r  N)
r   r-   rt   r   rf   rS   r   rm   ry   rl   r  s     r   test_toLSHDSAzKeyTests.test_toLSHDSA]  r  r   c                     t         j                  j                  t        j                        }| j                  |j                  d      t        j                         y)zP
        L{keys.Key.toString} serializes an RSA key in Agent v3 format.
        r[   N)r   r-   rt   r   rd   rS   r   rn   r  s     r   test_toAgentv3RSAzKeyTests.test_toAgentv3RSAe  =     hh!!'"<"<=i0'2L2LMr   c                     t         j                  j                  t        j                        }| j                  |j                  d      t        j                         y)zO
        L{keys.Key.toString} serializes a DSA key in Agent v3 format.
        r[   N)r   r-   rt   r   rf   rS   r   ro   r  s     r   test_toAgentv3DSAzKeyTests.test_toAgentv3DSAl  r  r   c                 @   t        j                  | j                        }|j                  dd      }| j	                  t         j                  j                  |dj                               |       | j                  t         j                  |j                  dd       y)zd
        L{keys.Key.toString} applies Normalization Form KC to Unicode
        passphrases.
        r   r   r   r   r   N)	r   r-   r1   r   rS   rt   r   rr   r   r   s      r   (test_toStringNormalizesUnicodePassphrasez1KeyTests.test_toStringNormalizesUnicodePassphrases  s    
 hht{{#<<	6K<LHH5I5P5P5RS	
 	--LL*	 	 	
r   c                     | j                  t        j                  t        j                  | j                        j
                  d       y)zm
        L{keys.Key.toString} raises L{keys.BadKeyError} when passed an invalid
        format type.
        r   N)rr   r   rs   r-   r1   r   rM   s    r   test_toStringErrorszKeyTests.test_toStringErrors  s/    
 	$**DHHT[[,A,J,JJWr   c           	      b   d}t         j                  j                  t        j                        }|j                  |      }| j                  |j                         j                  ||             | j                  |j                  ||             t        j                  |      \  }}| j                  |d       | j                  |j                  j                         j                  t        j                  |      d   |t        j                          t#        j$                                      y)zR
        Signed data can be verified using RSA (with SHA-1, the default).
        	   some-datar  r   N)r   r-   rt   r   rd   signr   ry   verifyr   getNSrS   assertIsNoner0   rY  r   PKCS1v15r   SHA1rG   r   r   	signaturesignatureTypes        r   test_signAndVerifyRSAzKeyTests.test_signAndVerifyRSA  s     hh!!'"<"<=HHTN	

++It<=

9d34#)<<	#: y
3NN%%'..Y'*D'2B2B2Dfkkm	
r   c           	      f   d}t         j                  j                  t        j                        }|j                  |d      }| j                  |j                         j                  ||             | j                  |j                  ||             t        j                  |      \  }}| j                  |d       | j                  |j                  j                         j                  t        j                  |      d   |t        j                          t#        j$                                      y)zE
        Signed data can be verified using RSA with SHA-256.
        r  r  r  r   N)r   r-   rt   r   rd   r  r   ry   r  r   r  rS   r  r0   rY  r   r  r   SHA256r  s        r   test_signAndVerifyRSASHA256z$KeyTests.test_signAndVerifyRSASHA256       hh!!'"<"<=HHTHA	

++It<=

9d34#)<<	#: y8NN%%'..Y'*D'2B2B2Dfmmo	
r   c           	      f   d}t         j                  j                  t        j                        }|j                  |d      }| j                  |j                         j                  ||             | j                  |j                  ||             t        j                  |      \  }}| j                  |d       | j                  |j                  j                         j                  t        j                  |      d   |t        j                          t#        j$                                      y)zE
        Signed data can be verified using RSA with SHA-512.
        r  r  r  r   N)r   r-   rt   r   rd   r  r   ry   r  r   r  rS   r  r0   rY  r   r  r   SHA512r  s        r   test_signAndVerifyRSASHA512z$KeyTests.test_signAndVerifyRSASHA512  r  r   c                 $   d}t         j                  j                  t        j                        }|j                  |      }| j                  |j                         j                  ||             | j                  |j                  ||             y)z8
        Signed data can be verified using DSA.
        r  N)	r   r-   rt   r   rf   r  r   ry   r  rG   r   r   r  s       r   test_signAndVerifyDSAzKeyTests.test_signAndVerifyDSA  sf     hh!!'"<"<=HHTN	

++It<=

9d34r   c                 \   d}t         j                  j                  t        j                        }|j                  |      }t         j                  j                  t        j                        }|j                  |      }t         j                  j                  t        j                        }|j                  |      }| j                  |j                         j                  ||             | j                  |j                  ||             | j                  |j                         j                  ||             | j                  |j                  ||             | j                  |j                         j                  ||             | j                  |j                  ||             y)z7
        Signed data can be verified using EC.
        r  N)r   r-   rt   r   rh   r  r   r   r   ry   r  )rG   r   r   r  key384signature384key521signature521s           r   test_signAndVerifyECzKeyTests.test_signAndVerifyEC  s"    hh!!'">">?HHTN	$$W%D%DE{{4($$W%D%DE{{4(

++It<=

9d34..|TBClD9:..|TBClD9:r   c                 $   d}t         j                  j                  t        j                        }|j                  |      }| j                  |j                         j                  ||             | j                  |j                  ||             y)z<
        Signed data can be verified using Ed25519.
        r  N)	r   r-   rt   r   rj   r  r   ry   r  r  s       r   test_signAndVerifyEd25519z"KeyTests.test_signAndVerifyEd25519  sf    
 hh!!'"D"DEHHTN	

++It<=

9d34r   c                 l   t         j                  j                  t        j                        }| j                  t         j                  |j                  dd       t         j                  j                  t        j                        }| j                  t         j                  |j                  dd       y)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-   rt   r   rd   rr   BadSignatureAlgorithmErrorr  rh   r  s     r   test_signWithWrongAlgorithmz$KeyTests.test_signWithWrongAlgorithm  s     hh!!'"<"<=++HH$	 	 	
 hh!!'">">?++HH$	 	 	
r   c                 `   t         j                  j                  t        j                        }| j                  |j                  | j                  d             | j                  |j                  | j                  d             | j                  |j                  | j                  d             y)zC
        A known-good RSA signature verifies successfully.
        r      aN)
r   r-   rt   r   r^   r   r  r?   r   r@   r  s     r   test_verifyRSAzKeyTests.test_verifyRSA  y     hh!!'";";<

4#4#4c:;D$5$5t<=D$5$5s;<r   c                 `   t         j                  j                  t        j                        }| j                  |j                  | j                  d             | j                  |j                  | j                  d             | j                  |j                  | j                  d             y)zC
        A known-good DSA signature verifies successfully.
        r   r  N)
r   r-   rt   r   r_   r   r  r@   r   r?   r  s     r   test_verifyDSAzKeyTests.test_verifyDSA  r  r   c                     t         j                  j                  t        j                        }| j                  |j                  | j                  dd d             y)z
        Some commercial SSH servers send DSA keys as 2 20-byte numbers;
        they are still verified as valid keys.
        iNr   )r   r-   rt   r   r_   r   r  r@   r  s     r   test_verifyDSANoPrefixzKeyTests.test_verifyDSANoPrefix  sB    
 hh!!'";";<

4#4#4ST#:C@Ar   c                 t    | j                  t        t        j                  | j                              d       y)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)rS   reprr   r-   r1   rM   s    r   test_reprPrivateRSAzKeyTests.test_reprPrivateRSA  s.    
 	$++&'F!I	
r   c                     | j                  t        t        j                  | j                        j                               d       y)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)rS   r  r   r-   r1   ry   rM   s    r   test_reprPublicRSAzKeyTests.test_reprPublicRSAm  s5    
 	$++&--/0	
r   c                     | j                  t        t        j                  | j                        j                                t        d      j                  di t        j                         y)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*   )
rS   r  r   r-   r7   ry   r   formatr   r6   rM   s    r   test_reprPublicECDSAzKeyTests.test_reprPublicECDSA  s]    
 	$**%,,./
F
 f
/ --
/	
r   c                     | j                  t        t        j                  | j                               t        d      j                  di t        j                         y)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*   )	rS   r  r   r-   r7   r   r  r   r6   rM   s    r   test_reprPrivateECDSAzKeyTests.test_reprPrivateECDSA  sT    
 	$**%&F
 f/ --/	
r   c                     | j                  t        t        j                  | j                        j                               t        d             y)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)rS   r  r   r-   r>   ry   r   rM   s    r   test_reprPublicEd25519zKeyTests.test_reprPublicEd25519  s=     	$//*1134
	
r   c                     | j                  t        t        j                  | j                              t        d             y)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)rS   r  r   r-   r>   r   rM   s    r   test_reprPrivateEd25519z KeyTests.test_reprPrivateEd25519  s4     	$//*+		
r   )___name__
__module____qualname__r	   skipCryptographyr   rH   rN   rU   rp   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   rC  rH  rK  rN  rP  r`  rb  rf  rj  rp  rt  rv  rz  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   *   sh   =,~ 
DFHP
T04(9')6'/b

.$
0
,

	
	



&g
R

.'&5


	
@("UHJ7&7.5496 ? ?C$X
,
*X< 
 
$	


, 
 
5
"
"
( 
 
.<
"
$

$

$ N N& N NNNNN
(X
$
$
$5;* 5 5
*==BN
`
>
(
, 
 
" 
 
r   r   c                   *    e Zd ZdZeeZd Zd Zd Z	y)PersistentRSAKeyTestsz1
    Tests for L{keys._getPersistentRSAKey}.
    Nc                    t        | j                               }|j                  d      }t        j                  |d      }| j                  |j                         d       | j                  |j                                y)z
        L{keys._getPersistentRSAKey} will put the key in
        C{directory}/C{filename}, with the key length of C{keySize}.
        	mykey.pemrQ   keySizeN)	r   rB   childr   _getPersistentRSAKeyrS   rT   r   existsrG   tempDirrC   r   s       r   test_providedArgumentsz,PersistentRSAKeyTests.test_providedArguments  s]    
 4;;=)--,''>T*()r   c                    t        | j                               }|j                  d      }t        j                  |d      }| j                  |j                         d       | j                  |j                                |j                         }t        j                  |d      }| j                  |j                         d       | j                  |j                         |       y)zm
        L{keys._getPersistentRSAKey} will not regenerate the key if the key
        already exists.
        r  rQ   r  rP   N)
r   rB   r  r   r  rS   rT   r   r  
getContent)rG   r  rC   r   
keyContents        r   test_noRegenerationz)PersistentRSAKeyTests.test_noRegeneration  s    
 4;;=)--,''>T*()'')
 ''>T*++-z:r   c                     t        | j                               }|j                  d      }t        j                  |d      }d|_        | j                  |j                         d       y)z
        If the key generated by L{keys.getPersistentRSAKey} is set to None
        the key size should then become 0.
        r  rQ   r  Nr   )r   rB   r  r   r  r0   rS   rT   r  s       r   test_keySizeZeroz&PersistentRSAKeyTests.test_keySizeZero  sQ    
 4;;=)--,''>Q'r   )
r  r  r  __doc__r	   r  r   r   r  r  r*   r   r   r  r    s#     
*;&
(r   r  )!r  r   rK   textwrapr   twisted.conch.testr   twisted.pythonr   twisted.python.filepathr   twisted.python.reflectr   twisted.trialr   r	   r  cryptography.hazmat.backendsr
   rU  r   rV  r   twisted.conch.sshr   r   r   ed25519_supportedr   r   TestCaser   r  r*   r   r   <module>r     s   
  	  & $ , 0 "^,9 <5A55');;=r
x   r
j51(H-- 1(r   