3 ꅭh�T�@s.ddlmZmZmZddlZddlZddlmZmZddl m Z ddl m Z m Z mZmZmZddlmZmZddlmZmZddlmZmZmZdd lmZejej�Gd d �d e��Z ejej!�Gd d �d e��Z"ejej#�Gdd�de��Z$ejej%�Gdd�de��Z&ejej'j(�Gdd�de��Z)dS)�)�absolute_import�division�print_functionN)�utils�x509)�UnsupportedAlgorithm)�_asn1_integer_to_int�_asn1_string_to_bytes�_decode_x509_name�_obj2txt�_parse_asn1_time)�_encode_asn1_int_gc� _txt2obj_gc)�hashes� serialization)�dsa�ec�rsa)� _ASN1Typec@s�eZdZdd�Zdd�Zdd�Zdd�Zd d �Zd d �Zd d�Z e j d�Z e dd��Ze dd��Zdd�Ze dd��Ze dd��Ze dd��Ze dd��Ze dd��Ze d d!��Ze jd"d#��Ze d$d%��Ze d&d'��Zd(d)�Zd*S)+� _CertificatecCsZ||_||_|jjj|j�}|dkr0tjj|_n&|dkrDtjj|_ntj dj |�|��dS)Nr�z{} is not a valid X509 version) �_backend�_x509�_libZX509_get_versionr�Version�v1�_versionZv3ZInvalidVersion�format)�self�backendZ x509_cert�version�r!�/usr/lib64/python3.6/x509.py�__init__s  z_Certificate.__init__cCs dj|j�S)Nz)r�subject)rr!r!r"�__repr__,sz_Certificate.__repr__cCs,t|tj�stS|jjj|j|j�}|dkS)Nr)� isinstancer� Certificate�NotImplementedrrZX509_cmpr)r�other�resr!r!r"�__eq__/s z_Certificate.__eq__cCs ||k S)Nr!)rr)r!r!r"�__ne__6sz_Certificate.__ne__cCst|jtjj��S)N)�hash� public_bytesr�Encoding�DER)rr!r!r"�__hash__9sz_Certificate.__hash__cCs|S)Nr!)r�memor!r!r"� __deepcopy__<sz_Certificate.__deepcopy__cCs*tj||j�}|j|jtjj��|j�S)N) r�Hashr�updater.rr/r0�finalize)r� algorithm�hr!r!r"� fingerprint?sz_Certificate.fingerprintrcCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_get_serialNumberr�openssl_assert�_ffi�NULLr)r�asn1_intr!r!r"� serial_numberFsz_Certificate.serial_numbercCs|jS)N)r>)rr!r!r"�serialLsz_Certificate.serialcCsR|jjj|j�}||jjjkr0|jj�td��|jjj||jjj �}|jj |�S)Nz,Certificate public key is of an unknown type) rrZX509_get_pubkeyrr;r<�_consume_errors� ValueError�gc� EVP_PKEY_free�_evp_pkey_to_public_key)r�pkeyr!r!r"� public_keyPs  z_Certificate.public_keycCs|jjj|j�}t|j|�S)N)rrZX509_getm_notBeforerr )r� asn1_timer!r!r"�not_valid_before[sz_Certificate.not_valid_beforecCs|jjj|j�}t|j|�S)N)rrZX509_getm_notAfterrr )rrGr!r!r"�not_valid_after`sz_Certificate.not_valid_aftercCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_get_issuer_namerr:r;r<r )r�issuerr!r!r"rJesz_Certificate.issuercCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_get_subject_namerr:r;r<r )rr$r!r!r"r$ksz_Certificate.subjectc Cs8|j}y tj|Stk r2tdj|���YnXdS)Nz)Signature algorithm OID:{} not recognized)�signature_algorithm_oidr�_SIG_OIDS_TO_HASH�KeyErrorrr)r�oidr!r!r"�signature_hash_algorithmqs  z%_Certificate.signature_hash_algorithmcCs^|jjjd�}|jjj|jjj||j�|jj|d|jjjk�t|j|dj �}t j |�S)Nz X509_ALGOR **r) rr;�newr�X509_get0_signaturer<rr:r r7r�ObjectIdentifier)r�algrNr!r!r"rK{s z$_Certificate.signature_algorithm_oidcCs|jjj|j�S)N)rZ_certificate_extension_parser�parser)rr!r!r"� extensions�sz_Certificate.extensionscCsR|jjjd�}|jjj||jjj|j�|jj|d|jjjk�t|j|d�S)NzASN1_BIT_STRING **r) rr;rPrrQr<rr:r )r�sigr!r!r"� signature�s z_Certificate.signaturecsd�jjjd�}�jjj�j|�}�jj|dk��jjj|�fdd��}�jjj|d|�dd�S)Nzunsigned char **rcs�jjj|d�S)Nr)rr� OPENSSL_free)�pointer)rr!r"��sz4_Certificate.tbs_certificate_bytes..) rr;rPrZi2d_re_X509_tbsrr:rB�buffer)r�ppr*r!)rr"�tbs_certificate_bytes�s z"_Certificate.tbs_certificate_bytescCsn|jj�}|tjjkr*|jjj||j�}n(|tjjkrJ|jjj ||j�}nt d��|jj |dk�|jj |�S)Nz/encoding must be an item from the Encoding enum�) r�_create_mem_bio_gcrr/�PEMrZPEM_write_bio_X509rr0Z i2d_X509_bio� TypeErrorr:� _read_mem_bio)r�encoding�bior*r!r!r"r.�s   z_Certificate.public_bytesN)�__name__� __module__� __qualname__r#r%r+r,r1r3r9rZread_only_propertyr �propertyr>r?rFrHrIrJr$rOrK�cached_propertyrUrWr]r.r!r!r!r"rs*         rc@s:eZdZdd�Zedd��Zedd��Zejdd��Z d S) �_RevokedCertificatecCs||_||_||_dS)N)rZ_crl� _x509_revoked)rrZcrlZ x509_revokedr!r!r"r#�sz_RevokedCertificate.__init__cCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_REVOKED_get0_serialNumberrkr:r;r<r)rr=r!r!r"r>�sz!_RevokedCertificate.serial_numbercCst|j|jjj|j��S)N)r rrZ X509_REVOKED_get0_revocationDaterk)rr!r!r"�revocation_date�sz#_RevokedCertificate.revocation_datecCs|jjj|j�S)N)rZ_revoked_cert_extension_parserrTrk)rr!r!r"rU�sz_RevokedCertificate.extensionsN) rerfrgr#rhr>rlrrirUr!r!r!r"rj�s  rjc@s�eZdZdd�Zdd�Zdd�Zdd�Zejd d ��Z d d �Z e d d��Z e dd��Z e dd��Ze dd��Ze dd��Ze dd��Ze dd��Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zejd%d&��Zd'd(�Zd)S)*�_CertificateRevocationListcCs||_||_dS)N)r� _x509_crl)rrZx509_crlr!r!r"r#�sz#_CertificateRevocationList.__init__cCs,t|tj�stS|jjj|j|j�}|dkS)Nr)r&r�CertificateRevocationListr(rrZ X509_CRL_cmprn)rr)r*r!r!r"r+�s z!_CertificateRevocationList.__eq__cCs ||k S)Nr!)rr)r!r!r"r,�sz!_CertificateRevocationList.__ne__cCsXtj||j�}|jj�}|jjj||j�}|jj|dk�|jj|�}|j |�|j �S)Nr^) rr4rr_r�i2d_X509_CRL_biornr:rbr5r6)rr7r8rdr*Zderr!r!r"r9�s   z&_CertificateRevocationList.fingerprintcCs@|jjj|j�}|jj||jjjk�|jjj||jjj�}|S)N) rrZ X509_CRL_duprnr:r;r<rBZ X509_CRL_free)r�dupr!r!r"� _sorted_crl�sz&_CertificateRevocationList._sorted_crlcCsl|jjjd�}t|j|�}|jjj|j||�}|dkr:dS|jj|d|jjjk�t |j|j|d�SdS)NzX509_REVOKED **r) rr;rPr rZX509_CRL_get0_by_serialrrr:r<rj)rr>�revokedr=r*r!r!r"�(get_revoked_certificate_by_serial_number�s  zC_CertificateRevocationList.get_revoked_certificate_by_serial_numberc Cs8|j}y tj|Stk r2tdj|���YnXdS)Nz)Signature algorithm OID:{} not recognized)rKrrLrMrr)rrNr!r!r"rOs  z3_CertificateRevocationList.signature_hash_algorithmcCs^|jjjd�}|jjj|j|jjj|�|jj|d|jjjk�t|j|dj �}t j |�S)Nz X509_ALGOR **r) rr;rPr�X509_CRL_get0_signaturernr<r:r r7rrR)rrSrNr!r!r"rK s z2_CertificateRevocationList.signature_algorithm_oidcCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_CRL_get_issuerrnr:r;r<r )rrJr!r!r"rJsz!_CertificateRevocationList.issuercCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_CRL_get_nextUpdaternr:r;r<r )rZnur!r!r"� next_updatesz&_CertificateRevocationList.next_updatecCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_CRL_get_lastUpdaternr:r;r<r )rZlur!r!r"� last_update sz&_CertificateRevocationList.last_updatecCsR|jjjd�}|jjj|j||jjj�|jj|d|jjjk�t|j|d�S)NzASN1_BIT_STRING **r) rr;rPrrurnr<r:r )rrVr!r!r"rW&s z$_CertificateRevocationList.signaturecsd�jjjd�}�jjj�j|�}�jj|dk��jjj|�fdd��}�jjj|d|�dd�S)Nzunsigned char **rcs�jjj|d�S)Nr)rrrX)rY)rr!r"rZ5sz?_CertificateRevocationList.tbs_certlist_bytes..) rr;rPrZi2d_re_X509_CRL_tbsrnr:rBr[)rr\r*r!)rr"�tbs_certlist_bytes/s z-_CertificateRevocationList.tbs_certlist_bytescCsn|jj�}|tjjkr*|jjj||j�}n(|tjjkrJ|jjj ||j�}nt d��|jj |dk�|jj |�S)Nz/encoding must be an item from the Encoding enumr^) rr_rr/r`rZPEM_write_bio_X509_CRLrnr0rprar:rb)rrcrdr*r!r!r"r.9s    z'_CertificateRevocationList.public_bytescCsD|jjj|j�}|jjj||�}|jj||jjjk�t|j||�S)N) rr�X509_CRL_get_REVOKEDrnZsk_X509_REVOKED_valuer:r;r<rj)r�idxrs�rr!r!r"� _revoked_certGsz(_CertificateRevocationList._revoked_certccs&x tt|��D]}|j|�VqWdS)N)�range�lenr|)r�ir!r!r"�__iter__Msz#_CertificateRevocationList.__iter__cs�t|t�r8|jt���\}}}�fdd�t|||�D�Stj|�}|dkrV|t��7}d|kolt��knsvt��j|�SdS)Ncsg|]}�j|��qSr!)r|)�.0r)rr!r"� Tsz:_CertificateRevocationList.__getitem__..r) r&�slice�indicesr~r}�operator�index� IndexErrorr|)rrz�start�stop�stepr!)rr"� __getitem__Qs   z&_CertificateRevocationList.__getitem__cCs4|jjj|j�}||jjjkr"dS|jjj|�SdS)Nr)rrryrnr;r<Zsk_X509_REVOKED_num)rrsr!r!r"�__len__]sz"_CertificateRevocationList.__len__cCs|jjj|j�S)N)rZ_crl_extension_parserrTrn)rr!r!r"rUdsz%_CertificateRevocationList.extensionscCsLt|tjtjtjf�std��|jj j |j |j �}|dkrH|jj �dSdS)NzGExpecting one of DSAPublicKey, RSAPublicKey, or EllipticCurvePublicKey.r^FT)r&rZ DSAPublicKeyrZ RSAPublicKeyrZEllipticCurvePublicKeyrarrZX509_CRL_verifyrnZ _evp_pkeyr@)rrFr*r!r!r"�is_signature_validhs  z-_CertificateRevocationList.is_signature_validN)rerfrgr#r+r,r9rrirrrtrhrOrKrJrvrwrWrxr.r|r�r�r�rUr�r!r!r!r"rm�s(       rmc@s�eZdZdd�Zdd�Zdd�Zdd�Zd d �Zed d ��Z ed d��Z edd��Z e j dd��Zdd�Zedd��Zedd��Zedd��Zdd�ZdS)�_CertificateSigningRequestcCs||_||_dS)N)r� _x509_req)rrZx509_reqr!r!r"r#~sz#_CertificateSigningRequest.__init__cCs2t|t�stS|jtjj�}|jtjj�}||kS)N)r&r�r(r.rr/r0)rr)Z self_bytesZ other_bytesr!r!r"r+�s  z!_CertificateSigningRequest.__eq__cCs ||k S)Nr!)rr)r!r!r"r,�sz!_CertificateSigningRequest.__ne__cCst|jtjj��S)N)r-r.rr/r0)rr!r!r"r1�sz#_CertificateSigningRequest.__hash__cCsH|jjj|j�}|jj||jjjk�|jjj||jjj�}|jj |�S)N) rr�X509_REQ_get_pubkeyr�r:r;r<rBrCrD)rrEr!r!r"rF�sz%_CertificateSigningRequest.public_keycCs2|jjj|j�}|jj||jjjk�t|j|�S)N)rrZX509_REQ_get_subject_namer�r:r;r<r )rr$r!r!r"r$�sz"_CertificateSigningRequest.subjectc Cs8|j}y tj|Stk r2tdj|���YnXdS)Nz)Signature algorithm OID:{} not recognized)rKrrLrMrr)rrNr!r!r"rO�s  z3_CertificateSigningRequest.signature_hash_algorithmcCs^|jjjd�}|jjj|j|jjj|�|jj|d|jjjk�t|j|dj �}t j |�S)Nz X509_ALGOR **r) rr;rPr�X509_REQ_get0_signaturer�r<r:r r7rrR)rrSrNr!r!r"rK�s z2_CertificateSigningRequest.signature_algorithm_oidcs6�jjj�j�}�jjj|�fdd��}�jjj|�S)Ncs"�jjj|�jjj�jjjd��S)NZX509_EXTENSION_free)rrZsk_X509_EXTENSION_pop_freer;Z addressofZ _original_lib)�x)rr!r"rZ�sz7_CertificateSigningRequest.extensions..)rrZX509_REQ_get_extensionsr�r;rBZ_csr_extension_parserrT)rZ x509_extsr!)rr"rU�s z%_CertificateSigningRequest.extensionscCsn|jj�}|tjjkr*|jjj||j�}n(|tjjkrJ|jjj ||j�}nt d��|jj |dk�|jj |�S)Nz/encoding must be an item from the Encoding enumr^) rr_rr/r`rZPEM_write_bio_X509_REQr�r0Zi2d_X509_REQ_biorar:rb)rrcrdr*r!r!r"r.�s    z'_CertificateSigningRequest.public_bytescsd�jjjd�}�jjj�j|�}�jj|dk��jjj|�fdd��}�jjj|d|�dd�S)Nzunsigned char **rcs�jjj|d�S)Nr)rrrX)rY)rr!r"rZ�szB_CertificateSigningRequest.tbs_certrequest_bytes..) rr;rPrZi2d_re_X509_REQ_tbsr�r:rBr[)rr\r*r!)rr"�tbs_certrequest_bytes�s z0_CertificateSigningRequest.tbs_certrequest_bytescCsR|jjjd�}|jjj|j||jjj�|jj|d|jjjk�t|j|d�S)NzASN1_BIT_STRING **r) rr;rPrr�r�r<r:r )rrVr!r!r"rW�s z$_CertificateSigningRequest.signaturecCsh|jjj|j�}|jj||jjjk�|jjj||jjj�}|jjj |j|�}|dkrd|jj �dSdS)Nr^FT) rrr�r�r:r;r<rBrCZX509_REQ_verifyr@)rrEr*r!r!r"r��s z-_CertificateSigningRequest.is_signature_validcCs t|j|j�}|jjj|j|d�}|dkrs.   %-