/* Ċ Ġ* ĠCopyright Ġ@ Ġ 2 0 1 8 Ġ- Ġpresent Ġ 8 x 8 , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ package Ġorg . j its i . video bridge . transport . dt ls Ċ Ċ import Ġorg . j its i . nl j . dt ls . D tls Client Ċ import Ġorg . j its i . nl j . dt ls . D tls Server Ċ import Ġorg . j its i . nl j . dt ls . D tls Stack Ċ import Ġorg . j its i . nl j . sr tp . Tls Role Ċ import Ġorg . j its i . utils . Ordered JsonObject Ċ import Ġorg . j its i . utils . logging 2 . Logger Ċ import Ġorg . j its i . utils . logging 2 . create Child Logger Ċ import Ġorg . j its i . x mpp . extensions . j ingle . D tls Fingerprint Packet Extension Ċ import Ġorg . j its i . x mpp . extensions . j ingle . Ice Udp Transport Packet Extension Ċ import Ġjava . util . concurrent . atomic . Atomic Boolean Ċ Ċ /** Ċ Ġ* ĠTransport Ġlayer Ġwhich Ġneg oti ates Ġa ĠD TLS Ġconnection Ġand Ġsupports Ċ Ġ* Ġdecrypt ing Ġand Ġencrypt ing Ġdata . Ċ Ġ* Ċ Ġ* ĠIncoming ĠD TLS Ġdata Ġshould Ġbe Ġfed Ġinto Ġthis Ġlayer Ġvia Ġ[ dt ls Data Received ], Ċ Ġ* Ġand Ġdecrypted ĠD TLS Ġapplication Ġdata Ġwill Ġbe Ġpassed Ġto Ġthe Ċ Ġ* Ġ[ incoming Data Handler ], Ġwhich Ġshould Ġbe Ġset Ġby Ġan Ġinterested Ġparty . Ċ Ġ* Ċ Ġ* ĠOut going Ġdata Ġcan Ġbe Ġsent Ġvia Ġ[ send D tls Data ] Ġand Ġthe Ġencrypted Ġdata Ġwill Ċ Ġ* Ġbe Ġpassed Ġto Ġthe Ġ[ outgoing Data Handler ], Ġwhich Ġshould Ġbe Ġset Ġby Ġan Ċ Ġ* Ġinterested Ġparty . Ċ Ġ*/ Ċ class ĠD tls Transport ( parent Logger : ĠLogger ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġcreate Child Logger ( parent Logger ) ĊĊĠĠĠ Ġprivate Ġval Ġrunning Ġ= ĠAtomic Boolean ( true ) ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġincoming Data Handler : ĠIncoming Data Handler ? Ġ= Ġnull ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġoutgoing Data Handler : ĠOut going Data Handler ? Ġ= Ġnull ĊĠĠĠ Ġ@ Jvm Field ĊĠĠĠ Ġvar Ġevent Handler : ĠEventHandler ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġdt ls Handshake Complete Ġ= Ġfalse ĊĊĠĠĠ Ġval Ġis Connected : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdt ls Handshake Complete ĊĊĠĠĠ Ġprivate Ġval Ġstats Ġ= ĠStats () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠD TLS Ġstack Ġinstance ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdt ls Stack Ġ= ĠD tls Stack ( logger ). also Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠInstall Ġa Ġhandler Ġfor Ġwhen Ġthe ĠD TLS Ġstack Ġhas Ġdecrypted Ġapplication Ġdata Ġavailable ĊĠĠĠĠĠĠĠ Ġit . incoming Data Handler Ġ= Ġobject Ġ: ĠD tls Stack . Incoming Data Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdata Received ( data : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstats . num Packets Received ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Data Handler ?. dt ls AppData Received ( data , Ġoff , Ġlen ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstats . num Incoming Packets Dropped No Handler ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠInstall Ġa Ġhandler Ġto Ġallow Ġthe ĠD TLS Ġstack Ġto Ġsend Ġout Ġencrypted Ġdata ĊĠĠĠĠĠĠĠ Ġit . outgoing Data Handler Ġ= Ġobject Ġ: ĠD tls Stack . Outgoing Data Handler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġsend Data ( data : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoutgoing Data Handler ?. send Data ( data , Ġoff , Ġlen )?. also Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstats . num Packets Sent ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstats . num Outgoing Packets Dropped No Handler ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠHandle ĠD TLS Ġstack Ġevents ĊĠĠĠĠĠĠĠ Ġit . event Handler Ġ= Ġobject Ġ: ĠD tls Stack . EventHandler Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandshake Complete ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchosen Sr tp Protection Profile : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtls Role : ĠT ls Role , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey ing Material : ĠByteArray ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Handshake Complete Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Handler ?. handshake Complete ( chosen Sr tp Protection Profile , Ġtls Role , Ġkey ing Material ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠStart Ġa ĠD TLS Ġhandshake . Ġ ĠThe Ġ' role ' Ġshould Ġhave Ġbeen Ġset Ġbefore Ġcalling Ġthis ĊĠĠĠĠ Ġ* Ġ( via Ġ[ set Setup Attribute ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart D tls Handshake () Ġ{ ĊĠĠĠĠĠĠĠ Ġlogger . info (" Starting ĠD TLS Ġhandshake ") ĊĠĠĠĠĠĠĠ Ġif Ġ( dt ls Stack . role Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Starting Ġthe ĠD TLS Ġstack Ġbefore Ġit Ġknows Ġits Ġrole ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Stack . start () ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġwe 're Ġnot Ġdoing Ġanything Ġhere , Ġshould Ġwe ? Ġor Ġchange Ġthe Ġlog ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Error Ġduring ĠD TLS Ġneg otiation , Ġclosing Ġthis Ġtransport Ġmanager ", Ġt ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Setup Attribute ( setup Attr : ĠString ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( setup Attr . isNull OrEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( setup Attr . toLowerCase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" active " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" The Ġremote Ġside Ġis Ġact ing Ġas ĠD TLS Ġclient , Ġwe 'll Ġact Ġas Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Stack . act As Server () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" passive " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" The Ġremote Ġside Ġis Ġact ing Ġas ĠD TLS Ġserver , Ġwe 'll Ġact Ġas Ġclient ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Stack . act As Client () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" The Ġremote Ġside Ġsent Ġan Ġun recognized ĠD TLS Ġsetup Ġvalue : Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Attr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Remote Fingerprint s ( remote Fingerprint s : ĠMap < String , ĠString >) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠDon 't Ġpass Ġan Ġempty Ġlist Ġto Ġthe Ġstack Ġin Ġorder Ġto Ġavoid Ġw ip ing ĊĠĠĠĠĠĠĠ Ġ// Ġcertificates Ġthat Ġwere Ġcontained Ġin Ġa Ġprevious Ġrequest . ĊĠĠĠĠĠĠĠ Ġif Ġ( remote Fingerprint s . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdt ls Stack . remote Fingerprint s Ġ= Ġremote Fingerprint s ĊĠĠĠĠĠĠĠ Ġval Ġhas Sha 1 Hash Ġ= Ġremote Fingerprint s . keys . any Ġ{ Ġit . equals (" sha - 1 ", Ġignore Case Ġ= Ġtrue ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( dt ls Stack . role Ġ== Ġnull Ġ&& Ġhas Sha 1 Hash ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhack ( ge orge ) ĠJ ig asi Ġsends Ġa Ġsha - 1 Ġdt ls Ġfingerprint Ġwithout Ġa ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsetup Ġattribute Ġand Ġit Ġassumes Ġa Ġserver Ġrole Ġfor Ġthe Ġbridge . ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Ass ume Ġthat Ġthe Ġremote Ġside Ġis ĠJ ig asi , Ġwe 'll Ġact Ġas Ġserver ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Stack . act As Server () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDescribe Ġthe Ġproperties Ġof Ġthis Ġ[ D tls Transport ] Ġinto Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġ[ Ice Udp Transport Packet Extension ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdescribe ( ice Udp Transport Pe : ĠI ce Udp Transport Packet Extension ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfingerprint PE Ġ= Ġice Udp Transport Pe . getFirst Child OfType ( D tls Fingerprint Packet Extension :: class . java ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD tls Fingerprint Packet Extension (). also Ġ{ Ġice Udp Transport Pe . addChild Extension ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfingerprint PE . setup Ġ= Ġwhen Ġ( dt ls Stack . role ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠD tls Server Ġ-> Ġ" passive " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠD tls Client Ġ-> Ġ" active " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ" act pass " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException (" Cannot Ġdescribe Ġrole Ġ${ dt ls Stack . role }") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfingerprint PE . fingerprint Ġ= Ġdt ls Stack . local Fingerprint ĊĠĠĠĠĠĠĠ Ġfingerprint PE . hash Ġ= Ġdt ls Stack . local Fingerprint Hash Function ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNotify Ġthis Ġlayer Ġthat ĠD TLS Ġdata Ġhas Ġbeen Ġreceived Ġfrom Ġthe Ġnetwork ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġdt ls Data Received ( data : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġdt ls Stack . process Incoming Protocol Data ( data , Ġoff , Ġlen ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġout ĠD TLS Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġsend D tls Data ( data : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) Ġ= ĊĠĠĠĠĠĠĠ Ġdt ls Stack . send Application Data ( data , Ġoff , Ġlen ) ĊĊĠĠĠ Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( running . compare AndSet ( true , Ġfalse )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" Stopping ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Stack . close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Debug State (): ĠOrdered JsonObject Ġ= Ġstats . toJson (). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġput (" running ", Ġrunning . get ()) ĊĠĠĠĠĠĠĠ Ġput (" is _ connected ", Ġis Connected ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠStats ( ĊĠĠĠĠĠĠĠ Ġvar Ġnum Packets Received : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġnum Incoming Packets Dropped No Handler : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġnum Packets Sent : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠ Ġvar Ġnum Outgoing Packets Dropped No Handler : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfun ĠtoJson (): ĠOrdered JsonObject Ġ= ĠOrdered JsonObject (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" num _ packets _ received ", Ġnum Packets Received ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" num _ incoming _ packets _ d ropped _ no _ handler ", Ġnum Incoming Packets Dropped No Handler ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" num _ packets _ sent ", Ġnum Packets Sent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġput (" num _ outgoing _ packets _ d ropped _ no _ handler ", Ġnum Outgoing Packets Dropped No Handler ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhandler Ġfor Ġwhen Ġ[ D tls Transport ] Ġwants Ġto Ġsend Ġdata Ġout ĊĠĠĠĠ Ġ* Ġonto Ġthe Ġnetwork ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠOut going Data Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġsend Data ( buf : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhandler Ġfor Ġwhen Ġ[ D tls Transport ] Ġhas Ġreceived ĠD TLS Ġapplication ĊĠĠĠĠ Ġ* Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠIncoming Data Handler Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġdt ls AppData Received ( buf : ĠByteArray , Ġoff : ĠInt , Ġlen : ĠInt ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhandler Ġfor Ġ[ D tls Transport ] Ġevents ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinterface ĠEventHandler Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġhandshake Complete ( chosen Sr tp Protection Profile : ĠInt , Ġtls Role : ĠT ls Role , Ġkey ing Material : ĠByteArray ) ĊĠĠĠ Ġ} Ċ } Ċ