
    hx)                     X   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
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 d
Zd
ZdZdZdZdZdZd
ZdZdddZddddddddddddZddd 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 d0 d1e          Z% G d2 d3e          Z& G d4 d5e          Z' G d6 d7e          Z( G d8 d9e          Z) G d: d;e          Z* G d< d=e          Z+e!e"e#e$e%e&e'e)e+d>	Z,e!e"e#e$e%e&e(e)e*e+d?
Z- G d@ dAe          Z. eee.dBC            eee.dBD            eee.dEC            eee.dED            eee.dFC            eee.dFD           e/dGk    rddHl0m1Z1  e1 e2            dIJ           dS dS )Kz
RTR

Based on RTR RFC 6810 https://tools.ietf.org/html/rfc6810 for version 0
Based on RTR RFC 8210 https://tools.ietf.org/html/rfc8210 for version 1
    N)Packetbind_layersRaw)ByteEnumField	ByteFieldIntField
ShortField)IPFieldIP6FieldStrLenField)FieldLenField)StrFixedLenFieldShortEnumField)TCP)orb                01)r      Serial NotifySerial QueryReset QueryCache ResponseIPv4 PrefixIPv6 PrefixzEnd of DatazCache Reset
Router KeyError ReportReserved)r   r                  r   	   
      zCorrupt DatazInternal ErrorzNo data AvailablezInvalid RequestzUnsupported Protocol VersionzUnsupported PDU TypezWithdrawal of Unknown RecordzDuplicate Announcement ReceivedzUnexpected Protocol Version)	r   r   r#   r$   r%      r&   r'   r   c                       e Zd ZdZdZ edde           edde           edd           e	de
           e	dd          gZd	S )
RTRSerialNotifyze

    Serial Notify packet from section 5.2
    https://tools.ietf.org/html/rfc6810#section-5.2

    r   rtr_versionr   pdu_type
session_idlengthserial_numberN)__name__
__module____qualname____doc__namer   RTR_VERSIONPDU_TYPEr	   r   STATIC_SERIAL_NOTIFY_LENGTHfields_desc     U/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/rtr.pyr-   r-   @   sv          D =;?? =Q99:lA..8H&ABB8OQ//	1KKKr=   r-   c                       e Zd ZdZdZ edde           edde           edd           e	de
           e	d	d          gZd
S )RTRSerialQueryzd

    Serial Query packet from section 5.3
    https://tools.ietf.org/html/rfc6810#section-5.3

    r   r.   r   r/   r   r0   r1   r2   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_SERIAL_QUERY_LENGTHr;   r<   r=   r>   r@   r@   Q   sv          D =;?? =Q99:lA..8H&@AA8OQ//	1KKKr=   r@   c                   v    e Zd ZdZdZ edde           edde           edd           e	de
          gZd	S )
RTRResetQueryzc

    Reset Query packet from section 5.4
    https://tools.ietf.org/html/rfc6810#section-5.4

    r   r.   r   r/   r#   reservedr1   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_RESET_QUERY_LENGTHr;   r<   r=   r>   rC   rC   a   h          D =;?? =Q99:j!,,8H&?@@BKKKr=   rC   c                   |    e Zd ZdZdZ edde           edde           edd           e	de
          gZd	 Zd
S )RTRCacheResponsezf

    Cache Response packet from section 5.5
    https://tools.ietf.org/html/rfc6810#section-5.5

    r   r.   r   r/   r$   r0   r1   c                     t           S NRTRselfpayloads     r>   guess_payload_classz$RTRCacheResponse.guess_payload_class~       
r=   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_CACHE_RESPONSE_LENGTHr;   rP   r<   r=   r>   rH   rH   p   s}          D =;?? =Q99:lA..8H&BCCEK
    r=   rH   c                       e Zd ZdZdZ edde           edde           edd           e	de
           ed	d           ed
d           edd           edd           edd           e	dd          g
Zd ZdS )RTRIPv4Prefixzc

    IPv4 Prefix packet from section 5.6
    https://tools.ietf.org/html/rfc6810#section-5.6

    r   r.   r   r/   r%   rD   r1   flagsshortest_lengthlongest_lengthzerosprefixz0.0.0.0asnc                     t           S rJ   rK   rM   s     r>   rP   z!RTRIPv4Prefix.guess_payload_class   rQ   r=   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_IPV4_PREFIX_LENGTHr   r
   r;   rP   r<   r=   r>   rT   rT      s          D =;?? =Q99:j!,,8H&?@@9Wa((9.229-q119Wa((78Y//8E1%%	'K    r=   rT   c                       e Zd ZdZdZ edde           edde           edd           e	de
           ed	d           ed
d           edd           edd           edd           e	dd          g
Zd ZdS )RTRIPv6Prefixzc

    IPv6 Prefix packet from section 5.7
    https://tools.ietf.org/html/rfc6810#section-5.7

    r   r.   r   r/   r&   rD   r1   rU   rV   rW   rX   rY   z::rZ   c                     t           S rJ   rK   rM   s     r>   rP   z!RTRIPv6Prefix.guess_payload_class   rQ   r=   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_IPV6_PREFIX_LENGTHr   r   r;   rP   r<   r=   r>   r^   r^      s          D =;?? =Q99:j!,,8H&?@@9Wa((9.229-q119Wa((8Hd++8E1%%	'K    r=   r^   c                       e Zd ZdZdZ edde           edde           edd           e	de
           e	d	d          gZd
S )RTREndofDatav0zv

    End of Data packet from version 0 standard section 5.8
    https://tools.ietf.org/html/rfc6810#section-5.8

    zEnd of Data - version 0r.   r   r/   r'   r0   r1   r2   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_END_OF_DATA_V0_LENGTHr;   r<   r=   r>   rb   rb      sv          %D =;?? =Q99:lA..8H&BCC8OQ//	1KKKr=   rb   c                       e Zd ZdZdZ edde           edde           edd           e	d	e
           e	d
d           e	dd           e	dd           e	dd          gZdS )RTREndofDatav1zv

    End of Data packet from version 1 standard section 5.8
    https://tools.ietf.org/html/rfc8210#section-5.8

    zEnd of Data - version 1r.   r   r/   r'   r0   r   r1   r2   refresh_intervalretry_intervalexpire_intervalN)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_END_OF_DATA_V1_LENGTHr;   r<   r=   r>   re   re      s          %D =;?? =Q99:lA..8H&BCC8OQ//8.228,a008-q113KKKr=   re   c                   v    e Zd ZdZdZ edde           edde           edd           e	de
          gZd	S )
RTRCacheResetzc

    Cache Reset packet from section 5.9
    https://tools.ietf.org/html/rfc6810#section-5.9

    r   r.   r   r/   r   rD   r1   N)r3   r4   r5   r6   r7   r   r8   r9   r	   r   STATIC_CACHE_RESET_LENGTHr;   r<   r=   r>   rk   rk      rF   r=   rk   c                       e Zd ZdZdZ edde           edde           edd           ed	d           e	d
d           e
ddd           e	dd           eddd           gZd ZdS )RTRRouterKeyzw

    Router Key packet from version 1 standard section 5.10
    https://tools.ietf.org/html/rfc8210#section-5.10

    r    r.   r   r/   r(   rU   r   rX   r1   Nsubject_key_identifier r   rZ   subject_PKIc                     | j         dz
  S )Nr   )r1   xs    r>   <lambda>zRTRRouterKey.<lambda>   s    QX] r=   length_fromc                     t          |          dz   }| j        s+|d d         t          j        d|          z   |dd          z   }||z   S Nr#   !Ir&   lenr1   structpackrN   pktpaytemp_lens       r>   
post_buildzRTRRouterKey.post_build   Q    s88a<{ 	Bbqb'FKh777#abb'ACSyr=   )r3   r4   r5   r6   r7   r   r8   r9   r   r   r   r   r;   r   r<   r=   r>   rn   rn      s          D =;?? =Q999Wa((9Wa((8Hd++##$<b"EE8E1%%;}b+B+BD D DEK    r=   rn   c                       e Zd ZdZdZ edde           edde           edde	           e
dd	           ed
d	dd           eddd            edd	dd           eddd           gZd Zd	S )RTRErrorReportzf

    Error Report packet from section 5.10
    https://tools.ietf.org/html/rfc6810#section-5.10

    r!   r.   r   r/   r)   
error_coder1   Nlength_of_encaps_PDUrz   erroneous_PDU)fmt	length_ofrp   c                     | j         S rJ   )r   rs   s    r>   ru   zRTRErrorReport.<lambda>  	    Q5K r=   rv   length_of_error_text
error_textc                     | j         S rJ   )r   rs   s    r>   ru   zRTRErrorReport.<lambda>  r   r=   c                     t          |          dz   }| j        s+|d d         t          j        d|          z   |dd          z   }||z   S ry   r{   r   s       r>   r   zRTRErrorReport.post_build  r   r=   )r3   r4   r5   r6   r7   r   r8   r9   r   
ERROR_LISTr   r   r   r;   r   r<   r=   r>   r   r      s          D =;?? =R::!>,:>>8Hd++ =!7!%4?L L L;+K+KM M M =!74+79 9 9;|R+K+KM M MNK    r=   r   )	r   r   r#   r$   r%   r&   r'   r   r)   )
r   r   r#   r$   r%   r&   r'   r   r(   r)   c                   .    e Zd ZdZdZedd            ZdS )rL   z
    Dummy RPKI to Router generic packet for pre-sorting the packet type
    eg. https://tools.ietf.org/html/rfc6810#section-5.2

    zRTR dissectorNc                     |rct          |          dk    rPt          |d                   }t          |d                   }|dk    rt          |         S |dk    rt          |         S t          S )zQ
          Attribution of correct type depending on version and pdu_type
        r#   r   r   )r|   r   PDU_CLASS_VERSION_0PDU_CLASS_VERSION_1r   )cls_pktargskargsversionr/   s         r>   dispatch_hookzRTR.dispatch_hook:  se    
  	5CIINN$q'llG47||H!||*844A*844
r=   rJ   )r3   r4   r5   r6   r7   classmethodr   r<   r=   r>   rL   rL   1  sC         
 D   [  r=   rL   iC  )dport)sportiZ   i  __main__)interactzRPKI to Router)mydictmybanner)3r6   r}   scapy.packetr   r   r   scapy.fieldsr   r   r   r	   r
   r   r   r   r   r   scapy.layers.inetr   scapy.compatr   r:   rA   rE   rl   rR   r\   r`   rc   ri   r8   r9   r   r-   r@   rC   rH   rT   r^   rb   re   rk   rn   r   r   r   rL   r3   
scapy.mainr   globalsr<   r=   r>   <module>r      s     1 1 1 1 1 1 1 1 1 1 G G G G G G G G G G G G 7 7 7 7 7 7 7 7 7 7 & & & & & & 9 9 9 9 9 9 9 9 ! ! ! ! ! !               ! !   
 
  !$"/'/2.0 0
1 1 1 1 1f 1 1 1"1 1 1 1 1V 1 1 1 B B B B BF B B B    v   $    F   0    F   01 1 1 1 1V 1 1 1 3 3 3 3 3V 3 3 3&B B B B BF B B B    6   4    V   : *('*''(')+ +  *('*''('&)	+ 	+     &   0 CC         CC         CD ! ! ! ! CD ! ! ! ! CD ! ! ! ! CD ! ! ! !z######HGGII(8999999 r=   