B
    `                 @   s  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mZmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZmZ d dlmZ d dlm Z m!Z!m"Z"m#Z# ee$dddZ%dd Z&G dd de'Z(G dd de'Z)G dd de j*dZ+G dd de,Z-G dd de+Z.G dd de+Z/G dd  d e+Z0G d!d" d"e+Z1G d#d$ d$e+Z2G d%d& d&e,Z3G d'd( d(e+Z4G d)d* d*e+Z5G d+d, d,e+Z6G d-d. d.e+Z7G d/d0 d0e,Z8G d1d2 d2eZ9G d3d4 d4e+Z:G d5d6 d6e+Z;G d7d8 d8e,Z<G d9d: d:e,Z=G d;d< d<e,Z>G d=d> d>e+Z?G d?d@ d@e+Z@G dAdB dBe+ZAG dCdD dDe+ZBG dEdF dFeZCdGdH eCD ZDG dIdJ dJe+ZEG dKdL dLe+ZFG dMdN dNe+ZGG dOdP dPe,ZHG dQdR dRe,ZIG dSdT dTe+ZJG dUdV dVe+ZKG dWdX dXe+ZLG dYdZ dZe+ZMG d[d\ d\e+ZNG d]d^ d^e+ZOG d_d` d`e+ZPG dadb dbe+ZQG dcdd dde+ZRG dedf dfe+ZSdS )g    N)Enum)utils)
BIT_STRING	DERReaderOBJECT_IDENTIFIERSEQUENCE)_PUBLIC_KEY_TYPES)constant_timeserialization)EllipticCurvePublicKey)RSAPublicKey)SignedCertificateTimestamp)GeneralName	IPAddress	OtherName)RelativeDistinguishedName)CRLEntryExtensionOIDExtensionOIDOCSPExtensionOIDObjectIdentifier)
public_keyreturnc          	   C   s   t | tr | tjjtjj}nt | tr@| tjj	tjj
}n| tjjtjj}t|}|t}|t}|t}W d Q R X |  |t | s|  W d Q R X | dkrtd|j}t| S )Nr   zInvalid public key encoding)
isinstancer   Zpublic_bytesr
   EncodingZDERZPublicFormatZPKCS1r   ZX962ZUncompressedPointZSubjectPublicKeyInfor   Zread_single_elementr   Zread_elementr   r   Zis_emptyZread_any_elementZ	read_byte
ValueErrordatahashlibsha1digest)r   r   Z
serializedreaderZpublic_key_info	algorithmZpublic_key_data r!   K/home/dcms/DCMS/lib/python3.7/site-packages/cryptography/x509/extensions.py_key_identifier_from_public_key%   s.    




r#   c                s.    fdd} fdd} fdd}|||fS )Nc                s   t t|  S )N)lengetattr)self)
field_namer!   r"   
len_methodN   s    z*_make_sequence_methods.<locals>.len_methodc                s   t t|  S )N)iterr%   )r&   )r'   r!   r"   iter_methodQ   s    z+_make_sequence_methods.<locals>.iter_methodc                s   t |  | S )N)r%   )r&   idx)r'   r!   r"   getitem_methodT   s    z._make_sequence_methods.<locals>.getitem_methodr!   )r'   r(   r*   r,   r!   )r'   r"   _make_sequence_methodsM   s    r-   c                   s$   e Zd Zeed fddZ  ZS )DuplicateExtension)msgoidc                s   t t| | || _d S )N)superr.   __init__r0   )r&   r/   r0   )	__class__r!   r"   r2   [   s    zDuplicateExtension.__init__)__name__
__module____qualname__strr   r2   __classcell__r!   r!   )r3   r"   r.   Z   s   r.   c                   s$   e Zd Zeed fddZ  ZS )ExtensionNotFound)r/   r0   c                s   t t| | || _d S )N)r1   r9   r2   r0   )r&   r/   r0   )r3   r!   r"   r2   a   s    zExtensionNotFound.__init__)r4   r5   r6   r7   r   r2   r8   r!   r!   )r3   r"   r9   `   s   r9   c               @   s    e Zd ZejedddZdS )ExtensionType)r   c             C   s   dS )zK
        Returns the oid associated with the given extension type.
        Nr!   )r&   r!   r!   r"   r0   g   s    zExtensionType.oidN)r4   r5   r6   abcabstractpropertyr   r0   r!   r!   r!   r"   r:   f   s   r:   )	metaclassc               @   sT   e Zd Zejd dddZeddddZddd	d
Ze	d\Z
ZZdd ZdS )
Extensions	Extension)
extensionsc             C   s
   || _ d S )N)_extensions)r&   r@   r!   r!   r"   r2   o   s    zExtensions.__init__)r0   r   c             C   s0   x| D ]}|j |kr|S qW td||d S )NzNo {} extension was found)r0   r9   format)r&   r0   extr!   r!   r"   get_extension_for_oidr   s    

z Extensions.get_extension_for_oid)r   c             C   sD   |t krtdx| D ]}t|j|r|S qW td||jd S )Nz|UnrecognizedExtension can't be used with get_extension_for_class because more than one instance of the class may be present.zNo {} extension was found)UnrecognizedExtension	TypeErrorr   valuer9   rB   r0   )r&   ZextclassrC   r!   r!   r"   get_extension_for_classy   s    
z"Extensions.get_extension_for_classrA   c             C   s   d | jS )Nz<Extensions({})>)rB   rA   )r&   r!   r!   r"   __repr__   s    zExtensions.__repr__N)r4   r5   r6   typingListr2   r   rD   rH   r-   __len____iter____getitem__rI   r!   r!   r!   r"   r>   n   s
   r>   c               @   sJ   e Zd ZejZedddZdd Zdd Z	dd	 Z
d
d ZedZdS )	CRLNumber)
crl_numberc             C   s   t |tstd|| _d S )Nzcrl_number must be an integer)r   intrF   _crl_number)r&   rP   r!   r!   r"   r2      s    
zCRLNumber.__init__c             C   s   t |tstS | j|jkS )N)r   rO   NotImplementedrP   )r&   otherr!   r!   r"   __eq__   s    
zCRLNumber.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   __ne__   s    zCRLNumber.__ne__c             C   s
   t | jS )N)hashrP   )r&   r!   r!   r"   __hash__   s    zCRLNumber.__hash__c             C   s   d | jS )Nz<CRLNumber({})>)rB   rP   )r&   r!   r!   r"   rI      s    zCRLNumber.__repr__rR   N)r4   r5   r6   r   Z
CRL_NUMBERr0   rQ   r2   rU   rV   rX   rI   r   read_only_propertyrP   r!   r!   r!   r"   rO      s   rO   c               @   s   e Zd ZejZeje ejej	e
  eje dddZeed dddZedd dd	d
Zdd Zdd Zdd Zdd ZedZedZedZdS )AuthorityKeyIdentifier)key_identifierauthority_cert_issuerauthority_cert_serial_numberc             C   sr   |d k|d kkrt d|d k	rBt|}tdd |D sBtd|d k	r\t|ts\td|| _|| _|| _d S )NzXauthority_cert_issuer and authority_cert_serial_number must both be present or both Nonec             s   s   | ]}t |tV  qd S )N)r   r   ).0xr!   r!   r"   	<genexpr>   s    z2AuthorityKeyIdentifier.__init__.<locals>.<genexpr>z;authority_cert_issuer must be a list of GeneralName objectsz/authority_cert_serial_number must be an integer)	r   listallrF   r   rQ   _key_identifier_authority_cert_issuer_authority_cert_serial_number)r&   r[   r\   r]   r!   r!   r"   r2      s     

zAuthorityKeyIdentifier.__init__)r   r   c             C   s   t |}| |d d dS )N)r[   r\   r]   )r#   )clsr   r   r!   r!   r"   from_issuer_public_key   s
    z-AuthorityKeyIdentifier.from_issuer_public_keySubjectKeyIdentifier)skir   c             C   s   | |j d d dS )N)r[   r\   r]   )r   )rf   ri   r!   r!   r"   "from_issuer_subject_key_identifier   s    z9AuthorityKeyIdentifier.from_issuer_subject_key_identifierc             C   s
   d | S )Nz<AuthorityKeyIdentifier(key_identifier={0.key_identifier!r}, authority_cert_issuer={0.authority_cert_issuer}, authority_cert_serial_number={0.authority_cert_serial_number})>)rB   )r&   r!   r!   r"   rI      s    zAuthorityKeyIdentifier.__repr__c             C   s2   t |tstS | j|jko0| j|jko0| j|jkS )N)r   rZ   rS   r[   r\   r]   )r&   rT   r!   r!   r"   rU      s    
zAuthorityKeyIdentifier.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV      s    zAuthorityKeyIdentifier.__ne__c             C   s,   | j d krd }n
t| j }t| j|| jfS )N)r\   tuplerW   r[   r]   )r&   Zacir!   r!   r"   rX      s
    

zAuthorityKeyIdentifier.__hash__rc   rd   re   N)r4   r5   r6   r   ZAUTHORITY_KEY_IDENTIFIERr0   rJ   OptionalbytesIterabler   rQ   r2   classmethodr   rg   rj   rI   rU   rV   rX   r   rY   r[   r\   r]   r!   r!   r!   r"   rZ      s$   	

rZ   c               @   s^   e Zd ZejZedddZee	d dddZ
edZdd	 Zd
d Zdd Zdd ZdS )rh   )r   c             C   s
   || _ d S )N)_digest)r&   r   r!   r!   r"   r2     s    zSubjectKeyIdentifier.__init__)r   r   c             C   s   | t |S )N)r#   )rf   r   r!   r!   r"   from_public_key  s    z$SubjectKeyIdentifier.from_public_keyrp   c             C   s   d | jS )Nz$<SubjectKeyIdentifier(digest={0!r})>)rB   r   )r&   r!   r!   r"   rI     s    zSubjectKeyIdentifier.__repr__c             C   s   t |tstS t| j|jS )N)r   rh   rS   r	   Zbytes_eqr   )r&   rT   r!   r!   r"   rU     s    
zSubjectKeyIdentifier.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV      s    zSubjectKeyIdentifier.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX   #  s    zSubjectKeyIdentifier.__hash__N)r4   r5   r6   r   ZSUBJECT_KEY_IDENTIFIERr0   rm   r2   ro   r   rq   r   rY   r   rI   rU   rV   rX   r!   r!   r!   r"   rh   	  s   
rh   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )AuthorityInformationAccessAccessDescription)descriptionsc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   rs   )r^   r_   r!   r!   r"   r`   ,  s    z6AuthorityInformationAccess.__init__.<locals>.<genexpr>z@Every item in the descriptions list must be an AccessDescription)ra   rb   rF   _descriptions)r&   rt   r!   r!   r"   r2   *  s
    z#AuthorityInformationAccess.__init__ru   c             C   s   d | jS )Nz <AuthorityInformationAccess({})>)rB   ru   )r&   r!   r!   r"   rI   6  s    z#AuthorityInformationAccess.__repr__c             C   s   t |tstS | j|jkS )N)r   rr   rS   ru   )r&   rT   r!   r!   r"   rU   9  s    
z!AuthorityInformationAccess.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   ?  s    z!AuthorityInformationAccess.__ne__c             C   s   t t| jS )N)rW   rk   ru   )r&   r!   r!   r"   rX   B  s    z#AuthorityInformationAccess.__hash__N)r4   r5   r6   r   ZAUTHORITY_INFORMATION_ACCESSr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   rr   '  s   
rr   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )SubjectInformationAccessrs   )rt   c             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   rs   )r^   r_   r!   r!   r"   r`   K  s    z4SubjectInformationAccess.__init__.<locals>.<genexpr>z@Every item in the descriptions list must be an AccessDescription)ra   rb   rF   ru   )r&   rt   r!   r!   r"   r2   I  s
    z!SubjectInformationAccess.__init__ru   c             C   s   d | jS )Nz<SubjectInformationAccess({})>)rB   ru   )r&   r!   r!   r"   rI   U  s    z!SubjectInformationAccess.__repr__c             C   s   t |tstS | j|jkS )N)r   rv   rS   ru   )r&   rT   r!   r!   r"   rU   X  s    
zSubjectInformationAccess.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   ^  s    zSubjectInformationAccess.__ne__c             C   s   t t| jS )N)rW   rk   ru   )r&   r!   r!   r"   rX   a  s    z!SubjectInformationAccess.__hash__N)r4   r5   r6   r   ZSUBJECT_INFORMATION_ACCESSr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   rv   F  s   
rv   c               @   sP   e Zd ZeedddZdd Zdd Zdd	 Zd
d Z	e
dZe
dZdS )rs   )access_methodaccess_locationc             C   s4   t |tstdt |ts$td|| _|| _d S )Nz)access_method must be an ObjectIdentifierz%access_location must be a GeneralName)r   r   rF   r   _access_method_access_location)r&   rw   rx   r!   r!   r"   r2   f  s    

zAccessDescription.__init__c             C   s
   d | S )NzY<AccessDescription(access_method={0.access_method}, access_location={0.access_location})>)rB   )r&   r!   r!   r"   rI   r  s    zAccessDescription.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   rs   rS   rw   rx   )r&   rT   r!   r!   r"   rU   x  s    
zAccessDescription.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zAccessDescription.__ne__c             C   s   t | j| jfS )N)rW   rw   rx   )r&   r!   r!   r"   rX     s    zAccessDescription.__hash__ry   rz   N)r4   r5   r6   r   r   r2   rI   rU   rV   rX   r   rY   rw   rx   r!   r!   r!   r"   rs   e  s   	
rs   c               @   s\   e Zd ZejZeeje	 dddZ
edZedZdd Zdd	 Zd
d Zdd ZdS )BasicConstraints)capath_lengthc             C   sX   t |tstd|d k	r&|s&td|d k	rHt |tr@|dk rHtd|| _|| _d S )Nzca must be a boolean valuez)path_length must be None when ca is Falser   z2path_length must be a non-negative integer or None)r   boolrF   r   rQ   _ca_path_length)r&   r|   r}   r!   r!   r"   r2     s    
zBasicConstraints.__init__r   r   c             C   s
   d | S )Nz:<BasicConstraints(ca={0.ca}, path_length={0.path_length})>)rB   )r&   r!   r!   r"   rI     s    zBasicConstraints.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r{   rS   r|   r}   )r&   rT   r!   r!   r"   rU     s    
zBasicConstraints.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zBasicConstraints.__ne__c             C   s   t | j| jfS )N)rW   r|   r}   )r&   r!   r!   r"   rX     s    zBasicConstraints.__hash__N)r4   r5   r6   r   ZBASIC_CONSTRAINTSr0   r~   rJ   rl   rQ   r2   r   rY   r|   r}   rI   rU   rV   rX   r!   r!   r!   r"   r{     s   

r{   c               @   sJ   e Zd ZejZedddZe	dZ
dd Zdd Zd	d
 Zdd ZdS )DeltaCRLIndicator)rP   c             C   s   t |tstd|| _d S )Nzcrl_number must be an integer)r   rQ   rF   rR   )r&   rP   r!   r!   r"   r2     s    
zDeltaCRLIndicator.__init__rR   c             C   s   t |tstS | j|jkS )N)r   r   rS   rP   )r&   rT   r!   r!   r"   rU     s    
zDeltaCRLIndicator.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zDeltaCRLIndicator.__ne__c             C   s
   t | jS )N)rW   rP   )r&   r!   r!   r"   rX     s    zDeltaCRLIndicator.__hash__c             C   s
   d | S )Nz.<DeltaCRLIndicator(crl_number={0.crl_number})>)rB   )r&   r!   r!   r"   rI     s    zDeltaCRLIndicator.__repr__N)r4   r5   r6   r   ZDELTA_CRL_INDICATORr0   rQ   r2   r   rY   rP   rU   rV   rX   rI   r!   r!   r!   r"   r     s   
r   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )CRLDistributionPointsDistributionPoint)distribution_pointsc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z1CRLDistributionPoints.__init__.<locals>.<genexpr>z?distribution_points must be a list of DistributionPoint objects)ra   rb   rF   _distribution_points)r&   r   r!   r!   r"   r2     s    zCRLDistributionPoints.__init__r   c             C   s   d | jS )Nz<CRLDistributionPoints({})>)rB   r   )r&   r!   r!   r"   rI     s    zCRLDistributionPoints.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zCRLDistributionPoints.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zCRLDistributionPoints.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zCRLDistributionPoints.__hash__N)r4   r5   r6   r   ZCRL_DISTRIBUTION_POINTSr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   r     s   r   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )FreshestCRLr   )r   c             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z'FreshestCRL.__init__.<locals>.<genexpr>z?distribution_points must be a list of DistributionPoint objects)ra   rb   rF   r   )r&   r   r!   r!   r"   r2     s    zFreshestCRL.__init__r   c             C   s   d | jS )Nz<FreshestCRL({})>)rB   r   )r&   r!   r!   r"   rI   	  s    zFreshestCRL.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zFreshestCRL.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zFreshestCRL.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zFreshestCRL.__hash__N)r4   r5   r6   r   ZFRESHEST_CRLr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   r     s   r   c               @   s   e Zd Zejeje  eje ejejd  ejeje  dddZ	dd Z
dd Zd	d
 Zdd ZedZedZedZedZdS )r   ReasonFlags)	full_namerelative_namereasons
crl_issuerc             C   s   |r|rt d|r6t|}tdd |D s6td|rLt|tsLtd|rrt|}tdd |D srtd|rt|trtdd |D std	|rtj|kstj	|krt d
|r|s|s|st d|| _
|| _|| _|| _d S )NzOYou cannot provide both full_name and relative_name, at least one must be None.c             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   )  s    z-DistributionPoint.__init__.<locals>.<genexpr>z/full_name must be a list of GeneralName objectsz1relative_name must be a RelativeDistinguishedNamec             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   6  s    z2crl_issuer must be None or a list of general namesc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   =  s    z0reasons must be None or frozenset of ReasonFlagszLunspecified and remove_from_crl are not valid reasons in a DistributionPointzPYou must supply crl_issuer, full_name, or relative_name when reasons is not None)r   ra   rb   rF   r   r   	frozensetr   unspecifiedremove_from_crl
_full_name_relative_name_reasons_crl_issuer)r&   r   r   r   r   r!   r!   r"   r2     sB    



zDistributionPoint.__init__c             C   s
   d | S )Nz}<DistributionPoint(full_name={0.full_name}, relative_name={0.relative_name}, reasons={0.reasons}, crl_issuer={0.crl_issuer})>)rB   )r&   r!   r!   r"   rI   U  s    zDistributionPoint.__repr__c             C   s>   t |tstS | j|jko<| j|jko<| j|jko<| j|jkS )N)r   r   rS   r   r   r   r   )r&   rT   r!   r!   r"   rU   \  s    
zDistributionPoint.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   g  s    zDistributionPoint.__ne__c             C   sH   | j d k	rt| j }nd }| jd k	r0t| j}nd }t|| j| j|fS )N)r   rk   r   rW   r   r   )r&   fnr   r!   r!   r"   rX   j  s    

zDistributionPoint.__hash__r   r   r   r   N)r4   r5   r6   rJ   rl   rn   r   r   	FrozenSetr2   rI   rU   rV   rX   r   rY   r   r   r   r   r!   r!   r!   r"   r     s   6


r   c               @   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 )r   r   ZkeyCompromiseZcACompromiseZaffiliationChanged
supersededZcessationOfOperationZcertificateHoldZprivilegeWithdrawnZaACompromiseZremoveFromCRLN)r4   r5   r6   r   Zkey_compromiseZca_compromiseZaffiliation_changedr   Zcessation_of_operationZcertificate_holdZprivilege_withdrawnZaa_compromiser   r!   r!   r!   r"   r   }  s   r   c               @   sb   e Zd ZejZeje eje dddZ	dd Z
dd Zdd	 Zd
d ZedZedZdS )PolicyConstraints)require_explicit_policyinhibit_policy_mappingc             C   s\   |d k	rt |tstd|d k	r4t |ts4td|d krL|d krLtd|| _|| _d S )Nz>require_explicit_policy must be a non-negative integer or Nonez=inhibit_policy_mapping must be a non-negative integer or NonezSAt least one of require_explicit_policy and inhibit_policy_mapping must not be None)r   rQ   rF   r   _require_explicit_policy_inhibit_policy_mapping)r&   r   r   r!   r!   r"   r2     s    

zPolicyConstraints.__init__c             C   s
   d | S )Nz{<PolicyConstraints(require_explicit_policy={0.require_explicit_policy}, inhibit_policy_mapping={0.inhibit_policy_mapping})>)rB   )r&   r!   r!   r"   rI     s    zPolicyConstraints.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r   rS   r   r   )r&   rT   r!   r!   r"   rU     s    
zPolicyConstraints.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zPolicyConstraints.__ne__c             C   s   t | j| jfS )N)rW   r   r   )r&   r!   r!   r"   rX     s    zPolicyConstraints.__hash__r   r   N)r4   r5   r6   r   ZPOLICY_CONSTRAINTSr0   rJ   rl   rQ   r2   rI   rU   rV   rX   r   rY   r   r   r!   r!   r!   r"   r     s   	r   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )CertificatePoliciesPolicyInformation)policiesc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z/CertificatePolicies.__init__.<locals>.<genexpr>z;Every item in the policies list must be a PolicyInformation)ra   rb   rF   	_policies)r&   r   r!   r!   r"   r2     s
    zCertificatePolicies.__init__r   c             C   s   d | jS )Nz<CertificatePolicies({})>)rB   r   )r&   r!   r!   r"   rI     s    zCertificatePolicies.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zCertificatePolicies.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zCertificatePolicies.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zCertificatePolicies.__hash__N)r4   r5   r6   r   ZCERTIFICATE_POLICIESr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   r     s   
r   c               @   sf   e Zd Zeejejejedf   dddZ	dd Z
dd Zd	d
 Zdd ZedZedZdS )r   
UserNotice)policy_identifierpolicy_qualifiersc             C   sH   t |tstd|| _|r>t|}tdd |D s>td|| _d S )Nz-policy_identifier must be an ObjectIdentifierc             s   s   | ]}t |ttfV  qd S )N)r   r7   r   )r^   r_   r!   r!   r"   r`     s    z-PolicyInformation.__init__.<locals>.<genexpr>zMpolicy_qualifiers must be a list of strings and/or UserNotice objects or None)r   r   rF   _policy_identifierra   rb   _policy_qualifiers)r&   r   r   r!   r!   r"   r2     s    
zPolicyInformation.__init__c             C   s
   d | S )Nze<PolicyInformation(policy_identifier={0.policy_identifier}, policy_qualifiers={0.policy_qualifiers})>)rB   )r&   r!   r!   r"   rI     s    zPolicyInformation.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r   rS   r   r   )r&   rT   r!   r!   r"   rU     s    
zPolicyInformation.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zPolicyInformation.__ne__c             C   s(   | j d k	rt| j }nd }t| j|fS )N)r   rk   rW   r   )r&   Zpqr!   r!   r"   rX     s    
zPolicyInformation.__hash__r   r   N)r4   r5   r6   r   rJ   rl   rn   Unionr7   r2   rI   rU   rV   rX   r   rY   r   r   r!   r!   r!   r"   r     s    	
r   c               @   s\   e Zd Zejd eje dddZdd Zdd Zd	d
 Z	dd Z
edZedZdS )r   NoticeReference)notice_referenceexplicit_textc             C   s&   |rt |tstd|| _|| _d S )Nz2notice_reference must be None or a NoticeReference)r   r   rF   _notice_reference_explicit_text)r&   r   r   r!   r!   r"   r2   !  s    zUserNotice.__init__c             C   s
   d | S )NzV<UserNotice(notice_reference={0.notice_reference}, explicit_text={0.explicit_text!r})>)rB   )r&   r!   r!   r"   rI   0  s    zUserNotice.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r   rS   r   r   )r&   rT   r!   r!   r"   rU   6  s    
zUserNotice.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   ?  s    zUserNotice.__ne__c             C   s   t | j| jfS )N)rW   r   r   )r&   r!   r!   r"   rX   B  s    zUserNotice.__hash__r   r   N)r4   r5   r6   rJ   rl   r7   r2   rI   rU   rV   rX   r   rY   r   r   r!   r!   r!   r"   r      s   	
r   c               @   s\   e Zd Zeje eje dddZdd Z	dd Z
dd	 Zd
d ZedZedZdS )r   )organizationnotice_numbersc             C   s2   || _ t|}tdd |D s(td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   rQ   )r^   r_   r!   r!   r"   r`   Q  s    z+NoticeReference.__init__.<locals>.<genexpr>z)notice_numbers must be a list of integers)_organizationra   rb   rF   _notice_numbers)r&   r   r   r!   r!   r"   r2   J  s
    zNoticeReference.__init__c             C   s
   d | S )NzU<NoticeReference(organization={0.organization!r}, notice_numbers={0.notice_numbers})>)rB   )r&   r!   r!   r"   rI   V  s    zNoticeReference.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r   rS   r   r   )r&   rT   r!   r!   r"   rU   \  s    
zNoticeReference.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   e  s    zNoticeReference.__ne__c             C   s   t | jt| jfS )N)rW   r   rk   r   )r&   r!   r!   r"   rX   h  s    zNoticeReference.__hash__r   r   N)r4   r5   r6   rJ   rl   r7   rn   rQ   r2   rI   rU   rV   rX   r   rY   r   r   r!   r!   r!   r"   r   I  s   		
r   c               @   sT   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd ZdS )ExtendedKeyUsage)usagesc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   t  s    z,ExtendedKeyUsage.__init__.<locals>.<genexpr>z9Every item in the usages list must be an ObjectIdentifier)ra   rb   rF   _usages)r&   r   r!   r!   r"   r2   r  s
    zExtendedKeyUsage.__init__r   c             C   s   d | jS )Nz<ExtendedKeyUsage({})>)rB   r   )r&   r!   r!   r"   rI   }  s    zExtendedKeyUsage.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zExtendedKeyUsage.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zExtendedKeyUsage.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zExtendedKeyUsage.__hash__N)r4   r5   r6   r   ZEXTENDED_KEY_USAGEr0   rJ   rn   r   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   r   o  s   	r   c               @   s2   e Zd ZejZdd Zdd Zdd Zdd Z	d	S )
OCSPNoCheckc             C   s   t |tstS dS )NT)r   r   rS   )r&   rT   r!   r!   r"   rU     s    
zOCSPNoCheck.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zOCSPNoCheck.__ne__c             C   s   t tS )N)rW   r   )r&   r!   r!   r"   rX     s    zOCSPNoCheck.__hash__c             C   s   dS )Nz<OCSPNoCheck()>r!   )r&   r!   r!   r"   rI     s    zOCSPNoCheck.__repr__N)
r4   r5   r6   r   ZOCSP_NO_CHECKr0   rU   rV   rX   rI   r!   r!   r!   r"   r     s
   r   c               @   s2   e Zd ZejZdd Zdd Zdd Zdd Z	d	S )
PrecertPoisonc             C   s   t |tstS dS )NT)r   r   rS   )r&   rT   r!   r!   r"   rU     s    
zPrecertPoison.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zPrecertPoison.__ne__c             C   s   t tS )N)rW   r   )r&   r!   r!   r"   rX     s    zPrecertPoison.__hash__c             C   s   dS )Nz<PrecertPoison()>r!   )r&   r!   r!   r"   rI     s    zPrecertPoison.__repr__N)
r4   r5   r6   r   ZPRECERT_POISONr0   rU   rV   rX   rI   r!   r!   r!   r"   r     s
   r   c               @   sT   e Zd ZejZejd dddZe	d\Z
ZZdd Zdd	 Zd
d Zdd ZdS )
TLSFeatureTLSFeatureType)featuresc             C   s8   t |}tdd |D r&t|dkr.td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z&TLSFeature.__init__.<locals>.<genexpr>r   z@features must be a list of elements from the TLSFeatureType enum)ra   rb   r$   rF   	_features)r&   r   r!   r!   r"   r2     s    zTLSFeature.__init__r   c             C   s
   d | S )Nz$<TLSFeature(features={0._features})>)rB   )r&   r!   r!   r"   rI     s    zTLSFeature.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zTLSFeature.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zTLSFeature.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zTLSFeature.__hash__N)r4   r5   r6   r   ZTLS_FEATUREr0   rJ   rn   r2   r-   rL   rM   rN   rI   rU   rV   rX   r!   r!   r!   r"   r     s   r   c               @   s   e Zd ZdZdZdS )r         N)r4   r5   r6   Zstatus_requestZstatus_request_v2r!   r!   r!   r"   r     s   r   c             C   s   i | ]}||j qS r!   )rG   )r^   r_   r!   r!   r"   
<dictcomp>  s    r   c               @   sJ   e Zd ZejZedddZdd Zdd Z	dd	 Z
d
d ZedZdS )InhibitAnyPolicy)
skip_certsc             C   s,   t |tstd|dk r"td|| _d S )Nzskip_certs must be an integerr   z)skip_certs must be a non-negative integer)r   rQ   rF   r   _skip_certs)r&   r   r!   r!   r"   r2     s
    
zInhibitAnyPolicy.__init__c             C   s
   d | S )Nz-<InhibitAnyPolicy(skip_certs={0.skip_certs})>)rB   )r&   r!   r!   r"   rI     s    zInhibitAnyPolicy.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zInhibitAnyPolicy.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zInhibitAnyPolicy.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX     s    zInhibitAnyPolicy.__hash__r   N)r4   r5   r6   r   ZINHIBIT_ANY_POLICYr0   rQ   r2   rI   rU   rV   rX   r   rY   r   r!   r!   r!   r"   r     s   	r   c            
   @   s   e Zd ZejZeeeeeeeeed	ddZe	dZ
e	dZe	dZe	dZe	dZe	d	Ze	d
Zedd Zedd Zdd Zdd Zdd Zdd ZdS )KeyUsage)	digital_signaturecontent_commitmentkey_enciphermentdata_enciphermentkey_agreementkey_cert_signcrl_signencipher_onlydecipher_onlyc
       
      C   sN   |s|s|	rt d|| _|| _|| _|| _|| _|| _|| _|| _|	| _	d S )NzKencipher_only and decipher_only can only be true when key_agreement is true)
r   _digital_signature_content_commitment_key_encipherment_data_encipherment_key_agreement_key_cert_sign	_crl_sign_encipher_only_decipher_only)
r&   r   r   r   r   r   r   r   r   r   r!   r!   r"   r2     s    zKeyUsage.__init__r   r   r   r   r   r   r   c             C   s   | j stdn| jS d S )Nz7encipher_only is undefined unless key_agreement is true)r   r   r   )r&   r!   r!   r"   r   (  s    zKeyUsage.encipher_onlyc             C   s   | j stdn| jS d S )Nz7decipher_only is undefined unless key_agreement is true)r   r   r   )r&   r!   r!   r"   r   1  s    zKeyUsage.decipher_onlyc             C   s<   y| j }| j}W n tk
r,   d}d}Y nX d| ||S )NFa-  <KeyUsage(digital_signature={0.digital_signature}, content_commitment={0.content_commitment}, key_encipherment={0.key_encipherment}, data_encipherment={0.data_encipherment}, key_agreement={0.key_agreement}, key_cert_sign={0.key_cert_sign}, crl_sign={0.crl_sign}, encipher_only={1}, decipher_only={2})>)r   r   r   rB   )r&   r   r   r!   r!   r"   rI   :  s    

zKeyUsage.__repr__c             C   sz   t |tstS | j|jkox| j|jkox| j|jkox| j|jkox| j|jkox| j|jkox| j	|j	kox| j
|j
kox| j|jkS )N)r   r   rS   r   r   r   r   r   r   r   r   r   )r&   rT   r!   r!   r"   rU   O  s    
zKeyUsage.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   _  s    zKeyUsage.__ne__c          
   C   s,   t | j| j| j| j| j| j| j| j| j	f	S )N)
rW   r   r   r   r   r   r   r   r   r   )r&   r!   r!   r"   rX   b  s    zKeyUsage.__hash__N)r4   r5   r6   r   Z	KEY_USAGEr0   r~   r2   r   rY   r   r   r   r   r   r   r   propertyr   r   rI   rU   rV   rX   r!   r!   r!   r"   r     s.   






		r   c               @   sv   e Zd ZejZejeje	  ejeje	  dddZ
dd Zdd Zdd	 Zd
d Zdd ZedZedZdS )NameConstraints)permitted_subtreesexcluded_subtreesc             C   s   |d k	r4t |}tdd |D s*td| | |d k	rht |}tdd |D s^td| | |d kr|d krtd|| _|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   |  s    z+NameConstraints.__init__.<locals>.<genexpr>z@permitted_subtrees must be a list of GeneralName objects or Nonec             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z?excluded_subtrees must be a list of GeneralName objects or NonezIAt least one of permitted_subtrees and excluded_subtrees must not be None)ra   rb   rF   _validate_ip_namer   _permitted_subtrees_excluded_subtrees)r&   r   r   r!   r!   r"   r2   u  s"    

zNameConstraints.__init__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   r   rS   r   r   )r&   rT   r!   r!   r"   rU     s    
zNameConstraints.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zNameConstraints.__ne__c             C   s   t dd |D rtdd S )Nc             s   s.   | ]&}t |to$t |jtjtjf V  qd S )N)r   r   rG   	ipaddressIPv4NetworkIPv6Network)r^   namer!   r!   r"   r`     s   z4NameConstraints._validate_ip_name.<locals>.<genexpr>zGIPAddress name constraints must be an IPv4Network or IPv6Network object)anyrF   )r&   treer!   r!   r"   r     s
    
z!NameConstraints._validate_ip_namec             C   s
   d | S )Nze<NameConstraints(permitted_subtrees={0.permitted_subtrees}, excluded_subtrees={0.excluded_subtrees})>)rB   )r&   r!   r!   r"   rI     s    zNameConstraints.__repr__c             C   s@   | j d k	rt| j }nd }| jd k	r0t| j}nd }t||fS )N)r   rk   r   rW   )r&   Zpsesr!   r!   r"   rX     s    

zNameConstraints.__hash__r   r   N)r4   r5   r6   r   ZNAME_CONSTRAINTSr0   rJ   rl   rn   r   r2   rU   rV   r   rI   rX   r   rY   r   r   r!   r!   r!   r"   r   r  s   	
r   c               @   s\   e Zd ZeeedddZedZ	edZ
edZdd Zd	d
 Zdd Zdd ZdS )r?   )r0   criticalrG   c             C   s:   t |tstdt |ts$td|| _|| _|| _d S )Nz2oid argument must be an ObjectIdentifier instance.z critical must be a boolean value)r   r   rF   r~   _oid	_critical_value)r&   r0   r   rG   r!   r!   r"   r2     s    

zExtension.__init__r   r   r   c             C   s
   d | S )Nz@<Extension(oid={0.oid}, critical={0.critical}, value={0.value})>)rB   )r&   r!   r!   r"   rI     s    zExtension.__repr__c             C   s2   t |tstS | j|jko0| j|jko0| j|jkS )N)r   r?   rS   r0   r   rG   )r&   rT   r!   r!   r"   rU     s
    
zExtension.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zExtension.__ne__c             C   s   t | j| j| jfS )N)rW   r0   r   rG   )r&   r!   r!   r"   rX     s    zExtension.__hash__N)r4   r5   r6   r   r~   r:   r2   r   rY   r0   r   rG   rI   rU   rV   rX   r!   r!   r!   r"   r?     s   



r?   c               @   sb   e Zd Zeje dddZed\ZZ	Z
eje dddZdd	 Zd
d Zdd Zdd ZdS )GeneralNames)general_namesc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`     s    z(GeneralNames.__init__.<locals>.<genexpr>z^Every item in the general_names list must be an object conforming to the GeneralName interface)ra   rb   rF   _general_names)r&   r   r!   r!   r"   r2     s
    zGeneralNames.__init__r   )typec                s0    fdd| D } t kr(dd |D }t|S )Nc             3   s   | ]}t | r|V  qd S )N)r   )r^   i)r   r!   r"   r`     s    z3GeneralNames.get_values_for_type.<locals>.<genexpr>c             s   s   | ]}|j V  qd S )N)rG   )r^   r   r!   r!   r"   r`     s    )r   ra   )r&   r   objsr!   )r   r"   get_values_for_type  s    z GeneralNames.get_values_for_typec             C   s   d | jS )Nz<GeneralNames({})>)rB   r   )r&   r!   r!   r"   rI     s    zGeneralNames.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zGeneralNames.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zGeneralNames.__ne__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    zGeneralNames.__hash__N)r4   r5   r6   rJ   rn   r   r2   r-   rL   rM   rN   Typer   rI   rU   rV   rX   r!   r!   r!   r"   r     s   
	r   c               @   s\   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd Zdd ZdS )SubjectAlternativeName)r   c             C   s   t || _d S )N)r   r   )r&   r   r!   r!   r"   r2     s    zSubjectAlternativeName.__init__r   c             C   s   | j |S )N)r   r   )r&   r   r!   r!   r"   r      s    z*SubjectAlternativeName.get_values_for_typec             C   s   d | jS )Nz<SubjectAlternativeName({})>)rB   r   )r&   r!   r!   r"   rI   #  s    zSubjectAlternativeName.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU   &  s    
zSubjectAlternativeName.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   ,  s    zSubjectAlternativeName.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX   /  s    zSubjectAlternativeName.__hash__N)r4   r5   r6   r   ZSUBJECT_ALTERNATIVE_NAMEr0   rJ   rn   r   r2   r-   rL   rM   rN   r   rI   rU   rV   rX   r!   r!   r!   r"   r     s   r   c               @   s\   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd Zdd ZdS )IssuerAlternativeName)r   c             C   s   t || _d S )N)r   r   )r&   r   r!   r!   r"   r2   6  s    zIssuerAlternativeName.__init__r   c             C   s   | j |S )N)r   r   )r&   r   r!   r!   r"   r   ;  s    z)IssuerAlternativeName.get_values_for_typec             C   s   d | jS )Nz<IssuerAlternativeName({})>)rB   r   )r&   r!   r!   r"   rI   >  s    zIssuerAlternativeName.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU   A  s    
zIssuerAlternativeName.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   G  s    zIssuerAlternativeName.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX   J  s    zIssuerAlternativeName.__hash__N)r4   r5   r6   r   ZISSUER_ALTERNATIVE_NAMEr0   rJ   rn   r   r2   r-   rL   rM   rN   r   rI   rU   rV   rX   r!   r!   r!   r"   r   3  s   r   c               @   s\   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd Zdd ZdS )CertificateIssuer)r   c             C   s   t || _d S )N)r   r   )r&   r   r!   r!   r"   r2   Q  s    zCertificateIssuer.__init__r   c             C   s   | j |S )N)r   r   )r&   r   r!   r!   r"   r   V  s    z%CertificateIssuer.get_values_for_typec             C   s   d | jS )Nz<CertificateIssuer({})>)rB   r   )r&   r!   r!   r"   rI   Y  s    zCertificateIssuer.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU   \  s    
zCertificateIssuer.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   b  s    zCertificateIssuer.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX   e  s    zCertificateIssuer.__hash__N)r4   r5   r6   r   ZCERTIFICATE_ISSUERr0   rJ   rn   r   r2   r-   rL   rM   rN   r   rI   rU   rV   rX   r!   r!   r!   r"   r   N  s   r   c               @   sJ   e Zd ZejZedddZdd Zdd Z	dd	 Z
d
d ZedZdS )	CRLReason)reasonc             C   s   t |tstd|| _d S )Nz*reason must be an element from ReasonFlags)r   r   rF   _reason)r&   r   r!   r!   r"   r2   l  s    
zCRLReason.__init__c             C   s   d | jS )Nz<CRLReason(reason={})>)rB   r   )r&   r!   r!   r"   rI   r  s    zCRLReason.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU   u  s    
zCRLReason.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV   {  s    zCRLReason.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX   ~  s    zCRLReason.__hash__r   N)r4   r5   r6   r   Z
CRL_REASONr0   r   r2   rI   rU   rV   rX   r   rY   r   r!   r!   r!   r"   r   i  s   r   c               @   sL   e Zd ZejZejdddZdd Zdd Z	dd	 Z
d
d ZedZdS )InvalidityDate)invalidity_datec             C   s   t |tjstd|| _d S )Nz+invalidity_date must be a datetime.datetime)r   datetimerF   _invalidity_date)r&   r   r!   r!   r"   r2     s    zInvalidityDate.__init__c             C   s   d | jS )Nz$<InvalidityDate(invalidity_date={})>)rB   r   )r&   r!   r!   r"   rI     s    zInvalidityDate.__repr__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zInvalidityDate.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zInvalidityDate.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX     s    zInvalidityDate.__hash__r   N)r4   r5   r6   r   ZINVALIDITY_DATEr0   r   r2   rI   rU   rV   rX   r   rY   r   r!   r!   r!   r"   r     s   r   c               @   sT   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd ZdS ))PrecertificateSignedCertificateTimestamps)signed_certificate_timestampsc             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   sctr!   r!   r"   r`     s   zEPrecertificateSignedCertificateTimestamps.__init__.<locals>.<genexpr>zYEvery item in the signed_certificate_timestamps list must be a SignedCertificateTimestamp)ra   rb   rF   _signed_certificate_timestamps)r&   r   r!   r!   r"   r2     s    
z2PrecertificateSignedCertificateTimestamps.__init__r   c             C   s   d t| S )Nz/<PrecertificateSignedCertificateTimestamps({})>)rB   ra   )r&   r!   r!   r"   rI     s    z2PrecertificateSignedCertificateTimestamps.__repr__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    z2PrecertificateSignedCertificateTimestamps.__hash__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
z0PrecertificateSignedCertificateTimestamps.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    z0PrecertificateSignedCertificateTimestamps.__ne__N)r4   r5   r6   r   Z%PRECERT_SIGNED_CERTIFICATE_TIMESTAMPSr0   rJ   rn   r   r2   r-   rL   rM   rN   rI   rX   rU   rV   r!   r!   r!   r"   r     s   	r   c               @   sT   e Zd ZejZeje dddZ	e
d\ZZZdd Zdd Zd	d
 Zdd ZdS )SignedCertificateTimestamps)r   c             C   s,   t |}tdd |D s"td|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r   r!   r!   r"   r`     s   z7SignedCertificateTimestamps.__init__.<locals>.<genexpr>zYEvery item in the signed_certificate_timestamps list must be a SignedCertificateTimestamp)ra   rb   rF   r   )r&   r   r!   r!   r"   r2     s    
z$SignedCertificateTimestamps.__init__r   c             C   s   d t| S )Nz!<SignedCertificateTimestamps({})>)rB   ra   )r&   r!   r!   r"   rI     s    z$SignedCertificateTimestamps.__repr__c             C   s   t t| jS )N)rW   rk   r   )r&   r!   r!   r"   rX     s    z$SignedCertificateTimestamps.__hash__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
z"SignedCertificateTimestamps.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    z"SignedCertificateTimestamps.__ne__N)r4   r5   r6   r   ZSIGNED_CERTIFICATE_TIMESTAMPSr0   rJ   rn   r   r2   r-   rL   rM   rN   rI   rX   rU   rV   r!   r!   r!   r"   r     s   	r   c               @   sJ   e Zd ZejZedddZdd Zdd Z	dd	 Z
d
d ZedZdS )	OCSPNonce)noncec             C   s   t |tstd|| _d S )Nznonce must be bytes)r   rm   rF   _nonce)r&   r   r!   r!   r"   r2     s    
zOCSPNonce.__init__c             C   s   t |tstS | j|jkS )N)r   r   rS   r   )r&   rT   r!   r!   r"   rU     s    
zOCSPNonce.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zOCSPNonce.__ne__c             C   s
   t | jS )N)rW   r   )r&   r!   r!   r"   rX     s    zOCSPNonce.__hash__c             C   s
   d | S )Nz<OCSPNonce(nonce={0.nonce!r})>)rB   )r&   r!   r!   r"   rI     s    zOCSPNonce.__repr__r   N)r4   r5   r6   r   ZNONCEr0   rm   r2   rU   rV   rX   rI   r   rY   r   r!   r!   r!   r"   r     s   r   c               @   s   e Zd ZejZdd Zdd Zdd Zdd Z	d	d
 Z
edZedZedZedZedZedZedZdS )IssuingDistributionPointc       	      C   s   |r(t |tr tdd |D s(td|rHtj|ks@tj|krHtdt |trpt |trpt |trpt |tsxtd||||g}t	dd |D dkrtd	t
|||||||gstd
|| _|| _|| _|| _|| _|| _|| _d S )Nc             s   s   | ]}t |tV  qd S )N)r   r   )r^   r_   r!   r!   r"   r`   #  s    z4IssuingDistributionPoint.__init__.<locals>.<genexpr>z:only_some_reasons must be None or frozenset of ReasonFlagszTunspecified and remove_from_crl are not valid reasons in an IssuingDistributionPointzuonly_contains_user_certs, only_contains_ca_certs, indirect_crl and only_contains_attribute_certs must all be boolean.c             S   s   g | ]}|r|qS r!   r!   )r^   r_   r!   r!   r"   
<listcomp>E  s    z5IssuingDistributionPoint.__init__.<locals>.<listcomp>   zOnly one of the following can be set to True: only_contains_user_certs, only_contains_ca_certs, indirect_crl, only_contains_attribute_certszCannot create empty extension: if only_contains_user_certs, only_contains_ca_certs, indirect_crl, and only_contains_attribute_certs are all False, then either full_name, relative_name, or only_some_reasons must have a value.)r   r   rb   rF   r   r   r   r   r~   r$   r   _only_contains_user_certs_only_contains_ca_certs_indirect_crl_only_contains_attribute_certs_only_some_reasonsr   r   )	r&   r   r   only_contains_user_certsonly_contains_ca_certsonly_some_reasonsindirect_crlonly_contains_attribute_certsZcrl_constraintsr!   r!   r"   r2     sP    







z!IssuingDistributionPoint.__init__c             C   s
   d | S )NaG  <IssuingDistributionPoint(full_name={0.full_name}, relative_name={0.relative_name}, only_contains_user_certs={0.only_contains_user_certs}, only_contains_ca_certs={0.only_contains_ca_certs}, only_some_reasons={0.only_some_reasons}, indirect_crl={0.indirect_crl}, only_contains_attribute_certs={0.only_contains_attribute_certs})>)rB   )r&   r!   r!   r"   rI   g  s    z!IssuingDistributionPoint.__repr__c             C   sb   t |tstS | j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j|jko`| j	|j	kS )N)
r   r   rS   r   r   r  r  r  r  r  )r&   rT   r!   r!   r"   rU   s  s    
zIssuingDistributionPoint.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zIssuingDistributionPoint.__ne__c             C   s$   t | j| j| j| j| j| j| jfS )N)rW   r   r   r  r  r  r  r  )r&   r!   r!   r"   rX     s    z!IssuingDistributionPoint.__hash__r   r   r   r   r  r  r  N)r4   r5   r6   r   ZISSUING_DISTRIBUTION_POINTr0   r2   rI   rU   rV   rX   r   rY   r   r   r  r  r  r  r  r!   r!   r!   r"   r     s    P



r   c               @   sP   e Zd ZeedddZedZedZ	dd Z
dd	 Zd
d Zdd ZdS )rE   )r0   rG   c             C   s"   t |tstd|| _|| _d S )Nzoid must be an ObjectIdentifier)r   r   rF   r   r   )r&   r0   rG   r!   r!   r"   r2     s    
zUnrecognizedExtension.__init__r   r   c             C   s
   d | S )Nz7<UnrecognizedExtension(oid={0.oid}, value={0.value!r})>)rB   )r&   r!   r!   r"   rI     s    zUnrecognizedExtension.__repr__c             C   s&   t |tstS | j|jko$| j|jkS )N)r   rE   rS   r0   rG   )r&   rT   r!   r!   r"   rU     s    
zUnrecognizedExtension.__eq__c             C   s
   | |k S )Nr!   )r&   rT   r!   r!   r"   rV     s    zUnrecognizedExtension.__ne__c             C   s   t | j| jfS )N)rW   r0   rG   )r&   r!   r!   r"   rX     s    zUnrecognizedExtension.__hash__N)r4   r5   r6   r   rm   r2   r   rY   r0   rG   rI   rU   rV   rX   r!   r!   r!   r"   rE     s   

rE   )Tr;   r   r   r   rJ   enumr   Zcryptographyr   Zcryptography.hazmat._derr   r   r   r   Zcryptography.hazmat._typesr   Zcryptography.hazmat.primitivesr	   r
   Z,cryptography.hazmat.primitives.asymmetric.ecr   Z-cryptography.hazmat.primitives.asymmetric.rsar   Z*cryptography.x509.certificate_transparencyr   Zcryptography.x509.general_namer   r   r   Zcryptography.x509.namer   Zcryptography.x509.oidr   r   r   r   rm   r#   r-   	Exceptionr.   r9   ABCMetar:   objectr>   rO   rZ   rh   rr   rv   rs   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Z_TLS_FEATURE_TYPE_TO_ENUMr   r   r   r?   r   r   r   r   r   r   r   r   r   r   rE   r!   r!   r!   r"   <module>   sx   (!_&)%%d@7)&"qU+&-+ 