a ]@sdZzddlmZmZWn"ey:ddlmZmZYn0ddlZddlZddlm Z Gddde Z Gddde Z Gd d d e ZGd d d eZGd ddeeZGdddeeZdS)zJOSE utilities.)HashableMappingN)rsacs$eZdZdZdZfddZZS)abstractclassmethodaDescriptor for an abstract classmethod. It augments the :mod:`abc` framework with an abstract classmethod. This is implemented as :class:`abc.abstractclassmethod` in the standard Python library starting with version 3.2. This particular implementation, allegedly based on Python 3.3 source code, is stolen from http://stackoverflow.com/questions/11217878/python-2-7-combine-abc-abstractmethod-and-classmethod. Tcsd|_tt||dS)NT)__isabstractmethod__superr__init__)selftarget __class__-/usr/lib/python3/dist-packages/josepy/util.pyrszabstractclassmethod.__init__)__name__ __module__ __qualname____doc__rr __classcell__r r r rr s rc@sPeZdZdZddZddZejjfddZ dd Z d d Z d d Z ddZ dS)ComparableX509zWrapper for OpenSSL.crypto.X509** objects that supports __eq__. :ivar wrapped: Wrapped certificate or certificate request. :type wrapped: `OpenSSL.crypto.X509` or `OpenSSL.crypto.X509Req`. cCs*t|tjjs t|tjjs J||_dSN) isinstanceOpenSSLcryptoX509ZX509Reqwrappedr rr r rr'szComparableX509.__init__cCs t|j|Sr)getattrrr namer r r __getattr__,szComparableX509.__getattr__cCs.t|jtjjrtjj}ntjj}|||jS)aLDumps the object into a buffer with the specified encoding. :param int filetype: The desired encoding. Should be one of `OpenSSL.crypto.FILETYPE_ASN1`, `OpenSSL.crypto.FILETYPE_PEM`, or `OpenSSL.crypto.FILETYPE_TEXT`. :returns: Encoded X509 object. :rtype: str )rrrrrZdump_certificateZdump_certificate_request)r Zfiletypefuncr r r_dump/s  zComparableX509._dumpcCs t||jstS||kSr)rr NotImplementedr!r otherr r r__eq__As zComparableX509.__eq__cCst|j|fSr)hashr r!r r r r__hash__GszComparableX509.__hash__cCs ||k Srr r#r r r__ne__JszComparableX509.__ne__cCsd|jj|jSNz <{0}({1!r})>)formatr rrr'r r r__repr__MszComparableX509.__repr__N)rrrrrrrrZ FILETYPE_ASN1r!r%r(r)r,r r r rr src@sDeZdZdZeZddZddZddZdd Z d d Z d d Z dS) ComparableKeyznComparable wrapper for ``cryptography`` keys. See https://github.com/pyca/cryptography/issues/2122. cCs ||_dSr)_wrappedrr r rrYszComparableKey.__init__cCs t|j|Sr)rr.rr r rr\szComparableKey.__getattr__cCs`t||jr|jj|jjur tSt|jdr<||kSt|jdrX||kStSdS)Nprivate_numberspublic_numbers)rr r.r"hasattrr/r0r#r r rr%_s   zComparableKey.__eq__cCs ||k Srr r#r r rr)kszComparableKey.__ne__cCsd|jj|jSr*)r+r rr.r'r r rr,nszComparableKey.__repr__cCs||jS)zGet wrapped public key.)r r. public_keyr'r r rr2qszComparableKey.public_keyN) rrrrr"r(rrr%r)r,r2r r r rr-Qs r-c@seZdZdZddZdS)ComparableRSAKeyzWrapper for ``cryptography`` RSA keys. Wraps around: - :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey` - :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey` c Csrt|jtjrD|}|j}t|j|j|j |j |j |j |j |jfSt|jtjrn|}t|j|j |jfSdSr)rr.rZRSAPrivateKeyWithSerializationr/r0r&r pqZdmp1Zdmq1ZiqmpneZRSAPublicKeyWithSerialization)r ZprivZpubr r rr(szComparableRSAKey.__hash__N)rrrrr(r r r rr3vs r3c@sTeZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ dS) ImmutableMapz5Immutable key to value mapping with attribute access.r cKs\t|t|jkr8tdd|j|r0d|nd|jD]}t||||q>dS)NzA__init__() takes exactly the following arguments: {0} ({1} given), Znone)set __slots__ TypeErrorr+joinobject __setattr__pop)r kwargsslotr r rrs  zImmutableMap.__init__cKs$t|}||t|fi|S)zReturn updated map.)dictupdatetype)r rAitemsr r rrDs zImmutableMap.updatecCs,z t||WSty&t|Yn0dSr)rAttributeErrorKeyErrorr keyr r r __getitem__s  zImmutableMap.__getitem__cCs t|jSr)iterr;r'r r r__iter__szImmutableMap.__iter__cCs t|jSr)lenr;r'r r r__len__szImmutableMap.__len__csttfddjDS)Nc3s|]}t|VqdSr)r).0rBr'r r z(ImmutableMap.__hash__..)r&tupler;r'r r'rr(szImmutableMap.__hash__cCs tddSNzcan't set attributerGr rvaluer r rr?szImmutableMap.__setattr__c Cs&d|jjdddt|DS)Nz{0}({1})r9css|]\}}d||VqdSz {0}={1!r}Nr+rPrJrWr r rrQsz(ImmutableMap.__repr__..)r+r rr=sixZ iteritemsr'r r rr,szImmutableMap.__repr__N) rrrrr;rrDrKrMrOr(r?r,r r r rr8s r8c@s\eZdZdZdZddZddZddZd d Zd d Z d dZ ddZ ddZ ddZ dS) frozendictzFrozen dictionary.)_items_keysc Osj|r|st|}n*t|dkr6t|dtr6|d}ntt|d|t|dttt |dS)Nrr]r^) rCrNrrr<r>r?rSsortedr[Ziterkeys)r argsrArFr r rrs  zfrozendict.__init__cCs |j|Sr)r]rIr r rrKszfrozendict.__getitem__cCs t|jSr)rLr^r'r r rrMszfrozendict.__iter__cCs t|jSr)rNr]r'r r rrOszfrozendict.__len__cstfddjDS)Nc3s|]}||fVqdSrr )rPrJr'r rrQrRz+frozendict._sorted_items..)rSr^r'r r'r _sorted_itemsszfrozendict._sorted_itemscCs t|Sr)r&rbr'r r rr(szfrozendict.__hash__cCs,z |j|WSty&t|Yn0dSr)r]rHrGrr r rrs  zfrozendict.__getattr__cCs tddSrTrUrVr r rr?szfrozendict.__setattr__cCsdddd|DS)Nzfrozendict({0})r9css|]\}}d||VqdSrXrYrZr r rrQsz&frozendict.__repr__..)r+r=rbr'r r rr,szfrozendict.__repr__N)rrrrr;rrKrMrOrbr(rr?r,r r r rr\s r\)rcollections.abcrr ImportError collectionsrr[Z)cryptography.hazmat.primitives.asymmetricr classmethodrr>rr-r3r8r\r r r rs  1%.