
Z7                 @   s   d  Z  d d l Z d d l Z d d l Z d d l m Z Gd d   d e  Z Gd d   d e  Z	 Gd d	   d	 e  Z
 Gd
 d   d e
  Z Gd d   d e j e j  Z Gd d   d e j e j  Z d S)zJOSE utilities.    N)rsac                   s.   e  Z d  Z d Z d Z   f d d   Z   S)abstractclassmethoda  Descriptor 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.

    Tc                s#   d | _  t t |   j |  d  S)NT)__isabstractmethod__superr   __init__)selftarget)	__class__ -/usr/lib/python3/dist-packages/josepy/util.pyr      s    	zabstractclassmethod.__init__)__name__
__module____qualname____doc__r   r   r
   r
   )r	   r   r   	   s   r   c               @   ss   e  Z d  Z d Z d d   Z d d   Z e j j d d  Z	 d d	   Z
 d
 d   Z d d   Z d d   Z d S)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`.

    c             C   s=   t  | t j j  s0 t  | t j j  s0 t  | |  _ d  S)N)
isinstanceOpenSSLcryptoX509ZX509ReqAssertionErrorwrapped)r   r   r
   r
   r   r   $   s    zComparableX509.__init__c             C   s   t  |  j |  S)N)getattrr   )r   namer
   r
   r   __getattr__)   s    zComparableX509.__getattr__c             C   sC   t  |  j t j j  r' t j j } n t j j } | | |  j  S)aL  Dumps 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

        )r   r   r   r   r   Zdump_certificateZdump_certificate_request)r   Zfiletypefuncr
   r
   r   _dump,   s    zComparableX509._dumpc             C   s,   t  | |  j  s t S|  j   | j   k S)N)r   r	   NotImplementedr   )r   otherr
   r
   r   __eq__>   s    zComparableX509.__eq__c             C   s   t  |  j |  j   f  S)N)hashr	   r   )r   r
   r
   r   __hash__D   s    zComparableX509.__hash__c             C   s   |  | k S)Nr
   )r   r   r
   r
   r   __ne__G   s    zComparableX509.__ne__c             C   s   d j  |  j j |  j  S)Nz<{0}({1!r})>)formatr	   r   r   )r   r
   r
   r   __repr__J   s    zComparableX509.__repr__N)r   r   r   r   r   r   r   r   ZFILETYPE_ASN1r   r   r    r!   r#   r
   r
   r
   r   r      s   r   c               @   sd   e  Z d  Z d Z e Z d d   Z d d   Z d d   Z d d	   Z	 d
 d   Z
 d d   Z d S)ComparableKeyznComparable wrapper for ``cryptography`` keys.

    See https://github.com/pyca/cryptography/issues/2122.

    c             C   s   | |  _  d  S)N)_wrapped)r   r   r
   r
   r   r   V   s    zComparableKey.__init__c             C   s   t  |  j |  S)N)r   r%   )r   r   r
   r
   r   r   Y   s    zComparableKey.__getattr__c             C   s   t  | |  j  s+ |  j j | j j k	 r/ t St |  j d  rW |  j   | j   k St |  j d  r |  j   | j   k St Sd  S)Nprivate_numberspublic_numbers)r   r	   r%   r   hasattrr&   r'   )r   r   r
   r
   r   r   \   s    zComparableKey.__eq__c             C   s   |  | k S)Nr
   )r   r   r
   r
   r   r!   h   s    zComparableKey.__ne__c             C   s   d j  |  j j |  j  S)Nz<{0}({1!r})>)r"   r	   r   r%   )r   r
   r
   r   r#   k   s    zComparableKey.__repr__c             C   s   |  j  |  j j    S)zGet wrapped public key.)r	   r%   
public_key)r   r
   r
   r   r)   n   s    zComparableKey.public_keyN)r   r   r   r   r   r    r   r   r   r!   r#   r)   r
   r
   r
   r   r$   N   s   r$   c               @   s"   e  Z d  Z d Z d d   Z d S)ComparableRSAKeyzWrapper for ``cryptography`` RSA keys.

    Wraps around:

    - :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey`
    - :class:`~cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey`

    c          	   C   s   t  |  j t j  rd |  j   } | j } t |  j | j | j	 | j
 | j | j | j | j f  St  |  j t j  r |  j   } t |  j | j | j f  Sd  S)N)r   r%   r   ZRSAPrivateKeyWithSerializationr&   r'   r   r	   pqZdmp1Zdmq1ZiqmpneZRSAPublicKeyWithSerialization)r   ZprivZpubr
   r
   r   r    }   s    	zComparableRSAKey.__hash__N)r   r   r   r   r    r
   r
   r
   r   r*   s   s   r*   c               @   s|   e  Z d  Z d Z f  Z d d   Z d d   Z d d   Z d d	   Z d
 d   Z	 d d   Z
 d d   Z d d   Z d S)ImmutableMapz5Immutable key to value mapping with attribute access.c             K   s   t  |  t  |  j  k rT t d j d j |  j  | rH d j |  n d    x- |  j D]" } t j |  | | j |   q^ Wd  S)NzA__init__() takes exactly the following arguments: {0} ({1} given)z, Znone)set	__slots__	TypeErrorr"   joinobject__setattr__pop)r   kwargsslotr
   r
   r   r      s    !zImmutableMap.__init__c             K   s)   t  |   } | j |  t |   |   S)zReturn updated map.)dictupdatetype)r   r7   itemsr
   r
   r   r:      s    zImmutableMap.updatec             C   s6   y t  |  |  SWn t k
 r1 t |   Yn Xd  S)N)r   AttributeErrorKeyError)r   keyr
   r
   r   __getitem__   s    zImmutableMap.__getitem__c             C   s   t  |  j  S)N)iterr1   )r   r
   r
   r   __iter__   s    zImmutableMap.__iter__c             C   s   t  |  j  S)N)lenr1   )r   r
   r
   r   __len__   s    zImmutableMap.__len__c                s&   t  t   f d d     j D   S)Nc             3   s   |  ] } t    |  Vq d  S)N)r   ).0r8   )r   r
   r   	<genexpr>   s    z(ImmutableMap.__hash__.<locals>.<genexpr>)r   tupler1   )r   r
   )r   r   r       s    zImmutableMap.__hash__c             C   s   t  d   d  S)Nzcan't set attribute)r=   )r   r   valuer
   r
   r   r5      s    zImmutableMap.__setattr__c             C   s5   d j  |  j j d j d d   t j |   D   S)Nz{0}({1})z, c             s   s'   |  ] \ } } d  j  | |  Vq d S)z	{0}={1!r}N)r"   )rE   r?   rH   r
   r
   r   rF      s   z(ImmutableMap.__repr__.<locals>.<genexpr>)r"   r	   r   r3   sixZ	iteritems)r   r
   r
   r   r#      s    	zImmutableMap.__repr__N)r   r   r   r   r1   r   r:   r@   rB   rD   r    r5   r#   r
   r
   r
   r   r/      s   	r/   c               @   s   e  Z d  Z d Z d Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)
frozendictzFrozen dictionary._items_keysc             O   s   | r | r t  |  } n> t |  d k rQ t | d t j  rQ | d } n	 t    t j |  d |  t j |  d t t	 t
 j |     d  S)N   r   rK   rL   )r9   rC   r   collectionsMappingr2   r4   r5   rG   sortedrI   Ziterkeys)r   argsr7   r<   r
   r
   r   r      s    (	zfrozendict.__init__c             C   s   |  j  | S)N)rK   )r   r?   r
   r
   r   r@      s    zfrozendict.__getitem__c             C   s   t  |  j  S)N)rA   rL   )r   r
   r
   r   rB      s    zfrozendict.__iter__c             C   s   t  |  j  S)N)rC   rK   )r   r
   r
   r   rD      s    zfrozendict.__len__c                s    t    f d d     j D  S)Nc             3   s   |  ] } |   | f Vq d  S)Nr
   )rE   r?   )r   r
   r   rF      s    z+frozendict._sorted_items.<locals>.<genexpr>)rG   rL   )r   r
   )r   r   _sorted_items   s    zfrozendict._sorted_itemsc             C   s   t  |  j    S)N)r   rR   )r   r
   r
   r   r       s    zfrozendict.__hash__c             C   s4   y |  j  | SWn t k
 r/ t |   Yn Xd  S)N)rK   r>   r=   )r   r   r
   r
   r   r      s    zfrozendict.__getattr__c             C   s   t  d   d  S)Nzcan't set attribute)r=   )r   r   rH   r
   r
   r   r5      s    zfrozendict.__setattr__c             C   s)   d j  d j d d   |  j   D   S)Nzfrozendict({0})z, c             s   s'   |  ] \ } } d  j  | |  Vq d S)z	{0}={1!r}N)r"   )rE   r?   rH   r
   r
   r   rF      s   z&frozendict.__repr__.<locals>.<genexpr>)r"   r3   rR   )r   r
   r
   r   r#      s    zfrozendict.__repr__N)z_itemsz_keys)r   r   r   r   r1   r   r@   rB   rD   rR   r    r   r5   r#   r
   r
   r
   r   rJ      s   rJ   )r   rN   r   rI   Z)cryptography.hazmat.primitives.asymmetricr   classmethodr   r4   r   r$   r*   rO   Hashabler/   rJ   r
   r
   r
   r   <module>   s   1%.