package Ġio . lib p 2 p . security . plaintext Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġcrypto . pb . Crypto Ċ import Ġio . lib p 2 p . core . Connection Closed Exception Ċ import Ġio . lib p 2 p . core . P 2 P Channel Ċ import Ġio . lib p 2 p . core . Peer Id Ċ import Ġio . lib p 2 p . core . crypto . Priv Key Ċ import Ġio . lib p 2 p . core . crypto . PubKey Ċ import Ġio . lib p 2 p . core . crypto . un marshal PublicKey Ċ import Ġio . lib p 2 p . core . mult istream . Protocol Descriptor Ċ import Ġio . lib p 2 p . core . security . Secure Channel Ċ import Ġio . lib p 2 p . etc . types . to Protobuf Ċ import Ġio . lib p 2 p . security . Invalid Initial Packet Ċ import Ġio . lib p 2 p . security . Invalid Remote PubKey Ċ import Ġio . netty . buffer . Byte Buf Ċ import Ġio . netty . buffer . Un p ooled Ċ import Ġio . netty . channel . Channel HandlerContext Ċ import Ġio . netty . channel . Simple Channel Inbound Handler Ċ import Ġio . netty . handler . codec . Length Field Based Frame Decoder Ċ import Ġio . netty . handler . codec . Length Field Prep ender Ċ import Ġplaintext . pb . Pl aintext Ċ import Ġjava . util . concurrent . Comp letableFuture Ċ Ċ class ĠPl aintext In secure Channel ( private Ġval Ġlocal Key : ĠPriv Key ) Ġ: ĠSecure Channel Ġ{ ĊĠĠĠ Ġoverride Ġval Ġprotocol Descriptor Ġ= ĠProtocol Descriptor ("/ plaintext / 2 . 0 . 0 ") ĊĊĠĠĠ Ġoverride Ġfun Ġinit Channel ( ch : ĠP 2 P Channel , Ġselected Protocol : ĠString ): ĠCompletableFuture < out ĠSecure Channel . Session > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhandshake Completed Ġ= ĠCompletableFuture < Secure Channel . Session >() ĊĊĠĠĠĠĠĠĠ Ġval Ġhand sh aker Ġ= ĠPl aintext Handshake Handler ( handshake Completed , Ġlocal Key ) ĊĠĠĠĠĠĠĠ ĠlistOf ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLength Field Prep ender ( 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLength Field Based Frame Decoder ( Integer . MAX _ VALUE , Ġ 0 , Ġ 4 , Ġ 0 , Ġ 4 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhand sh aker ĊĠĠĠĠĠĠĠ Ġ). forEach Ġ{ Ġch . push Handler ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġhandshake Completed ĊĠĠĠ Ġ} Ċ } Ġ// ĠPl aintext In secure Channel Ċ Ċ class ĠPl aintext Handshake Handler ( ĊĠĠĠ Ġprivate Ġval Ġhandshake Completed : ĠCompletableFuture < Secure Channel . Session >, ĊĠĠĠ Ġlocal Key : ĠPriv Key Ċ ) Ġ: ĠSimple Channel Inbound Handler < Byte Buf >() Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlocal PubKey Ġ= Ġlocal Key . publicKey () ĊĠĠĠ Ġprivate Ġval Ġlocal Peer Id Ġ= ĠPeer Id . from PubKey ( local PubKey ) ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremote PubKey : ĠPub Key ĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġremote Peer Id : ĠPeer Id ĊĊĠĠĠ Ġprivate Ġvar Ġactive Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġread Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Active ( ctx : ĠChannel HandlerContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( active ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġactive Ġ= Ġtrue ĊĊĠĠĠĠĠĠĠ Ġval Ġpub Key Msg Ġ= ĠCrypto . PublicKey . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setType ( local PubKey . key Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setData ( ByteString . copyFrom ( local PubKey . raw ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġexchange Msg Ġ= ĠPl aintext . Exchange . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. setId ( local Peer Id . bytes . to Protobuf ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Pub key ( pub Key Msg ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠĠĠĠĠ Ġval Ġbyte Buf Ġ= ĠUn p ooled . buffer (). write Bytes ( exchange Msg . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġctx . write And Flush ( byte Buf ) ĊĊĠĠĠĠĠĠĠ Ġhandshake Completed ( ctx ) ĊĠĠĠ Ġ} Ġ// Ġchannel Active ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Read 0 ( ctx : ĠChannel HandlerContext , Ġmsg : ĠByte Buf ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( read ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġread Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġval Ġexchange Recv Ġ= ĠPl aintext . Exchange . parser (). parseFrom ( msg . nio Buffer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠInvalid Initial Packet () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! exchange Recv . has Pub key ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Remote PubKey () ĊĊĠĠĠĠĠĠĠ Ġremote Peer Id Ġ= ĠPeer Id ( exchange Recv . id . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġremote PubKey Ġ= Ġunmarshal PublicKey ( exchange Recv . pubkey . toByteArray ()) ĊĠĠĠĠĠĠĠ Ġval Ġcalculated Peer Id Ġ= ĠPeer Id . from PubKey ( remote PubKey ) ĊĠĠĠĠĠĠĠ Ġif Ġ( remote Peer Id Ġ!= Ġcalculated Peer Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Remote PubKey () ĊĊĠĠĠĠĠĠĠ Ġhandshake Completed ( ctx ) ĊĠĠĠ Ġ} Ġ// Ġchannel Read 0 ĊĊĠĠĠ Ġoverride Ġfun Ġexception Ca ught ( ctx : ĠChannel HandlerContext , Ġcause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandshake Failed ( cause ) ĊĠĠĠĠĠĠĠ Ġctx . channel (). close () ĊĠĠĠ Ġ} Ġ// Ġexception Ca ught ĊĊĠĠĠ Ġoverride Ġfun Ġchannel Un registered ( ctx : ĠChannel HandlerContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandshake Failed ( Connection Closed Exception (" Connection Ġwas Ġclosed Ġ${ ctx . channel ()} ")) ĊĠĠĠĠĠĠĠ Ġsuper . channel Un registered ( ctx ) ĊĠĠĠ Ġ} Ġ// Ġchannel Un registered ĊĊĠĠĠ Ġprivate Ġfun Ġhandshake Completed ( ctx : ĠChannel HandlerContext ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! active Ġ|| Ġ! read ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġsession Ġ= ĠSecure Channel . Session ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocal Peer Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote Peer Id , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġremote PubKey ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġhandshake Completed . complete ( session ) ĊĠĠĠĠĠĠĠ Ġctx . pipeline (). remove ( this ) ĊĠĠĠĠĠĠĠ Ġctx . fire Channel Active () ĊĠĠĠ Ġ} Ġ// Ġhandshake Complete ĊĊĠĠĠ Ġprivate Ġfun Ġhandshake Failed ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠ Ġhandshake Completed . complete Exception ally ( cause ) ĊĠĠĠ Ġ} Ġ// Ġhandshake Failed Ċ } Ġ// ĠPl aintext Handshake Handler Ċ