
    9c'                         d dl Z d dlZd dlZd dlZd dlZd dlmZmZm	Z	 	 d dl
Z
 G d de      Z G d de      Z G d d	e      Z G d
 de	      Zy# e$ r	 d dlm
Z
 Y :w xY w)    N)OptionKwargModule)lzmac                       e Zd Zd Zy)
LZMAHeaderc                     t         j                  j                  j                  |      D ]  \  }}t	        | ||        y N)binwalkcorecompatiteratorsetattr)selfkwargskvs       =/usr/lib/python3/dist-packages/binwalk/modules/compression.py__init__zLZMAHeader.__init__   s6    ll))226: 	 FQD!Q	     N)__name__
__module____qualname__r    r   r   r   r      s     r   r   c                   V    e Zd ZdZddgZdZdZd Zd Zd Z	d	 Z
d
 Zd Zd Zd Zd Zy)LZMAzRaw LZMA compression stream]   n      i   c                 \   || _         d | _        | j                          | j                          | j	                          | j                   j
                  j                  rN| j                   j
                  j                  d| j                  j                         z  d| j
                         y y )N^%s7zregex	extensioncmd)
module
propertiesbuild_propertiesbuild_dictionariesbuild_headers	extractorenabledadd_ruleDESCRIPTIONlowerr   r'   s     r   r   zLZMA.__init__   s    ! ;;  ((KK!!**9I9I9O9O9Q1Q]agkgugu*v )r   c                 (   t         j                  j                  j                  |      j	                         }| j                  |d | j                         rt        | j                        | j                  d   z   dz   }t         j                  j                  j                  |d      j                  ||z          | j                  j                  j                  d      D ]0  }| j                  j                  j                  |d   |      dk(  s0 y  y y )N   ÿÿÿÿÿÿÿÿwbzlzma compressed datar&   T)r   r   common	BlockFileread
decompress
BLOCK_SIZEchrr(   dictionarieswriter'   r,   matchexecute)r   	file_namecompressed_dataheaderexrules        r   r,   zLZMA.extractor*   s     ",,--77	BGGI ???+;DOO<= )!!"%&)35FLL)))T:@@/AYZ ++//556LM ;;((00	JdR >r   c                 T    |dz  |z   dz  |z   }|| j                   kD  ry t        |      S )N   	   )MAX_PROPint)r   pblplcprops        r   build_propertyzLZMA.build_property?   s2    q&B!#r)$--4yr   c                     t        t        |            }|| j                  kD  ry |dz  }||dz  dz  z  }|dz  }||dz  z
  }|||fS )N-   rF   rE   )rH   ordrG   r   rL   rI   rJ   rK   s        r   parse_propertyzLZMA.parse_propertyE   s[    3t9~$--U^Q
AXBF]B|r   c                     | j                  |d         \  }}}t        j                  dt        j                  j
                  j                  |dd             d   }t        ||||      S )Nr   <I   rE   )rI   rJ   rK   
dictionary)rR   structunpackr   r   r   	str2bytesr   )r   rB   rI   rJ   rK   rV   s         r   parse_headerzLZMA.parse_headerR   s_    **6!95R]]4)<)<)F)FvaPQ{)STUVW
RB2*EEr   c                    t               | _        | j                  j                  dk(  r6| j                  D ]&  }| j                  j                  t        |             ( y t        dd      D ]^  }t        dd      D ]M  }t        dd      D ]<  }| j                  |||      }|| j                  j                  t        |             > O ` y )NTr   rF   rE   )	setr(   r'   partial_scanCOMMON_PROPERTIESaddr;   rangerM   rQ   s        r   r)   zLZMA.build_propertiesW   s    %;;##t+.. /##CI./ Aqk ;1+ ;B#Aqk ;#222r2>+ OO//D	:;;;r   c           
         g | _         | j                  j                  dk(  rW| j                   j                  t        j
                  j                  j                  t        j                  dd                   y t        dd      D ][  }| j                   j                  t        j
                  j                  j                  t        j                  dd|z                     ] y )NTrT   i            )r<   r'   r]   appendr   r   r   	bytes2strrW   packr`   )r   ns     r   r*   zLZMA.build_dictionariesf   s    ;;##t+$$W\\%8%8%B%B6;;tU\C]%^_2r] c!!(()<)<)F)Fv{{SWYZ^_Y_G`)abcr   c                     t               | _        | j                  D ]4  }| j                  D ]#  }| j                  j	                  ||z   dz          % 6 y )Nr4   )r\   headersr(   r<   r_   )r   rL   rV   s      r   r+   zLZMA.build_headersp   sS    uOO 	CD"// C
  
!2j!ABC	Cr   c                    d }d }| j                   D ]V  }	 t        j                  j                  j	                  ||z         }t        j                  |       | j                  |      } n |}| j                  |j                  |j                  |j                        | _        d| j                   | j                  |j                  |j                  |j                  |j"                  fz  }|S # t        $ r0}t        |      dk(  r| j                  |      }Y d }~ Y d }~d }~wt        $ r0}t        |      dk(  r| j                  |      }Y d }~ Y d }~Ed }~ww xY w)Nzunknown BUF errorzACompressed data ended before the end-of-stream marker was reachedzD%s, properties: 0x%.2X [pb: %d, lp: %d, lc: %d], dictionary size: %d)rj   r   r   r   rY   r   r9   rZ   IOErrorstr	ExceptionrM   rI   rJ   rK   r(   r/   rV   )r   dataresultdescriptionrB   
final_dataes          r   r9   zLZMA.decompressw   sE   ll 	F$\\00::6D=I

+**62	( "11&))VYY		RDO`dhdtdtdhdsdsdjdmdmdjdmdmdjdmdmdjdududw wK +  q600!..v6F 1   q6``!..v6F as$   AC++	E4DE+EEN)r   r   r   r/   r^   rG   r:   r   r,   rM   rR   rZ   r)   r*   r+   r9   r   r   r   r   r      sL    /Kt#HJ
w*F
;cC!r   r   c                   .    e Zd ZdZdZdZdZd Zd Zd Z	y)	Deflatez=
    Finds and extracts raw deflate compression streams.
    Fi   zRaw deflate compression streamc                     || _         | j                   j                  j                  rN| j                   j                  j                  d| j                  j                         z  d| j                         y y )Nr!   deflater#   )r'   r,   r-   r.   r/   r0   r1   s     r   r   zDeflate.__init__   s^     ;;  ((KK!!**9I9I9O9O9Q1Q]flplzlz*{ )r   c                    d}d}d}t         j                  j                  |      d   }t        j                  j
                  j                  |d      5 }	 |j                         \  }}|r|dk(  rn||d | z  }	 t        j                  t        j                  j                  j                  |      d      }t        j                  j
                  j                  |d      5 }	|	j                  |       d d d        d}	 d d d        |S # 1 sw Y   xY w# t        j                  $ r
}
Y d }
~
nd }
~
ww xY w# 1 sw Y   |S xY w)N Fr   rTw)ospathsplitextr   r   r6   r7   
read_blockzlibr9   r   rY   r=   error)r   r@   in_dataout_dataretvalout_filefp_inro   dlenfp_outrs   s              r   r,   zDeflate.extractor   s"   77##I.q1\\  **9c: 	e$//1ttqytET{*G#w||/B/B/L/LW/UWZ[H ,,66xE /X./!F	" / / zz  	" sI   %D49A'D D2
D<D4D	DD0&D4+D00D44D>c                 *   	 t        j                  t        j                  j                  j                  |      d       | j                  S # t         j                  $ r4}t        |      j                  d      sY d }~y Y d }~| j                  S d }~ww xY w)Nr{   zError -5)
r   r9   r   r   r   rY   r   rm   
startswithr/   )r   ro   rs   s      r   r9   zDeflate.decompress   sx    	 OOGLL//99$?E  zz 	q6$$Z0 1 	s   =A BBBN)
r   r   r   __doc__ENABLEDr:   r/   r   r,   r9   r   r   r   ru   ru      s(     GJ2K|2 r   ru   c            	           e Zd ZdZ edddddd       edd	ddd
d       eddddid       eddddid      gZ edd       edd       edd       edd       edd      gZd Zd Z	y)RawCompressionzRaw CompressionXrw   T)r-   scan_for_deflatez(Scan for raw deflate compression streams)shortlongr   rq   Zr   )r-   scan_for_lzmaz%Scan for raw LZMA compression streamsPpartialr]   z'Perform a superficial, but faster, scanSstopstop_on_first_hitzStop after the first resultr-   F)namedefaultr   r   c                     g | _         | j                  r$| j                   j                  t        |              | j                  r%| j                   j                  t        |              y y r
   )decompressorsr   re   ru   r   r   )r   s    r   initzRawCompression.init   sQ      %%gdm4%%d4j1 r   c           	      X   t        | j                  d       D ]  }d}| j                          |s|j                         \  }}|dk  rnt	        d|      D ]  }| j
                  D ]^  }|j                  ||||j                  z          }|s'| j                  |||j                         |z
  |z          | j                  s\d} n |r n!| j                  xj                  dz  c_         |j                         |j                  z
  | j                  _        |s| j                           y )NFrU   r   )rq   fileoffsetT)iter	next_filerB   r   r`   r   r9   r:   rp   tellr   status	completedr   footer)r   fp	file_donero   r   idecompressorrq   s           r   runzRawCompression.run   s   t~~t, 	BIKKM!}}t!8q$ /A(,(:(: &&2&=&=d1QI`I`E`>a&b& KKKbQSQXQXQZ]aQadeQeKf#55,0	 %& !KK))Q.)/ )+	BII(=%'  * KKM7	r   N)
r   r   r   TITLEr   CLIr   KWARGSr   r   r   r   r   r   r      s    E 	S"&DAE	G 	S"&>B	D 	S%t,D	F 	S*D18	:C( 	9e,>51&6%u5?E2F2r   r   )r}   r   rW   binwalk.core.compatr   binwalk.core.commonbinwalk.core.moduler   r   r   r   ImportError	backportsobjectr   r   ru   r   r   r   r   <module>r      so    
     5 5
   A6 AH6 f 6 rCV CQ  s   A AA