
    @OOfQ                     v   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!  ejD                  d      Z# ejD                  d      Z$dZ% G d de!jL                        Z'dejP                  de)e*e+e+f      fdZ,de+de+de-de*ej\                  ej^                  f   fdZ0d eejb                     e)e+   z  dejd                  fd!Z3	 d0d"ejh                  d#ej^                  d$e+dz  d eejb                     de+dz  de'fd%Z5 e	d&'       G d( d)             Z6e+Z7e*ee+   ejd                  f   Z8ee7e8f   Z9 ed*e:      Z; G d+ d,      Z<d-e:d.e:dz  dejh                  fd/Z=y)1    N)Iterable)	dataclass)Path)cast)NewType)Optional)Union)x509)hashes)serialization)dsa)ec)rsa)pkcs12)ExtendedKeyUsageOID)NameOID)serializableiB  daysim  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                   j   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dej&                  j(                  fdZdefdZedeeeef      fd       Zedej:                  fd       Zedej:                  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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jP                  fd       Z)y)Certz&Representation of a (TLS) certificate._certcertc                 J    t        |t        j                        sJ || _        y N)
isinstancer
   Certificater   )selfr   s     P/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/mitmproxy/certs.py__init__zCert.__init__7   s    $ 0 0111
    c                 D    | j                         |j                         k(  S r   )fingerprint)r   others     r   __eq__zCert.__eq__;   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__>   s?    *.--8QCL88477+[B?? 9s   A c                 6    | j                   j                         S r   )r   __hash__r   s    r   r.   zCert.__hash__B   s    zz""$$r!   c                 $    | j                  |      S r   )from_pem)clsstates     r   
from_statezCert.from_stateE   s    ||E""r!   c                 "    | j                         S r   )to_pemr/   s    r   	get_statezCert.get_stateI   s    {{}r!   c                 8    t        j                  |      | _        y r   )r
   load_pem_x509_certificater   )r   r3   s     r   	set_statezCert.set_stateL   s    33E:
r!   datareturnc                 <    t        j                  |      } | |      S r   )r
   r9   )r2   r;   r   s      r   r1   zCert.from_pemO   s    --d34yr!   c                 h    | j                   j                  t        j                  j                        S r   )r   public_bytesr   EncodingPEMr/   s    r   r6   zCert.to_pemT   s#    zz&&}'='='A'ABBr!   r
   c                 6    t         |j                               S r   )r   to_cryptography)r   r
   s     r   from_pyopensslzCert.from_pyopensslW   s    (D((*++r!   c                 h    t         j                  j                  j                  | j                        S r   )OpenSSLcryptoX509from_cryptographyr   r/   s    r   to_pyopensslzCert.to_pyopenssl[   s!    ~~""44TZZ@@r!   c                 \    | j                   j                  t        j                               S r   )r   r#   r   SHA256r/   s    r   r#   zCert.fingerprint^   s    zz%%fmmo66r!   c                 @    t        | j                  j                        S r   )_name_to_keyvalr   issuerr/   s    r   rO   zCert.issuera   s    tzz0011r!   c                     	 | j                   j                  S # t        $ rA | j                   j                  j	                  t
        j                  j                        cY S w xY wN)tzinfo)r   not_valid_before_utcAttributeErrornot_valid_beforereplacedatetimetimezoneutcr/   s    r   	notbeforezCert.notbeforee   sS    	U::222 	U::..66h>O>O>S>S6TT	U    AA"!A"c                     	 | j                   j                  S # t        $ rA | j                   j                  j	                  t
        j                  j                        cY S w xY wrQ   )r   not_valid_after_utcrT   not_valid_afterrV   rW   rX   rY   r/   s    r   notafterzCert.notaftern   sS    	T::111 	T::--55X=N=N=R=R5SS	Tr[   c                 $   t         j                  dk  rDt        j                  j                  t        j                  j
                        | j                  kD  S t        j                  j                  t        j                        | j                  kD  S )N)      )sysversion_inforW   nowrX   rY   r_   UTCr/   s    r   has_expiredzCert.has_expiredu   s`    g%$$(():):)>)>?$--OO  $$X\\2T]]BBr!   c                 @    t        | j                  j                        S r   )rN   r   subjectr/   s    r   ri   zCert.subjectz   s    tzz1122r!   c                 .    | j                   j                  S r   )r   serial_numberr/   s    r   serialzCert.serial~   s    zz'''r!   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   
public_keyr   r   RSAPublicKeyrt   r   DSAPublicKeyr   EllipticCurvePublicKeycurvename	__class____name__rV   getattr)r   rv   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   ri   get_attributes_for_oidr
   r   COMMON_NAMEr   r(   r)   r   attrss     r   r*   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   ri   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   
extensionsget_extension_for_classr
   SubjectAlternativeNamer)   GeneralNamesExtensionNotFound)r   sanss     r   r'   zCert.altnames   sm    
	+::((@@++e  $$T** %% 	)$$R((	)s   =A (A?>A?)*r}   
__module____qualname____doc__r
   r   __annotations__r    r%   r,   r.   classmethodr4   r7   r:   bytesr1   r6   rF   rG   rH   rD   rJ   r#   propertylisttupler(   rO   rW   rZ   r_   boolrg   ri   intrl   r   r*   r   r   r'    r!   r   r   r   2   s   0T-- 9@% # #; E f  C C ,7>>#6#6 ,6 , ,Agnn11 A7U 7 2U38_- 2 2 U8,, U U T(++ T TCT C
 3eCHo. 3 3 ( ( ( 
sCx 
 
 C$J   cDj   +$++ + +r!   r   r{   r<   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   rN   rN      s[    E !++C03djj!aV Lr!   r   r*   rt   c                 x   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        j                  d      z
        }|j!                  |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_exponentrt      r   T)ca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)rW   re   r   generate_private_keyr
   NameNameAttributer   r   r   CertificateBuilderrk   random_serial_numbersubject_namerU   	timedeltar^   	CA_EXPIRYissuer_namerv   add_extensionBasicConstraintsExtendedKeyUsager   SERVER_AUTHKeyUsageSubjectKeyIdentifierfrom_public_keysignr   rL   )r   r*   rt   re   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&&sX-?-?Q-G'GHG%%cIo6G!!$'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                  |       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.r   )
stacklevelidna)r   r
   r   r   lenr(   warningswarnDeprecationWarningr   	ipaddress
ip_addressr   	IPAddress
ValueErrorencodedecodeDNSName)r   ssr+   ips       r   _fix_legacy_sansr      s    
 $))*43t9q=ZQ5M>	
 &(d3i& 	.A.))!,
 		$..,-	.   $$  &&  +HHV$++-		$,,q/*+s   C,,AD;:D;privkeycacert
commonnamec                    t        j                         }|j                  |j                        }|j	                  t        j
                  t        j                  g      d      }|j                  |j                               }t        j                  j                         }|j                  |t        j                  d      z
        }|j                  |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        |            |       }|j	                  t         j6                  j9                  |j                               d      }|j;                  | t=        j>                               }	tA        |	      S )aB  
    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.

    Returns cert if operation succeeded, None if not.
    Fr   r   r   N@   r   )!r
   r   r   ri   r   r   r   r   rv   rW   re   rU   r   r^   CERT_EXPIRYr   r   r   r   r   r   r   r   rk   r   r   r   AuthorityKeyIdentifierfrom_issuer_public_keyr   r   rL   r   )
r   r   r   r   r   r   re   ri   is_valid_commonnamer   s
             r   
dummy_certr   
  s   $ %%'G!!&..1G##2>>?@5 $ G   !2!2!45G





!C&&sX-?-?Q-G'GHG%%cK&78GG$D0IS_r5I%%%t))'*=*=zJK'''t))'*C*C\RS""499W#56G##D$=$=$?@G ####$4T$:;(( $ G ####::6;L;L;NO $ G <<Gv}}<GD:r!   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   F  s'    
J!!!tdr!   r   DHParamsc                      e Zd ZU dZdZeeef   ed<   e	e   ed<   de
j                  dededz  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fd"Z#y)%	CertStorez4
    Implements an in-memory certificate store.
    d   certsexpire_queuedefault_privatekey
default_cadefault_chain_fileNdhparamsc                     || _         || _        || _        | j                  r-t        j                  | j                  j                               n|g| _        || _        i | _        g | _	        y r   )
r   r   r   r
   load_pem_x509_certificates
read_bytesdefault_chain_certsr   r   r   )r   r   r   r   r   s        r   r    zCertStore.__init__^  sj     #5$"4 && ++D,C,C,N,N,PQ 	 
 !
r!   entryr<   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.expireq  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_DHPARAMrF   SSL_libBIO_new_filer(   r   rc   getfilesystemencoding_ffiNULLgcBIO_freePEM_read_bio_DHparamsDH_freeRuntimeError)r  biodhs      r   load_dhparamzCertStore.load_dhparamw  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!   basenamert   
passphrasec                     t        |      }|| dz  }|| dz  }|j                         s| j                  |||       | j                  |||      S )N-ca.pem-dhparam.pem)r   r  create_store
from_files)r2   r  r  rt   r  ca_filedhparam_files          r   
from_storezCertStore.from_store  s^     DzH:W--
,77~~T8X6~~g|Z@@r!   r  r  c                     |j                         }t        ||      }| j                  |      }t        j                  |      }t        |d         }t        |      dkD  r|}	nd }	 | |||	|      S )Nr      )r   load_pem_private_keyr  r
   r   r   r   )
r2   r  r  r  rawkeyr  r   r   r   s
             r   r  zCertStore.from_files  sq       ""3
3l+//4%(^u:>&-JJ3J++r!   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   r*   rt   r  )encodingformatencryption_algorithmz-ca.p12)r{   r$  r   casr0  z-ca-cert.pemz-ca-cert.cerz-ca-cert.p12r  )mkdirr   r   r*  r  private_bytesr   r@   rA   PrivateFormatTraditionalOpenSSLNoEncryptionr?   r   serialize_key_and_certificatesr   r  )r  r  rt   r   r*   r$  r   pem_certs           r   r  zCertStore.create_store  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                     |j                         }t        j                  |      }	 t        ||      }| j                  t        ||||g      |       y # t        $ r | j
                  }Y 7w xY w)N)password)r   r   r1   r"  r   r   add_certr   )r   r9  r  r  r#  r   r$  s          r   add_cert_filezCertStore.add_cert_file  sh     oo}}S!	*&sZ@C 	nT3tf=tD  	*))C	*s   A A,+A,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   r*   r   r'   r(   r)   )r   r   r>  is       r   r<  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.
        .r!  z*.N)r   r(   splitranger   r   joinr
   r   r   asterisk_formsr)   )rA  r   retr@  s       r   rG  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   c           	      H    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 )a  
        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.
        *c                      | j                   v S r   )r   )r$  r   s    r   <lambda>z$CertStore.get_cert.<locals>.<lambda>4  s    sdjj'8 r!   N)r   r   r   r   )r   extendrG  r   nextfilterr   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   dictTCertIdr   r   r   r   r   r   r   r   r    r  staticmethodr  r   r(   r   r   r  r  
contextlibcontextmanagerr*  r  r=  r<  r
   GeneralNamerG  r   rR  r   r!   r   r   r   U  sL    I'((~&&--  !4K	
 &IN It I 74 7H 7 7.  $(ASjA A 	A
 DLA 
A A KO,,*.,<ADL,	, , %  % HL4H4H!4H-04H	4H 4Hn AE
E
E#
E16
E	
E
"n 
"c 
"d 
" #3!1!11 #d3i # #( $(	+$J+ t''(+ Dj	+
 
+r!   r   r;   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   r"  	TypeError)r;   r;  s     r   r"  r"  J  s?    
11$AA 'd33s    33r   )>rV  rW   r   r'  rc   r   collections.abcr   dataclassesr   pathlibr   typingr   r   r   r	   rF   cryptographyr
   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   ,cryptography.hazmat.primitives.serializationr   cryptography.x509r   r   mitmproxy.coretypesr   r   r   r   r  Serializabler   r   r   r   r(   rN   r   RSAPrivateKeyWithSerializationr   r   rX  r   r   r   r   r   TCustomCertIdTGeneratedCertIdrT  r   r   r   r"  r   r!   r   <module>ri     s      	 
  $ !        1 8 9 8 9 ? 1 % , HH-	 h  c*"z+<$$ z+z$)) U38_(= 111 1 3--t/?/??@	1h'8D$4$45S	A 'dFWFW 'F  $999 d
9 4##
$	9
 *9 
9x $   #(9(99: 
//
0:u%r rj
u 
 
ARAR 
r!   