o
    îRµiA!  ã                   @   s   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ƒ 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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d„ ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!dS )é    N)Úutils)Ú_get_backend)ÚNameOIDÚObjectIdentifierc                   @   s4   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S )Ú	_ASN1Typeé   é   é   é   é   é   é   é   é   é   N)Ú__name__Ú
__module__Ú__qualname__Ú
UTF8StringÚNumericStringÚPrintableStringÚ	T61StringÚ	IA5StringÚUTCTimeÚGeneralizedTimeÚVisibleStringÚUniversalStringÚ	BMPString© r   r   ú8/usr/lib/python3/dist-packages/cryptography/x509/name.pyr      s    r   c                 C   s   i | ]}|j |“qS r   )Úvalue©Ú.0Úir   r   r   Ú
<dictcomp>   s    r$   ÚCNÚLÚSTÚOÚOUÚCÚSTREETÚDCÚUIDc                 C   sœ   | sdS |   dd¡} |   dd¡} |   dd¡} |   dd	¡} |   d
d¡} |   dd¡} |   dd¡} |   dd¡} | d dv r>d|  } | d dkrL| dd… d } | S )z>Escape special characters in RFC4514 Distinguished Name value.Ú ú\z\\ú"z\"ú+z\+ú,z\,ú;z\;ú<z\<ú>z\>ú z\00r   )ú#ú éÿÿÿÿr8   Nz\ )Úreplace)Úvalr   r   r   Ú_escape_dn_value3   s   r<   c                   @   s„   e Zd Zefdedefdd„Ze d¡Z	e d¡Z
defdd	„Zd
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 )ÚNameAttributeÚoidr    c                 C   s�   t |tƒs	tdƒ‚t |tƒstdƒ‚|tjks|tjkr)t| d¡ƒdkr)t	dƒ‚|t
kr4t |tj¡}t |tƒs=tdƒ‚|| _|| _|| _d S )Nz2oid argument must be an ObjectIdentifier instance.z#value argument must be a text type.Úutf8é   z/Country name must be a 2 character country codez%_type must be from the _ASN1Type enum)Ú
isinstancer   Ú	TypeErrorÚstrr   ÚCOUNTRY_NAMEÚJURISDICTION_COUNTRY_NAMEÚlenÚencodeÚ
ValueErrorÚ	_SENTINELÚ_NAMEOID_DEFAULT_TYPEÚgetr   r   Ú_oidÚ_valueÚ_type)Úselfr>   r    rN   r   r   r   Ú__init__L   s&   
ÿ


ÿ


zNameAttribute.__init__rL   rM   Úreturnc                 C   s$   t  | j| jj¡}d|t| jƒf S )z 
        Format as RFC4514 Distinguished Name string.

        Use short attribute name if available, otherwise fall back to OID
        dotted string.
        z%s=%s)Ú_NAMEOID_TO_NAMErK   r>   Údotted_stringr<   r    )rO   Úkeyr   r   r   Úrfc4514_stringq   s   zNameAttribute.rfc4514_stringÚotherc                 C   s&   t |tƒstS | j|jko| j|jkS ©N)rA   r=   ÚNotImplementedr>   r    ©rO   rV   r   r   r   Ú__eq__{   s   
zNameAttribute.__eq__c                 C   ó
   | |k S rW   r   rY   r   r   r   Ú__ne__�   ó   
zNameAttribute.__ne__c                 C   s   t | j| jfƒS rW   )Úhashr>   r    ©rO   r   r   r   Ú__hash__„   s   zNameAttribute.__hash__c                 C   s
   d  | ¡S )Nz/<NameAttribute(oid={0.oid}, value={0.value!r})>)Úformatr_   r   r   r   Ú__repr__‡   r]   zNameAttribute.__repr__N)r   r   r   rI   r   rC   rP   r   Úread_only_propertyr>   r    rU   ÚobjectÚboolrZ   r\   Úintr`   rb   r   r   r   r   r=   K   s    
"

r=   c                   @   s¤   e Zd Zdeje fdd„Zdeje fdd„Zde	fdd„Z
d	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 rW   ©rA   r=   ©r"   Úxr   r   r   Ú	<genexpr>�   ó   € z5RelativeDistinguishedName.__init__.<locals>.<genexpr>z/attributes must be an iterable of NameAttributez$duplicate attributes are not allowed)ÚlistrH   ÚallrB   Ú_attributesÚ	frozensetÚ_attribute_setrF   ©rO   rh   r   r   r   rP   Œ   s   
ÿz"RelativeDistinguishedName.__init__rQ   c                    ó   ‡ fdd„| D ƒS )Nc                    ó   g | ]	}|j ˆ kr|‘qS r   ©r>   r!   rw   r   r   Ú
<listcomp>›   ó    zDRelativeDistinguishedName.get_attributes_for_oid.<locals>.<listcomp>r   ©rO   r>   r   rw   r   Úget_attributes_for_oidš   ó   z0RelativeDistinguishedName.get_attributes_for_oidc                 C   s   d  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.
        r1   c                 s   ó   � | ]}|  ¡ V  qd S rW   ©rU   ©r"   Úattrr   r   r   rm   ¤   ó   € z;RelativeDistinguishedName.rfc4514_string.<locals>.<genexpr>)Újoinrq   r_   r   r   r   rU   �   s   z(RelativeDistinguishedName.rfc4514_stringrV   c                 C   ó   t |tƒstS | j|jkS rW   )rA   rg   rX   rs   rY   r   r   r   rZ   ¦   ó   
z RelativeDistinguishedName.__eq__c                 C   r[   rW   r   rY   r   r   r   r\   ¬   r]   z RelativeDistinguishedName.__ne__c                 C   ó
   t | jƒS rW   )r^   rs   r_   r   r   r   r`   ¯   r]   z"RelativeDistinguishedName.__hash__c                 C   r…   rW   )Úiterrq   r_   r   r   r   Ú__iter__²   r]   z"RelativeDistinguishedName.__iter__c                 C   r…   rW   )rF   rq   r_   r   r   r   Ú__len__µ   r]   z!RelativeDistinguishedName.__len__c                 C   s   d  |  ¡ ¡S )Nz<RelativeDistinguishedName({})>)ra   rU   r_   r   r   r   rb   ¸   s   z"RelativeDistinguishedName.__repr__N)r   r   r   ÚtypingÚIterabler=   rP   ÚListr{   rC   rU   rd   re   rZ   r\   rf   r`   ÚIteratorr‡   rˆ   rb   r   r   r   r   rg   ‹   s    	rg   c                   @   sÀ   e Zd Zdd„ Zdefdd„Zdeje fdd„Z	e
deje fdd	„ƒZddefdd„Zd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 )ÚNamec                 C   sR   t |ƒ}tdd„ |D ƒƒrdd„ |D ƒ| _d S tdd„ |D ƒƒr%|| _d S tdƒ‚)Nc                 s   ri   rW   rj   rk   r   r   r   rm   ¿   rn   z Name.__init__.<locals>.<genexpr>c                 S   s   g | ]}t |gƒ‘qS r   )rg   rk   r   r   r   rx   À   s    
ÿz!Name.__init__.<locals>.<listcomp>c                 s   ri   rW   )rA   rg   rk   r   r   r   rm   Ã   rn   zNattributes must be a list of NameAttribute or a list RelativeDistinguishedName)ro   rp   rq   rB   rt   r   r   r   rP   ½   s   ÿ
ÿzName.__init__rQ   c                 C   s   d  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.
        r2   c                 s   r}   rW   r~   r   r   r   r   rm   Ö   s   € 
ÿz&Name.rfc4514_string.<locals>.<genexpr>)r‚   Úreversedrq   r_   r   r   r   rU   Ë   s   
ÿzName.rfc4514_stringc                    ru   )Nc                    rv   r   rw   r!   rw   r   r   rx   Û   ry   z/Name.get_attributes_for_oid.<locals>.<listcomp>r   rz   r   rw   r   r{   Ú   r|   zName.get_attributes_for_oidc                 C   s   | j S rW   ©rq   r_   r   r   r   ÚrdnsÝ   s   z	Name.rdnsNc                 C   s   t |ƒ}| | ¡S rW   )r   Úx509_name_bytes)rO   Úbackendr   r   r   Úpublic_bytesá   s   
zName.public_bytesrV   c                 C   rƒ   rW   )rA   r�   rX   rq   rY   r   r   r   rZ   å   r„   zName.__eq__c                 C   r[   rW   r   rY   r   r   r   r\   ë   r]   zName.__ne__c                 C   s   t t| jƒƒS rW   )r^   Útuplerq   r_   r   r   r   r`   î   s   zName.__hash__c                 c   s"   � | j D ]
}|D ]}|V  qqd S rW   r�   )rO   ÚrdnÚavar   r   r   r‡   ó   s   €
ÿÿzName.__iter__c                 C   s   t dd„ | jD ƒƒS )Nc                 s   s   � | ]}t |ƒV  qd S rW   )rF   )r"   r•   r   r   r   rm   ù   r�   zName.__len__.<locals>.<genexpr>)Úsumrq   r_   r   r   r   rˆ   ø   s   zName.__len__c                 C   s    d  dd„ | jD ƒ¡}d |¡S )Nr2   c                 s   r}   rW   r~   r   r   r   r   rm   ü   r�   z Name.__repr__.<locals>.<genexpr>z
<Name({})>)r‚   rq   ra   )rO   r�   r   r   r   rb   û   s   
zName.__repr__rW   )r   r   r   rP   rC   rU   r‰   r‹   r=   r{   ÚpropertyrŠ   rg   r�   Úbytesr“   rd   re   rZ   r\   rf   r`   rŒ   r‡   rˆ   rb   r   r   r   r   r�   ¼   s    r�   )"r‰   Úcryptographyr   Úcryptography.hazmat.backendsr   Úcryptography.x509.oidr   r   ÚEnumr   Ú_ASN1_TYPE_TO_ENUMrd   rI   rD   r   rE   ÚSERIAL_NUMBERÚDN_QUALIFIERÚEMAIL_ADDRESSr   ÚDOMAIN_COMPONENTrJ   ÚCOMMON_NAMEÚLOCALITY_NAMEÚSTATE_OR_PROVINCE_NAMEÚORGANIZATION_NAMEÚORGANIZATIONAL_UNIT_NAMEÚSTREET_ADDRESSÚUSER_IDrR   r<   r=   rg   r�   r   r   r   r   Ú<module>   s8   ú÷@1