U
    ÓZj�  ã                   @   sÂ   d Z zddlmZmZ W n$ ek
r<   ddlmZmZ Y nX ddlZddlZddlm	Z	 G dd„ de
ƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZG dd„ deeƒZG dd„ deeƒZdS )zJOSE utilities.é    )ÚHashableÚMappingN)Úrsac                       s$   e Zd ZdZdZ‡ fdd„Z‡  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| ƒ |¡ d S )NT)Ú__isabstractmethod__Úsuperr   Ú__init__)ÚselfÚtarget©Ú	__class__© úN/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/josepy/util.pyr      s    zabstractclassmethod.__init__)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__classcell__r   r   r   r   r      s   r   c                   @   sP   e Zd ZdZdd„ Zdd„ Zejjfdd„Z	dd	„ Z
d
d„ Zdd„ Zdd„ ZdS )ÚComparableX509zËWrapper 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ƒs t |tjjƒs 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 r   )Úgetattrr   ©r	   Únamer   r   r   Ú__getattr__,   s    zComparableX509.__getattr__c                 C   s.   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 |  ¡ | ¡ kS r   )r   r   ÚNotImplementedr"   ©r	   Úotherr   r   r   Ú__eq__A   s    zComparableX509.__eq__c                 C   s   t | j|  ¡ fƒS r   )Úhashr   r"   ©r	   r   r   r   Ú__hash__G   s    zComparableX509.__hash__c                 C   s
   | |k S r   r   r$   r   r   r   Ú__ne__J   s    zComparableX509.__ne__c                 C   s   d  | jj| j¡S ©Nz<{0}({1!r})>)Úformatr   r   r   r(   r   r   r   Ú__repr__M   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 r   )Ú_wrappedr   r   r   r   r   Y   s    zComparableKey.__init__c                 C   s   t | j|ƒS r   )r   r/   r   r   r   r   r    \   s    zComparableKey.__getattr__c                 C   s`   t || jƒr| jj|jjk	r tS t| jdƒr<|  ¡ | ¡ kS t| jdƒrX|  ¡ | ¡ kS tS d S )NÚprivate_numbersÚpublic_numbers)r   r   r/   r#   Úhasattrr0   r1   r$   r   r   r   r&   _   s    ÿzComparableKey.__eq__c                 C   s
   | |k S r   r   r$   r   r   r   r*   k   s    zComparableKey.__ne__c                 C   s   d  | jj| j¡S r+   )r,   r   r   r/   r(   r   r   r   r-   n   s    zComparableKey.__repr__c                 C   s   |   | j ¡ ¡S )zGet wrapped public key.)r   r/   Ú
public_keyr(   r   r   r   r3   q   s    zComparableKey.public_keyN)r   r   r   r   r#   r)   r   r    r&   r*   r-   r3   r   r   r   r   r.   Q   s   r.   c                   @   s   e Zd ZdZdd„ ZdS )ÚComparableRSAKeyz×Wrapper for ``cryptography`` RSA keys.

    Wraps around:

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

    c              	   C   sr   t | jtjƒrD|  ¡ }|j}t| j|j|j	|j
|j|j|j|jfƒS t | jtjƒrn|  ¡ }t| j|j|jfƒS d S r   )r   r/   r   ZRSAPrivateKeyWithSerializationr0   r1   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   r4   v   s   	r4   c                   @   sT   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S )ÚImmutableMapz5Immutable key to value mapping with attribute access.r   c                 K   s\   t |ƒt | jƒkr8td d | j¡|r0d |¡nd¡ƒ‚| jD ]}t | || |¡¡ q>d S )NzA__init__() takes exactly the following arguments: {0} ({1} given)ú, Únone)ÚsetÚ	__slots__Ú	TypeErrorr,   ÚjoinÚobjectÚ__setattr__Úpop)r	   ÚkwargsÚslotr   r   r   r   ”   s    
þÿ
zImmutableMap.__init__c                 K   s    t | ƒ}| |¡ t| ƒf |ŽS )zReturn updated map.)ÚdictÚupdateÚtype)r	   rC   Úitemsr   r   r   rF   �   s    
zImmutableMap.updatec                 C   s.   zt | |ƒW S  tk
r(   t|ƒ‚Y nX d S r   )r   ÚAttributeErrorÚKeyError©r	   Úkeyr   r   r   Ú__getitem__£   s    zImmutableMap.__getitem__c                 C   s
   t | jƒS r   )Úiterr=   r(   r   r   r   Ú__iter__©   s    zImmutableMap.__iter__c                 C   s
   t | jƒS r   )Úlenr=   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 r   )r   )Ú.0rD   r(   r   r   Ú	<genexpr>°   s     z(ImmutableMap.__hash__.<locals>.<genexpr>)r'   Útupler=   r(   r   r(   r   r)   ¯   s    zImmutableMap.__hash__c                 C   s   t dƒ‚d S ©Nzcan't set attribute©rI   ©r	   r   Úvaluer   r   r   rA   ²   s    zImmutableMap.__setattr__c              	   C   s&   d  | jjd dd„ t | ¡D ƒ¡¡S )Nz{0}({1})r:   c                 s   s   | ]\}}d   ||¡V  qdS ©z	{0}={1!r}N©r,   ©rR   rL   rX   r   r   r   rS   ¶   s   ÿz(ImmutableMap.__repr__.<locals>.<genexpr>)r,   r   r   r?   ÚsixÚ	iteritemsr(   r   r   r   r-   µ   s    þzImmutableMap.__repr__N)r   r   r   r   r=   r   rF   rM   rO   rQ   r)   rA   r-   r   r   r   r   r9   �   s   	r9   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   sj   |r|st |ƒ}n*t|ƒdkr6t|d tƒr6|d }ntƒ ‚t | d|¡ t | dttt	 
|¡ƒƒ¡ d S )Né   r   r_   r`   )rE   rP   r   r   r>   r@   rA   rT   Úsortedr\   Úiterkeys)r	   ÚargsrC   rH   r   r   r   r   À   s    

zfrozendict.__init__c                 C   s
   | j | S r   )r_   rK   r   r   r   rM   Ì   s    zfrozendict.__getitem__c                 C   s
   t | jƒS r   )rN   r`   r(   r   r   r   rO   Ï   s    zfrozendict.__iter__c                 C   s
   t | jƒS r   )rP   r_   r(   r   r   r   rQ   Ò   s    zfrozendict.__len__c                    s   t ‡ fdd„ˆ jD ƒƒS )Nc                 3   s   | ]}|ˆ | fV  qd S r   r   )rR   rL   r(   r   r   rS   Ö   s     z+frozendict._sorted_items.<locals>.<genexpr>)rT   r`   r(   r   r(   r   Ú_sorted_itemsÕ   s    zfrozendict._sorted_itemsc                 C   s   t |  ¡ ƒS r   )r'   re   r(   r   r   r   r)   Ø   s    zfrozendict.__hash__c                 C   s.   z| j | W S  tk
r(   t|ƒ‚Y nX d S r   )r_   rJ   rI   r   r   r   r   r    Û   s    zfrozendict.__getattr__c                 C   s   t dƒ‚d S rU   rV   rW   r   r   r   rA   á   s    zfrozendict.__setattr__c                 C   s   d  d dd„ |  ¡ D ƒ¡¡S )Nzfrozendict({0})r:   c                 s   s   | ]\}}d   ||¡V  qdS rY   rZ   r[   r   r   r   rS   å   s
   ÿ ÿz&frozendict.__repr__.<locals>.<genexpr>)r,   r?   re   r(   r   r   r   r-   ä   s    ÿzfrozendict.__repr__N)r   r   r   r   r=   r   rM   rO   rQ   re   r)   r    rA   r-   r   r   r   r   r^   »   s   r^   )r   Úcollections.abcr   r   ÚImportErrorÚcollectionsr   r\   Z)cryptography.hazmat.primitives.asymmetricr   Úclassmethodr   r@   r   r.   r4   r9   r^   r   r   r   r   Ú<module>   s   1%.