/* Ċ Ġ* Ġ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 . nl j . dt ls Ċ Ċ import Ġjava . time . Duration Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ import Ġjava . util . concurrent . Linked BlockingQueue Ċ import Ġjava . util . concurrent . TimeUnit Ċ import Ġorg . bouncycastle . tls . Certificate Ċ import Ġorg . bouncycastle . tls . D TL ST r ansport Ċ import Ġorg . bouncycastle . tls . Data gram Transport Ċ import Ġorg . j its i . nl j . Packet Info Ċ import Ġorg . j its i . nl j . protocol . Protocol Stack Ċ import Ġorg . j its i . nl j . sr tp . Tls Role Ċ import Ġorg . j its i . nl j . stats . Node Stats Block Ċ import Ġorg . j its i . nl j . transform . Node Stats Producer Ċ import Ġorg . j its i . nl j . util . Buffer Pool Ċ import Ġorg . j its i . utils . logging 2 . c debug Ċ import Ġorg . j its i . utils . logging 2 . create Child Logger Ċ import Ġorg . j its i . rtp . Un parsed Packet Ċ import Ġorg . j its i . utils . logging 2 . Logger Ċ Ċ /** Ċ Ġ* ĠRepresents Ġa Ġsingle Ġinstance Ġof Ġa ĠD TLS Ġstack Ġfor Ġa Ġgiven Ġconnection . Ġ ĠThis Ġclass Ġalso Ġacts Ġas Ġthe Ġ[ Data gram Transport ] Ċ Ġ* Ġused Ġby Ġthe Ġunderlying ĠD TLS Ġlibrary Ġin Ġorder Ġto Ġsend Ġand Ġreceive ĠD TLS Ġpackets . Ġ ĠUsers Ġof Ġthis Ġclass Ġneed Ġto Ġhandle Ċ Ġ* Ġpassing Ġincoming ĠD TLS Ġpackets Ġinto Ġthe Ġstack , Ġas Ġwell Ġas Ġhandling Ġpackets Ġthe Ġstack Ġwants Ġto Ġsend Ġout . Ġ ĠThe Ġpassing Ċ Ġ* Ġof Ġincoming Ġpackets Ġis Ġdone Ġvia Ġcalling Ġ[ D tls Stack . process Incoming Protocol Data ]. Ġ ĠThe Ġhandling Ġof Ġoutgoing Ġpackets Ġis Ġdone Ġby Ċ Ġ* Ġassigning Ġa Ġhandler Ġto Ġthe Ġ[ D tls Stack . on Outgoing Protocol Data ] Ġmember . Ġ ĠIncoming Ġpackets Ġmay Ġbe Ġeither Ġcontrol Ġpackets Ċ Ġ* Ġ( terminated Ġby Ġthe Ġstack Ġitself ) Ġor Ġapp Ġpackets Ġwhich Ġhave Ġbeen Ġsent Ġover ĠD TLS Ġ( S CT P Ġpackets , Ġfor Ġexample ). Ġ ĠAfter Ċ Ġ* Ġpassing Ġincoming Ġpackets Ġto Ġthe Ġstack Ġvia Ġ[ D tls Stack . process Incoming Protocol Data ], Ġany Ġapp Ġpackets Ġready Ġfor Ġfurther Ġprocessing Ċ Ġ* Ġwill Ġbe Ġreturned . Ġ ĠOut going Ġpackets Ġcan Ġbe Ġsent Ġvia Ġ[ D tls Stack . send Application Data ]. Ċ Ġ* Ċ Ġ* ĠAn Ġexample Ġof Ġpassing Ġincoming ĠD TLS Ġpackets Ġthrough Ġthe Ġstack : Ċ Ġ* Ċ Ġ* Ġ Ġ--> ĠRe cv Ġ' dt ls Packet ' Ġfrom Ġthe Ġnetwork Ġand Ġpass Ġit Ġinto Ġthe Ġstack : Ċ Ġ* Ġ Ġval Ġapp Packets Ġ= Ġdt ls Stack . process Incoming Protocol Data ( listOf ( dt ls Packet )) Ċ Ġ* Ġ Ġif Ġ( app Packets . isNotEmpty ()) Ġ{ Ċ Ġ* ĠĠĠ Ġ// ĠProcess Ġthe Ġapp Ġpackets Ċ Ġ* Ġ Ġ} Ċ Ġ* Ċ Ġ* Ġ ĠAn Ġexample Ġof Ġsending Ġapp Ġpackets Ġout Ġvia Ġthe ĠD TLS Ġstack : Ċ Ġ* Ġ Ġdt ls Stack . on Outgoing Data Ġ= Ġ{ Ġoutgoing D tls Packet Ġ-> Ċ Ġ* ĠĠĠ Ġ// ĠWork Ġto Ġsend Ġthe Ġpackets Ġout Ċ Ġ* Ġ Ġ} Ċ Ġ* Ġ Ġval Ġdt ls App Packet Ġ= Ġ... Ċ Ġ* Ġ Ġdt ls Stack . send Application Data ( dt ls App Packet ) Ċ Ġ* Ċ Ġ*/ Ċ class ĠD tls Stack ( ĊĠĠĠ Ġparent Logger : ĠLogger Ċ ) Ġ: ĠProtocol Stack , ĠData gram Transport , ĠNode Stats Producer Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= Ġcreate Child Logger ( parent Logger ) ĊĠĠĠ Ġprivate Ġval Ġrole Set Ġ= ĠCompletableFuture < Unit >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġcertificate Ġinfo Ġfor Ġthis Ġparticular Ġ[ D tls Stack ] Ġinstance . ĠWe Ġsave Ġit Ġin Ġa Ġlocal Ġval Ġbecause Ġthe Ġglobal Ġone ĊĠĠĠĠ Ġ* Ġmight Ġbe Ġref reshed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcertificate Info Ġ= ĠD tls Stack . certificate Info ĊĊĠĠĠ Ġval Ġlocal Fingerprint Hash Function : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcertificate Info . local Fingerprint Hash Function ĊĊĠĠĠ Ġval Ġlocal Fingerprint : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġcertificate Info . local Fingerprint ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġremote Ġfingerprint s Ġsent Ġto Ġus Ġover Ġthe Ġsignal ing Ġpath . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġremote Fingerprint s : ĠMap < String , ĠString > Ġ= ĠHashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġthat Ġa Ġspecific Ġ[ Certificate ] Ġmatches Ġthe Ġremote Ġfingerprint s Ġsent Ġto Ġus Ġover Ġthe Ġsignal ing Ġpath . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġfun Ġverify And Validate Remote Certificate ( remote Certificate : ĠCertificate ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġremote Certificate ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠD tls Utils . verify And Validate Certificate ( it , Ġremote Fingerprint s ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThe Ġabove Ġthrows Ġan Ġexception Ġif Ġthe Ġchecks Ġfail . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . c debug Ġ{ Ġ" Fingerprint s Ġverified ." Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠIncoming ĠD TLS Ġpackets Ġreceived Ġfrom Ġthe Ġnetwork Ġare Ġstored Ġhere Ġvia Ġ[ process Incoming Protocol Data ]. Ġ ĠThey Ġare Ġread ĊĠĠĠĠ Ġ* Ġby Ġthe Ġunderlying ĠD TLS Ġlibrary Ġvia Ġthe Ġ[ receive ] Ġmethod , Ġwhich Ġthe Ġlibrary Ġcalls Ġto Ġreceive Ġincoming Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġincoming Protocol Data Ġ= ĠLinked BlockingQueue < Packet Info >() ĊĠĠĠ Ġ// ĠTODO Ġconvert Ġto Ġsingle Ġpacket ? ĊĠĠĠ Ġprivate Ġvar Ġon Outgoing Protocol Data : Ġ( List < Packet Info >) Ġ-> ĠUnit Ġ= Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġon Outgoing Protocol Data ( handler : Ġ( List < Packet Info >) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġon Outgoing Protocol Data Ġ= Ġhandler ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġneg oti ated ĠD TLS Ġtransport . Ġ ĠThis Ġis Ġused Ġto Ġread Ġand Ġwrite ĠD TLS Ġapp Ġdata . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġdt ls Transport : ĠD TL ST r ansport ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ D tls Role ] Ġ' plugin ' Ġthat Ġwill Ġdetermine Ġhow Ġthis Ġstack Ġoper ates Ġ( as Ġa Ġclient ĊĠĠĠĠ Ġ* Ġor Ġa Ġserver ). Ġ ĠA Ġcall Ġto Ġ[ act As Client ] Ġor Ġ[ act As Server ] Ġmust Ġbe Ġmade Ġto Ġfill Ġout ĊĠĠĠĠ Ġ* Ġthis Ġrole Ġand Ġsuccessfully Ġcall Ġ[ start ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġrole : ĠD tls Role ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġprivate Ġset ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġbuffer Ġwe 'll Ġuse Ġto Ġreceive Ġdata Ġfrom Ġ[ dt ls Transport ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġdt ls AppData Buf Ġ= ĠByteArray ( 1 5 0 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInstall Ġa Ġhandler Ġto Ġbe Ġinvoked Ġwhen Ġthe ĠD TLS Ġhandshake Ġis Ġfinished . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNOTE Ġthis ĠMUST Ġbe Ġcalled Ġbefore Ġcalling Ġeither Ġ[ act As Server ] Ġor ĊĠĠĠĠ Ġ* Ġ[ act As Client ] ! ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Handshake Complete ( handler : Ġ( Int , ĠT ls Role , ĠByteArray ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandshake Complete Handler Ġ= Ġhandler ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġact As Server () Ġ{ ĊĠĠĠĠĠĠĠ Ġrole Ġ= ĠD tls Server ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcertificate Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandshake Complete Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: verify And Validate Remote Certificate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrole Set . complete ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġact As Client () Ġ{ ĊĠĠĠĠĠĠĠ Ġrole Ġ= ĠD tls Client ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcertificate Info , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhandshake Complete Handler , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis :: verify And Validate Remote Certificate , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġrole Set . complete ( Unit ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġhandler Ġto Ġbe Ġinvoked Ġwhen Ġthe ĠD TLS Ġhandshake Ġis Ġcomplete . Ġ ĠA Ġ[ ByteArray ] ĊĠĠĠĠ Ġ* Ġcontaining Ġthe ĠSR TP Ġkey ing Ġmaterial Ġis Ġpassed ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġhandshake Complete Handler : Ġ( Int , ĠT ls Role , ĠByteArray ) Ġ-> ĠUnit Ġ= Ġ{ Ġ_, Ġ_, Ġ_ Ġ-> Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġprocess Incoming Protocol Data ( packet Info : ĠPacket Info ): ĠList < Packet Info > Ġ{ ĊĠĠĠĠĠĠĠ Ġincoming Protocol Data . add ( packet Info ) ĊĠĠĠĠĠĠĠ Ġvar Ġbytes Received : ĠInt ĊĠĠĠĠĠĠĠ Ġval Ġout Packets Ġ= Ġmutable ListOf < Packet Info >() ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Received Ġ= Ġdt ls Transport ?. receive ( dt ls AppData Buf , Ġ 0 , Ġ 1 5 0 0 , Ġ 1 ) Ġ?: Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( bytes Received Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuf Copy Ġ= ĠBuffer Pool . get Buffer ( bytes Received ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSystem . arraycopy ( dt ls AppData Buf , Ġ 0 , Ġbuf Copy , Ġ 0 , Ġbytes Received ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġout Packets . add ( Packet Info ( D tls Protocol Packet ( buf Copy , Ġ 0 , Ġbytes Received ))) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( bytes Received Ġ> Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġreturn Ġout Packets ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsend Application Data ( packet Info : ĠPacket Info ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdt ls Transport ?. send ( packet Info . packet . buffer , Ġpacket Info . packet . offset , Ġpacket Info . packet . length ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ' start ' Ġthis Ġstack , Ġin Ġwhatever Ġrole Ġit Ġhas Ġbeen Ġtold Ġto Ġoperate Ġ( client Ġor Ġserver ). Ġ ĠIf Ġa Ġrole ĊĠĠĠĠ Ġ* Ġhas Ġnot Ġyet Ġbeen Ġyet Ġ( via Ġ[ act As Server ] Ġor Ġ[ act As Client ]), Ġthen Ġit Ġwill Ġblock Ġuntil Ġthe Ġrole ĊĠĠĠĠ Ġ* Ġhas Ġbeen Ġset . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠ Ġrole Set . then Run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThere Ġis Ġa Ġbit Ġof Ġa Ġrace Ġhere : ĠIt 's Ġtechnically Ġpossible Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfar Ġside Ġcould Ġfinish Ġthe Ġhandshake Ġand Ġsend Ġa Ġmessage Ġbefore ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthis Ġside Ġassigns Ġdt ls Transport Ġhere . Ġ ĠIf Ġso , Ġthat Ġmessage ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwould Ġbe Ġpassed Ġto Ġ# process Incoming Protocol Data Ġand Ġput Ġin ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġincoming Protocol Data , Ġbut , Ġsince Ġdt ls Transport Ġwon 't Ġbe Ġset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġyet , Ġwe Ġwon 't Ġ' receive ' Ġit Ġyet . Ġ ĠThe Ġmessage Ġisn 't Ġlost , Ġbut ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwon 't Ġbe Ġreceived Ġuntil Ġanother Ġmessage Ġcomes Ġafter ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdt ls Transport Ġhas Ġbeen Ġset . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdt ls Transport Ġ= Ġrole ?. start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReceive Ġlimit Ġcomputation Ġcopied Ġfrom Ġ[ org . bouncycastle . crypto . tls . UDP Transport ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Receive Limit (): ĠInt Ġ= Ġ 1 5 0 0 Ġ- Ġ 2 0 Ġ- Ġ 8 ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġlimit Ġcomputation Ġcopied Ġfrom Ġ[ org . bouncycastle . crypto . tls . UDP Transport ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġget Send Limit (): ĠInt Ġ= Ġ 1 5 0 0 Ġ- Ġ 8 4 Ġ- Ġ 8 ĊĊĠĠĠ Ġoverride Ġfun Ġreceive ( buf : ĠByteArray , Ġoff : ĠInt , Ġlength : ĠInt , Ġwait Millis : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpacket Info Ġ= Ġincoming Protocol Data . poll ( wait Millis . to Long (), ĠTimeUnit . MILLISECONDS ) Ġ?: Ġreturn Ġ- 1 ĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= Ġpacket Info . packet ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( packet . buffer , Ġpacket . offset , Ġbuf , Ġoff , Ġpacket . length ) ĊĊĠĠĠĠĠĠĠ ĠBuffer Pool . return Buffer ( packet Info . packet . buffer ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġpacket . length ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġan Ġoutgoing ĠD TLS Ġpacket Ġ( already Ġprocessed Ġby Ġthe ĠD TLS Ġstack ) Ġout Ġvia Ġinvoking ĊĠĠĠĠ Ġ* Ġa Ġhandler . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠWe Ġhave Ġto Ġuse Ġa Ġsynchronous Ġcallback Ġapproach Ġhere , Ġas Ġsome Ġpackets Ġorig inate ĊĠĠĠĠ Ġ* Ġfrom Ġwithin Ġthe Ġstack Ġitself Ġ( e . g . Ġduring Ġconnect ) Ġand Ġif Ġwe Ġput Ġthe Ġpackets Ġin , ĊĠĠĠĠ Ġ* Ġfor Ġexample , Ġa Ġqueue , Ġwe 'd Ġstill Ġhave Ġto Ġfire Ġsome Ġtrigger Ġfor Ġsomething Ġto Ġcome ĊĠĠĠĠ Ġ* Ġin Ġand Ġread Ġthem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġsend ( buf : ĠByteArray , Ġoff : ĠInt , Ġlength : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThe Ġbuf Ġcoming Ġfrom Ġhere Ġwill Ġbelong Ġto Ġus rs ctp , Ġso Ġmake Ġsure Ġwe Ġcopy ĊĠĠĠĠĠĠĠ Ġ// Ġinto Ġa Ġbuffer Ġof Ġour Ġown Ġbefore Ġforwarding . ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : Ġthe Ġreason Ġwe Ġhave Ġto Ġcopy Ġinto Ġour Ġown Ġbefore Ġbefore Ġforwarding ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġthat Ġthis Ġpacket Ġwill Ġend Ġup Ġin Ġthe Ġsame Ġplace Ġas Ġa Ġpacket Ġthat ĊĠĠĠĠĠĠĠ Ġ// Ġcame Ġfrom Ġthe Ġpool Ġwhich Ġhas Ġto Ġbe Ġreturned . Ġ ĠSince Ġwe Ġcan 't Ġtell Ġif ĊĠĠĠĠĠĠĠ Ġ// Ġa Ġbuffer Ġcame Ġfrom Ġthe Ġpool Ġor Ġnot , Ġwe 'll Ġneed Ġto Ġalways Ġreturn Ġit . ĊĠĠĠĠĠĠĠ Ġval Ġnew Buf Ġ= ĠBuffer Pool . get Buffer ( length ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( buf , Ġoff , Ġnew Buf , Ġ 0 , Ġlength ) ĊĠĠĠĠĠĠĠ Ġval Ġpacket Ġ= ĠPacket Info ( Un parsed Packet ( new Buf , Ġ 0 , Ġlength )) ĊĠĠĠĠĠĠĠ Ġon Outgoing Protocol Data ( listOf ( packet )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetNode Stats (): ĠNode Stats Block Ġ= ĠNode Stats Block (" D tls Stack "). apply Ġ{ ĊĠĠĠĠĠĠĠ Ġadd Block ( Node Stats Block (" local Fingerprint "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd String ( certificate Info . local Fingerprint Hash Function , Ġcertificate Info . local Fingerprint ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġadd Block ( Node Stats Block (" remote Fingerprint s "). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Fingerprint s . forEach Ġ{ Ġ( hash , Ġfp ) Ġ-> Ġadd String ( hash , Ġfp ) Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġadd String (" role ", Ġ( role ?. java Class Ġ?: Ġ" null "). toString ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠBecause Ġgenerating Ġthe Ġcertificate Info Ġcan Ġbe Ġexpensive , Ġwe Ġgenerate Ġa Ġsingle ĊĠĠĠĠĠĠĠĠ Ġ* Ġone Ġto Ġbe Ġused Ġeverywhere Ġwhich Ġexpires Ġin Ġ 2 4 Ġhours Ġ( when Ġwe 'll Ġgenerate ĊĠĠĠĠĠĠĠĠ Ġ* Ġanother Ġone ). ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsync Root : ĠAny Ġ= ĠAny () ĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġcertificate Info : ĠCertificate Info Ġ= ĠD tls Utils . generate Certificate Info () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= Ġsynchronized ( sync Root ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpiration Period Ms Ġ= ĠDuration . of Days ( 1 ). to Millis () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( field . creation Timestamp Ms Ġ+ Ġexpiration Period Ms Ġ< ĠSystem . currentTimeMillis ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġavoid Ġcreating Ġour Ġown Ġthread ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread Ġ{ Ġfield Ġ= ĠD tls Utils . generate Certificate Info () Ġ}. start () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ