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.   %-