3
O6bw8                 @   sh  d Z ddlZddlZddlmZ ddlmZ	 ddl
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mZ ddl m!Z"m#Z$ ddl%m&Z'm(Z)m*Z+m,Z-m.Z/m0Z1 ddl2m3Z4m5Z6 ddl7m8Z9m:Z;m<Z=m>Z? ddl@mAZB ddlCmDZE ejFeGZHejIdejJZKdd ZLdd ZMdd ZNdd ZOdd ZPdd ZQdd ZRd d! ZSd"d# ZTd$d% ZUd&d' ZVd(d) ZWdS )*z4Support for requesting and verifying OCSP responses.    N)datetime)InvalidSignature)default_backend)DSAPublicKey)ECDSAEllipticCurvePublicKey)PKCS1v15)RSAPublicKey)HashSHA1)EncodingPublicFormat)AuthorityInformationAccessExtendedKeyUsageExtensionNotFoundload_pem_x509_certificate
TLSFeatureTLSFeatureType)AuthorityInformationAccessOIDExtendedKeyUsageOID)load_der_ocsp_responseOCSPCertStatusOCSPRequestBuilderOCSPResponseStatus)post)RequestExceptions9   -----BEGIN CERTIFICATE[^
]+.+?-----END CERTIFICATE[^
]+c             C   sR   t | d}|j }W dQ R X g }t }x$tjt|D ]}|jt|| q6W |S )z0Parse the tlsCAFile into a list of certificates.rbN)openread_default_backend_refindall_CERT_REGEXappend_load_pem_x509_certificate)cafilefdatatrusted_ca_certsbackendZ	cert_data r*   S/var/www/html/sandeepIITI/myenv/lib/python3.6/site-packages/pymongo/ocsp_support.py_load_trusted_ca_certsE   s    r,   c             C   sF   | j }x|D ]}|j|kr|S qW |rBx|D ]}|j|kr,|S q,W d S )N)issuersubject)certchainr(   Zissuer_name	candidater*   r*   r+   _get_issuer_certS   s    



r2   c             C   s   yft | tr | j||t | nDt | tr:| j||| n*t | trX| j||t| n| j|| W n tk
rz   dS X dS )Nr      )
isinstance_RSAPublicKeyverify	_PKCS1v15_DSAPublicKey_EllipticCurvePublicKey_ECDSA_InvalidSignature)key	signature	algorithmr'   r*   r*   r+   _verify_signatured   s    


r?   c             C   s&   y| j j|S  tk
r    d S X d S )N)
extensionsZget_extension_for_class_ExtensionNotFound)r/   klassr*   r*   r+   _get_extensionu   s    rC   c             C   sr   | j  }t|tr$|jtjtj}n,t|tr@|jtj	tj
}n|jtjtj}tt t d}|j| |j S )N)r)   )
public_keyr4   r5   public_bytes	_EncodingDER_PublicFormatZPKCS1r9   ZX962ZUncompressedPointZSubjectPublicKeyInfo_Hash_SHA1r   updatefinalize)r/   rD   Zpbytesdigestr*   r*   r+   _public_key_hash|   s    


rN   c                s    fdd| D S )Nc                s(   g | ] }t |kr|j jkr|qS r*   )rN   r-   r.   ).0r/   )r-   responder_key_hashr*   r+   
<listcomp>   s    z*_get_certs_by_key_hash.<locals>.<listcomp>r*   )certificatesr-   rP   r*   )r-   rP   r+   _get_certs_by_key_hash   s    rS   c                s    fdd| D S )Nc                s&   g | ]}|j kr|j j kr|qS r*   )r.   r-   )rO   r/   )r-   responder_namer*   r+   rQ      s    
z&_get_certs_by_name.<locals>.<listcomp>r*   )rR   r-   rT   r*   )r-   rT   r+   _get_certs_by_name   s    rU   c       
      C   s  |j }|j}|j}|d k	r$|| jks,||kr<tjd | }ntjd |j}|j d k	rnt|| |}tjd nt|| |}tjd |stjd dS |d }t	|t
}| stj|jkrtjd dS t| j |j|j|jstjd dS t|j |j|j|j}	|	stjd	 |	S )
NzResponder is issuerzResponder is a delegatezUsing responder namezUsing key hashz%No matching or valid responder certs.r   z(Delegate not authorized for OCSP signingz&Delegate signature verification failedz&Response signature verification failed)rT   rP   Zissuer_key_hashr.   _LOGGERdebugrR   rU   rS   rC   _ExtendedKeyUsage_ExtendedKeyUsageOIDZOCSP_SIGNINGvaluer?   rD   r=   Zsignature_hash_algorithmZtbs_certificate_bytesZtbs_response_bytes)
r-   responsenameZ	rkey_hashZ	ikey_hashZresponder_certcertsZresponder_certsextretr*   r*   r+   _verify_response_signature   sH    








r`   c             C   s   t  }|j| |t }|j S )N)_OCSPRequestBuilderZadd_certificaterJ   build)r/   r-   Zbuilderr*   r*   r+   _build_ocsp_request   s    rc   c             C   s^   t jd t| |}|sdS tj }|j|kr<t jd dS |jrZ|j|k rZt jd dS dS )NzVerifying responser   zthisUpdate is in the futureznextUpdate is in the pastr3   )rV   rW   r`   	_datetimeutcnowZthis_updateZnext_update)r-   r[   resnowr*   r*   r+   _verify_response   s    




rh   c             C   s  t | |}y|| }tjd W n tk
r   y t||jtjddidd}W n, tk
r~ } ztjd| d S d }~X nX |j	dkrtjd|j	 d S t
|j}tjd	|j |jtjkrd S |j|jkrtjd
 d S t||sd S tjd |||< Y nX |S )NzUsing cached OCSP response.zContent-Typezapplication/ocsp-request   )r'   headerstimeoutzHTTP request failed: %s   zHTTP request returned %dzOCSP response status: %rz-Response serial number does not match requestzCaching OCSP response.)rc   rV   rW   KeyError_postrE   rF   rG   _RequestExceptionstatus_code_load_der_ocsp_responsecontentresponse_status_OCSPResponseStatus
SUCCESSFULZserial_numberrh   )r/   r-   uriocsp_response_cacheZocsp_requestZocsp_responser[   excr*   r*   r+   _get_ocsp_response   s<    







ry   c             C   sH  | j  }|dkrtjd dS |j }| j }|s@tjd dS dd |D }t|||j}d}t|t}|dk	rx(|j	D ]}|t
jkrztjd d	}P qzW |j}	|d
krtjd |rtjd dS |jstjd dS t|t}|dk rtjd dS dd |j	D }
|
s"tjd dS |dkr:tjd dS tjd xh|
D ]`}tjd| t||||	}|dkrvqJtjd|j |jtjkrdS |jtjkrJdS qJW tjd dS tjd |dkrtjd dS t|}tjd|j |jtjkrdS t||sdS ||	t||< tjd|j |jtjkrDdS dS )zCCallback for use with OpenSSL.SSL.Context.set_ocsp_client_callback.NzNo peer cert?r   zNo peer cert chain?c             S   s   g | ]}|j  qS r*   )to_cryptography)rO   Zcerr*   r*   r+   rQ      s    z"_ocsp_callback.<locals>.<listcomp>Fz!Peer presented a must-staple certT    z$Peer did not staple an OCSP responsez5Must-staple cert with no stapled response, hard fail.z.OCSP endpoint checking is disabled, soft fail.r3   z*No authority access information, soft failc             S   s    g | ]}|j tjkr|jjqS r*   )Zaccess_method_AuthorityInformationAccessOIDZOCSPZaccess_locationrZ   )rO   descr*   r*   r+   rQ   =  s   zNo OCSP URI, soft failzNo issuer cert?zRequesting OCSP dataz	Trying %szOCSP cert status: %rz)No definitive OCSP cert status, soft failzPeer stapled an OCSP responsezOCSP response status: %r)Zget_peer_certificaterV   rW   rz   Zget_peer_cert_chainr2   r(   rC   _TLSFeaturerZ   _TLSFeatureTypeZstatus_requestrw   Zcheck_ocsp_endpoint_AuthorityInformationAccessry   Zcertificate_status_OCSPCertStatusZGOODZREVOKEDrq   rs   rt   ru   rh   rc   )connZ
ocsp_bytes	user_datar/   r0   r-   Zmust_stapler^   featurerw   urisrv   r[   r*   r*   r+   _ocsp_callback  s    
























r   )X__doc__loggingZ_loggingrer    r   rd   Zcryptography.exceptionsr   r;   Zcryptography.hazmat.backendsr   r   Z-cryptography.hazmat.primitives.asymmetric.dsar   r8   Z,cryptography.hazmat.primitives.asymmetric.ecr   r:   r   r9   Z1cryptography.hazmat.primitives.asymmetric.paddingr   r7   Z-cryptography.hazmat.primitives.asymmetric.rsar	   r5   Z%cryptography.hazmat.primitives.hashesr
   rI   r   rJ   Z,cryptography.hazmat.primitives.serializationr   rF   r   rH   Zcryptography.x509r   r   r   rX   r   rA   r   r$   r   r~   r   r   Zcryptography.x509.oidr   r|   r   rY   Zcryptography.x509.ocspr   rq   r   r   r   ra   r   rt   requestsr   rn   Zrequests.exceptionsr   ro   	getLogger__name__rV   compileDOTALLr"   r,   r2   r?   rC   rN   rS   rU   r`   rc   rh   ry   r   r*   r*   r*   r+   <module>   s@    
4'