3
vQho              8   @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ ddgZejeejd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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Z%G d#d$ d$eZ&G d%d& d&eZ'G d'd( d(e!Z(ej)j*e ej+j*e ej,j*e ej-j*e  ej.j*e! ej/j*e" ej0j*e# ej1j*e ej2j*e$ ej3j*e& ej4j*e& ej5j*e' ej6j*e! ej7j*e! ej8j*e! ej9j*e! ej:j*e! ej;j*e! ej<j*e! ej=j*e! ej>j*e! ej?j*e! ej@j*e! ejAj*e! ejBj*e! ejCj*e! iZDej+jEe ej,jEe ej-jEe  ej.jEe! ej/jEe" ej0jEe# ej1jEe ej2jEe$ ejFjEe% ej4jEe& ejGjEe% ej3jEe& ej5jEe' ejHjEe( ej6jEe! ej7jEe! ej8jEe! ej9jEe! ej:jEe! ej;jEe! ej<jEe! ej=jEe! ej>jEe! ej?jEe! ej@jEe! ejAjEe! ejBjEe! ejCjEe! iZIeDZJeIZKG d)d* d*eZLG d+d deZMeM ZNdS ),    N)debug)error)eoo)_MISSING)to_bytes)int2octoct2int	ints2octsnullstr2octsisOctetsType)char)tag)univ)usefulEncoderencode)flagsc               @   s>   e Zd ZdZdZeeZdd Zdd Zdd Z	dd
dZ
d	S )AbstractItemEncoderTr   c             C   sz   |\}}}||B }|r |t jO }|dk r2||B fS |d@ f}|dL }x"|rfd|d@ B f| }|dL }qFW |dB f| S d S )N            )r   ZtagFormatConstructed)self	singleTagisConstructedZtagClassZ	tagFormatZtagIdZ
encodedTag	substrate r   :/tmp/pip-build-2nz6shyl/pyasn1/pyasn1/codec/ber/encoder.py	encodeTag"   s    



zAbstractItemEncoder.encodeTagc             C   sr   | r| j rdS |dk r|fS f }x|r@|d@ f| }|dL }q$W t|}|dkr`tjd| d|B f| S d S )Nr         ~   zLength octets overflow (%d))r   )supportIndefLenModelenr   PyAsn1Error)r   lengthdefModer   ZsubstrateLenr   r   r   encodeLength6   s    z AbstractItemEncoder.encodeLengthc             K   s   t jdd S )NzNot implemented)r   r%   )r   valueasn1Spec	encodeFunoptionsr   r   r   encodeValueJ   s    zAbstractItemEncoder.encodeValueNc             K   s  |d kr|j }n|j }|s6| j|||f|\}}}|S |jdd}	t}xpt|jD ]`\}
}|	}|
s
y| j|||f|\}}}W n4 tjk
r   tj	 }tjd||d f Y nX t
rt
d|rdpd||f  | r|r|jdd	r|S |s
d}t
r
t
d
 | j||}t
rDt
d|r,dp.d|tjt|f  || jt||7 }t
r|t
dt|tjt|f  |rt|| }|s|| j7 }qT|| }|sT|| j7 }qTW |st|}|S )Nr'   TzError encoding %r: %s   zencoded %svalue %s into %szconstructed  
ifNotEmptyFz;overridden encoding mode into definitive for primitive typezencoded %stag %s into %sz)encoded %s octets (tag + payload) into %s)tagSetr-   getr
   	enumerateZ	superTagsr   r%   sysexc_infoLOGr   r   hexdumpr	   r(   r$   eooOctetsSubstrateeooIntegerSubstrate)r   r)   r*   r+   r,   r1   r   r   ZisOctetsr'   idxr   ZdefModeOverrideexcheaderr   r   r   r   M   s^    zAbstractItemEncoder.encode)r   r   )NN)__name__
__module____qualname__r#   r9   r	   r8   r   r(   r-   r   r   r   r   r   r      s   r   c               @   s   e Zd Zdd ZdS )EndOfOctetsEncoderc             K   s
   t ddfS )NFT)r
   )r   r)   r*   r+   r,   r   r   r   r-      s    zEndOfOctetsEncoder.encodeValueN)r=   r>   r?   r-   r   r   r   r   r@      s   r@   c               @   s   e Zd ZdZdd ZdS )BooleanEncoderFc             K   s   |rdp
dddfS )Nr.   r   F)r.   )r   r   )r   r)   r*   r+   r,   r   r   r   r-      s    zBooleanEncoder.encodeValueN)r=   r>   r?   r#   r-   r   r   r   r   rA      s   rA   c               @   s   e Zd ZdZdZdd ZdS )IntegerEncoderFc             K   sL   |dkr6t r"t d| jrdpd  | jr2f ddfS d	S tt|ddddfS )
Nr   z#encoding %spayload for zero INTEGERzno r/   FT)signedr   )rD   FF)r6   supportCompactZeror   int)r   r)   r*   r+   r,   r   r   r   r-      s    
zIntegerEncoder.encodeValueN)r=   r>   r?   r#   rE   r-   r   r   r   r   rB      s   rB   c               @   s   e Zd Zdd ZdS )BitStringEncoderc             K   s  |d k	r|j |}t|}|d r4|d|d  > }n|}|jdd}| sZt||d kr|j }tt|d | | ddfS trtd|  |jj}	|	rtj	|	|	}
ntj	 }
|j |
d}d}t
}x>||k r|}t||d  |}||||| |f|7 }qW |ddfS )Nr!   maxChunkSizer   FTz#encoding into up to %s-octet chunks)r1   )cloner$   r2   asOctetsr   r6   r1   baseTagr   TagSetr
   min)r   r)   r*   r+   r,   ZvalueLengthZalignedValuerH   r   rK   r1   stopstartr   r   r   r-      s0    
zBitStringEncoder.encodeValueN)r=   r>   r?   r-   r   r   r   r   rG      s   rG   c               @   s   e Zd Zdd ZdS )OctetStringEncoderc             K   s  |d kr|j  }nt|s*|j|j  }n|}|jdd}| sLt||krV|ddfS trftd|  |d kr|jj}|rtj	||}ntj	 }|j|d}n6t|s|jj}|rtj	||}ntj	 }|j|d}d}	t
}x4||	|	|  }
|
sP |||
|f|7 }|	|7 }	qW |ddfS )NrH   r   FTz#encoding into up to %s-octet chunks)r1   )rJ   r   rI   r2   r$   r6   r1   rK   r   rL   r
   )r   r)   r*   r+   r,   r   rH   rK   r1   poschunkr   r   r   r-      s>    

zOctetStringEncoder.encodeValueN)r=   r>   r?   r-   r   r   r   r   rP      s   rP   c               @   s   e Zd ZdZdd ZdS )NullEncoderFc             K   s
   t ddfS )NFT)r
   )r   r)   r*   r+   r,   r   r   r   r-   %  s    zNullEncoder.encodeValueN)r=   r>   r?   r#   r-   r   r   r   r   rS   "  s   rS   c               @   s   e Zd ZdZdd ZdS )ObjectIdentifierEncoderFc             K   s  |d k	r|j |}|j }y|d }|d }W n$ tk
rR   tjd|f Y nX d|  kofdkn  r|dkr|d f|dd   }nL|dkr|f|dd   }n0|dkr|d f|dd   }ntjd|f n0|dkr|d f|dd   }ntjd|f f }x|D ]}	d|	  ko,d	kn  r@||	f7 }n`|	d	kr|	d	@ f}
|	d
L }	x&|	rd|	d	@ B f|
 }
|	d
L }	q^W ||
7 }ntjd|	|f qW |ddfS )Nr   r.   zShort OID %s'   (      P   z"Impossible first/second arcs at %sr   r   r   zNegative OID arc %s at %sF)rI   ZasTuple
IndexErrorr   r%   )r   r)   r*   r+   r,   oidfirstsecondoctetsZsubOidresr   r   r   r-   ,  s@    




z#ObjectIdentifierEncoder.encodeValueN)r=   r>   r?   r#   r-   r   r   r   r   rT   )  s   rT   c               @   s0   e Zd ZdZdZedd Zdd Zdd Zd	S )
RealEncoderFrW   c             C   s   d\}}| dk rd	}|dk r d
}| |9 } |dkrZ| dt |d |  9 } t |d | }n0|dkr| dt |d |  9 } t |d | }x$t| | kr| |9 } |d8 }qP qW |t| ||fS )Nr.   r   r!   rW            )r.   r.   rc   )absrF   )mencbaseemsesr   r   r   _dropFloatingPointh  s&    zRealEncoder._dropFloatingPointc             C   s"  |\}}}dddg}|j |kr.| j||j |S | j |krH| j|| j |S |||g}|||g}d}d}	td}xtdD ]}
| j||
 ||
 ||
 \}||
< ||
< ||
< t||
 t|k st||
 t|krv||
 |k rv||
 }t||
 }||
 }	qvW trtd|	|||f  |||	|fS )NrW   r!   ra   r.   infr`   zMautomatically chosen REAL encoding base %s, sign %s, mantissa %s, exponent %s)
binEncBaserj   floatrangerd   rF   r6   )r   r)   re   brg   ZencBaseZmantissaexponentsignrf   ir   r   r   _chooseEncBase  s*    





.4zRealEncoder._chooseEncBasec             K   s  |d k	r|j |}|jrdS |jr&dS |\}}}|s>tddfS |dkrvtrRtd td||dkrdd	pfd
|f ddfS |dkrd}| j|\}	}}
}|	dk r|dO }|
dkrx|d@ dkr|dL }|d7 }qW nf|
dkr
x"|d@ dk r|dL }|d7 }qW |dO }n.x$|d@ dkr.|dL }|d7 }qW |dO }d}x$|d@ dkr`|dL }|d7 }q>W |dkrvtjd||d> O }t}|dks|dkrt	|d@ }nx(|dkrt	|d@ | }|dL }qW |dkr |r t
|d d@ r t	d| }|d kr0|r0t
|d d@  r0t	d| }t|}|dkrLtjd|dkrXn@|dkrl|dO }n,|dkr|dO }n|dO }t	|d@ | }t}x$|rt	|d@ | }|dL }qW t	|| | }|ddfS tjd| d S )!N@   FA   T
   z!encoding REAL into character formz%dE%s%dr   +r/   rW   r   r.   r!   r   r`   ra      rb       zScale factor overflowr    zReal exponent overflowzProhibited Real base %srt   )rz   FFru   )r{   FFrc   rc   )r   rc   rc   )rI   Z	isPlusInfZ
isMinusInfr
   r6   r   rs   r   r%   r   r   r$   )r   r)   r*   r+   r,   re   ro   rg   forh   rf   ZsfeonZpor   r   r   r   r-     s    


$




"$







zRealEncoder.encodeValueN)	r=   r>   r?   r#   rl   staticmethodrj   rs   r-   r   r   r   r   r_   d  s
   !r_   c               @   s   e Zd ZdZdd ZdS )SequenceEncoderFc             K   s  t }|jd| j}tr*td|r"dp$d  |d krt|j}|rB||j}xt|j D ]\}	}
|r||	 }|jr|
j	 rtrXtd|f  qX|j
r|
|jkrtrXtd|f  qX|r|j|jd |o|jrZ|j}|jtjjtjjfkr|||
|ft||jd7 }nJ||
|f|}|j|
r2||7 }n&||||f|7 }trltd	|f  qX|||
|f|7 }qXW nhxdt|jjD ]R\}	}y||j }
W n* tk
r   tjd
|j|f Y nX |jr|j|krtrtd|f  q|j
r |
|jkr trtd|f  q|r4|j|jd |j}|jr|jtjjtjjfkrx|||
|ft||jd7 }nJ||
|f|}|j|
r||7 }n&||||f|7 }trtd	|f  n|||
|f|7 }qW |ddfS )NomitEmptyOptionalsz$%sencoding empty OPTIONAL componentsznot r/   z"not encoding OPTIONAL component %rz!not encoding DEFAULT component %r)r0   )wrapTypezwrapped with wrap type %rz#Component name "%s" not found in %rT)r
   r2   r   r6   isInconsistentcomponentTyper3   valuesZ
isOptionalZisValueZisDefaultedZ
asn1ObjectupdateZopenTypetypeIdr   SetOf
SequenceOfdictisSameTypeWith
namedTypesnameKeyErrorr   r%   )r   r)   r*   r+   r,   r   r   inconsistencyr   r:   	component	namedTyper   rR   ZcomponentSpecr   r   r   r-     s    



zSequenceEncoder.encodeValueN)r=   r>   r?   r   r-   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )SequenceOfEncoderc             K   s   |d kr|j }|r|n|j}g }|jdd }x`t|D ]T\}}	||	|f|}
|d k	r|j|	 r||
|f|}
trtd|f  |j|
 q8W |S )Nr   zwrapped with wrap type %r)r   r   popr3   r   r6   append)r   r)   r*   r+   r,   r   chunksr   r:   r   rR   r   r   r   _encodeComponents  s     z#SequenceOfEncoder._encodeComponentsc             K   s"   | j |||f|}tj|ddfS )NT)r   r
   join)r   r)   r*   r+   r,   r   r   r   r   r-     s    zSequenceOfEncoder.encodeValueN)r=   r>   r?   r   r-   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )ChoiceEncoderc                s~   |d kr j  }nX fdd|jjD }t|dkrRtjdt|rFdpHd f |d } | }|| }|||f|ddfS )	Nc                s   g | ]}|j  kr|j qS r   )r   ).0r   )r)   r   r   
<listcomp>  s    z-ChoiceEncoder.encodeValue.<locals>.<listcomp>r.   z%s components for Choice at %rz	Multiple zNone r   T)ZgetComponentr   r   r$   r   r%   )r   r)   r*   r+   r,   r   namesr   r   )r)   r   r-     s    
zChoiceEncoder.encodeValueN)r=   r>   r?   r-   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )
AnyEncoderc             K   s<   |d kr|j  }nt|s(|j|j  }||jdd dfS )Nr'   T)rJ   r   rI   r2   )r   r)   r*   r+   r,   r   r   r   r-     s
    
zAnyEncoder.encodeValueN)r=   r>   r?   r-   r   r   r   r   r     s   r   c               @   s4   e Zd ZdZdZeZeZeefddZdddZ	dS )SingleItemEncoderNc             K   s,   |t k	r|n| j| _|t k	r |n| j| _d S )N)r   TAG_MAP_tagMapTYPE_MAP_typeMap)r   tagMaptypeMapignoredr   r   r   __init__  s    zSingleItemEncoder.__init__c       	      K   s  y|d kr|j }n|j }W n$ tk
r>   tjd|f Y nX trtd|jdd rZdp\d|jdd|d krv|j p||j |f  | jd k	r|j| jd	 | j	d k	r|j| j	d
 y&| j
| }trtd|jj|f  W n tk
rj   |d kr|j}n|j}tj|j|j}y| j| }W n( tk
rJ   tjd||f Y nX trftd|jj|f  Y nX |j||| f|}trtd|t|tj|f  |S )Nz<Value %r is not ASN.1 type instance and "asn1Spec" not givenzBencoder called in %sdef mode, chunk size %s for type %s, value:
%sr'   Tinr/   rH   r   )r'   )rH   z)using value codec %s chosen by type ID %szNo encoder for %r (%s)z(using value codec %s chosen by tagSet %sz;codec %s built %s octets of substrate: %s
encoder completed)r   AttributeErrorr   r%   r6   r2   ZprettyPrintTypefixedDefLengthModer   fixedChunkSizer   	__class__r=   r   r1   r   rL   rK   r   r   r$   r   r7   )	r   r)   r*   r,   r   ZconcreteEncoderr1   Z
baseTagSetr   r   r   r   __call__  sP    




zSingleItemEncoder.__call__)N)
r=   r>   r?   r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZeZeefddZdddZdS )r   c             K   s   | j f ||d|| _d S )N)r   r   )SINGLE_ITEM_ENCODER_singleItemEncoder)r   r   r   r,   r   r   r   r   X  s    zEncoder.__init__Nc             K   s   | j |fd|i|S )Nr*   )r   )r   ZpyObjectr*   r,   r   r   r   r   ]  s    zEncoder.__call__)N)r=   r>   r?   r   r   r   r   r   r   r   r   r   r   U  s   )Or4   Zpyasn1r   r   Zpyasn1.codec.berr   Zpyasn1.compatr   Zpyasn1.compat.integerr   Zpyasn1.compat.octetsr   r   r	   r
   r   r   Zpyasn1.typer   r   r   r   __all__ZregisterLoggeer=   ZDEBUG_ENCODERr6   objectr   r@   rA   rB   rG   rP   rS   rT   r_   r   r   r   r   ZendOfOctetsr1   BooleanZIntegerZ	BitStringZOctetStringZNullZObjectIdentifierZ
EnumeratedRealr   r   ZChoiceZ
UTF8StringZNumericStringZPrintableStringZTeletexStringZVideotexStringZ	IA5StringZGraphicStringZVisibleStringZGeneralStringZUniversalStringZ	BMPStringZObjectDescriptorZGeneralizedTimeZUTCTimer   r   SetSequenceZAnyr   r   r   r   r   r   r   r   r   r   <module>   s     )=; (z%



















































G@