/* Ċ Ġ* ĠLicensed Ġto Ġthe ĠApache ĠSoftware ĠFoundation Ġ( ASF ) Ġunder Ġone Ġor Ġmore Ċ Ġ* Ġcontributor Ġlicense Ġagreements . Ġ ĠSee Ġthe ĠNOTICE Ġfile Ġdistributed Ġwith Ċ Ġ* Ġthis Ġwork Ġfor Ġadditional Ġinformation Ġregarding Ġcopyright Ġownership . Ċ Ġ* ĠThe ĠASF Ġlicenses Ġthis Ġfile Ġto ĠYou Ġ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 . apache . tu w eni . dev p 2 p . v 5 . topic Ċ Ċ import Ġorg . apache . tu w eni . bytes . Bytes Ċ import Ġorg . apache . tu w eni . dev p 2 p . v 5 . encrypt . AES 1 2 8 GCM Ċ import Ġorg . apache . tu w eni . rl p . RLP Ċ import Ġjava . net . Inet Address Ċ Ċ data Ġclass ĠTicket ( ĊĠ Ġval Ġtopic : ĠBytes , ĊĠ Ġval Ġsrc NodeId : ĠBytes , ĊĠ Ġval Ġsrc Ip : ĠInet Address , ĊĠ Ġval Ġrequest Time : ĠLong , ĊĠ Ġval Ġwait Time : ĠLong , ĊĠ Ġval Ġcum Time : ĠLong Ċ ) Ġ{ ĊĊĠ Ġfun Ġencode (): ĠBytes Ġ{ ĊĠĠĠ Ġreturn ĠR LP . encode List Ġ{ Ġwriter Ġ-> ĊĠĠĠĠĠ Ġwriter . writeValue ( topic ) ĊĠĠĠĠĠ Ġwriter . writeValue ( src NodeId ) ĊĠĠĠĠĠ Ġwriter . writeValue ( Bytes . wrap ( src Ip . address )) ĊĠĠĠĠĠ Ġwriter . write Long ( request Time ) ĊĠĠĠĠĠ Ġwriter . write Long ( wait Time ) ĊĠĠĠĠĠ Ġwriter . write Long ( cum Time ) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun Ġencrypt ( key : ĠBytes ): ĠBytes Ġ{ ĊĠĠĠ Ġval Ġticket Bytes Ġ= Ġencode () ĊĠĠĠ Ġreturn ĠAES 1 2 8 GCM . encrypt ( key , ĠBytes . wrap ( ByteArray ( ZERO _ NON CE _ SIZE )), Ġticket Bytes , ĠBytes . EMPTY ) ĊĠ Ġ} ĊĊĠ Ġfun Ġvalidate ( ĊĠĠĠ Ġsrc NodeId : ĠBytes , ĊĠĠĠ Ġsrc Ip : ĠInet Address , ĊĠĠĠ Ġnow : ĠLong , ĊĠĠĠ Ġtopic : ĠBytes ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġrequire ( this . src NodeId Ġ== Ġsrc NodeId ) Ġ{ ĠT ICK ET _ INVALID _ MSG Ġ} ĊĠĠĠ Ġrequire ( this . src Ip Ġ== Ġsrc Ip ) Ġ{ ĠT ICK ET _ INVALID _ MSG Ġ} ĊĠĠĠ Ġrequire ( this . topic Ġ== Ġtopic ) Ġ{ ĠT ICK ET _ INVALID _ MSG Ġ} ĊĠĠĠ Ġval Ġwindow Start Ġ= Ġthis . request Time Ġ+ Ġthis . wait Time ĊĠĠĠ Ġrequire ( now Ġ>= Ġwindow Start Ġ&& Ġnow Ġ<= Ġwindow Start Ġ+ ĠTIME _ WINDOW _ MS ) Ġ{ ĠT ICK ET _ INVALID _ MSG Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġconst Ġval ĠZERO _ NON CE _ SIZE : ĠInt Ġ= Ġ 1 2 ĊĠĠĠ Ġinternal Ġconst Ġval ĠTIME _ WINDOW _ MS : ĠInt Ġ= Ġ 1 0 0 0 0 Ġ// Ġ 1 0 Ġseconds ĊĠĠĠ Ġinternal Ġconst Ġval ĠT ICK ET _ INVALID _ MSG Ġ= Ġ" Ticket Ġis Ġinvalid " ĊĊĠĠĠ Ġfun Ġcreate ( content : ĠBytes ): ĠTicket Ġ{ ĊĠĠĠĠĠ Ġreturn ĠR LP . decode List ( content ) Ġ{ Ġreader Ġ-> ĊĠĠĠĠĠĠĠ Ġval Ġtopic Ġ= Ġreader . readValue () ĊĠĠĠĠĠĠĠ Ġval Ġsrc NodeId Ġ= Ġreader . readValue () ĊĠĠĠĠĠĠĠ Ġval Ġsrc Ip Ġ= ĠInet Address . getBy Address ( reader . readValue (). toArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġrequest Time Ġ= Ġreader . read Long () ĊĠĠĠĠĠĠĠ Ġval Ġwait Time Ġ= Ġreader . read Long () ĊĠĠĠĠĠĠĠ Ġval Ġcum Time Ġ= Ġreader . read Long () ĊĠĠĠĠĠĠĠ Ġreturn @ decode List ĠTicket ( topic , Ġsrc NodeId , Ġsrc Ip , Ġrequest Time , Ġwait Time , Ġcum Time ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt ( encrypted : ĠBytes , Ġkey : ĠBytes ): ĠTicket Ġ{ ĊĠĠĠĠĠ Ġval Ġdecrypted Ġ= ĠAES 1 2 8 GCM . decrypt ( encrypted , Ġkey , ĠBytes . EMPTY ) ĊĠĠĠĠĠ Ġreturn Ġcreate ( de crypted ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ