
    M/e4                     F   d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
Z
ddlZddlZddlZddlmZ ddlmZ  G d de
j&                        Z G d d	e
j&                        Z G d
 de
j&                        Z G d de
j&                        Z G d de
j&                        Z G d de
j&                        Z G d de
j&                        Z G d de
j&                        Zedk(  r4 ej:                   ej<                  ej>                  dd e gz                yy)zTests for acme.crypto_util.    N)List)errors)	test_utilc                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
SSLSocketAndProbeSNITestz/Tests for acme.crypto_util.SSLSocket/probe_sni.c                    t        j                  d      | _        t        j                  d      }d|| j                  j                  fiddlm  G fddt        j                        } |dt        j                        | _
        | j                  j                  j                         d	   | _        t        j                  | j                  j                   
      | _        y )Nzrsa2048_cert.pemzrsa2048_key.pem   foor   	SSLSocketc                   $     e Zd Z fdZ xZS )3SSLSocketAndProbeSNITest.setUp.<locals>._TestServerc                 T    t        |   |i |  | j                        | _        y N)super__init__socket)selfargskwargsr   	__class__certss      G/usr/lib/python3/dist-packages/acme/_internal/tests/crypto_util_test.pyr   z<SSLSocketAndProbeSNITest.setUp.<locals>._TestServer.__init__    s'     $1&1'U;    )__name__
__module____qualname__r   __classcell__)r   r   r   s   @r   _TestServerr      s    < <r   r   ) r      )target)r   load_comparable_certcertload_pyopenssl_private_keywrappedacme.crypto_utilr   socketserver	TCPServerBaseRequestHandlerserverr   getsocknameport	threadingThreadhandle_requestserver_thread)r   keyr   r   r   s      @@r   setUpzSSLSocketAndProbeSNITest.setUp   s    223EF	223DE#tyy0012.	<,00 	<
 "'<+J+JKKK&&224Q7	&--;;--/r   c                     | j                   j                         r| j                   j                          | j                  j	                          y r   )r0   is_alivejoinr*   server_closer   s    r   tearDownz!SSLSocketAndProbeSNITest.tearDown)   s6    &&(##%  "r   c                 ^    ddl m} t        j                   ||d| j                              S )Nr   )	probe_sni	127.0.0.1)hostr,   )r&   r:   joseComparableX509r,   )r   namer:   s      r   _probezSSLSocketAndProbeSNITest._probe/   s*    .""9{$4 5 	5r   c                 b    | j                   j                          t        j                  d       y )Nr    )r0   starttimesleepr7   s    r   _start_serverz&SSLSocketAndProbeSNITest._start_server4   s      "

1r   c                 d    | j                          | j                  | j                  d      k(  sJ y )Nr	   )rE   r#   r@   r7   s    r   test_probe_okz&SSLSocketAndProbeSNITest.test_probe_ok8   s)    yyDKK////r   c                     | j                          t        j                  t        j                        5  | j                  d       d d d        y # 1 sw Y   y xY w)N   bar)rE   pytestraisesr   Errorr@   r7   s    r   test_probe_not_recognized_namez7SSLSocketAndProbeSNITest.test_probe_not_recognized_name<   s?    ]]6<<( 	 KK	  	  	 s   AAc                 |   | j                   j                          t        j                         }	 t        j                  d       t        j                  t        j                        5  | j                  d       d d d        t        j                  |       y # 1 sw Y   xY w# t        j                  |       w xY w)Nr    rI   )
r*   r6   r   getdefaulttimeoutsetdefaulttimeoutrJ   rK   r   rL   r@   )r   original_timeouts     r   test_probe_connection_errorz4SSLSocketAndProbeSNITest.test_probe_connection_errorA   s      "!335	7$$Q'v||, $F#$ $$%56$ $ $$%56s#   8B$ (B:B$ B!B$ $B;N)r   r   r   __doc__r2   r8   r@   rE   rG   rM   rR    r   r   r   r      s(    9/$#5
0 
7r   r   c                       e Zd ZdZd Zy)SSLSocketTestz%Tests for acme.crypto_util.SSLSocket.c                     ddl m} t        j                  t              5   |d ddid       }d d d        t        j                  t              5   |d       }d d d        y # 1 sw Y   4xY w# 1 sw Y   y xY w)Nr   r
   sni)r1   r#   c                      y r   rT   )_s    r   <lambda>zASSLSocketTest.test_ssl_socket_invalid_arguments.<locals>.<lambda>S   s    r   )cert_selection)r&   r   rJ   rK   
ValueError)r   r   rZ   s      r   !test_ssl_socket_invalid_argumentsz/SSLSocketTest.test_ssl_socket_invalid_argumentsO   sm    .]]:& 	3$ 8#13A	3 ]]:& 	 $A	  	 	3 	3	  	 s   A"	A."A+.A7N)r   r   r   rS   r^   rT   r   r   rV   rV   L   s
    / r   rV   c                   8    e Zd ZdZed        Zd Zd Zd Zd Z	y)PyOpenSSLCertOrReqAllNamesTestz;Test for acme.crypto_util._pyopenssl_cert_or_req_all_names.c                 *    ddl m}  | ||            S )Nr   ) _pyopenssl_cert_or_req_all_names)r&   rb   )clsloaderr?   rb   s       r   _callz$PyOpenSSLCertOrReqAllNamesTest._call[   s     	F/t==r   c                 B    | j                  t        j                  |      S r   re   r   	load_certr   r?   s     r   
_call_certz)PyOpenSSLCertOrReqAllNamesTest._call_certa       zz)--t44r   c                 2    | j                  d      dgk(  sJ y )Nzcert-nocn.derzno-common-name.badssl.comrj   r7   s    r   test_cert_one_san_no_commonz:PyOpenSSLCertOrReqAllNamesTest.test_cert_one_san_no_commond   s#    /567 	7 7r   c                 2    | j                  d      dgk(  sJ y )Ncert.pemexample.comrm   r7   s    r   test_cert_no_sans_yes_commonz;PyOpenSSLCertOrReqAllNamesTest.test_cert_no_sans_yes_commonh   s    z*}o===r   c                 4    | j                  d      ddgk(  sJ y Ncert-san.pemrq   www.example.comrm   r7   s    r   test_cert_two_sans_yes_commonz<PyOpenSSLCertOrReqAllNamesTest.test_cert_two_sans_yes_commonk   &    ~.'):;< 	< <r   N)
r   r   r   rS   classmethodre   rj   rn   rr   rw   rT   r   r   r`   r`   X   s+    E> >
57><r   r`   c                   ~    e Zd ZdZed        Ze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y)PyOpenSSLCertOrReqSANTestz5Test for acme.crypto_util._pyopenssl_cert_or_req_san.c                 *    ddl m}  | ||            S )Nr   )_pyopenssl_cert_or_req_san)r&   r}   )rc   rd   r?   r}   s       r   re   zPyOpenSSLCertOrReqSANTest._calls   s     	@)&,77r   c           	      $   t        j                  t        dd      t        dd      t        dd            D cg c]  }t        |       }}t        dt	        |      d      D cg c]  }d	j                  |||dz          d
z    c}S c c}w c c}w )z5Returns expected names from '{cert,csr}-idnsans.pem'.i  i   iA  i  i   iw  r   -   r   z.invalid)	itertoolschainrangechrlenr5   )rc   icharss      r   _get_idn_namesz(PyOpenSSLCertOrReqSANTest._get_idn_namesy   s     "+ue1D16ue1D16vv1F"H IAQ I I q#e*b13 aR()J6 3 	3I3s   B$!Bc                 B    | j                  t        j                  |      S r   rg   ri   s     r   rj   z$PyOpenSSLCertOrReqSANTest._call_cert   rk   r   c                 B    | j                  t        j                  |      S r   re   r   load_csrri   s     r   	_call_csrz#PyOpenSSLCertOrReqSANTest._call_csr       zz),,d33r   c                 0    | j                  d      g k(  sJ y Nrp   rm   r7   s    r   test_cert_no_sansz+PyOpenSSLCertOrReqSANTest.test_cert_no_sans       z*b000r   c                 4    | j                  d      ddgk(  sJ y rt   rm   r7   s    r   test_cert_two_sansz,PyOpenSSLCertOrReqSANTest.test_cert_two_sans   rx   r   c                     | j                  d      t        dd      D cg c]  }dj                  |       c}k(  sJ y c c}w )Nzcert-100sans.pemr    e   example{0}.com)rj   r   formatr   r   s     r   test_cert_hundred_sansz0PyOpenSSLCertOrReqSANTest.test_cert_hundred_sans   sD    12>CAsmL*11!4LM 	M ML   ?c                 L    | j                  d      | j                         k(  sJ y )Ncert-idnsans.pem)rj   r   r7   s    r   test_cert_idn_sansz,PyOpenSSLCertOrReqSANTest.test_cert_idn_sans   s*    12,,./ 	/ /r   c                 0    | j                  d      g k(  sJ y Nzcsr-nosans.pemr   r7   s    r   test_csr_no_sansz*PyOpenSSLCertOrReqSANTest.test_csr_no_sans       ~~./2555r   c                 2    | j                  d      dgk(  sJ y )Nzcsr.pemrq   r   r7   s    r   test_csr_one_sanz*PyOpenSSLCertOrReqSANTest.test_csr_one_san   s    ~~i(]O;;;r   c                 4    | j                  d      ddgk(  sJ y )Ncsr-san.pemrq   rv   r   r7   s    r   test_csr_two_sansz+PyOpenSSLCertOrReqSANTest.test_csr_two_sans   s&    ~~m,'):;< 	< <r   c                 4    | j                  d      g dk(  sJ y )Nzcsr-6sans.pem)rq   zexample.orgzexample.netzexample.infozsubdomain.example.comzother.subdomain.example.comr   r7   s    r   test_csr_six_sansz+PyOpenSSLCertOrReqSANTest.test_csr_six_sans   s"    ~~o.99 	9 9r   c                     | j                  d      t        dd      D cg c]  }dj                  |       c}k(  sJ y c c}w )Nzcsr-100sans.pemr    r   r   )r   r   r   r   s     r   test_csr_hundred_sansz/PyOpenSSLCertOrReqSANTest.test_csr_hundred_sans   sD    ~~/0>CAsmL*11!4LM 	M MLr   c                 L    | j                  d      | j                         k(  sJ y )Nzcsr-idnsans.pem)r   r   r7   s    r   test_csr_idn_sansz+PyOpenSSLCertOrReqSANTest.test_csr_idn_sans   s*    ~~/0,,./ 	/ /r   c                 4    | j                  d      ddgk(  sJ y )Nzcritical-san.pemzchicago-cubs.venafi.examplezcubs.venafi.examplerm   r7   s    r   test_critical_sanz+PyOpenSSLCertOrReqSANTest.test_critical_san   s*    1279NOP 	P Pr   N)r   r   r   rS   ry   re   r   rj   r   r   r   r   r   r   r   r   r   r   r   r   rT   r   r   r{   r{   p   so    ?8 8
 3 3541<M/6<<9M/Pr   r{   c                   \    e Zd ZdZed        Zd Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zy)PyOpenSSLCertOrReqSANIPTestz8Test for acme.crypto_util._pyopenssl_cert_or_req_san_ip.c                 *    ddl m}  | ||            S )Nr   )_pyopenssl_cert_or_req_san_ip)r&   r   )rc   rd   r?   r   s       r   re   z!PyOpenSSLCertOrReqSANIPTest._call   s     	C,VD\::r   c                 B    | j                  t        j                  |      S r   rg   ri   s     r   rj   z&PyOpenSSLCertOrReqSANIPTest._call_cert   rk   r   c                 B    | j                  t        j                  |      S r   r   ri   s     r   r   z%PyOpenSSLCertOrReqSANIPTest._call_csr   r   r   c                 0    | j                  d      g k(  sJ y r   rm   r7   s    r   r   z-PyOpenSSLCertOrReqSANIPTest.test_cert_no_sans   r   r   c                 0    | j                  d      g k(  sJ y r   r   r7   s    r   r   z,PyOpenSSLCertOrReqSANIPTest.test_csr_no_sans   r   r   c                 0    | j                  d      g k(  sJ y )Nru   rm   r7   s    r   test_cert_domain_sansz1PyOpenSSLCertOrReqSANIPTest.test_cert_domain_sans   s    ~."444r   c                 0    | j                  d      g k(  sJ y )Nr   r   r7   s    r   test_csr_domain_sansz0PyOpenSSLCertOrReqSANIPTest.test_csr_domain_sans   s    ~~m,222r   c                 4    | j                  d      ddgk(  sJ y )Nzcert-ipsans.pem192.0.2.145203.0.113.1rm   r7   s    r   test_cert_ip_two_sansz1PyOpenSSLCertOrReqSANIPTest.test_cert_ip_two_sans   s    01m]5SSSSr   c                 4    | j                  d      ddgk(  sJ y )Nzcsr-ipsans.pemr   r   r   r7   s    r   test_csr_ip_two_sansz0PyOpenSSLCertOrReqSANIPTest.test_csr_ip_two_sans   s    ~~./M=3QQQQr   c                 4    | j                  d      ddgk(  sJ y )Nzcsr-ipv6sans.pem0:0:0:0:0:0:0:1%A3BE:32F3:206E:C75D:956:CEE:9858:5EC5r   r7   s    r   test_csr_ipv6_sansz.PyOpenSSLCertOrReqSANIPTest.test_csr_ipv6_sans   s*    ~~01+-TUV 	V Vr   c                 4    | j                  d      ddgk(  sJ y )Nzcert-ipv6sans.pemr   r   rm   r7   s    r   test_cert_ipv6_sansz/PyOpenSSLCertOrReqSANIPTest.test_cert_ipv6_sans   s*    23+-TUV 	V Vr   N)r   r   r   rS   ry   re   rj   r   r   r   r   r   r   r   r   r   rT   r   r   r   r      sM    B; ;
541653TRVVr   r   c                   "    e Zd ZdZd Zd Zd Zy)GenSsCertTestz6Test for gen_ss_cert (generation of self-signed cert).c                     d| _         g | _        t        j                  j	                         | _        | j
                  j                  t        j                  j                  d       y )N      )
cert_count
serial_numOpenSSLcryptoPKeyr1   generate_keyTYPE_RSAr7   s    r   r2   zGenSsCertTest.setUp   sB    %'>>&&(gnn55t<r   c           	      F   ddl m} t        | j                        D ]V  } || j                  dgdt        j                  d      g      }| j                  j                  |j                                X t        t        | j                              | j                  k\  sJ y )Nr   gen_ss_certdummyTz10.10.10.10)	force_sanips)r&   r   r   r   r1   	ipaddress
ip_addressr   appendget_serial_numberr   set)r   r   rZ   r#   s       r   test_sn_collisionsz GenSsCertTest.test_sn_collisions   s    0t' 	=Atxx'd$-$8$8$G#HJDOO""4#9#9#;<	= 3t'(DOO;;;r   c                     ddl m} t        j                  t              5   || j
                  t        j                  d      g        || j
                         d d d        y # 1 sw Y   y xY w)Nr   r   z1.1.1.1)r   )r&   r   rJ   rK   AssertionErrorr1   r   r   )r   r   s     r   test_no_namezGenSsCertTest.test_no_name   sN    0]]>* 	"y';';I'F&GH!	" 	" 	"s   ;A$$A-N)r   r   r   rS   r2   r   r   rT   r   r   r   r      s    @=<"r   r   c                   >    e Zd ZdZed        Zd Zd Zd Zd Z	d Z
y)	MakeCSRTestzTest for standalone functions.c                 &   t         j                  j                         }|j                  t         j                  j                  d       t         j                  j                  t         j                  j                  |      }ddlm}  ||g|i |S )Nr   r   )make_csr)	r   r   r   r   r   dump_privatekeyFILETYPE_PEMr&   r   )rc   r   r   privkeyprivkey_pemr   s         r   _call_with_keyzMakeCSRTest._call_with_key   sg    ..%%'W^^44d;nn44W^^5P5PRYZ-5d5f55r   c                    | j                  ddg      }d|v sJ d|v sJ t        j                  j                  t        j                  j                  |      }t        |d      rst        |j                               dk(  sJ |j                         d   j                         t        j                  j                  dd	d
      j                         k(  sJ y y )N	a.examplez	b.example   --BEGIN CERTIFICATE REQUEST--   --END CERTIFICATE REQUEST--get_extensionsr    r      subjectAltNameFs   DNS:a.example, DNS:b.examplecriticalvalue)
r   r   r   load_certificate_requestr   hasattrr   r   get_dataX509Extensionr   csr_pemcsrs      r   test_make_csrzMakeCSRTest.test_make_csr  s    %%{K&@A/7:::-888nn55NN''2
 3()s))+,111%%'*335,,%"9 -  (*   *r   c                    | j                  dgdt        j                  d      t        j                  d      g      }d|v sJ d|v sJ t        j                  j                  t        j                  j                  |      }t        |d      rst        |j                               dk(  sJ |j                         d	   j                         t        j                  j                  d
dd      j                         k(  sJ y y )Nr   Fr;   z::1r   r   r   r    r   r   s#   DNS:a.example, IP:127.0.0.1, IP:::1r   )r   r   r   r   r   r   r   r   r   r   r   r   r   s      r   test_make_csr_ipzMakeCSRTest.test_make_csr_ip  s    %%{mUY=Q=QR]=^`i`t`tuz`{<|}/7:::-888nn55NN''2
 3()s))+,111%%'*335$^^99!2*/'M :   (xz* * * *r   c                    | j                  dgd      }t        j                  j                  t        j                  j                  |      }t        |d      rdt        |j                               dk(  sJ |j                         D cg c]  }|j                         dk(  r| }}t        |      dk(  sJ d       y y c c}w )	Nr   T)must_stapler      s   0r    z*Expected exactly one Must Staple extension)	r   r   r   r   r   r   r   r   r   )r   r   r   emust_staple_extss        r   test_make_csr_must_staplez%MakeCSRTest.test_make_csr_must_staple)  s    %%{m%Fnn55NN''2 3()s))+,111 ,/+=+=+?  9a::<#77 !"  9  9'(A- =<=- *
 9s   	B>c                     t        j                  t              5  | j                          d d d        y # 1 sw Y   y xY wr   )rJ   rK   r]   r   r7   s    r   test_make_csr_without_hostnamez*MakeCSRTest.test_make_csr_without_hostname;  s/    ]]:& 	"!	" 	" 	"s   4=c                     | j                  dg      }t        j                  j                  t        j                  j                  |      }|j                         dk(  sJ d       y )Nr   r   zEExpected CSR version to be v1 (encoded as 0), per RFC 2986, section 4)r   r   r   r   r   get_versionr   s      r   test_make_csr_correct_versionz)MakeCSRTest.test_make_csr_correct_version?  sZ    %%{m4nn55NN''2  A% 	TS	T%r   N)r   r   r   rS   ry   r   r   r   r  r  r	  rT   r   r   r   r      s1    (6 6$*(=$"Tr   r   c                   ,    e Zd ZdZed        Zd Zd Zy)DumpPyopensslChainTestzTest for dump_pyopenssl_chain.c                     ddl m}  ||      S )Nr   )dump_pyopenssl_chain)r&   r  )rc   loadedr  s      r   re   zDumpPyopensslChainTest._callK  s     	:#F++r   c                     g d}|D cg c]  }t        j                  |       }}t        d |D              }t        | j	                  |            |k(  sJ y c c}w )Nrp   ru   r   c              3      K   | ]E  }t        t        j                  j                  t        j                  j                  |             G y wr   )r   r   r   dump_certificater   ).0r#   s     r   	<genexpr>zCDumpPyopensslChainTest.test_dump_pyopenssl_chain.<locals>.<genexpr>T  s8        //0K0KTRS s   AA)r   rh   sumr   re   )r   namesr?   r  lengths        r   test_dump_pyopenssl_chainz0DumpPyopensslChainTest.test_dump_pyopenssl_chainQ  s_    @8=>)%%d+>>      4::f%&&000	 ?s   Ac                 J   g d}|D cg c]  }t        j                  |       }}t        j                  }|D cg c]
  } ||       }}t        j
                  j                  t        fd|D              }t        | j                  |            |k(  sJ y c c}w c c}w )Nr  c              3   r   K   | ].  }t         t        j                  j                  |             0 y wr   )r   r   r   r   )r  r#   	dump_funcs     r   r  zKDumpPyopensslChainTest.test_dump_pyopenssl_chain_wrapped.<locals>.<genexpr>_  s'     Z4S7>>#>#>EFZs   47)
r   rh   r=   r>   r   r   r  r  r   re   )	r   r  r?   r  	wrap_funcr#   r%   r  r  s	           @r   !test_dump_pyopenssl_chain_wrappedz8DumpPyopensslChainTest.test_dump_pyopenssl_chain_wrappedY  s    @8=>)%%d+>>''	/56t9T?66NN33	ZSYZZ4::g&'6111 ?6s
   BB N)r   r   r   rS   ry   re   r  r  rT   r   r   r  r  H  s!    (, ,
12r   r  __main__r    )!rS   r   r   r   r'   sysr-   rC   typingr   unittestjosepyr=   r   rJ   acmer   acme._internal.testsr   TestCaser   rV   r`   r{   r   r   r   r  r   exitmainargv__file__rT   r   r   <module>r*     s	   !     
         *57x00 57p	 H%% 	 <X%6%6 <0AP 1 1 APH'V("3"3 'VT"H%% "4MT(## MT`2X.. 26 zCHH[V[[!"
234 r   