o
    ˷ex7                     @   s  U 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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ejeef ed	< 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%eed< dd e%& D Z'dej(ee)f defddZ*dedefddZ+G dd dZ,G dd dZ-G dd  d Z.G d!d" d"Z/dS )#    N)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"   M/var/www/ideatree/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(   _NAMEOID_DEFAULT_TYPECNLSTOOUCSTREETDCUID_NAMEOID_TO_NAMEc                 C   s   i | ]\}}||qS r"   r"   )r&   kvr"   r"   r#   r(   ;   s    valreturnc                 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v rMd|  } | d dkr[| dd d } | S )z>Escape special characters in RFC4514 Distinguished Name value. #utf8\z\\"z\"+z\+,z\,;z\;<z\<>z\> z\00r   )r9    rC   Nz\ )
isinstancebytesbinasciihexlifydecodereplace)r6   r"   r"   r#   _escape_dn_value>   s"   
rK   c                 C   s   | sdS dd }t j|| S )Nr8   c                 S   s(   |  d}t|dkr|S tt|dS )N      )grouplenchrint)mr6   r"   r"   r#   subc   s   
z_unescape_dn_value.<locals>.sub)_RFC4514NameParser_PAIR_RErS   )r6   rS   r"   r"   r#   _unescape_dn_value[   s   rV   c                   @   s   e Zd Z	ddddedejeef deje	 de
ddf
d	d
ZedefddZedejeef fddZedefddZ	ddeje defddZdede
fddZdefddZdefddZdS )NameAttributeNT)	_validateoidr$   _typerX   r7   c                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j	ks4|tj
kr\t |ts;J t|d}|dkrN|du rNtd|dkr\tjd	|dd
 |d u rgt|tj}t |tspt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 strr:      Tz/Country name must be a 2 character country codezUCountry names should be two characters, but the attribute is {} characters in length.)
stacklevelz%_type must be from the _ASN1Type enum)rE   r   	TypeErrorr   r   r   X500_UNIQUE_IDENTIFIERrF   strCOUNTRY_NAMEJURISDICTION_COUNTRY_NAMErO   encode
ValueErrorwarningswarnformatr)   getr   _oid_valuerZ   )selfrY   r$   rZ   rX   c_lenr"   r"   r#   __init__o   sF   








zNameAttribute.__init__c                 C      | j S N)rh   rj   r"   r"   r#   rY         zNameAttribute.oidc                 C   rm   rn   )ri   ro   r"   r"   r#   r$      rp   zNameAttribute.valuec                 C   s   t | j| jjS )zt
        The short attribute name (for example "CN") if available,
        otherwise the OID dotted string.
        )r3   rg   rY   dotted_stringro   r"   r"   r#   rfc4514_attribute_name   s   z$NameAttribute.rfc4514_attribute_nameattr_name_overridesc                 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=)rg   rY   rr   rK   r$   )rj   rs   	attr_namer"   r"   r#   rfc4514_string   s
   
zNameAttribute.rfc4514_stringotherc                 C   s&   t |tstS | j|jko| j|jkS rn   )rE   rW   NotImplementedrY   r$   rj   rw   r"   r"   r#   __eq__   s   
zNameAttribute.__eq__c                 C   s   t | j| jfS rn   )hashrY   r$   ro   r"   r"   r#   __hash__      zNameAttribute.__hash__c                 C   s
   d | S )Nz/<NameAttribute(oid={0.oid}, value={0.value!r})>)rf   ro   r"   r"   r#   __repr__      
zNameAttribute.__repr__rn   )r   r   r   r   typingUnionr_   rF   Optionalr   boolrl   propertyrY   r$   rr   _OidNameMaprv   objectrz   rQ   r|   r~   r"   r"   r"   r#   rW   n   s<    
8
rW   c                   @   s   e Zd Zdeje fddZdedeje fddZ		dd	ej
e defd
dZdedefddZdefddZdeje fddZdefddZdefddZdS )RelativeDistinguishedName
attributesc                 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 rn   rE   rW   r&   xr"   r"   r#   	<genexpr>       z5RelativeDistinguishedName.__init__.<locals>.<genexpr>z/attributes must be an iterable of NameAttributez$duplicate attributes are not allowed)listrc   allr]   _attributes	frozenset_attribute_setrO   rj   r   r"   r"   r#   rl      s   
z"RelativeDistinguishedName.__init__rY   r7   c                        fdd| D S )Nc                       g | ]	}|j  kr|qS r"   rY   r%   r   r"   r#   
<listcomp>       zDRelativeDistinguishedName.get_attributes_for_oid.<locals>.<listcomp>r"   rj   rY   r"   r   r#   get_attributes_for_oid      z0RelativeDistinguishedName.get_attributes_for_oidNrs   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.
        r=   c                 3       | ]}|  V  qd S rn   rv   r&   attrrs   r"   r#   r      
    
z;RelativeDistinguishedName.rfc4514_string.<locals>.<genexpr>)joinr   rj   rs   r"   r   r#   rv      s   	z(RelativeDistinguishedName.rfc4514_stringrw   c                 C      t |tstS | j|jkS rn   )rE   r   rx   r   ry   r"   r"   r#   rz         
z RelativeDistinguishedName.__eq__c                 C   
   t | jS rn   )r{   r   ro   r"   r"   r#   r|      r   z"RelativeDistinguishedName.__hash__c                 C   r   rn   )iterr   ro   r"   r"   r#   __iter__   r   z"RelativeDistinguishedName.__iter__c                 C   r   rn   )rO   r   ro   r"   r"   r#   __len__  r   z!RelativeDistinguishedName.__len__c                 C   s   d |  S )Nz<RelativeDistinguishedName({})>)rf   rv   ro   r"   r"   r#   r~     s   z"RelativeDistinguishedName.__repr__rn   )r   r   r   r   IterablerW   rl   r   Listr   r   r   r_   rv   r   r   rz   rQ   r|   Iteratorr   r   r~   r"   r"   r"   r#   r      s$    

r   c                   @   s2  e Zd Zejdeje ddfddZejdeje ddfddZdejej	eef  ddfddZe
dedd fd	d
Z	d!deje defddZdedeje fddZedeje fddZd!dejdefddZdedefddZdefddZdeje fddZdefddZdefdd Z dS )"Namer   r7   Nc                 C      d S rn   r"   r   r"   r"   r#   rl     s   zName.__init__c                 C   r   rn   r"   r   r"   r"   r#   rl     s   c                 C   s`   t |}tdd |D rdd |D | _d S tdd |D r,ttjt || _d S td)Nc                 s   r   rn   r   r   r"   r"   r#   r     r   z Name.__init__.<locals>.<genexpr>c                 S   s   g | ]}t tt|gqS r"   )r   r   castrW   r   r"   r"   r#   r     s    z!Name.__init__.<locals>.<listcomp>c                 s   r   rn   )rE   r   r   r"   r"   r#   r   !  r   zNattributes must be a list of NameAttribute or a list RelativeDistinguishedName)r   r   r   r   r   r   r   r]   r   r"   r"   r#   rl     s   

datac                 C   s   t | S rn   )rT   parse)clsr   r"   r"   r#   from_rfc4514_string+  s   zName.from_rfc4514_stringrs   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.
        r>   c                 3   r   rn   r   r   r   r"   r#   r   <  r   z&Name.rfc4514_string.<locals>.<genexpr>)r   reversedr   r   r"   r   r#   rv   /  s   zName.rfc4514_stringrY   c                    r   )Nc                    r   r"   r   r%   r   r"   r#   r   D  r   z/Name.get_attributes_for_oid.<locals>.<listcomp>r"   r   r"   r   r#   r   A  r   zName.get_attributes_for_oidc                 C   rm   rn   r   ro   r"   r"   r#   rdnsF  rp   z	Name.rdnsbackendc                 C   s
   t | S rn   )	rust_x509encode_name_bytes)rj   r   r"   r"   r#   public_bytesJ  r   zName.public_bytesrw   c                 C   r   rn   )rE   r   rx   r   ry   r"   r"   r#   rz   M  r   zName.__eq__c                 C   s   t t| jS rn   )r{   tupler   ro   r"   r"   r#   r|   S  s   zName.__hash__c                 c   s"    | j D ]
}|D ]}|V  qqd S rn   r   )rj   rdnavar"   r"   r#   r   X  s   
zName.__iter__c                 C   s   t dd | jD S )Nc                 s   s    | ]}t |V  qd S rn   )rO   )r&   r   r"   r"   r#   r   ^      zName.__len__.<locals>.<genexpr>)sumr   ro   r"   r"   r#   r   ]  s   zName.__len__c                 C   s    d dd | jD }d|S )Nr>   c                 s   s    | ]}|  V  qd S rn   r   r   r"   r"   r#   r   a  r   z Name.__repr__.<locals>.<genexpr>z
<Name({})>)r   r   rf   rj   r   r"   r"   r#   r~   `  s   
zName.__repr__rn   )!r   r   r   r   overloadr   rW   rl   r   r   classmethodr_   r   r   r   rv   r   r   r   r   r   AnyrF   r   r   r   rz   rQ   r|   r   r   r   r~   r"   r"   r"   r#   r   
  sJ    


r   c                   @   s2  e Zd ZedZedZdZee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deddfddZdefddZdeje fddZdeddfddZdefddZdefddZ de!fdd Z"de#fd!d"Z$dS )#rT   z!(0|([1-9]\d*))(\.(0|([1-9]\d*)))+z[a-zA-Z][a-zA-Z\d-]*z!\\([\\ #=\"\+,;<>]|[\da-zA-Z]{2})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   r7   Nc                 C   s   || _ d| _d S )Nr   )_data_idx)rj   r   r"   r"   r#   rl     s   
z_RFC4514NameParser.__init__c                 C   s   | j t| jk S rn   )r   rO   r   ro   r"   r"   r#   	_has_data  r}   z_RFC4514NameParser._has_datac                 C   s   |   r
| j| j S d S rn   )r   r   r   ro   r"   r"   r#   _peek  s   z_RFC4514NameParser._peekchc                 C   s"   |   |krt|  jd7  _d S )NrL   )r   rc   r   )rj   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   rc   rN   rO   )rj   patr   r6   r"   r"   r#   _read_re  s   z_RFC4514NameParser._read_rec                 C   s:   |   g}|  r| d ||    |  s	t|S )Nr>   )
_parse_rdnr   r   appendr   r   r"   r"   r#   r     s   

z_RFC4514NameParser.parsec                 C   sB   |   g}|  dkr| d ||    |  dkst|S )Nr=   )	_parse_nar   r   r   r   )rj   nasr"   r"   r#   r     s   

z_RFC4514NameParser._parse_rdnc                 C   s   z|  | j}W n ty"   |  | j}t|}|d u r tY nw t|}| d |  dkrD|  | j	}t
|dd   }n
|  | j}t|}t||S )Nrt   r9   rL   )r   _OID_RErc   	_DESCR_RE_NAME_TO_NAMEOIDrg   r   r   r   _HEXSTRING_RErG   	unhexlifyrI   
_STRING_RErV   rW   )rj   	oid_valuenamerY   r$   	raw_valuer"   r"   r#   r     s"   


z_RFC4514NameParser._parse_na)%r   r   r   recompiler   r   _PAIRrU   _LUTF1_SUTF1_TUTF1rP   sys
maxunicode_UTFMB	_LEADCHAR_STRINGCHAR
_TRAILCHARVERBOSEr   r   r_   rl   r   r   r   r   r   r   r   r   r   r   r   rW   r   r"   r"   r"   r#   rT   e  sJ    


	
	rT   )0rG   r   r   r   rd   cryptographyr   "cryptography.hazmat.bindings._rustr   r   cryptography.x509.oidr   r   Enumr   _ASN1_TYPE_TO_ENUMr`   r   ra   SERIAL_NUMBERDN_QUALIFIEREMAIL_ADDRESSr   DOMAIN_COMPONENTr)   Dict__annotations__Mappingr_   r   COMMON_NAMELOCALITY_NAMESTATE_OR_PROVINCE_NAMEORGANIZATION_NAMEORGANIZATIONAL_UNIT_NAMESTREET_ADDRESSUSER_IDr3   itemsr   r   rF   rK   rV   rW   r   r   rT   r"   r"   r"   r#   <module>   sF   

g5[