
    kjf                     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	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 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 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jJ                  dk  rd dl&m'Z' nd dlm'Z'  ejP                  e)      Z* ejV                  d      Z, ejV                  d      Z- ejV                  d      Z. ejV                  d      Z/dZ0 G d de$jb                        Z2dejf                  de4e5e6e6f      fd Z7d!e6d"e6d#e8de5ejr                  ejt                  f   fd$Z;d%eejx                     e4e6   z  dejz                  fd&Z>	 	 d7d'ej~                  d(ejt                  d)e6dz  d%eejx                     d!e6dz  d*e6dz  de2fd+Z@d'ej~                  d(ejt                  deAfd,ZB e
d-.       G d/ d0             ZCe6ZDe5ee6   ejz                  f   ZEeeDeEf   ZF ed1eA      ZG G d2 d3      ZHd4eAd5eAdz  dej~                  fd6ZIy)8    N)Iterable)	dataclass)Path)cast)NewType)Optional)Union)x509)hashes)serialization)dsa)ec)rsa)CertificatePublicKeyTypes)pkcs12)ExtendedKeyUsageOID)NameOID)serializable)      )
deprecatediB  )days      s  
-----BEGIN DH PARAMETERS-----
MIICCAKCAgEAyT6LzpwVFS3gryIo29J5icvgxCnCebcdSe/NHMkD8dKJf8suFCg3
O2+dguLakSVif/t6dhImxInJk230HmfC8q93hdcg/j8rLGJYDKu3ik6H//BAHKIv
j5O9yjU3rXCfmVJQic2Nne39sg3CreAepEts2TvYHhVv3TEAzEqCtOuTjgDv0ntJ
Gwpj+BJBRQGG9NvprX1YGJ7WOFBP/hWU7d6tgvE6Xa7T/u9QIKpYHMIkcN/l3ZFB
chZEqVlyrcngtSXCROTPcDOQ6Q8QzhaBJS+Z6rcsd7X+haiQqvoFcmaJ08Ks6LQC
ZIL2EtYJw8V8z7C0igVEBIADZBI6OTbuuhDwRw//zU1uq52Oc48CIZlGxTYG/Evq
o9EWAXUYVzWkDSTeBH1r4z/qLPE2cnhtMxbFxuvK53jGB0emy2y1Ei6IhKshJ5qX
IB/aE7SSHyQ3MDHHkCmQJCsOd4Mo26YX61NZ+n501XjqpCBQ2+DfZCBh8Va2wDyv
A2Ryg9SUz8j0AXViRNMJgJrr446yro/FuJZwnQcO3WQnXeqSBnURqKjmqkeFP+d8
6mk2tqJaY507lRNqtGlLnj7f5RNoBFJDCLBNurVgfvq9TCVWKDIFD4vZRjCrnl6I
rD693XKIHUCWOjMh1if6omGXKHH40QuME2gNa50+YPn1iYDl88uDbbMCAQI=
-----END DH PARAMETERS-----
c                      e Zd ZU dZej
                  ed<   dej
                  fdZd Zd Z	d Z
ed        Zd	 Zd
 Zededd fd       ZdefdZedej&                  j(                  dd fd       Z ed      dej&                  j(                  fd       Zdej
                  fdZdefdZdefdZedeeeef      fd       Z ede!jB                  fd       Z"ede!jB                  fd       Z#de$fdZ%edeeeef      fd       Z&ede'fd       Z(ede$fd       Z)edeee'f   fd       Z*ededz  fd       Z+ededz  fd        Z,edejZ                  fd!       Z.edee   fd"       Z/y)#Certz&Representation of a (TLS) certificate._certcertc                 J    t        |t        j                        sJ || _        y N)
isinstancer
   Certificater   )selfr   s     X/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/mitmproxy/certs.py__init__zCert.__init__E   s    $ 0 0111
    c                 D    | j                         |j                         k(  S r!   )fingerprint)r$   others     r%   __eq__zCert.__eq__I   s    !U%6%6%888r'   c                     | j                   D cg c]  }t        |j                         }}d| j                  d|dS c c}w )Nz	<Cert(cn=z, altnames=z)>)altnamesstrvaluecn)r$   xr-   s      r%   __repr__zCert.__repr__L   s?    *.--8QCL88477+[B?? 9s   A c                 6    | j                   j                         S r!   )r   __hash__r$   s    r%   r4   zCert.__hash__P   s    zz""$$r'   c                 $    | j                  |      S r!   )from_pem)clsstates     r%   
from_statezCert.from_stateS   s    ||E""r'   c                 "    | j                         S r!   )to_pemr5   s    r%   	get_statezCert.get_stateW   s    {{}r'   c                 8    t        j                  |      | _        y r!   )r
   load_pem_x509_certificater   )r$   r9   s     r%   	set_statezCert.set_stateZ   s    33E:
r'   datareturnc                 <    t        j                  |      } | |      S r!   )r
   r?   )r8   rA   r   s      r%   r7   zCert.from_pem]   s    --d34yr'   c                 h    | j                   j                  t        j                  j                        S r!   )r   public_bytesr   EncodingPEMr5   s    r%   r<   zCert.to_pemb   s#    zz&&}'='='A'ABBr'   r
   c                 6    t         |j                               S r!   )r   to_cryptography)r$   r
   s     r%   from_pyopensslzCert.from_pyopenssle   s    (D((*++r'   zUse `to_cryptography` instead.c                 h    t         j                  j                  j                  | j                        S r!   )OpenSSLcryptoX509from_cryptographyr   r5   s    r%   to_pyopensslzCert.to_pyopenssli   s!    ~~""44TZZ@@r'   c                     | j                   S r!   )r   r5   s    r%   rI   zCert.to_cryptographym   s    zzr'   c                 6    | j                   j                         S r!   )r   
public_keyr5   s    r%   rS   zCert.public_keyp   s    zz$$&&r'   c                 \    | j                   j                  t        j                               S r!   )r   r)   r   SHA256r5   s    r%   r)   zCert.fingerprints   s    zz%%fmmo66r'   c                 @    t        | j                  j                        S r!   )_name_to_keyvalr   issuerr5   s    r%   rX   zCert.issuerv   s    tzz0011r'   c                     	 | j                   j                  S # t        $ r7 | j                   j                  j	                  t
        j                        cY S w xY wN)tzinfo)r   not_valid_before_utcAttributeErrornot_valid_beforereplacedatetimeUTCr5   s    r%   	notbeforezCert.notbeforez   sK    	L::222 	L::..66hll6KK	L    =AAc                     	 | j                   j                  S # t        $ r7 | j                   j                  j	                  t
        j                        cY S w xY wrZ   )r   not_valid_after_utcr]   not_valid_afterr_   r`   ra   r5   s    r%   notafterzCert.notafter   sK    	K::111 	K::--55X\\5JJ	Krc   c                    t         j                  dk  r:t        j                  j                  t        j                        | j
                  kD  S t        j                  j                  t        j                        | j
                  kD  S )N)r      )sysversion_infor`   nowra   rg   r5   s    r%   has_expiredzCert.has_expired   sX    g%$$((6FF  $$X\\2T]]BBr'   c                 @    t        | j                  j                        S r!   )rW   r   subjectr5   s    r%   ro   zCert.subject   s    tzz1122r'   c                 .    | j                   j                  S r!   )r   serial_numberr5   s    r%   serialzCert.serial   s    zz'''r'   c                     	 | j                   j                  j                  t        j                        j
                  }|j                  S # t        j                  $ r Y yw xY w)NF)r   
extensionsget_extension_for_classr
   BasicConstraintsr/   caExtensionNotFound)r$   constraintss     r%   is_caz
Cert.is_ca   sV    	**//GG%%e  >>!%% 		s   AA A! A!c                    | j                   j                         }t        |t        j                        rd|j
                  fS t        |t        j                        rd|j
                  fS t        |t        j                        r&d|j                  j                   d|j
                  fS |j                  j                  j                  dd      j                  dd      t        |dd	      fS )
NRSADSAzEC ()	PublicKey _key_size)r   rS   r"   r   RSAPublicKeyr   r   DSAPublicKeyr   EllipticCurvePublicKeycurvename	__class____name__r_   getattr)r$   rS   s     r%   keyinfozCert.keyinfo   s    ZZ**,
j#"2"23*----j#"2"23*----j"";";<***//02J4G4GGG  ))11+rBJJ3PRSJ
B/
 	
r'   Nc                     | j                   j                  j                  t        j                  j
                        }|rt        t        |d   j                        S y Nr   )	r   ro   get_attributes_for_oidr
   r   COMMON_NAMEr   r.   r/   r$   attrss     r%   r0   zCert.cn   sA    

""99$,,:R:RSU1X^^,,r'   c                     | j                   j                  j                  t        j                  j
                        }|rt        t        |d   j                        S y r   )	r   ro   r   r
   r   ORGANIZATION_NAMEr   r.   r/   r   s     r%   organizationzCert.organization   sF    

""99LL**
 U1X^^,,r'   c                    	 | j                   j                  j                  t        j                        j
                  }t        j                  |      S # t        j                  $ r t        j                  g       cY S w xY w)z>
        Get all SubjectAlternativeName DNS altnames.
        )r   rt   ru   r
   SubjectAlternativeNamer/   GeneralNamesrx   )r$   sanss     r%   r-   zCert.altnames   sm    
	+::((@@++e  $$T** %% 	)$$R((	)s   =A (A?>A?c                 r   	 | j                   j                  j                  t        j                        j
                  }|D cg c]N  }|j                  r@t        |j                  d   t        j                        r|j                  d   j
                  P c}S c c}w # t        j                  $ r g cY S w xY wr   )
r   rt   ru   r
   CRLDistributionPointsr/   	full_namer"   UniformResourceIdentifierrx   )r$   ext
dist_points      r%   crl_distribution_pointszCert.crl_distribution_points   s    	**''??**e  #&''z33A68V8VW $$Q'--   %% 	I	s   =B ABB65B6)0r   
__module____qualname____doc__r
   r#   __annotations__r&   r+   r2   r4   classmethodr:   r=   r@   bytesr7   r<   rL   rM   rN   rJ   r   rP   rI   r   rS   r)   propertylisttupler.   rX   r`   rb   rg   boolrm   ro   intrr   rz   r   r0   r   r   r-   r    r'   r%   r   r   @   s   0T-- 9@% # #; E f  C C ,7>>#6#6 ,6 , , 01Agnn11 A 2A!1!1 '5 '7U 7 2U38_- 2 2 L8,, L L K(++ K KCT C
 3eCHo. 3 3 ( ( ( t   
sCx 
 
 C$J   cDj   +$++ + + c  r'   r   r   rB   c                     g }| D ]Q  }|j                         j                  d      d   }t        t        |j                        }|j                  ||f       S |S )N=r   )rfc4514_string	partitionr   r.   r/   append)r   partsattrkvs        r%   rW   rW      s[    E !++C03djj!aV Lr'   r   r0   r   c                 f   t         j                   j                         }t        j                  d|      }t	        j
                  t	        j                  t        j                  |      t	        j                  t        j                  |       g      }t	        j                         }|j                  t	        j                               }|j                  |      }|j                  |t        z         }|j!                  |t        z   t"        z         }|j%                  |      }|j'                  |j'                               }|j)                  t	        j*                  dd       d      }|j)                  t	        j,                  t.        j0                  g      d      }|j)                  t	        j2                  ddddddddd	      d      }|j)                  t        j4                  j7                  |j'                               d      }|j9                  |t;        j<                               }||fS )	Ni  )public_exponentr   T)rw   path_lengthcriticalF)	digital_signaturecontent_commitmentkey_enciphermentdata_enciphermentkey_agreementkey_cert_signcrl_signencipher_onlydecipher_onlyprivate_key	algorithm)r`   rl   r   generate_private_keyr
   NameNameAttributer   r   r   CertificateBuilderrq   random_serial_numbersubject_namer^   CERT_VALIDITY_OFFSETrf   	CA_EXPIRYissuer_namerS   add_extensionrv   ExtendedKeyUsager   SERVER_AUTHKeyUsageSubjectKeyIdentifierfrom_public_keysignr   rU   )r   r0   r   rl   r   r   builderr   s           r%   	create_car      s   
 




!C**K 99w22B7w88,G	
D %%'G##D$=$=$?@G""4(G&&s-A'ABG%%c,@&@9&LMG!!$'G  !7!7!9:G##484 $ G ##2>>?@5 $ G ###$"#
	
  $ G ##!!11+2H2H2JK $ G <<K6==?<KDr'   r   c                    t        | t        j                        r| S t        | t              rt	        |       dkD  rt        | d   t
              rt        j                  dt        d       g }t        t        t
           |       D ]<  }	 t        j                  |      }|j                  t        j                  |             > t        j                  |      S t        j                  t        t$        t        j&                     |             S # t        $ rF |j                  d      j!                         }|j                  t        j"                  |             Y w xY w)z
    SANs used to be a list of strings in mitmproxy 10.1 and below, but now they're a list of GeneralNames.
    This function converts the old format to the new one.
    r   z0Passing SANs as a list of strings is deprecated.   )
stacklevelidna)r"   r
   r   r   lenr.   warningswarnDeprecationWarningr   	ipaddress
ip_addressr   	IPAddress
ValueErrorencodedecodeDNSNamer   GeneralName)r   ssr1   ips       r%   _fix_legacy_sansr     s   
 $))*43t9q=ZQ5M>	
 &(d3i& 	.A.))!,
 		$..,-	.   $$  ht/?/?&@$!GHH  +HHV$++-		$,,q/*+s   DAEEprivkeycacert
commonnamecrl_urlc           
         t        j                         }|j                  |j                        }|j	                  t        j
                  t        j                  g      d      }|j                  |j                               }t        j                  j                         }|j                  |t        z         }|j                  |t        z   t        z         }g }|duxr t        |      dk  }	|	r7|J |j!                  t        j"                  t$        j&                  |             |7|J |j!                  t        j"                  t$        j(                  |             |j+                  t        j,                  |            }|j/                  t        j0                               }|j	                  t        j2                  t5        |            |	       }	 |j6                  j9                  t         j:                        j<                  }
t         j>                  jA                  |
      }|j	                  |d      }|rR|j	                  t        jF                  t        jH                  t        jJ                  |      gddd      g      d      }|jM                  | tO        jP                               }tS        |      S # t         jB                  $ r0 t         j>                  jE                  |j                               }Y w xY w)am  
    Generates a dummy certificate.

    privkey: CA private key
    cacert: CA certificate
    commonname: Common name for the generated certificate.
    sans: A list of Subject Alternate Names.
    organization: Organization name for the generated certificate.
    crl_url: URL of CRL distribution point

    Returns cert if operation succeeded, None if not.
    Fr   N@   )relative_name
crl_issuerreasonsr   )*r
   r   r   ro   r   r   r   r   rS   r`   rl   r^   r   rf   CERT_EXPIRYr   r   r   r   r   r   r   r   rq   r   r   r   rt   ru   r   r/   AuthorityKeyIdentifier"from_issuer_subject_key_identifierrx   from_issuer_public_keyr   DistributionPointr   r   r   rU   r   )r   r   r   r   r   r   r   rl   ro   is_valid_commonname
issuer_skiakir   s                r%   
dummy_certr   :  s   ( %%'G!!&..1G##2>>?@5 $ G   !2!2!45G





!C&&s-A'ABG%%c,@&@;&NOGG$D0IS_r5I%%%t))'*=*=zJK'''t))'*C*C\RS""499W#56G##D$=$=$?@G ####$4T$:;(( $ G V&&>>%%

% 	 ))LLZX
 ##C%#8G ''&&**77@A&*#' $		  ( 
 <<Gv}}<GD:5 !! V ))@@ARARATUVs   AK A LLc                    t        j                         }|j                  |j                        }t        j                  j                         }|j                  |t        z         }|j                  |t        z   t        z         }|j                  t        j                  d      d      }|j                  | t        j                               }|j                  t         j"                  j$                        S )z
    Generates an empty CRL signed with the CA key

    privkey: CA private key
    cacert: CA certificate

    Returns a CRL DER encoded
    i  Fr   )r
    CertificateRevocationListBuilderr   rX   r`   rl   last_updater   next_update
CRL_EXPIRYr   	CRLNumberr   r   rU   rE   r   rF   DER)r   r   r   rl   crls        r%   	dummy_crlr    s     335G!!&--0G





!C!!#(<"<=G!!#(<"<z"IJG##DNN4$8%@G
,,7fmmo,
FCM226677r'   T)frozenc                   V    e Zd ZU eed<   ej                  ed<   edz  ed<   ee   ed<   y)CertStoreEntryr   
privatekeyN
chain_filechain_certs)	r   r   r   r   r   r   RSAPrivateKeyr   r   r   r'   r%   r	  r	    s'    
J!!!tdr'   r	  DHParamsc                   `   e Zd ZU dZdZej                  ed<   eed<   e	dz  ed<   e
e   ed<   eed<   eeef   ed	<   e
e   ed
<   dej                  dede	dz  dedef
dZdeddfdZede	defd       Ze	 d&de	ez  dedededz  dd f
d       Ze	 d&de	de	dedz  dd fd       Zeej4                  d               Ze	 d'de	dededdfd       Z	 d&dede	dedz  ddfdZdededdfdZedeej@                  z  de
e   fd        Z!	 	 d'd!edz  d"e"ej@                     d#edz  d$edz  def
d%Z#y)(	CertStorez4
    Implements an in-memory certificate store.
    d   default_privatekey
default_caNdefault_chain_filedefault_chain_certsdhparamscertsexpire_queuedefault_crlc                     || _         || _        || _        || _        | j                  rDt	        j
                  | j                  j                               D cg c]  }t        |       c}n|g| _        || _	        i | _
        g | _        y c c}w r!   )r  r  r  r  r
   load_pem_x509_certificates
read_bytesr   r  r  r  r  )r$   r  r  r  r  r  cs          r%   r&   zCertStore.__init__  s     #5$"4& &&	 88++668 Q  	  !
s   BentryrB   c                 4   | j                   j                  |       t        | j                         | j                  kD  rU| j                   j	                  d      }| j
                  j                         D ci c]  \  }}||k7  s|| c}}| _        y y c c}}w r   )r  r   r   	STORE_CAPpopr  items)r$   r  dr   r   s        r%   expirezCertStore.expire  sx      't  !DNN2!!%%a(A+/::+;+;+=H41aa!Q$HDJ 3Hs   6BBpathc                    | j                         s| j                  t               t        j                  j
                  j                  t        |       j                  t        j                               d      }|t        j                  j                  j                  k7  r,t        j                  j                  j                  |t        j                  j
                  j                        }t        j                  j
                  j                  |t        j                  j                  j                  t        j                  j                  j                  t        j                  j                  j                        }t        j                  j                  j                  |t        j                  j
                  j                         }|S t#        d      )N   rzError loading DH Params.)existswrite_bytesDEFAULT_DHPARAMrL   SSL_libBIO_new_filer.   r   rj   getfilesystemencoding_ffiNULLgcBIO_freePEM_read_bio_DHparamsDH_freeRuntimeError)r%  biodhs      r%   load_dhparamzCertStore.load_dhparam  s/    {{}_- kk++IS66894
 '++""'''++""%%c7;;+;+;+D+DEC!!77  %%  %%  %%	B !!$$R)9)9)A)ABBI566r'   basenamer   
passphrasec                     t        |      }|| dz  }|| dz  }|j                         s| j                  |||       | j                  |||      S )N-ca.pem-dhparam.pem)r   r(  create_store
from_files)r8   r%  r9  r   r:  ca_filedhparam_files          r%   
from_storezCertStore.from_store  s^     DzH:W--
,77~~T8X6~~g|Z@@r'   r@  rA  c                    |j                         }t        ||      }| j                  |      }t        j                  |      }t        |d         }t        ||j                        }	t        |      dkD  r|}
nd }
 | |||
|	|      S )Nr      )	r  load_pem_private_keyr8  r
   r  r   r  r   r   )r8   r@  rA  r:  rawkeyr7  r  rw   r  r  s              r%   r?  zCertStore.from_files  s       ""3
3l+//4%(^RXX&u:>&-JJ3JR00r'   c               #      K   t        j                  d      } t        j                  | dz         	 d t        j                  |        y# t        j                  |        w xY ww)z
        Context to temporarily set umask to its original value bitor 0o77.
        Useful when writing private keys to disk so that only the owner
        will be able to read them.
        r   ?   N)osumask)original_umasks    r%   umask_secretzCertStore.umask_secret#  sF      !
$&'	%HH^$BHH^$s   .A%A A%A""A%c                     | j                  dd       |xs |}|xs |}t        |||      \  }}t        j                         5  | | dz  j	                  |j                  t        j                  j                  t        j                  j                  t        j                               |j                  t        j                  j                        z          | | dz  j	                  t        j                  |j                         ||d t        j                                      d d d        |j                  t        j                  j                        }| | dz  j	                  |       | | d	z  j	                  |       | | d
z  j	                  t        j                  |j                         d |d t        j                                      | | dz  j	                  t                y # 1 sw Y   xY w)NT)parentsexist_ok)r   r0   r   r<  )encodingformatencryption_algorithmz-ca.p12)r   rG  r   casrS  z-ca-cert.pemz-ca-cert.cerz-ca-cert.p12r=  )mkdirr   r  rM  r)  private_bytesr   rF   rG   PrivateFormatTraditionalOpenSSLNoEncryptionrE   r   serialize_key_and_certificatesr   r*  )r%  r9  r   r   r0   rG  rw   pem_certs           r%   r>  zCertStore.create_store2  s    	

4$
/#/x^8 "xPR ##% 	xj((55!!*3377(66II)6)C)C)E " 
 //-"8"8"<"<=> xj((5555!*)6)C)C)E	. ??=#9#9#=#=>	8*L)	)66x@	8*L)	)66x@ 
8*L)	)6611__&%2%?%?%A	
 
8*L)	)66GO	 	s   C%G44G=specc           	      T   |j                         }t        j                  |      }	 t        ||      }|j	                         |j	                         k7  r>t        d|j                          d|j	                         d|j	                               	 t        j                  |      D cg c]  }t        |       }	}|j                  r't        j                  d|j                          d	       | j                  t        ||||	      |       y # t
        $ rW}| j                  }|j	                         |j	                         k7  r t        d|j                          d|       |Y d }~d }~ww xY wc c}w # t
        $ r%}t        j                  d|        |g}	Y d }~d }~ww xY w)
N)passwordzPrivate and public keys in "z"" do not match:
cert.public_key()=z
private_key.public_key()=zUnable to find private key in "z": z"Failed to read certificate chain: "z" is a certificate authority and not a leaf certificate. This indicates a misconfiguration, see https://docs.mitmproxy.org/stable/concepts-certificates/.)r  r   r7   rE  rS   r   absoluter  r
   r  loggerwarningrz   add_certr	  )
r$   r\  r%  r:  rF  r   r   er1   chains
             r%   add_cert_filezCertStore.add_cert_filei  s    oo}}S!	.sZHK  K$:$:$<< 24==?2C D*(* +1"--/13 	&*&E&Ec&JKT!WKEK
 ::NNDMMO$ %s t
 	nT;eDdK5  	11K K$:$:$<< 5dmmo5Fc!M =	 L 	NN?sCDFE	sB   D E9 +E4=E9 	E1AE,,E14E9 9	F'F""F'namesc                    |j                   j                  r#|| j                  |j                   j                  <   |j                   j                  D ]$  }|| j                  t	        |j
                        <   & |D ]  }|| j                  |<    y)z
        Adds a cert to the certstore. We register the CN in the cert plus
        any SANs, and also the list of names provided as an argument.
        N)r   r0   r  r-   r.   r/   )r$   r  rg  is       r%   rc  zCertStore.add_cert  sp    
 ::==(-DJJuzz}}%$$ 	-A',DJJs177|$	- 	"A!DJJqM	"r'   dnc           	      l   t        | t              rV| j                  d      }| g}t        dt	        |            D ](  }|j                  ddj                  ||d       z          * |S t        | t        j                        rt        j                  | j                        S t        | j                        gS )z
        Return all asterisk forms for a domain. For example, for www.example.com this will return
        [b"www.example.com", b"*.example.com", b"*.com"]. The single wildcard "*" is omitted.
        .rD  z*.N)r"   r.   splitranger   r   joinr
   r   r  asterisk_formsr/   )rj  r   retri  s       r%   rp  zCertStore.asterisk_forms  s     b#HHSME$C1c%j) 7

4#((59"5567JDLL)++BHH55M?"r'   r   r   r   r   c           
      J    t        |      }g }|r |j                   j                  |             |D ]"  }|j                   j                  |             $ |j                  d       |j                  ||f       t	        t         fd|      d      }|r j                  |   }|S t        t         j                   j                  j                  ||||       j                   j                   j                        }| j                  ||f<    j                  |       |S )a2  
        commonname: Common name for the generated certificate. Must be a
        valid, plain-ASCII, IDNA-encoded domain name.

        sans: A list of Subject Alternate Names.

        organization: Organization name for the generated certificate.

        crl_url: URL of CRL distribution point
        *c                      | j                   v S r!   )r  )rG  r$   s    r%   <lambda>z$CertStore.get_cert.<locals>.<lambda>  s    sdjj'8 r'   N)r   r
  r  r  )r   extendrp  r   nextfilterr  r	  r   r  r  r   r  r  r$  )	r$   r   r   r   r   potential_keyssr   r  s	   `        r%   get_certzCertStore.get_cert  s   "  %(*!!$"5"5j"AB 	:A!!$"5"5a"89	:c"z401F8.I4PJJt$E$ ! #++OO))   2222 44E .3DJJ
D)*KKr'   r!   NN)$r   r   r   r   r   r   r  r   r   r   r   r  dictTCertIdr	  r   r&   r$  staticmethodr8  r   r.   r   rB  r?  
contextlibcontextmanagerrM  r>  rf  rc  r
   r   rp  r   r{  r   r'   r%   r  r    s    I)))t#d#'((~&&--  !4K	
  4IN It I 74 7H 7 7.  $(ASjA A 	A
 DLA 
A A KO11*.1<ADL1	1 1 %  % HL4H4H!4H-04H	4H 4Hn AE!L!L#!L16!L	!LF
"n 
"c 
"d 
" #3!1!11 #d3i # #( $("/$J/ t''(/ Dj	/
 t/ 
/r'   r  rA   r^  c                 l    	 t        j                  | |      S # t        $ r |t        | d      cY S  w xY w)z
    like cryptography's load_pem_private_key, but silently falls back to not using a password
    if the private key is unencrypted.
    N)r   rE  	TypeError)rA   r^  s     r%   rE  rE    s?    
11$AA 'd33s    33r|  )Jr  r`   r   loggingrJ  rj   r   collections.abcr   dataclassesr   pathlibr   typingr   r   r   r	   rL   cryptographyr
   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   /cryptography.hazmat.primitives.asymmetric.typesr   ,cryptography.hazmat.primitives.serializationr   cryptography.x509r   r   mitmproxy.coretypesr   rk   typing_extensionsr   	getLoggerr   ra  	timedeltar   r   r  r   r*  Serializabler   r   r   r   r.   rW   r   RSAPrivateKeyWithSerializationr#   r   r   r   r   r  r   r   r  r	  TCustomCertIdTGeneratedCertIdr~  r  r  rE  r   r'   r%   <module>r     s       	 
  $ !        1 8 9 8 9 U ? 1 % ,g,#			8	$
 HH-	 h  c*XQ'
)x))r2 "\<$$ \~$)) U38_(= 111 1 3--t/?/??@	1hI8D$4$45S	A IdFWFW IF  $ZZZ d
Z 4##
$	Z
 *Z 4ZZ 
Zz888 80 $   #(9(99: 
//
0:u%Z Zz
u 
 
ARAR 
r'   