
    h^;              
       $   d Z ddlZddlZddlmZmZmZmZ ddlm	Z	m
Z
mZmZ ddlmZmZ ddlmZmZ ddlmZ ddlmZ d	d
dddddZ G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Zddd d!d"d#d$d%d&d'	Z G d( d)e          Z  G d* d+e          Z! eeed,-            eeed./            eeed0/            eeed1/            eeed2/            eee d3/            eee!d4/            eee            eee            ee!e            G d5 d6e          Z" G d7 d8e          Z# G d9 d:e          Z$ G d; d<e          Z%dS )=z(
TFTP (Trivial File Transfer Protocol).
    N)Packetbind_layerssplit_bottom_upbind_bottom_up)PacketListFieldShortEnumField
ShortFieldStrNullField)ATMT	Automaton)UDPIP)conf)	RandShortRRQWRQDATAACKERROROACK)                  c                   .    e Zd ZdZ edde          gZdS )TFTPzTFTP opcodeopr   N)__name__
__module____qualname__namer   TFTP_operationsfields_desc     U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/tftp.pyr   r      s)        D!>$?;;>KKKr'   r   c                   N    e Zd ZdZ edd           edd          gZd Zd ZdS )	TFTP_RRQzTFTP Read Requestfilename modeoctetc                     dS Nr   r&   selfothers     r(   answerszTFTP_RRQ.answers#       qr'   c                 <    |                      d          t          gfS )NzRRQ %filename%sprintfr   r2   s    r(   	mysummaryzTFTP_RRQ.mysummary&       ||,--u44r'   Nr    r!   r"   r#   r
   r%   r4   r:   r&   r'   r(   r*   r*      s\        D<
B//<002K  5 5 5 5 5r'   r*   c                   N    e Zd ZdZ edd           edd          gZd Zd ZdS )	TFTP_WRQzTFTP Write Requestr+   r,   r-   r.   c                     dS r0   r&   r1   s     r(   r4   zTFTP_WRQ.answers/   r5   r'   c                 <    |                      d          t          gfS )NzWRQ %filename%r7   r9   s    r(   r:   zTFTP_WRQ.mysummary2   r;   r'   Nr<   r&   r'   r(   r>   r>   *   s\        D<
B//<002K  5 5 5 5 5r'   r>   c                   8    e Zd ZdZ edd          gZd Zd ZdS )	TFTP_DATAz	TFTP Datablockr   c                 B    | j         dk    ot          |t                    S Nr   )rC   
isinstancer*   r1   s     r(   r4   zTFTP_DATA.answers:   s    zQ>:eX#>#>>r'   c                 <    |                      d          t          gfS )NzDATA %block%r7   r9   s    r(   r:   zTFTP_DATA.mysummary=   s    ||N++cU22r'   Nr    r!   r"   r#   r	   r%   r4   r:   r&   r'   r(   rB   rB   6   sK        D:gq))*K? ? ?3 3 3 3 3r'   rB   c                   D    e Zd Z edd           edd          gZd ZdS )TFTP_Optiononamer,   valuec                 
    d|fS )Nr,   r&   r2   pkts     r(   extract_paddingzTFTP_Option.extract_paddingE   s    3wr'   N)r    r!   r"   r
   r%   rP   r&   r'   r(   rJ   rJ   A   sH        <,,<,,.K    r'   rJ   c                   0    e Zd Z edg ed           gZdS )TFTP_Optionsoptionsc                     d S Nr&   )xs    r(   <lambda>zTFTP_Options.<lambda>J   s    TX r'   )length_fromN)r    r!   r"   r   rJ   r%   r&   r'   r(   rR   rR   I   s+        "?9b+==YYYZKKKr'   rR   c                   8    e Zd ZdZ edd          gZd Zd ZdS )TFTP_ACKzTFTP AckrC   r   c                     t          |t                    r| j        |j        k    S t          |t          t          t
          f          r| j        dk    S dS r0   )rF   rB   rC   r*   r>   	TFTP_OACKr1   s     r(   r4   zTFTP_ACK.answersQ   sM    eY'' 	#:,,(I>?? 	#:?"qr'   c                 <    |                      d          t          gfS )NzACK %block%r7   r9   s    r(   r:   zTFTP_ACK.mysummaryX   s    ||M**SE11r'   NrH   r&   r'   r(   rZ   rZ   M   sK        D:gq))*K  2 2 2 2 2r'   rZ   zNot definedzFile not foundzAccess violationz Disk full or allocation exceededzIllegal TFTP operationzUnknown transfer IDzFile already existszNo such userz,Terminate transfer due to option negotiation)	r   r   r   r   r   r   r         c                   P    e Zd ZdZ edde           edd          gZd Zd Z	dS )	
TFTP_ERRORz
TFTP Error	errorcoder   errormsgr,   c                 R    t          |t          t          t          t          f          S rU   )rF   rB   r*   r>   rZ   r1   s     r(   r4   zTFTP_ERROR.answersm   s    %)Xx!JKKKr'   c                 <    |                      d          t          gfS )NzERROR %errorcode%: %errormsg%r7   r9   s    r(   r:   zTFTP_ERROR.mysummaryp   s    ||;<<seCCr'   N)
r    r!   r"   r#   r   TFTP_Error_Codesr
   r%   r4   r:   r&   r'   r(   ra   ra   h   sg        D!>+q2BCC<
B//1KL L LD D D D Dr'   ra   c                       e Zd ZdZg Zd ZdS )r\   zTFTP Option Ackc                 :    t          |t          t          f          S rU   )rF   r>   r*   r1   s     r(   r4   zTFTP_OACK.answersx   s    %(H!5666r'   N)r    r!   r"   r#   r%   r4   r&   r'   r(   r\   r\   t   s-        DK7 7 7 7 7r'   r\   E   dportr   )r   r   r   r   r   r   c                      e Zd ZdZddZd Z ej        d          d             Z ej                    d	             Z	 ej
        e	          d
             Z ej
        e	d          d             Z ej        e	d          d             Z ej        e          d             Z ej        e          d             Z ej                    d             Z ej        d          d             Z ej        d          d             ZdS )	TFTP_readz@
    TFTP automaton to read a remote file on a TFTP server.
    Nri   c                 b    t          j        | fi | || _        || _        || _        || _        d S rU   )r   
parse_argsr+   serverportsport)r2   r+   rp   rr   rq   kargss         r(   ro   zTFTP_read.parse_args   s;    T++U+++ 	


r'   c                     t           |v ob|t                    j        | j        k    oGt          |v o>|t                   j        | j        k    o#| j        d u p|t                   j        | j        k    S rU   r   srcrp   r   rk   my_tid
server_tidrr   rN   s     r(   master_filterzTFTP_read.master_filter   h    c	 Oc"gkT[8 OSCZ OC$+-OD(MCHNdo,M	Pr'   r   initialc                     d| _         | j        pt                                                      | _        t          t          t          | j                   d | _        d| _	        t          | j                  t          | j        | j                  z  t                      z  | _        | j        t          | j        d          z  | _        |                     | j                   d| _        |                                 )	N   rj   r'   dstrr   rk   r.   r+   r-   r   )	blocksizerr   r   _fixrw   r   r   r   rx   resr   rp   rq   l3r*   r+   last_packetsendawaitingWAITINGr9   s    r(   BEGINzTFTP_read.BEGIN   s    j6IKK$4$4$6$6sD4444%%%$+TY(O(O(OORVRXRXX7Xt}7%S%S%SS		$"###llnnr'   c                     d S rU   r&   r9   s    r(   r   zTFTP_read.WAITING       r'   c                     t           |v rj|t                    j        | j        k    rQ| j        3|t                   j        | _        | j        | j        t                   _        |                     |          d S d S rU   )	rB   rC   r   rx   r   rr   r   rk   	RECEIVINGrN   s     r(   receive_datazTFTP_read.receive_data   se    I 4 E E&"%c(.%)_"..%%%	  E Er'   prioc                 B    t           |v r|                     |          d S rU   ra   r   rN   s     r(   receive_errorzTFTP_read.receive_error   %    **S//! r'   r   c                 *    |                                  rU   )r   r9   s    r(   timeout_waitingzTFTP_read.timeout_waiting   s    llnnr'   c                 :    |                      | j                   d S rU   r   r   r9   s    r(   retransmit_last_packetz TFTP_read.retransmit_last_packet       		$"#####r'   c                 ~    | j         t          | j                  z  | _        |                     | j                   d S NrC   )r   rZ   r   r   r   r9   s    r(   send_ackzTFTP_read.send_ack   s;      7XDM%B%B%BB		$"#####r'   c                    t           j        |v r|t           j                 j        }nd}| xj        |z  c_        | xj        dz  c_        t          |          | j        k    r|                                 |                                 )Nr'   r   )	r   	raw_layerloadr   r   lenr   r   END)r2   rO   recvds      r(   r   zTFTP_read.RECEIVING   st    >S  ',EEEEu::'',,.. hhjjr'   errorc                     t          t          t          | j                   |t                                                   S Nrj   r   r   r   rw   ra   summaryrN   s     r(   r   zTFTP_read.ERROR   /    T5555:&&(((r'   finalc                 R    t          t          t          | j                   | j        S r   )r   r   r   rw   r   r9   s    r(   r   zTFTP_read.END   s     T5555xr'   Nri   )r    r!   r"   __doc__ro   ry   r   stater   r   receive_conditionr   r   timeoutr   actionr   r   r   r   r   r&   r'   r(   rm   rm      s           P P P TZ   TZ\\  \ TG$$& & %$& TG!,,," " -," T\'1   T[!!$ $ "!$ T[$ $ $
 TZ\\	 	 \	 TZa) ) )
 TZa    r'   rm   c                      e Zd ZdZddZd Z ej        d          d             Z ej                    d	             Z	 ej
        e	          d
             Z ej
        e	          d             Z ej        e	d          d             Z ej        e          d             Z ej                    d             Z ej        d          d             Z ej        d          d             ZdS )
TFTP_writezB
    TFTP automaton to write a local file onto a TFTP server.
    Nri   c                 ~    t          j        | fi | || _        || _        || _        || _        d| _        || _        d S )Nr~   )r   ro   r+   rp   rq   rr   r   origdata)r2   r+   datarp   rr   rq   rs   s          r(   ro   zTFTP_write.parse_args   sI    T++U+++ 	
r'   c                     t           |v ob|t                    j        | j        k    oGt          |v o>|t                   j        | j        k    o#| j        d u p|t                   j        | j        k    S rU   ru   rN   s     r(   ry   zTFTP_write.master_filter   rz   r'   r   r{   c                 n     fdt          t           j                   j        z  dz             D              _         j        pt                                                       _        t          t          t           j                   d  _        t           j                  t           j         j                  z  t                      z   _         j        t#           j        d          z   _                              j                   d _        d	 _                                         )
Nc                 T    g | ]$}j         |j        z  |d z   j        z           %S )r   )r   r   ).0ir2   s     r(   
<listcomp>z$TFTP_write.BEGIN.<locals>.<listcomp>   sM     O O O ]1t~#5q1u6N#NO O O Or'   r   rj   r   r   r.   r   r,   r   )ranger   r   r   r   rr   r   r   rw   r   r   r   rx   r   rp   rq   r   r>   r+   r   r   r   r   WAITING_ACKr9   s   `r(   r   zTFTP_write.BEGIN   s   O O O O#C$6$6$.$H1$LMMO O O	j6IKK$4$4$6$6sD4444%%%$+TY(O(O(OORVRXRXX7Xt}7%S%S%SS		$"###   r'   c                     d S rU   r&   r9   s    r(   r   zTFTP_write.WAITING_ACK
  r   r'   c                     t           |v ri|t                    j        | j        k    rP| j        3|t                   j        | _        | j        | j        t                   _        |                                 d S d S rU   )	rZ   rC   r   rx   r   rr   r   rk   	SEND_DATArN   s     r(   received_ackzTFTP_write.received_ack  s`    s??s8}2dmCC&"%c(.%)_".."""	 ?CCr'   c                 B    t           |v r|                     |          d S rU   r   rN   s     r(   received_errorzTFTP_write.received_error  r   r'   r   c                 *    |                                  rU   )r   r9   s    r(   r   zTFTP_write.timeout_waiting  s       r'   c                 :    |                      | j                   d S rU   r   r9   s    r(   r   z!TFTP_write.retransmit_last_packet  r   r'   c                 .   | xj         dz  c_         | j        t          | j                   z  | j                            d          z  | _        |                     | j                   | j        r|                                 |                                 )Nr   r   r   )	r   r   rB   r   popr   r   r   r   r9   s    r(   r   zTFTP_write.SEND_DATA$  s    7YT]%C%C%CCdimmTUFVFVV		$"###9 	%""$$$hhjjr'   r   c                     t          t          t          | j                   |t                                                   S r   r   rN   s     r(   r   zTFTP_write.ERROR.  r   r'   r   c                 H    t          t          t          | j                   d S r   r   r   r   rw   r9   s    r(   r   zTFTP_write.END4      T555555r'   r   )r    r!   r"   r   ro   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r'   r(   r   r      s           P P P TZ! ! !  TZ\\  \ TK((# # )(# TK((" " )(" T\+q!!! ! "!! T[!!$ $ "!$ TZ\\  \ TZa) ) )
 TZa6 6 6 6 6r'   r   c                      e Zd ZdZddZd Z ej        d          d             Z ej	        e          d             Z
 ej        e
          d	             Z ej                    d
             Z ej        ed          d             Z ej	        e          d             Z ej        e          d             Z ej                    d             Z ej        d          d             ZdS )TFTP_WRQ_serverz3
    TFTP automaton to wait for incoming files
    Nc                 L    t          j        | g|R i | || _        || _        d S rU   )r   ro   iprr   )r2   r   rr   argsrs   s        r(   ro   zTFTP_WRQ_server.parse_args>  s5    T2D222E222


r'   c                 Z    t           |v o"| j         p|t                   j        | j        k    S rU   r   r   r   r   rN   s     r(   ry   zTFTP_WRQ_server.master_filterC  '    s{FDG Es2w{dg/EFr'   r   r{   c                     d| _         d| _        d| _        | j        pt	          j        dd          | _        t          t          t          | j                   d S )Nr~   r   r'   '    rj   )
blksizeblkfiledatarr   randomrandintrw   r   r   r   r9   s    r(   r   zTFTP_WRQ_server.BEGINF  sN    j@FN5%$@$@sD444444r'   c                 f    t           |v r'|                                                     |          d S rU   )r>   	WAIT_DATAaction_parametersrN   s     r(   receive_WRQzTFTP_WRQ_server.receive_WRQN  s0    s??..""44S999 ?r'   c                    |t                    }|j        | _        |j        | _        |t                   j        | _        |                    t                    }t          |j        |j                  t          | j	        |j
                  z  t                      z  | _        |9| j        t          d          z  | _        |                     | j                   d S d |j        D             }|r=t#          |d         j                  | _        |                     dd| j        z             | j        t+                      z  t          |          z  | _        |                     | j                   d S )	Nrv   r   r   r   r   c                 L    g | ]!}|j                                         d k    |"S s   BLKSIZErK   upperr   rV   s     r(   r   z+TFTP_WRQ_server.ack_WRQ.<locals>.<listcomp>_  ,    OOOJ1N1N11N1N1Nr'   r   Negotiated new blksize at %irS   )r   r   r   rv   r>   r+   getlayerrR   r   rw   rr   r   r   rZ   r   r   rS   intrL   r   debugr\   )r2   rO   r   rS   opts        r(   ack_WRQzTFTP_WRQ_server.ack_WRQS  s=   W&6H.,,|,,RV,,,sCI/V/V/VVY]Y_Y__?#w):):)::DIId&'''''OOgoOOOC M"3q6<00

1<t|KLLL#w4|C7P7P7PPDIId&'''''r'   c                     d S rU   r&   r9   s    r(   r   zTFTP_WRQ_server.WAIT_DATAf  r   r'   c                 ^    |                      | j                   |                                 rU   )r   r   r   r9   s    r(   
resend_ackzTFTP_WRQ_server.resend_ackj  s'    		$"###nnr'   c                     t           |v r2|t                    }|j        | j        k    r|                     |          d S d S rU   )rB   rC   r   r   )r2   rO   r   s      r(   r   zTFTP_WRQ_server.receive_datao  sC    y>DzTX%%iioo% %%r'   c                 ~    | j         t          | j                  z  | _        |                     | j                   d S r   )r   rZ   r   r   r   r9   s    r(   ack_datazTFTP_WRQ_server.ack_datav  s9    7XDH%=%=%==		$"#####r'   c                     | xj         |j        z  c_         t          |j                  | j        k     r|                                 | xj        dz  c_        |                                 rE   )r   r   r   r   r   r   r   )r2   r   s     r(   r   zTFTP_WRQ_server.DATA{  sV    "ty>>DL((((**Annr'   r   c                 `    t          t          t          | j                   | j        | j        fS r   )r   r   r   rw   r+   r   r9   s    r(   r   zTFTP_WRQ_server.END  s(    T5555}dm++r'   )NN)r    r!   r"   r   ro   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r&   r'   r(   r   r   9  s           
G G G TZ5 5 5 TE"": : #": T[( ( ($ TZ\\  \ T\)Q    TI&&& & '&& T[$ $ $ TZ\\  \ TZa, , , , ,r'   r   c                      e Zd ZdZddZd Z ej        d          d             Z ej	        e          d	             Z
 ej                    d
             Z ej        e          d             Z ej        e          d             Z ej        e          d             Z ej                    d             Z ej        ed          d             Z ej	        e          d             Z ej                    d             Z ej        e          d             Z ej        ed          d             Z ej        d          d             ZdS )TFTP_RRQ_serverz-
    TFTP automaton to serve local files
    NFc                    t          j        | fi | |i }|Ct          j                            t          j                            |          d          | _        nd | _        || _        || _        || _	        || _
        || _        | j
        pt          j        dd          | _        t          t           t"          | j                   d S )Nr,   r   r   rj   )r   ro   ospathjoinabspathdirstorejokerr   rr   	serve_oner   r   rw   r   r   r   )r2   r  r  r  r   rr   r  rs   s           r(   ro   zTFTP_RRQ_server.parse_args  s    T++U+++=E?w||BGOOC$8$8"==DHHDH


"j@FN5%$@$@sD444444r'   c                 Z    t           |v o"| j         p|t                   j        | j        k    S rU   r   rN   s     r(   ry   zTFTP_RRQ_server.master_filter  r   r'   r   r{   c                 "    d| _         d| _        d S )Nr~   r   )r   r   r9   s    r(   WAIT_RRQzTFTP_RRQ_server.WAIT_RRQ  s    r'   c                 B    t           |v r|                     |          d S rU   )r*   RECEIVED_RRQrN   s     r(   receive_rrqzTFTP_RRQ_server.receive_rrq  s&    s??##C((( ?r'   c                 v   |t                    }|                    t                    }t          |j        |j                  t          | j        |j                  z  t                      z  | _	        |t                   j                            dd          | _        d| _        d | _        | j        | j        v r| j        | j                 | _        n| j        t"          j                            t"          j                            | j        | j                            }|                    | j                  rR	 t-          |          5 }|                                | _        d d d            n# 1 swxY w Y   n# t0          $ r Y nw xY w| j        | j        | _        |rd |j        D             }|r=t7          |d         j                  | _        |                     dd	| j        z             | j	        t?                      z  t          |
          z  | _         | !                    | j                    d S d S )Nr   r   zutf-8ignorer   c                 L    g | ]!}|j                                         d k    |"S r   r   r   s     r(   r   z0TFTP_RRQ_server.RECEIVED_RRQ.<locals>.<listcomp>  r   r'   r   r   r   r   )"r   r   rR   r   rv   r   rw   rr   r   r   r*   r+   decoder   r   r  r  r   r  r  r  
startswithopenreadIOErrorr  rS   r   rL   r   r   r\   r   r   )r2   rO   r   rS   fnfdr   s          r(   r  zTFTP_RRQ_server.RECEIVED_RRQ  s+   W,,|,,RV,,,sBH/U/U/UUX\X^X^^H.55gxHH	=DJ&&
4=1DIIX!dh!F!FGGB}}TX&& b .R$&GGII	. . . . . . . . . . . . . . .   D9
DI 	(OOgoOOOC M"3q6<00

1<t|KLLL#w4|C7P7P7PPDIId&'''''	( 	(s6   ;E< 
E0$E< 0E44E< 7E48E< <
F	F	c                     | j         8t          | j                   | j        z  dz   | _        |                                 d S rE   )r   r   r   blknb	SEND_FILEr9   s    r(   file_in_storezTFTP_RRQ_server.file_in_store  s=    9 TY$,6:DJ..""" ! r'   c                 <    | j         |                                 d S rU   )r   r
  r9   s    r(   file_not_foundzTFTP_RRQ_server.file_not_found  s     9--//! r'   c                 t    |                      | j        t          dt          d                   z             d S )Nr   )rb   rc   )r   r   ra   rf   r9   s    r(   
send_errorzTFTP_RRQ_server.send_error  s4    		$'J=Ma=PQQQQRRRRRr'   c                     |                      | j        t          | j                  z  | j        | j        dz
  | j        z  | j        | j        z           z             d S )Nr   r   )r   r   rB   r   r   r   r9   s    r(   r  zTFTP_RRQ_server.SEND_FILE  s[    		$'IDH5555	48a<SWS_B_`d`hkokw`wBw8xxyyyyyr'   r   c                 *    |                                  rU   r  r9   s    r(   timeout_waiting_ackz#TFTP_RRQ_server.timeout_waiting_ack      nnr'   c                 z    t           |v r/|t                    j        | j        k    r|                                 d S d S rU   )rZ   rC   r   RECEIVED_ACKrN   s     r(   r   zTFTP_RRQ_server.received_ack  s=    s??s8}2dh>>##%%% ?>>r'   c                 &    | xj         dz  c_         d S rE   )r   r9   s    r(   r&  zTFTP_RRQ_server.RECEIVED_ACK  s    Ar'   c                     | j         | j        k    r/| j        r|                                 |                                 d S rU   )r   r  r  r   r
  r9   s    r(   no_more_datazTFTP_RRQ_server.no_more_data  s?    8dj  ~ !hhjj --//! ! r'   r   r   c                 *    |                                  rU   r"  r9   s    r(   data_remainingzTFTP_RRQ_server.data_remaining  r$  r'   r   c                 H    t          t          t          | j                   d S r   r   r9   s    r(   r   zTFTP_RRQ_server.END  r   r'   )NNNNNF)r    r!   r"   r   ro   ry   r   r   r
  r   r  r  	conditionr  r  r   r  r  r   r#  r   r&  r)  r+  r   r&   r'   r(   r   r     sR        5 5 5 5 G G G TZ   TH%%) ) &%) TZ\\( ( \(8 T^L!!# # "!#
 T^L!!" " "!" T[  S S ! S TZ\\z z \z T\)Q    TI&&& & '&& TZ\\  \ T^L!!" " "!" T^Lq)))  *) TZa6 6 6 6 6r'   r   )&r   r   r   scapy.packetr   r   r   r   scapy.fieldsr   r   r	   r
   scapy.automatonr   r   scapy.layers.inetr   r   scapy.configr   scapy.volatiler   r$   r   r*   r>   rB   rJ   rR   rZ   rf   ra   r\   rm   r   r   r   r&   r'   r(   <module>r4     sR    
			  M M M M M M M M M M M M            + + + + + + + + % % % % % % % %       $ $ $ $ $ $ &Uw6RR? ? ? ? ?6 ? ? ?
	5 	5 	5 	5 	5v 	5 	5 	5	5 	5 	5 	5 	5v 	5 	5 	53 3 3 3 3 3 3 3    &   [ [ [ [ [6 [ [ [2 2 2 2 2v 2 2 2 %')9/,,%E	 	 	D 	D 	D 	D 	D 	D 	D 	D7 7 7 7 7 7 7 7 CR         D(q ! ! ! ! D(q ! ! ! ! D) " " " " D(q ! ! ! ! D* # # # # D) " " " " Hl # # # Hl # # # I| $ $ $
X X X X X	 X X XvQ6 Q6 Q6 Q6 Q6 Q6 Q6 Q6hM, M, M, M, M,i M, M, M,`l6 l6 l6 l6 l6i l6 l6 l6 l6 l6r'   