
    hE                        d Z ddlZddlZddlmZmZ ddl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 i ddd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(i d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJi dKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdli dmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddÓddœddǓddɓdd˓dd͓ddϓddѓi ddӓddՓddדddٓddۓddݓddߓddddddddddddddddddddddddddddddddd dZdddddZd	diZdd	d
Zddd
ZddiZ G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d:e          Z G d dle          Z ddddddZ! G d dhe          Z" G d dje          Z# G d  dre          Z$ G d! dne          Z% G d" de          Z& G d# de          Z' G d$ de          Z( G d% de          Z) G d& de          Z* G d' de          Z+ G d( de          Z,g d)d*  e-dd%          D             z   Z. G d+ d~e          Z/ G d, d-e
          Z0ddddd.d/Z1d0d1d2Z2 G d3 de          Z3d4d5d2Z4 G d6 d2e          Z5d7d8d2Z6 G d9 d:e
          Z7 G d; dve          Z8 G d< de          Z9 G d= de          Z: G d> d?e          Z;d@ Z<e=                                D ]!\  Z>Z? e<e?e          Z@ ee;e@dAe>i           " eee;dBdCi            eee;dDdCi           eAdEk    r ddFlBmCZC  eC eD            dGH           dS dS (I  z/
Skinny Call Control Protocol (SCCP) extension
    N)Packetbind_layers)
FlagsFieldIPFieldLEIntEnumField
LEIntFieldStrFixedLenField)TCP)	RandShort)confSkinnyMessageKeepAlive   SkinnyMessageRegister   SkinnyMessageIpPort   SkinnyMessageKeypadButton   SkinnyMessageEnblocCall   SkinnyMessageStimulus   SkinnyMessageOffHook   SkinnyMessageOnHook   SkinnyMessageHookFlash	   SkinnyMessageForwardStatReq
   SkinnyMessageSpeedDialStatReq   SkinnyMessageLineStatReq   SkinnyMessageConfigStatReq   SkinnyMessageTimeDateReq   SkinnyMessageButtonTemplateReq   SkinnyMessageVersionReq   SkinnyMessageCapabilitiesRes   SkinnyMessageMediaPortList   SkinnyMessageServerReq    SkinnyMessageAlarm!   'SkinnyMessageMulticastMediaReceptionAck"   "SkinnyMessageOpenReceiveChannelAck#   $SkinnyMessageConnectionStatisticsRes$   SkinnyMessageOffHookWithCgpn%   SkinnyMessageSoftKeySetReq&   SkinnyMessageSoftKeyEvent'   SkinnyMessageUnregister(   SkinnyMessageSoftKeyTemplateReq)   SkinnyMessageRegisterTokenReq*   %SkinnyMessageMediaTransmissionFailure+   SkinnyMessageHeadsetStatus,   &SkinnyMessageMediaResourceNotification-   #SkinnyMessageRegisterAvailableLines.   SkinnyMessageDeviceToUserData/   %SkinnyMessageDeviceToUserDataResponse0   SkinnyMessageUpdateCapabilities1   ,SkinnyMessageOpenMultiMediaReceiveChannelAck2   SkinnyMessageClearConference3   SkinnyMessageServiceURLStatReq4   SkinnyMessageFeatureStatReq5    SkinnyMessageCreateConferenceRes6    SkinnyMessageDeleteConferenceRes7    SkinnyMessageModifyConferenceRes8   SkinnyMessageAddParticipantRes9   SkinnyMessageAuditConferenceRes@    SkinnyMessageAuditParticipantResA   %SkinnyMessageDeviceToUserDataVersion1   SkinnyMessageRegisterAck   SkinnyMessageStartTone   SkinnyMessageStopTone   SkinnyMessageSetRinger   SkinnyMessageSetLamp   SkinnyMessageSetHkFDetect   SkinnyMessageSpeakerMode   SkinnyMessageSetMicroMode   #SkinnyMessageStartMediaTransmission   "SkinnyMessageStopMediaTransmission    SkinnyMessageStartMediaReception   SkinnyMessageStopMediaReception   SkinnyMessageCallInfo   SkinnyMessageForwardStat   SkinnyMessageSpeedDialStat   SkinnyMessageLineStat   SkinnyMessageConfigStat   SkinnyMessageTimeDate   %SkinnyMessageStartSessionTransmission   $SkinnyMessageStopSessionTransmission   SkinnyMessageButtonTemplate   SkinnyMessageVersion   SkinnyMessageDisplayText   SkinnyMessageClearDisplay   SkinnyMessageCapabilitiesReq   SkinnyMessageEnunciatorCommand   SkinnyMessageRegisterReject   SkinnyMessageServerRes   SkinnyMessageReset   SkinnyMessageKeepAliveAcki  )SkinnyMessageStartMulticastMediaReceptioni  ,SkinnyMessageStartMulticastMediaTransmissioni  (SkinnyMessageStopMulticastMediaReceptioni  +SkinnyMessageStopMulticastMediaTransmissioni  SkinnyMessageOpenReceiveChanneli   SkinnyMessageCloseReceiveChanneli  $SkinnyMessageConnectionStatisticsReqi  SkinnyMessageSoftKeyTemplateResi	  SkinnyMessageSoftKeySetResi  )SkinnyMessageStationSelectSoftKeysMessagei  SkinnyMessageCallStatei  SkinnyMessagePromptStatusi  SkinnyMessageClearPromptStatusi  SkinnyMessageDisplayNotifyi  SkinnyMessageClearNotifyi  SkinnyMessageCallPlanei  i  SkinnyMessageUnregisterAcki  SkinnyMessageBackSpaceReqi  SkinnyMessageRegisterTokenAcki   SkinnyMessageRegisterTokenRejectB   -SkinnyMessageDeviceToUserDataResponseVersion1i  'SkinnyMessageStartMediaFailureDetectioni  SkinnyMessageDialedNumberi  SkinnyMessageUserToDeviceDatai  SkinnyMessageFeatureStati   SkinnyMessageDisplayPriNotifyi!  SkinnyMessageClearPriNotifyi"  SkinnyMessageStartAnnouncementi#  SkinnyMessageStopAnnouncementi$  SkinnyMessageAnnouncementFinishi'  SkinnyMessageNotifyDtmfTonei(  SkinnyMessageSendDtmfTonei)  $SkinnyMessageSubscribeDtmfPayloadReqi*  $SkinnyMessageSubscribeDtmfPayloadResi+  $SkinnyMessageSubscribeDtmfPayloadErri,  &SkinnyMessageUnSubscribeDtmfPayloadReqi-  &SkinnyMessageUnSubscribeDtmfPayloadResi.  &SkinnyMessageUnSubscribeDtmfPayloadErri/  SkinnyMessageServiceURLStati0  SkinnyMessageCallSelectStati1  "SkinnyMessageOpenMultiMediaChannel(SkinnyMessageStartMultiMediaTransmission'SkinnyMessageStopMultiMediaTransmission!SkinnyMessageMiscellaneousCommandSkinnyMessageFlowControlCommand*SkinnyMessageCloseMultiMediaReceiveChannel SkinnyMessageCreateConferenceReq SkinnyMessageDeleteConferenceReq SkinnyMessageModifyConferenceReqSkinnyMessageAddParticipantReqSkinnyMessageDropParticipantReqSkinnyMessageAuditConferenceReq SkinnyMessageAuditParticipantReq%SkinnyMessageUserToDeviceDataVersion1)i2  i3  i4  i5  i6  i7  i8  i9  i:  i;  i<  i=  i?  Off HookOn HookzRing out
Proceeding)r   r   r   r$   zRing offz
Speaker onzSpeaker off)r   r   zOff (?)OnLinec                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )SkinnyDateTimeFieldc                 4    t          j        | ||d           d S )Nr2   )r	   __init__)selfnamedefaults      X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/skinny.pyr   zSkinnyDateTimeField.__init__   s    !$gr:::::    c                 N    t          j        d|          \  }}}}}}}	}
||||||	fS )N<8I)structunpack)r   pktsyearmonthdowdayhourminsecmilliseconds              r   m2izSkinnyDateTimeField.m2i   s8    =C]5RS=T=T:eS#tS#{eS$S11r   c                     t          |t                    r|                     ||          }|d d         dz   |dd         z   dz   }t          j        dg|R  S )Nr   )r   r   r   )
isinstancestrh2ir   pack)r   r   valtmp_lsts       r   i2mzSkinnyDateTimeField.i2m   sb    c3 	%((3$$Cbqb'D.3qs8+d2{5+7++++r   c                     t          |t                    r|S t          j        t          j        |dz                       S )N)r   r   r   )r   r   timectimemktimer   r   xs      r   i2hzSkinnyDateTimeField.i2h   s7    a 	:H:dk!i-88999r   c                 .    |                      ||          S N)r  r  s      r   i2reprzSkinnyDateTimeField.i2repr   s    xxQr   c           	          d}t          |t                    r*t          j        |          }|d d         |dd         z   }n<|s8t          j        t          j                              \	  }}}}}}	}
}
}
||||||	f}n|}|S )N r   )r   r   r  strptimegmtime)r   r   r   tymdhr   r   rests              r   r   zSkinnyDateTimeField.h2i   s    a 	a  A"1"!B$AA 9=TY[[9Q9Q61aCdD$1ac*r   N)	__name__
__module____qualname__r   r   r  r  r  r   r  r   r   r   r      sn        ; ; ;2 2 2, , ,: : :         r   r   c                       e Zd ZdZdS )SkinnyMessageGenericzGeneric messageNr  r  r  r   r  r   r   r  r     s        DDDr   r  c                       e Zd ZdZdS )r   z
keep aliveNr  r  r   r   r   r      s        DDDr   c                       e Zd ZdZdS )r   zkeep alive ackNr  r  r   r   r   r      s        DDDr   c                   B    e Zd ZdZ edd           edd          gZdS )r   r   unknown1r   unknown2Nr  r  r  r   r   fields_descr  r   r   r   r      s8        D:j!,,:j!,,0KKKr   c                       e Zd ZdZdS )r   r   Nr  r  r   r   r   r      s        DDDr   c            	           e Zd ZdZ edde           edd           edd           edd           ed	d           ed
d          gZdS )r   zSkinny Call state messagestater   instancecallidr   r   r   r!  unknown3N)r  r  r  r   r   skinny_callstatesr   r#  r  r   r   r   r     sw        &D!>'1.?@@:j!,,:h**:j!,,:j!,,:j!,,.KKKr   c                   X    e Zd ZdZ edd           edd           edd          gZdS )r?   zSoft Key Eventkeyr   r'  r   r(  Nr"  r  r   r   r?   r?     sG        D:eQ'':j!,,:h**,KKKr   c                   p    e Zd ZdZ edde           edd           edd           edd          gZdS )	rq   zRing messageringr   r   r   r!  r)  N)r  r  r  r   r   skinny_ring_typer   r#  r  r   r   rq   rq     sY        D!>&#/?@@:j!,,:j!,,:j!,,.KKKr   zInside dial tonexxxzAlerting tonezReorder Tone)r4   r6   r8   r:   r<   c                   p    e Zd ZdZ edde           edd           edd           edd          gZd	S )
rm   z
Start tonetoner4   r   r   r'  r   r(  N)r  r  r  r   r   _skinny_tonesr   r#  r  r   r   rm   rm   %  sX        D!>&$>>:j!,,:j!,,:h**,KKKr   c                   B    e Zd ZdZ edd           edd          gZdS )ro   z	stop toner'  r   r(  r   Nr"  r  r   r   ro   ro   -  s8        D:j!,,:h**,KKKr   c                   .    e Zd ZdZ edde          gZdS )rw   zSpeaker mdoer.  r   N)r  r  r  r   r   skinny_speaker_modesr#  r  r   r   rw   rw   3  s*        D!>&#/CDDEKKKr   c                   \    e Zd ZdZ edde           edd           edde          gZdS )	rs   z!Lamp message (light of the phone)stimulusr   r'  r   moder   N)	r  r  r  r   r   skinny_stimulusr   skinny_lamp_moder#  r  r   r   rs   rs   8  sM        .D!>*c?CC:j!,,!>&!-=>>@KKKr   c                   n    e Zd ZdZ edd           edd           edd           edd          gZd	S )
r   z Station Select Soft Keys Messager'  r   r(  r   setmapi  Nr"  r  r   r   r   r   ?  sV        -D:j!,,:h**:eQ'':eV,,.KKKr   c                   p    e Zd ZdZ edd           eddd           edd           ed	d          gZd
S )r   zPrompt statustimeoutr   texts                                    r2   r'  r   r(  N)r  r  r  r   r   r	   r#  r  r   r   r   r   G  sY        D:i++##FJ;;:j!,,:h**,KKKr   c                   ,    e Zd ZdZ edd          gZdS )r   z&Activate/Deactivate Call Plane Messager'  r   Nr"  r  r   r   r   r   O  s'        3D:j!,,-KKKr   c                   B    e Zd ZdZ edd           edd          gZdS )r   zSetting date and timesettimeN	timestampr   )r  r  r  r   r   r   r#  r  r   r   r   r   T  s9        "D&&y$77:k1--/KKKr   c                   B    e Zd ZdZ edd           edd          gZdS )r   zclear prompt statusr'  r   r(  r   Nr"  r  r   r   r   r   Z  s8         D:j!,,:h**,KKKr   c                   X    e Zd ZdZ edd           edd           edd          gZdS )r   zkeypad buttonr,  r   r'  r   r(  Nr"  r  r   r   r   r   `  sG        D:eQ'':j!,,:h**,KKKr   c                   Z    e Zd ZdZ eddd           edd           edd          gZd	S )
r   zdialed numbernumber1337   r'  r   r(  r   N)r  r  r  r   r	   r   r#  r  r   r   r   r   g  sJ        D##Hfb99:j!,,:h**,KKKr   )
CallerNameCallerNumber
CalledNameCalledNumberOriginalCalledNameOriginalCalledNumberLastRedirectNameLastRedirectNumberc                     g | ]}d |z  S )zBit%dr  ).0is     r   
<listcomp>rW  n  sH      @c  @c  @c  QR  AH  KL  AL  @c  @c  @cr   c                      e Zd ZdZ eddd           eddd           edd	d           ed
dd           edd           edd           edd	d           eddd           edd	d           eddd           edd           edd           eddd           eddd           eddd           eddd           edd           eddde           edd          gZdS ) r   zcall information
callernamezJean ValjeanrB   	callernumrJ  rK  
callednameCausette	callednum1034lineinstancer   r(  r   originalcallednameoriginalcallednumlastredirectingnamelastredirectingnumoriginalredirectreasonlastredirectreasonvoicemailboxGs                           voicemailboxDoriginalvoicemailboxDlastvoicemailboxDsecurityrestrictionr,   unknownN)	r  r  r  r   r	   r   r   %_skinny_message_callinfo_restrictionsr#  r  r   r   r   r   q  sh       D##L."EE##K<<##L*bAA##K<<:na00:h**##$8*bII##$7DD##$9:rJJ##$8&"EE:6:::2A66##OZDD##OZDD##$;ZLL##$7RHH:j!,,:mQ4YZZ:i++%-KKKr   c                       e Zd Zd ZdS )SkinnyRateFieldc                     |d}d|z  S )Nr   z	%d ms/pktr  r  s      r   r  zSkinnyRateField.i2repr  s    9AQr   Nr  r  r  r  r  r   r   ro  ro    s#            r   ro  zG711 ulaw 64k)r   r   r   r   r   zecho cancellation offzecho cancellation on)r   r   c            
           e Zd ZdZ edd           edd           edd           edde           ed	de           ed
d           edd          gZ	d Z
dS )r   open receive channel
conferencer   passthrurate   codecr   echor   r(  c                     t           j        S r
  r   padding_layerr   ps     r   guess_payload_classz3SkinnyMessageOpenReceiveChannel.guess_payload_class      !!r   N)r  r  r  r   r   ro  r   _skinny_codecs_skinny_echor#  r  r  r   r   r   r     s        !D:lA..:j!,,"?62..!>'1n==!>&!\:::j!,,:h**,K" " " " "r   okkoc                       e Zd ZdZ edde           edd           ed e                       edd           edd          gZ	d	S )
r7   rs  statusr   remote0.0.0.0portru  r(  N)
r  r  r  r   r   _skinny_receive_channel_statusr   r   r   r#  r  r   r   r7   r7     sn        !D!>(A/MNN78Y//:fiikk22:j!,,:h**	,KKKr   zsilence suppression offzsilence suppression onc                       e Zd Zd ZdS )SkinnyFramePerPacketFieldc                     |d}d|z  S )Nr   z%d frames/pktr  r  s      r   r  z SkinnyFramePerPacketField.i2repr  s    9A""r   Nrq  r  r   r   r  r    s#        # # # # #r   r  c                   "   e Zd ZdZ edd           edd           edd           ed e                       edd	           ed
de	           edd           edde
           edd           edd           edd          gZd ZdS )r{   zstart multimedia transmissionrt  r   ru  r  r  r  rv  rw  rx  r   
precedence   silence	maxframesr   r(  c                     t           j        S r
  r{  r}  s     r   r  z7SkinnyMessageStartMediaTransmission.guess_payload_class  r  r   N)r  r  r  r   r   r   r   ro  r   r  _skinny_silencer  r#  r  r  r   r   r{   r{     s        *D:lA..:j!,,78Y//:fiikk22"?62..!>'1n==:lC00!>)Q@@,,[!<<:j!,,:h**
,K" " " " "r   c                       e Zd ZdZ edd           edd           edd           ed e                       edd	           ed
de	           edd           edde
           edd          g	ZdS )r   zclose receive channelrt  r   ru  r  r  r  rv  rw  rx  r   r  r  r  r(  N)r  r  r  r   r   r   r   ro  r   r  r  r#  r  r   r   r   r     s        "D:lA..:j!,,78Y//:fiikk22"?62..!>'1n==:lC00!>)Q@@:h**,KKKr   c                   X    e Zd ZdZ edd           edd           edd          gZdS )r   zstop multimedia transmissionrt  r   ru  r(  Nr"  r  r   r   r   r     sG        )D:lA..:j!,,:h**,KKKr   c                   `    e Zd Zd Z edd           edd           edde          gZd ZdS )SkinnylenNresr   msgc                     | j         Bt          |          t          |          z   dz
  }t          j        d|          |dd          z   }||z   S )Nr   z@Ir   )r  r   r   )r   r   r~  tmp_lens       r   
post_buildzSkinny.post_build  sL    8!ffs3xx'!+G+dG,,s122w6CQwr   )	r  r  r  r   r   r   skinny_messages_clsr#  r  r  r   r   r  r    s`        D:eT**:eQ''!>%,?@@BK    r   r  c                 F    t                                          | |          S r
  )globalsget)r   fallback_clss     r   get_clsr    s    99==|,,,r   r  dporti  sport__main__)interactzWelcome to Skinny add-on)mydictmybanner)E__doc__r  r   scapy.packetr   r   scapy.fieldsr   r   r   r   r	   scapy.layers.inetr
   scapy.volatiler   scapy.configr   r  r*  r/  r6  r;  r:  r   r  r   r   r   r   r   r?   rq   r3  rm   ro   rw   rs   r   r   r   r   r   r   r   rangerm  r   ro  r  r  r   r  r7   r  r  r{   r   r   r  r  itemsmsgidstrclsclsr  
scapy.mainr  r  r  r   r   <module>r     sc      , , , , , , , ,              ! ! ! ! ! ! $ $ $ $ $ $      G
$G #G !	G
 'G %G #G "G !G $G )G +G &G (G &G  ,!G" %#G$ *%G G& ('G( $)G*  +G, 5-G. 0/G0 21G2 *3G4 (5G6 '7G8 %9G: -;G< +=G> 3?G@ (AGB 4CGD 1EGF +GG G GH 3IGJ -KGL :MGN *OGP ,QGR )SGT .UGV .WGX .YGZ ,[G\ -]G^ ._G` 3aGd &eGf $gGh #iGj $kG G Gl "mGn 'oGp &qGr 'sGt 1uGv 0wGx .yGz -{G| #}G~ &G@ (AGB #CGD %EGF #GGH 3IGJ 2KGL )MG G GN "OGP &QGR 'SGT *UGV ,WGX )YGZ $[G\  ]G^ '_G` 7aGb :cGd 6eGf 9gGh -iGj .kGl 2mGn -oG G Gp (qGr 7sGt $uGv 'wGx ,yGz ({G| &}G~ $G@ $AGB (CGD 'EGF +GGH .IGJ ;KGL 5MGN 'OGP +QG G GR &SGT +UGV )WGX ,YGZ +[G\ -]G^ )_G` 'aGb 2cGd 2eGf 2gGh 4iGj 4kGl 4mGn )oGp )qGr 0sG Gt 75/-8...,--.3MG G G T 
				    
 
	   
	   " " " " "* " " "R    6       V          0 0 0 0 06 0 0 0    .   . . . . .V . . ., , , , , , , ,. . . . .V . . . 



 , , , , ,V , , ,, , , , ,0 , , ,F F F F Fv F F F
@ @ @ @ @6 @ @ @. . . . . . . ., , , , , , , ,. . . . .V . . .
/ / / / /F / / /, , , , ,V , , ,, , , , , , , ,, , , , , , , , )}  )}  )}  @c  @c  V[  V[  \]  _a  Vb  Vb  @c  @c  @c  )c %- - - - -F - - -.    j    
				  
!	 " " " " "f " " " 
	" " , , , , , , , , 
#	! # # # # #
 # # #" " " " "& " " "$
, 
, 
, 
, 
,v 
, 
, 
,, , , , ,f , , ,    V    - - -
 )..00 - -ME6
'&.
/
/CKeU^,,,, C'4 ) ) ) C'4 ) ) )z######HGGII(BCCCCCC r   