3 lá˜_c ã@sddlmZmZmZddlmZddlZddlmZddl m Z ddl m Z m Z Gdd„deƒZd d „eDƒZeƒZe jeje jeje jeje jeje jeje jejiZe jd e jd e jd e jde jde jde j de jde j!di Z"dd„Z#Gdd„deƒZ$Gdd„deƒZ%Gdd„deƒZ&dS)é)Úabsolute_importÚdivisionÚprint_function)ÚEnumN)Úutils)Ú _get_backend)ÚNameOIDÚObjectIdentifierc@s4eZdZdZdZdZdZdZdZdZ dZ d Z d Z d S) Ú _ASN1Typeé éééééééééN) Ú__name__Ú __module__Ú __qualname__Ú UTF8StringZ NumericStringÚPrintableStringZ T61StringÚ IA5StringZUTCTimeZGeneralizedTimeZ VisibleStringZUniversalStringZ BMPString©rrú/usr/lib64/python3.6/name.pyr sr cCsi|] }||j“qSr)Úvalue)Ú.0Úirrrú sr ZCNÚLZSTÚOZOUÚCZSTREETZDCZUIDcCsœ|sdS|jddƒ}|jddƒ}|jddƒ}|jdd ƒ}|jd d ƒ}|jd d ƒ}|jddƒ}|jddƒ}|ddkr|d|}|ddkr˜|dd…d}|S)z>Escape special characters in RFC4514 Distinguished Name value.Úú\z\\ú"z\"ú+z\+ú,z\,ú;z\;úz\>úz\00rú#ú éNz\ )r-r.éÿÿÿÿr0)Úreplace)ÚvalrrrÚ_escape_dn_value7s          r3c@sTeZdZefdd„ZejdƒZejdƒZdd„Z dd„Z d d „Z d d „Z d d„Z dS)Ú NameAttributecCs’t|tƒstdƒ‚t|tjƒs&tdƒ‚|tjks:|tjkrTt|j dƒƒdkrTt dƒ‚|t krjt j |tjƒ}t|tƒs|tdƒ‚||_||_||_dS)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ÚoidrrDrrrÚ__init__Ps"      zNameAttribute.__init__rBrCcCs$tj|j|jjƒ}d|t|jƒfS)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_NAMErArFZ dotted_stringr3r)rEÚkeyrrrÚrfc4514_stringuszNameAttribute.rfc4514_stringcCs&t|tƒstS|j|jko$|j|jkS)N)r7r4ÚNotImplementedrFr)rEÚotherrrrÚ__eq__s zNameAttribute.__eq__cCs ||k S)Nr)rErLrrrÚ__ne__…szNameAttribute.__ne__cCst|j|jfƒS)N)ÚhashrFr)rErrrÚ__hash__ˆszNameAttribute.__hash__cCs dj|ƒS)Nz/)Úformat)rErrrÚ__repr__‹szNameAttribute.__repr__N)rrrr?rGrZread_only_propertyrFrrJrMrNrPrRrrrrr4Os "   r4c@sTeZdZdd„Zdd„Zdd„Zdd„Zd d „Zd d „Zd d„Z dd„Z dd„Z dS)ÚRelativeDistinguishedNamecCs\t|ƒ}|stdƒ‚tdd„|Dƒƒs.tdƒ‚||_t|ƒ|_t|jƒt|ƒkrXtdƒ‚dS)Nz-a relative distinguished name cannot be emptycss|]}t|tƒVqdS)N)r7r4)rÚxrrrú ”sz5RelativeDistinguishedName.__init__..z/attributes must be an iterable of NameAttributez$duplicate attributes are not allowed)Úlistr>Úallr8Ú _attributesÚ frozensetÚ_attribute_setr<)rEÚ attributesrrrrG�s z"RelativeDistinguishedName.__init__cs‡fdd„|DƒS)Ncsg|]}|jˆkr|‘qSr)rF)rr)rFrrú ŸszDRelativeDistinguishedName.get_attributes_for_oid..r)rErFr)rFrÚget_attributes_for_oidžsz0RelativeDistinguishedName.get_attributes_for_oidcCsdjdd„|jDƒƒS)z¬ Format as RFC4514 Distinguished Name string. Within each RDN, attributes are joined by '+', although that is rarely used in certificates. r'css|]}|jƒVqdS)N)rJ)rÚattrrrrrU¨sz;RelativeDistinguishedName.rfc4514_string..)ÚjoinrX)rErrrrJ¡sz(RelativeDistinguishedName.rfc4514_stringcCst|tƒstS|j|jkS)N)r7rSrKrZ)rErLrrrrMªs z RelativeDistinguishedName.__eq__cCs ||k S)Nr)rErLrrrrN°sz RelativeDistinguishedName.__ne__cCs t|jƒS)N)rOrZ)rErrrrP³sz"RelativeDistinguishedName.__hash__cCs t|jƒS)N)ÚiterrX)rErrrÚ__iter__¶sz"RelativeDistinguishedName.__iter__cCs t|jƒS)N)r<rX)rErrrÚ__len__¹sz!RelativeDistinguishedName.__len__cCsdj|jƒƒS)Nz)rQrJ)rErrrrR¼sz"RelativeDistinguishedName.__repr__N) rrrrGr]rJrMrNrPrarbrRrrrrrS�s rSc@sjeZdZdd„Zdd„Zdd„Zedd„ƒZdd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zd S)ÚNamecCsRt|ƒ}tdd„|Dƒƒr,dd„|Dƒ|_n"tdd„|DƒƒrF||_ntdƒ‚dS)Ncss|]}t|tƒVqdS)N)r7r4)rrTrrrrUÃsz Name.__init__..cSsg|]}t|gƒ‘qSr)rS)rrTrrrr\Åsz!Name.__init__..css|]}t|tƒVqdS)N)r7rS)rrTrrrrUÇszNattributes must be a list of NameAttribute or a list RelativeDistinguishedName)rVrWrXr8)rEr[rrrrGÁsz Name.__init__cCsdjdd„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(css|]}|jƒVqdS)N)rJ)rr^rrrrUÛsz&Name.rfc4514_string..)r_ÚreversedrX)rErrrrJÏs zName.rfc4514_stringcs‡fdd„|DƒS)Ncsg|]}|jˆkr|‘qSr)rF)rr)rFrrr\ßsz/Name.get_attributes_for_oid..r)rErFr)rFrr]ÞszName.get_attributes_for_oidcCs|jS)N)rX)rErrrÚrdnsász Name.rdnsNcCst|ƒ}|j|ƒS)N)rZx509_name_bytes)rEZbackendrrrÚ public_bytesåszName.public_bytescCst|tƒstS|j|jkS)N)r7rcrKrX)rErLrrrrMés z Name.__eq__cCs ||k S)Nr)rErLrrrrNïsz Name.__ne__cCstt|jƒƒS)N)rOÚtuplerX)rErrrrPòsz Name.__hash__ccs(x"|jD]}x|D] }|VqWqWdS)N)rX)rEÚrdnZavarrrra÷s  z Name.__iter__cCstdd„|jDƒƒS)Ncss|]}t|ƒVqdS)N)r<)rrhrrrrUýszName.__len__..)ÚsumrX)rErrrrbüsz Name.__len__cCs:djdd„|jDƒƒ}tjr,dj|jdƒƒSdj|ƒSdS)Nr(css|]}|jƒVqdS)N)rJ)rr^rrrrUsz Name.__repr__..z r5)r_rXr9ZPY2rQr=)rErerrrrRÿsz Name.__repr__)N)rrrrGrJr]ÚpropertyrerfrMrNrPrarbrRrrrrrcÀs  rc)'Z __future__rrrÚenumrr9Z cryptographyrZcryptography.hazmat.backendsrZcryptography.x509.oidrr r Z_ASN1_TYPE_TO_ENUMÚobjectr?r:rr;Z SERIAL_NUMBERZ DN_QUALIFIERZ EMAIL_ADDRESSrZDOMAIN_COMPONENTr@Z COMMON_NAMEZ LOCALITY_NAMEZSTATE_OR_PROVINCE_NAMEZORGANIZATION_NAMEZORGANIZATIONAL_UNIT_NAMEZSTREET_ADDRESSZUSER_IDrHr3r4rSrcrrrrÚs6      @1