a
     `c                      @   s  d dl mZmZ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mZ G dd de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 )    )absolute_importdivisionprint_function)EnumN)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__
UTF8StringZNumericStringPrintableStringZ	T61String	IA5StringZUTCTimeZGeneralizedTimeZVisibleStringZUniversalStringZ	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>       r!   ZCNLZSTOZOUCZSTREETZDCZ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r| dd d } | S )z>Escape special characters in RFC4514 Distinguished Name value. \z\\"z\"+z\+,z\,;z\;<z\<>z\> z\00r   )# r0   Nz\ )replace)valr   r   r   _escape_dn_value7   s    r4   c                   @   sT   e Zd ZefddZedZedZdd Z	dd Z
d	d
 Zdd Zdd ZdS )NameAttributec                 C   s   t |tstdt |tjs&td|tjks:|tjkrTt|	ddkrTt
d|tkrjt|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sixZ	text_typer   COUNTRY_NAMEJURISDICTION_COUNTRY_NAMElenencode
ValueError	_SENTINEL_NAMEOID_DEFAULT_TYPEgetr
   r   _oid_value_type)selfoidr   rE   r   r   r   __init__P   s*    


zNameAttribute.__init__rC   rD   c                 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_NAMErB   rG   Zdotted_stringr4   r   )rF   keyr   r   r   rfc4514_stringu   s    zNameAttribute.rfc4514_stringc                 C   s&   t |tstS | j|jko$| j|jkS N)r8   r5   NotImplementedrG   r   rF   otherr   r   r   __eq__   s    
zNameAttribute.__eq__c                 C   s
   | |k S rL   r   rN   r   r   r   __ne__   s    zNameAttribute.__ne__c                 C   s   t | j| jfS rL   )hashrG   r   rF   r   r   r   __hash__   s    zNameAttribute.__hash__c                 C   s
   d | S )Nz/<NameAttribute(oid={0.oid}, value={0.value!r})>)formatrS   r   r   r   __repr__   s    zNameAttribute.__repr__N)r   r   r   r@   rH   r   Zread_only_propertyrG   r   rK   rP   rQ   rT   rV   r   r   r   r   r5   O   s   "


r5   c                   @   sT   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd ZdS )RelativeDistinguishedNamec                 C   s\   t |}|stdtdd |D s.td|| _t|| _t| jt|krXtdd S )Nz-a relative distinguished name cannot be emptyc                 s   s   | ]}t |tV  qd S rL   r8   r5   r   xr   r   r   	<genexpr>   r"   z5RelativeDistinguishedName.__init__.<locals>.<genexpr>z/attributes must be an iterable of NameAttributez$duplicate attributes are not allowed)listr?   allr9   _attributes	frozenset_attribute_setr=   rF   Z
attributesr   r   r   rH      s    
z"RelativeDistinguishedName.__init__c                    s    fdd| D S )Nc                    s   g | ]}|j  kr|qS r   rG   r   rb   r   r   
<listcomp>   r"   zDRelativeDistinguishedName.get_attributes_for_oid.<locals>.<listcomp>r   rF   rG   r   rb   r   get_attributes_for_oid   s    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.
        r)   c                 s   s   | ]}|  V  qd S rL   rK   r   attrr   r   r   r[      r"   z;RelativeDistinguishedName.rfc4514_string.<locals>.<genexpr>)joinr^   rS   r   r   r   rK      s    z(RelativeDistinguishedName.rfc4514_stringc                 C   s   t |tstS | j|jkS rL   )r8   rW   rM   r`   rN   r   r   r   rP      s    
z RelativeDistinguishedName.__eq__c                 C   s
   | |k S rL   r   rN   r   r   r   rQ      s    z RelativeDistinguishedName.__ne__c                 C   s
   t | jS rL   )rR   r`   rS   r   r   r   rT      s    z"RelativeDistinguishedName.__hash__c                 C   s
   t | jS rL   )iterr^   rS   r   r   r   __iter__   s    z"RelativeDistinguishedName.__iter__c                 C   s
   t | jS rL   )r=   r^   rS   r   r   r   __len__   s    z!RelativeDistinguishedName.__len__c                 C   s   d |  S )Nz<RelativeDistinguishedName({})>)rU   rK   rS   r   r   r   rV      s    z"RelativeDistinguishedName.__repr__N)r   r   r   rH   re   rK   rP   rQ   rT   rk   rl   rV   r   r   r   r   rW      s   	rW   c                   @   sj   e Zd Zdd Zdd Zdd Zedd Zdd
dZdd Z	dd Z
dd Zdd Zdd Zdd Zd	S )Namec                 C   sR   t |}tdd |D r,dd |D | _n"tdd |D rF|| _ntdd S )Nc                 s   s   | ]}t |tV  qd S rL   rX   rY   r   r   r   r[      r"   z Name.__init__.<locals>.<genexpr>c                 S   s   g | ]}t |gqS r   )rW   rY   r   r   r   rc      s   z!Name.__init__.<locals>.<listcomp>c                 s   s   | ]}t |tV  qd S rL   )r8   rW   rY   r   r   r   r[      r"   zNattributes must be a list of NameAttribute or a list RelativeDistinguishedName)r\   r]   r^   r9   ra   r   r   r   rH      s    
zName.__init__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.
        r*   c                 s   s   | ]}|  V  qd S rL   rf   rg   r   r   r   r[      s   z&Name.rfc4514_string.<locals>.<genexpr>)ri   reversedr^   rS   r   r   r   rK      s    
zName.rfc4514_stringc                    s    fdd| D S )Nc                    s   g | ]}|j  kr|qS r   rb   r   rb   r   r   rc      r"   z/Name.get_attributes_for_oid.<locals>.<listcomp>r   rd   r   rb   r   re      s    zName.get_attributes_for_oidc                 C   s   | j S rL   r^   rS   r   r   r   rdns   s    z	Name.rdnsNc                 C   s   t |}|| S rL   )r   Zx509_name_bytes)rF   Zbackendr   r   r   public_bytes   s    zName.public_bytesc                 C   s   t |tstS | j|jkS rL   )r8   rm   rM   r^   rN   r   r   r   rP      s    
zName.__eq__c                 C   s
   | |k S rL   r   rN   r   r   r   rQ      s    zName.__ne__c                 C   s   t t| jS rL   )rR   tupler^   rS   r   r   r   rT      s    zName.__hash__c                 c   s    | j D ]}|D ]
}|V  qqd S rL   ro   )rF   rdnZavar   r   r   rk      s    
zName.__iter__c                 C   s   t dd | jD S )Nc                 s   s   | ]}t |V  qd S rL   )r=   )r   rs   r   r   r   r[      r"   zName.__len__.<locals>.<genexpr>)sumr^   rS   r   r   r   rl      s    zName.__len__c                 C   s:   d dd | jD }tjr,d|dS d|S d S )Nr*   c                 s   s   | ]}|  V  qd S rL   rf   rg   r   r   r   r[      r"   z Name.__repr__.<locals>.<genexpr>z
<Name({})>r6   )ri   r^   r:   ZPY2rU   r>   )rF   rp   r   r   r   rV      s    zName.__repr__)N)r   r   r   rH   rK   re   propertyrp   rq   rP   rQ   rT   rk   rl   rV   r   r   r   r   rm      s   

rm   )'Z
__future__r   r   r   enumr   r:   Zcryptographyr   Zcryptography.hazmat.backendsr   Zcryptography.x509.oidr   r	   r
   Z_ASN1_TYPE_TO_ENUMobjectr@   r;   r   r<   ZSERIAL_NUMBERZDN_QUALIFIERZEMAIL_ADDRESSr   ZDOMAIN_COMPONENTrA   ZCOMMON_NAMEZLOCALITY_NAMEZSTATE_OR_PROVINCE_NAMEZORGANIZATION_NAMEZORGANIZATIONAL_UNIT_NAMEZSTREET_ADDRESSZUSER_IDrI   r4   r5   rW   rm   r   r   r   r   <module>   s:   @1