3
ґX{F                 @   sX  d Z ddlmZmZmZmZ ddlZddlZddlmZm	Z	m
Z
 ddlmZ ddlmZmZ ddlmZ dd	lmZ ejd
krddlmZmZ nddlmZmZ ejd#krddlmZmZ dZd$ddZd%ddZG dd deZG dd dZ n$ddlm Z  dZd&ddZd'ddZdddddddddddddZ!G dd  d e"Z#G d!d" d"e"Z$dS )(a  
Miscellaneous data helpers, including functions for converting integers to and
from bytes and UTC timezone. Exports the following items:

 - OrderedDict()
 - int_from_bytes()
 - int_to_bytes()
 - timezone.utc
 - inet_ntop()
 - inet_pton()
 - uri_to_iri()
 - iri_to_uri()
    )unicode_literalsdivisionabsolute_importprint_functionN)datetimedatetime   )unwrap)
iri_to_uri
uri_to_iri)OrderedDict)	type_nameZwin32)	inet_ntop	inet_pton   )	timedeltatzinfoTFc             C   s   d}|rJ| dk rJd}t tjtdt|  d d }| d|>  d|>  } d|  }t|d@ rfd| }|jd	}|r| rt|dd d
@ rd| }|dk	r|rd}nd}||t|  | }n$|rt|dd d
@ dkrd| }|S )au  
        Converts an integer to a byte string

        :param value:
            The integer to convert

        :param signed:
            If the byte string should be encoded using two's complement

        :param width:
            None == auto, otherwise an integer of the byte width for the return
            value

        :return:
            A byte string
        Fr   Tz%xg       @   r	   0hex       N   )intmathceillenabsdecodeord)valuesignedwidthZis_negbitsZhex_stroutputZpad_char r&   1/usr/lib/python3/dist-packages/asn1crypto/util.pyint_to_bytes)   s&    "
r(   c             C   sT   | dkrdS t | jdd}|s$|S t| dd d@ rPt| d }|d|>  S |S )a  
        Converts a byte string to an integer

        :param value:
            The byte string to convert

        :param signed:
            If the byte string should be interpreted using two's complement

        :return:
            An integer
            r   r      r	   r   r   )Zlongencoder    r   )r!   r"   ZnumZbit_lenr&   r&   r'   int_from_bytesV   s    r,   c               @   s$   e Zd Zdd Zdd Zdd ZdS )utcc             C   s   dS )Ns	   UTC+00:00r&   )self_r&   r&   r'   tznameu   s    z
utc.tznamec             C   s   t dS )Nr   )r   )r.   r/   r&   r&   r'   	utcoffsetx   s    zutc.utcoffsetc             C   s   t dS )Nr   )r   )r.   r/   r&   r&   r'   dst{   s    zutc.dstN)__name__
__module____qualname__r0   r1   r2   r&   r&   r&   r'   r-   s   s   r-   c               @   s   e Zd Ze ZdS )timezoneN)r3   r4   r5   r-   r&   r&   r&   r'   r6   ~   s   r6   )r6   c             C   sn   |dkr^|rD| dk r&t | d j }n| j }|d dkrL|d7 }n| j }tj|d p\d}| j|d|dS )au  
        Converts an integer to a byte string

        :param value:
            The integer to convert

        :param signed:
            If the byte string should be encoded using two's complement

        :param width:
            None == auto, otherwise an integer of the byte width for the return
            value

        :return:
            A byte string
        Nr   r	   r   big)	byteorderr"   )r   
bit_lengthr   r   to_bytes)r!   r"   r#   Zbits_requiredr&   r&   r'   r(      s    
c             C   s   t j| d|dS )a  
        Converts a byte string to an integer

        :param value:
            The byte string to convert

        :param signed:
            If the byte string should be interpreted using two's complement

        :return:
            An integer
        r7   )r"   )r   
from_bytes)r!   r"   r&   r&   r'   r,      s             )r	      r               r   	   
         c               @   s   e Zd ZdZdZdZdZdd Zdd Zdd Z	d	d
 Z
d#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d Zdd  Zd!d" ZdS )$extended_datez
    A datetime.date-like object that can represent the year 0. This is just
    to handle 0000-01-01 found in some certificates.
    Nc             C   sZ   |dkrt d|dk s |dkr(t d|dk s<|t| krDt d|| _|| _|| _dS )z
        :param year:
            The integer 0

        :param month:
            An integer from 1 to 12

        :param day:
            An integer from 1 to 31
        r   zyear must be 0r	   rG   zmonth is out of rangezday is out of rangeN)
ValueError_DAYS_PER_MONTH_YEAR_0yearmonthday)r.   rK   rL   rM   r&   r&   r'   __init__   s    zextended_date.__init__c             C   s   |j dd}td| j| j}d|krR|jd}|j dd}|j dd}|j d|}d|kr|jd}|j dd}|j dd}|j d|}|j|S )	z
        Performs strftime(), always returning a unicode string

        :param format:
            A strftime() format string

        :return:
            A unicode string of the formatted date
        z%Y0000i  z%c2000%z%%z%x)replacer   rL   rM   strftime)r.   formattempc_outx_outr&   r&   r'   _format   s    

zextended_date._formatc             C   s
   | j dS )z
        Formats the date as %Y-%m-%d

        :return:
            The date formatted to %Y-%m-%d as a unicode string in Python 3
            and a byte string in Python 2
        z
0000-%m-%d)rS   )r.   r&   r&   r'   	isoformat  s    	zextended_date.isoformatc             C   s   | j |}tr|jdS |S )z
        Formats the date using strftime()

        :param format:
            The strftime() format string

        :return:
            The formatted date as a unicode string in Python 3 and a byte
            string in Python 2
        zutf-8)rX   py2r+   )r.   rT   r%   r&   r&   r'   rS     s    

zextended_date.strftimec             C   sH   |dkr| j }|dkr| j}|dkr*| j}|dkr8t}nt}||||S )z
        Returns a new datetime.date or asn1crypto.util.extended_date
        object with the specified components replaced

        :return:
            A datetime.date or asn1crypto.util.extended_date object
        Nr   )rK   rL   rM   r   rH   )r.   rK   rL   rM   clsr&   r&   r'   rR   '  s    	zextended_date.replacec             C   s   t r| j S | j S d S )N)rZ   	__bytes____unicode__)r.   r&   r&   r'   __str__B  s    zextended_date.__str__c             C   s   | j  jdS )Nzutf-8)r]   r+   )r.   r&   r&   r'   r\   H  s    zextended_date.__bytes__c             C   s
   | j dS )Nz%Y-%m-%d)rX   )r.   r&   r&   r'   r]   K  s    zextended_date.__unicode__c             C   s   t || jsdS | j|dkS )NFr   )
isinstance	__class____cmp__)r.   otherr&   r&   r'   __eq__N  s    zextended_date.__eq__c             C   s   | j | S )N)rc   )r.   rb   r&   r&   r'   __ne__S  s    zextended_date.__ne__c             C   s   t tdt|d S )Nz
            An asn1crypto.util.extended_date object can only be compared to
            an asn1crypto.util.extended_date or datetime.date object, not %s
            )	TypeErrorr
   r   )r.   rb   r&   r&   r'   _comparison_errorV  s    zextended_date._comparison_errorc             C   s`   t |trdS t || js$| j| | j| j| jf}|j|j|jf}||k rPdS ||kr\dS dS )Nr	   r   rg   )r_   r   r`   rf   rK   rL   rM   )r.   rb   stotr&   r&   r'   ra   _  s    

zextended_date.__cmp__c             C   s   | j |dk S )Nr   )ra   )r.   rb   r&   r&   r'   __lt__w  s    zextended_date.__lt__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   __le__z  s    zextended_date.__le__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   __gt__}  s    zextended_date.__gt__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   __ge__  s    zextended_date.__ge__)NNN)r3   r4   r5   __doc__rK   rL   rM   rN   rX   rY   rS   rR   r^   r\   r]   rc   rd   rf   ra   rj   rk   rl   rm   r&   r&   r&   r'   rH      s(   
	rH   c               @   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZd/ddZdd Zdd	 Zd
d Zdd Zdd Zdd Zd0ddZdd Zd1d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+d, Zd-d. Z dS )2extended_datetimez
    A datetime.datetime-like object that can represent the year 0. This is just
    to handle 0000-01-01 found in some certificates.
    Nr   c	       	      C   s   |dkrt d|dk s |dkr(t d|dk s<|t| krDt d|dk sT|dkr\t d|dk sl|d	krtt d
|dk s|d	krt d|dk s|dkrt d|| _|| _|| _|| _|| _|| _|| _|| _	dS )a  
        :param year:
            The integer 0

        :param month:
            An integer from 1 to 12

        :param day:
            An integer from 1 to 31

        :param hour:
            An integer from 0 to 23

        :param minute:
            An integer from 0 to 59

        :param second:
            An integer from 0 to 59

        :param microsecond:
            An integer from 0 to 999999
        r   zyear must be 0r	   rG   zmonth is out of rangezday is out of range   zhour is out of range;   zminute is out of rangezsecond is out of rangei?B zmicrosecond is out of rangeN)
rI   rJ   rK   rL   rM   hourminutesecondmicrosecondr   )	r.   rK   rL   rM   rr   rs   rt   ru   r   r&   r&   r'   rN     s,    zextended_datetime.__init__c             C   s   t | j| j| jS )zS
        :return:
            An asn1crypto.util.extended_date of the date
        )rH   rK   rL   rM   )r.   r&   r&   r'   r     s    zextended_datetime.datec             C   s   t | j| j| j| j| jS )zI
        :return:
            A datetime.time object of the time
        )r   rr   rs   rt   ru   r   )r.   r&   r&   r'   r     s    zextended_datetime.timec             C   s"   | j dkrdS | j j| jddS )z\
        :return:
            None or a datetime.timedelta() of the offset from UTC
        Ni  )rK   )r   r1   rR   )r.   r&   r&   r'   r1     s    
zextended_datetime.utcoffsetc             C   s"   | j dkrdS | j j| jddS )zi
        :return:
            None or a datetime.timedelta() of the daylight savings time offset
        Ni  )rK   )r   r2   rR   )r.   r&   r&   r'   r2     s    
zextended_datetime.dstc             C   s"   | j dkrdS | j j| jddS )z
        :return:
            None or the name of the timezone as a unicode string in Python 3
            and a byte string in Python 2
        Ni  )rK   )r   r0   rR   )r.   r&   r&   r'   r0     s    
zextended_datetime.tznamec          	   C   s   |j dd}td| j| j| j| j| j| j| j}d|krf|j	d}|j dd}|j dd}|j d|}d|kr|j	d}|j dd}|j dd}|j d|}|j	|S )	z
        Performs strftime(), always returning a unicode string

        :param format:
            A strftime() format string

        :return:
            A unicode string of the formatted datetime
        z%YrO   i  z%crP   rQ   z%%z%x)
rR   r   rL   rM   rr   rs   rt   ru   r   rS   )r.   rT   rU   rV   rW   r&   r&   r'   rX     s*    

zextended_datetime._formatTc             C   s&   | j dkr| jd| S | jd| S )aj  
        Formats the date as "%Y-%m-%d %H:%M:%S" with the sep param between the
        date and time portions

        :param set:
            A single character of the separator to place between the date and
            time

        :return:
            The formatted datetime as a unicode string in Python 3 and a byte
            string in Python 2
        r   z0000-%%m-%%d%s%%H:%%M:%%Sz0000-%%m-%%d%s%%H:%%M:%%S.%%f)ru   rS   )r.   sepr&   r&   r'   rY     s    
zextended_datetime.isoformatc             C   s   | j |}tr|jdS |S )z
        Formats the date using strftime()

        :param format:
            The strftime() format string

        :return:
            The formatted date as a unicode string in Python 3 and a byte
            string in Python 2
        zutf-8)rX   rZ   r+   )r.   rT   r%   r&   r&   r'   rS   1  s    

zextended_datetime.strftimec	       
   	   C   s   |dkr| j }|dkr| j}|dkr*| j}|dkr8| j}|dkrF| j}|dkrT| j}|dkrb| j}|dkrp| j}|dkr~t}	nt	}	|	||||||||S )z
        Returns a new datetime.datetime or asn1crypto.util.extended_datetime
        object with the specified components replaced

        :return:
            A datetime.datetime or asn1crypto.util.extended_datetime object
        Nr   )
rK   rL   rM   rr   rs   rt   ru   r   r   ro   )
r.   rK   rL   rM   rr   rs   rt   ru   r   r[   r&   r&   r'   rR   B  s8    
zextended_datetime.replacec             C   s   t r| j S | j S d S )N)rZ   r\   r]   )r.   r&   r&   r'   r^   m  s    zextended_datetime.__str__c             C   s   | j  jdS )Nzutf-8)r]   r+   )r.   r&   r&   r'   r\   s  s    zextended_datetime.__bytes__c             C   s    d}| j dkr|d7 }| j|S )Nz%Y-%m-%d %H:%M:%Sr   z.%f)ru   rX   )r.   rT   r&   r&   r'   r]   v  s    
zextended_datetime.__unicode__c             C   s   t || jsdS | j|dkS )NFr   )r_   r`   ra   )r.   rb   r&   r&   r'   rc   |  s    zextended_datetime.__eq__c             C   s   | j | S )N)rc   )r.   rb   r&   r&   r'   rd     s    zextended_datetime.__ne__c             C   s   t tdt|dS )z
        Raises a TypeError about the other object not being suitable for
        comparison

        :param other:
            The object being compared to
        z
            An asn1crypto.util.extended_datetime object can only be compared to
            an asn1crypto.util.extended_datetime or datetime.datetime object,
            not %s
            N)re   r
   r   )r.   rb   r&   r&   r'   rf     s    	z#extended_datetime._comparison_errorc             C   s   | j  }|j  }|d k	r |d ks0|d kr8|d k	r8tdt|trFdS t|| js\| j| | j| j| j| j	| j
| j| j|f}|j|j|j|j	|j
|j|j|f}||k rdS ||krdS dS )Nz5can't compare offset-naive and offset-aware datetimesr	   r   rg   rg   )r1   re   r_   r   r`   rf   rK   rL   rM   rr   rs   rt   ru   )r.   rb   ZsoZoorh   ri   r&   r&   r'   ra     s:     

zextended_datetime.__cmp__c             C   s   | j |dk S )Nr   )ra   )r.   rb   r&   r&   r'   rj     s    zextended_datetime.__lt__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   rk     s    zextended_datetime.__le__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   rl     s    zextended_datetime.__gt__c             C   s   | j |dkS )Nr   )ra   )r.   rb   r&   r&   r'   rm     s    zextended_datetime.__ge__)r   r   r   r   N)rv   )NNNNNNNN)!r3   r4   r5   rn   rK   rL   rM   rr   rs   rt   ru   r   rN   r   r   r1   r2   r0   rX   rY   rS   rR   r^   r\   r]   rc   rd   rf   ra   rj   rk   rl   rm   r&   r&   r&   r'   ro     s>   
6

'
 
*(ro   )r   )FN)F)FN)F)%rn   Z
__future__r   r   r   r   r   sysr   r   r   Z_errorsr
   Z_irir   r   Z_ordereddictr   Z_typesr   platformZ_inetr   r   Zsocketversion_infor   r   rZ   r(   r,   r-   r6   rJ   objectrH   ro   r&   r&   r&   r'   <module>   sJ   


-


 ;