o
    àý°jÎ<  ã                   @  sÆ  U d dl m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m	Z	 d dl
mZ d dlmZ d dlmZmZ G dd„ dejƒZd	d
„ eD ƒZejejejejejejejejejejejejiZded< ejee f Z!eje ef Z"ej#dej$dej%dej&dej'dejdej(dejdej)di	Z*ded< dd
„ e* +¡ D ƒZ,ejdejdej#diZ-d.dd „Z.d/d!d"„Z/ej0d#ej1e e2f e e2d$d%�Z3G d&d'„ d'ej4e3 ƒZ5G d(d)„ d)ƒZ6G d*d+„ d+ƒZ7G d,d-„ d-ƒZ8dS )0é    )ÚannotationsN)ÚIterableÚIterator)Úutils)Úx509)ÚNameOIDÚObjectIdentifierc                   @  s<   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S )Ú	_ASN1Typeé   é   é   é   é   é   é   é   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú	BitStringÚOctetStringÚ
UTF8StringÚNumericStringÚPrintableStringÚ	T61StringÚ	IA5StringÚUTCTimeÚGeneralizedTimeÚVisibleStringÚUniversalStringÚ	BMPString© r%   r%   ú‰/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/cryptography/x509/name.pyr	      s    r	   c                 C  s   i | ]}|j |“qS r%   )Úvalue©Ú.0Úir%   r%   r&   Ú
<dictcomp>"   s    r+   z!dict[ObjectIdentifier, _ASN1Type]Ú_NAMEOID_DEFAULT_TYPEÚCNÚLÚSTÚOÚOUÚCÚSTREETÚDCÚUIDÚ_OidNameMapÚ_NAMEOID_TO_NAMEc                 C  s   i | ]\}}||“qS r%   r%   )r)   ÚkÚvr%   r%   r&   r+   =   s    )é   r:   )é   é@   Úvalústr | bytesÚreturnÚstrc                 C  sÒ   | sdS t | tƒrdt | ¡ d¡ S |  dd¡} |  dd¡} |  dd	¡} |  d
d¡} |  dd¡} |  dd¡} |  dd¡} |  dd¡} | d dksU| d dkrYt| ƒdkrYd|  } | d dkrg| dd… d } | S )z>Escape special characters in RFC4514 Distinguished Name value.Ú ú#Úutf8ú\z\\ú"z\"ú+z\+ú,z\,ú;z\;ú<z\<ú>z\>ú z\00r   ú r;   éÿÿÿÿNz\ )Ú
isinstanceÚbytesÚbinasciiÚhexlifyÚdecodeÚreplaceÚlen)r=   r%   r%   r&   Ú_escape_dn_valueF   s"   
$rU   c                 C  s   | sdS dd„ }t j || ¡S )NrA   c                 S  s8   |   d¡}t|ƒdkr|dd … S t | dd¡¡ ¡ S )Nr   r:   r;   rD   rA   )ÚgrouprT   rP   Ú	unhexlifyrS   rR   )Úmr=   r%   r%   r&   Úsubk   s   
z_unescape_dn_value.<locals>.sub)Ú_RFC4514NameParserÚ_PAIR_MULTI_RErY   )r=   rY   r%   r%   r&   Ú_unescape_dn_valuec   s   	r\   ÚNameAttributeValueTypeT)Ú	covariantc                   @  sv   e Zd Z	d$ddœd%dd„Zed&dd„ƒZed'dd„ƒZed(dd„ƒZ	d$d)dd„Zd*dd„Z	d+d d!„Z
d(d"d#„ZdS ),ÚNameAttributeNT)Ú	_validateÚoidr   r'   r]   Ú_typeú_ASN1Type | Noner`   Úboolr?   ÚNonec          
      C  s  t |tƒs	tdƒ‚|tjkr!|tjkrtdƒ‚t |tƒs tdƒ‚n	t |tƒs*tdƒ‚t	 
|¡}|d urg|\}}t |tƒs>J ‚t| d¡ƒ}||k sM||krgd|› d|› d|› �}	|d	u r`t|	ƒ‚tj|	d
d� |d u rrt 
|tj¡}t |tƒs{tdƒ‚|| _|| _|| _d S )Nz2oid argument must be an ObjectIdentifier instance.z6oid must be X500_UNIQUE_IDENTIFIER for BitString type.z!value must be bytes for BitStringzvalue argument must be a strrC   zAttribute's length must be >= z and <= z, but it was Tr:   )Ú
stacklevelz%_type must be from the _ASN1Type enum)rN   r   Ú	TypeErrorr	   r   r   ÚX500_UNIQUE_IDENTIFIERrO   r@   Ú_NAMEOID_LENGTH_LIMITÚgetrT   ÚencodeÚ
ValueErrorÚwarningsÚwarnr,   r   Ú_oidÚ_valuerb   )
Úselfra   r'   rb   r`   Úlength_limitsÚ
min_lengthÚ
max_lengthÚc_lenÚmsgr%   r%   r&   Ú__init__�   sH   
ÿ

ÿ
ÿ

ÿÿÿ

zNameAttribute.__init__c                 C  ó   | j S ©N)ro   ©rq   r%   r%   r&   ra   ¶   ó   zNameAttribute.oidc                 C  rx   ry   )rp   rz   r%   r%   r&   r'   º   r{   zNameAttribute.valuer@   c                 C  s   t  | j| jj¡S )zt
        The short attribute name (for example "CN") if available,
        otherwise the OID dotted string.
        )r7   rj   ra   Údotted_stringrz   r%   r%   r&   Úrfc4514_attribute_name¾   ó   z$NameAttribute.rfc4514_attribute_nameÚattr_name_overridesú_OidNameMap | Nonec                 C  s6   |r|  | j¡nd}|du r| j}|› dt| jƒ› �S )z 
        Format as RFC4514 Distinguished Name string.

        Use short attribute name if available, otherwise fall back to OID
        dotted string.
        Nú=)rj   ra   r}   rU   r'   )rq   r   Ú	attr_namer%   r%   r&   Úrfc4514_stringÆ   s
   
ÿzNameAttribute.rfc4514_stringÚotherÚobjectc                 C  s&   t |tƒstS | j|jko| j|jkS ry   )rN   r_   ÚNotImplementedra   r'   ©rq   r„   r%   r%   r&   Ú__eq__×   s   
zNameAttribute.__eq__Úintc                 C  s   t | j| jfƒS ry   )Úhashra   r'   rz   r%   r%   r&   Ú__hash__Ý   ó   zNameAttribute.__hash__c                 C  s   d| j › d| j›d�S )Nz<NameAttribute(oid=z, value=ú)>)ra   r'   rz   r%   r%   r&   Ú__repr__à   s   zNameAttribute.__repr__ry   )
ra   r   r'   r]   rb   rc   r`   rd   r?   re   )r?   r   )r?   r]   ©r?   r@   ©r   r€   r?   r@   ©r„   r…   r?   rd   ©r?   r‰   )r   r   r   rw   Úpropertyra   r'   r}   rƒ   rˆ   r‹   rŽ   r%   r%   r%   r&   r_   €   s     üú5ÿ

r_   c                   @  s`   e Zd Zd dd„Zd!d	d
„Z	d"d#dd„Zd$dd„Zd%dd„Zd&dd„Zd%dd„Z	d'dd„Z
dS )(ÚRelativeDistinguishedNameÚ
attributesú$Iterable[NameAttribute[str | bytes]]c                 C  s\   t |ƒ}|s
tdƒ‚tdd„ |D ƒƒstdƒ‚|| _t|ƒ| _t| jƒt|ƒkr,tdƒ‚d S )Nz-a relative distinguished name cannot be emptyc                 s  ó   � | ]}t |tƒV  qd S ry   ©rN   r_   ©r)   Úxr%   r%   r&   Ú	<genexpr>é   ó   € z5RelativeDistinguishedName.__init__.<locals>.<genexpr>z/attributes must be an iterable of NameAttributez$duplicate attributes are not allowed)Úlistrl   Úallrg   Ú_attributesÚ	frozensetÚ_attribute_setrT   ©rq   r•   r%   r%   r&   rw   å   s   
ÿz"RelativeDistinguishedName.__init__ra   r   r?   ú list[NameAttribute[str | bytes]]c                   ó   ‡ fdd„| D ƒS )Nc                   ó   g | ]	}|j ˆ kr|‘qS r%   ©ra   r(   r¦   r%   r&   Ú
<listcomp>÷   ó    zDRelativeDistinguishedName.get_attributes_for_oid.<locals>.<listcomp>r%   ©rq   ra   r%   r¦   r&   Úget_attributes_for_oidó   ó   z0RelativeDistinguishedName.get_attributes_for_oidNr   r€   r@   c                   s   d  ‡ fdd„| jD ƒ¡S )z¬
        Format as RFC4514 Distinguished Name string.

        Within each RDN, attributes are joined by '+', although that is rarely
        used in certificates.
        rF   c                 3  ó   � | ]}|  ˆ ¡V  qd S ry   ©rƒ   ©r)   Úattr©r   r%   r&   r›     ó
   € ÿ
ÿz;RelativeDistinguishedName.rfc4514_string.<locals>.<genexpr>)ÚjoinrŸ   ©rq   r   r%   r°   r&   rƒ   ù   s   	þz(RelativeDistinguishedName.rfc4514_stringr„   r…   rd   c                 C  ó   t |tƒstS | j|jkS ry   )rN   r”   r†   r¡   r‡   r%   r%   r&   rˆ     ó   
z RelativeDistinguishedName.__eq__r‰   c                 C  ó
   t | jƒS ry   )rŠ   r¡   rz   r%   r%   r&   r‹     ó   
z"RelativeDistinguishedName.__hash__ú$Iterator[NameAttribute[str | bytes]]c                 C  r¶   ry   )ÚiterrŸ   rz   r%   r%   r&   Ú__iter__  r·   z"RelativeDistinguishedName.__iter__c                 C  r¶   ry   )rT   rŸ   rz   r%   r%   r&   Ú__len__  r·   z!RelativeDistinguishedName.__len__c                 C  ó   d|   ¡ › d�S )Nz<RelativeDistinguishedName(r�   r­   rz   r%   r%   r&   rŽ     rŒ   z"RelativeDistinguishedName.__repr__)r•   r–   ©ra   r   r?   r£   ry   r�   r‘   r’   ©r?   r¸   r�   )r   r   r   rw   rª   rƒ   rˆ   r‹   rº   r»   rŽ   r%   r%   r%   r&   r”   ä   s    

ÿ



r”   c                   @  sº   e Zd Zejd3dd„ƒZejd4dd„ƒZd5d
d„Ze	d6d7dd„ƒZed8dd„ƒZ	d6d9dd„Z	d:dd„Z
ed;dd„ƒZd6d<d"d#„Zd=d'd(„Zd>d*d+„Zd?d-d.„Zd>d/d0„Zd@d1d2„ZdS )AÚNamer•   r–   r?   re   c                 C  ó   d S ry   r%   r¢   r%   r%   r&   rw     ó   zName.__init__ú#Iterable[RelativeDistinguishedName]c                 C  rÀ   ry   r%   r¢   r%   r%   r&   rw      rÁ   ú@Iterable[NameAttribute[str | bytes] | RelativeDistinguishedName]c                 C  s^   t |ƒ}tdd„ |D ƒƒrdd„ |D ƒ| _d S tdd„ |D ƒƒr+t t t |¡| _d S tdƒ‚)Nc                 s  r—   ry   r˜   r™   r%   r%   r&   r›   ,  rœ   z Name.__init__.<locals>.<genexpr>c                 S  s   g | ]}t t t|¡gƒ‘qS r%   )r”   ÚtypingÚcastr_   r™   r%   r%   r&   r§   -  s    ÿÿz!Name.__init__.<locals>.<listcomp>c                 s  r—   ry   )rN   r”   r™   r%   r%   r&   r›   1  rœ   zNattributes must be a list of NameAttribute or a list RelativeDistinguishedName)r�   rž   rŸ   rÄ   rÅ   r”   rg   r¢   r%   r%   r&   rw   %  s   þ
ÿÿNÚdatar@   r   ú_NameOidMap | Nonec                 C  s   t ||pi ƒ ¡ S ry   )rZ   Úparse)ÚclsrÆ   r   r%   r%   r&   Úfrom_rfc4514_string;  r~   zName.from_rfc4514_stringrO   c                 C  s
   t  |¡S )zS
        Parse a DER encoded X.509 name (the inverse of ``public_bytes``).
        )Ú	rust_x509Úparse_name_bytes)rÉ   rÆ   r%   r%   r&   Ú
from_bytesC  s   
zName.from_bytesr€   c                   s   d  ‡ fdd„t| jƒD ƒ¡S )að  
        Format as RFC4514 Distinguished Name string.
        For example 'CN=foobar.com,O=Foo Corp,C=US'

        An X.509 name is a two-level structure: a list of sets of attributes.
        Each list element is separated by ',' and within each list element, set
        elements are separated by '+'. The latter is almost never used in
        real world certificates. According to RFC4514 section 2.1 the
        RDNSequence must be reversed when converting to string representation.
        rG   c                 3  r¬   ry   r­   r®   r°   r%   r&   r›   W  r±   z&Name.rfc4514_string.<locals>.<genexpr>)r²   ÚreversedrŸ   r³   r%   r°   r&   rƒ   J  s   þzName.rfc4514_stringra   r   r£   c                   r¤   )Nc                   r¥   r%   r¦   r(   r¦   r%   r&   r§   `  r¨   z/Name.get_attributes_for_oid.<locals>.<listcomp>r%   r©   r%   r¦   r&   rª   \  r«   zName.get_attributes_for_oidúlist[RelativeDistinguishedName]c                 C  rx   ry   ©rŸ   rz   r%   r%   r&   Úrdnsb  r{   z	Name.rdnsÚbackendú
typing.Anyc                 C  s
   t  | ¡S ry   )rË   Úencode_name_bytes)rq   rÒ   r%   r%   r&   Úpublic_bytesf  r·   zName.public_bytesr„   r…   rd   c                 C  r´   ry   )rN   r¿   r†   rŸ   r‡   r%   r%   r&   rˆ   i  rµ   zName.__eq__r‰   c                 C  s   t t| jƒƒS ry   )rŠ   ÚtuplerŸ   rz   r%   r%   r&   r‹   o  s   zName.__hash__r¸   c                 c  s   � | j D ]}|E d H  qd S ry   rÐ   )rq   Úrdnr%   r%   r&   rº   t  s   €
ÿzName.__iter__c                 C  s   t dd„ | jD ƒƒS )Nc                 s  s   � | ]}t |ƒV  qd S ry   )rT   )r)   r×   r%   r%   r&   r›   y  s   € zName.__len__.<locals>.<genexpr>)ÚsumrŸ   rz   r%   r%   r&   r»   x  s   zName.__len__c                 C  r¼   )Nz<Name(r�   r­   rz   r%   r%   r&   rŽ   {  rŒ   zName.__repr__)r•   r–   r?   re   )r•   rÂ   r?   re   )r•   rÃ   r?   re   ry   )rÆ   r@   r   rÇ   r?   r¿   )rÆ   rO   r?   r¿   r�   r½   )r?   rÏ   )rÒ   rÓ   r?   rO   r‘   r’   r¾   r�   )r   r   r   rÄ   Úoverloadrw   ÚclassmethodrÊ   rÍ   rƒ   rª   r“   rÑ   rÕ   rˆ   r‹   rº   r»   rŽ   r%   r%   r%   r&   r¿     s,    
ýÿ




r¿   c                   @  s(  e Zd Ze d¡Ze d¡ZdZdZde› de› d�Z	e de› d	e› d
�¡Z
dZdZdZdeejƒ› d�Ze› de› �Ze› de› �Ze› de› �Ze de› de	› de› de	› de› de	› d�ej¡Ze d¡Zd2dd„Zd3dd„Zd4d!d"„Zd5d$d%„Zd6d&d'„Zd7d)d*„Zd8d,d-„Zd9d/d0„Zd1S ):rZ   z!(0|([1-9]\d*))(\.(0|([1-9]\d*)))+z[a-zA-Z][a-zA-Z\d-]*z[\\ #=\"\+,;<>]z[\da-zA-Z]{2}z\\(ú|ú)z(\\z)|((\\z)+)z7[\x01-\x1f\x21\x24-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]z3[\x01-\x21\x23-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]z7[\x01-\x1F\x21\x23-\x2A\x2D-\x3A\x3D\x3F-\x5B\x5D-\x7F]z[\x80-ú]z
        (
            (z!)
            (
                (z)*
                (z$)
            )?
        )?
        z#([\da-zA-Z]{2})+rÆ   r@   r   Ú_NameOidMapr?   re   c                 C  s   || _ d| _|| _d S )Nr   )Ú_dataÚ_idxÚ_attr_name_overrides)rq   rÆ   r   r%   r%   r&   rw   œ  s   
z_RFC4514NameParser.__init__rd   c                 C  s   | j t| jƒk S ry   )rà   rT   rß   rz   r%   r%   r&   Ú	_has_data¢  rŒ   z_RFC4514NameParser._has_dataú
str | Nonec                 C  s   |   ¡ r
| j| j S d S ry   )râ   rß   rà   rz   r%   r%   r&   Ú_peek¥  s   z_RFC4514NameParser._peekÚchc                 C  s"   |   ¡ |krt‚|  jd7  _d S )Nr;   )rä   rl   rà   )rq   rå   r%   r%   r&   Ú
_read_charª  s   z_RFC4514NameParser._read_charc                 C  s<   |j | j| jd�}|d u rt‚| ¡ }|  jt|ƒ7  _|S )N)Úpos)Úmatchrß   rà   rl   rV   rT   )rq   Úpatrè   r=   r%   r%   r&   Ú_read_re¯  s   z_RFC4514NameParser._read_rer¿   c                 C  sN   |   ¡ stg ƒS |  ¡ g}|   ¡ r!|  d¡ | |  ¡ ¡ |   ¡ stt|ƒƒS )a'  
        Parses the `data` string and converts it to a Name.

        According to RFC4514 section 2.1 the RDNSequence must be
        reversed when converting to string representation. So, when
        we parse it, we need to reverse again to get the RDNs on the
        correct order.
        rG   )râ   r¿   Ú
_parse_rdnræ   ÚappendrÎ   )rq   rÑ   r%   r%   r&   rÈ   ·  s   


þz_RFC4514NameParser.parser”   c                 C  sB   |   ¡ g}|  ¡ dkr|  d¡ | |   ¡ ¡ |  ¡ dkst|ƒS )NrF   )Ú	_parse_narä   ræ   rì   r”   )rq   Únasr%   r%   r&   rë   Ì  s   

þz_RFC4514NameParser._parse_rdnúNameAttribute[str]c              	   C  s°   z|   | j¡}W n ty'   |   | j¡}| j |t |¡¡}|d u r%t‚Y nw t|ƒ}|  d¡ |  	¡ dkrI|   | j
¡}t |dd … ¡ ¡ }n
|   | j¡}t|ƒ}t||ƒS )Nr�   rB   r;   )rê   Ú_OID_RErl   Ú	_DESCR_RErá   rj   Ú_NAME_TO_NAMEOIDr   ræ   rä   Ú_HEXSTRING_RErP   rW   rR   Ú
_STRING_REr\   r_   )rq   Ú	oid_valueÚnamera   r'   Ú	raw_valuer%   r%   r&   rí   Ô  s&   
ÿÿû

z_RFC4514NameParser._parse_naN)rÆ   r@   r   rÞ   r?   re   )r?   rd   )r?   rã   )rå   r@   r?   re   r�   )r?   r¿   )r?   r”   )r?   rï   ) r   r   r   ÚreÚcompilerð   rñ   Ú_ESCAPE_SPECIALÚ_ESCAPE_HEXÚ_PAIRr[   Ú_LUTF1Ú_SUTF1Ú_TUTF1ÚchrÚsysÚ
maxunicodeÚ_UTFMBÚ	_LEADCHARÚ_STRINGCHARÚ
_TRAILCHARÚVERBOSErô   ró   rw   râ   rä   ræ   rê   rÈ   rë   rí   r%   r%   r%   r&   rZ     sN    

þþüüûû	ö







rZ   )r=   r>   r?   r@   )r=   r@   r?   r@   )9Ú
__future__r   rP   rø   r  rÄ   rm   Úcollections.abcr   r   Úcryptographyr   Ú"cryptography.hazmat.bindings._rustr   rË   Úcryptography.x509.oidr   r   ÚEnumr	   Ú_ASN1_TYPE_TO_ENUMÚCOUNTRY_NAMEr   ÚJURISDICTION_COUNTRY_NAMEÚSERIAL_NUMBERÚDN_QUALIFIERÚEMAIL_ADDRESSr   ÚDOMAIN_COMPONENTr,   Ú__annotations__ÚMappingr@   r6   rÞ   ÚCOMMON_NAMEÚLOCALITY_NAMEÚSTATE_OR_PROVINCE_NAMEÚORGANIZATION_NAMEÚORGANIZATIONAL_UNIT_NAMEÚSTREET_ADDRESSÚUSER_IDr7   Úitemsrò   ri   rU   r\   ÚTypeVarÚUnionrO   r]   ÚGenericr_   r”   r¿   rZ   r%   r%   r%   r&   Ú<module>   sb   ú
÷ý

û	d6e