package Ġio . particle . mesh . setup . connection ĊĊ Ċ import Ġandroidx . annotation . MainThread Ċ import Ġio . particle . mesh . bluetooth . Packet MT US plit ter Ċ import Ġio . particle . mesh . bluetooth . connecting . Bluetooth Connection Ċ import Ġio . particle . mesh . common . QA Tool Ċ import Ġio . particle . mesh . setup . connection . security . Security Manager Ċ import Ġio . particle . mesh . setup . flow . Scopes Ċ import Ġmu . Kotlin Logging ĊĊ Ċ private Ġconst Ġval ĠFULL _ PROTOCOL _ HEADER _ SIZE Ġ= Ġ 6 Ċ private Ġconst Ġval ĠAES _ CC M _ MAC _ SIZE Ġ= Ġ 8 ĊĊ Ċ class ĠProtocol Trans ceiver Factory ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsecurity Manager : ĠSecurity Manager Ċ ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ@ MainThread ĊĠĠĠ Ġsuspend Ġfun Ġbuild Protocol Trans ceiver ( ĊĠĠĠĠĠĠĠ Ġdevice Connection : ĠBluetooth Connection , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġconnection Scopes : ĠS copes , ĊĠĠĠĠĠĠĠ Ġjp ake Low Entropy Password : ĠString , ĊĠĠĠĠĠĠĠ Ġsetup Context Scopes : ĠS copes ĊĠĠĠ Ġ): ĠProtocol Trans ceiver ? Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpacket MT US plit ter Ġ= ĠPacket MT US plit ter ({ Ġpacket Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Connection . packet Send Channel . offer ( packet ) ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠ Ġval Ġframe Writer Ġ= ĠOut bound Frame Writer Ġ{ Ġpacket MT US plit ter . split Into Packets ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġframe Reader Ġ= ĠIn bound Frame Reader ( connection Scopes ) ĊĊĠĠĠĠĠĠĠ Ġconnection Scopes . on Worker Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( packet Ġin Ġdevice Connection . packet Receive Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQA Tool . run S af ely ({ Ġframe Reader . receive Packet ( B le Packet ( packet )) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Creating Ġconnection Ġcrypto Ġdelegate " Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcrypto Delegate Ġ= Ġsecurity Manager . create Crypto Delegate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjp ake Low Entropy Password , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Writer , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġframe Reader ĊĠĠĠĠĠĠĠ Ġ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġframe Reader . crypto Delegate Ġ= Ġcrypto Delegate ĊĠĠĠĠĠĠĠ Ġframe Writer . crypto Delegate Ġ= Ġcrypto Delegate ĊĊĠĠĠĠĠĠĠ Ġ// Ġnow Ġthat Ġwe 've Ġpassed Ġthe Ġsecurity Ġhandshake , Ġset Ġthe Ġcorrect Ġnumber Ġof Ġbytes Ġto Ġassume ĊĠĠĠĠĠĠĠ Ġ// Ġfor Ġthe Ġmessage Ġheaders ĊĠĠĠĠĠĠĠ Ġframe Reader . extra Header Bytes Ġ= ĠFULL _ PROTOCOL _ HEADER _ SIZE Ġ+ ĠAES _ CC M _ MAC _ SIZE ĊĊĠĠĠĠĠĠĠ Ġval Ġrequest Writer Ġ= ĠRequest Writer Ġ{ Ġframe Writer . write Frame ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġrequest Sender Ġ= ĠProtocol Trans ceiver ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Writer , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdevice Connection , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection Scopes , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsetup Context Scopes ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġresponse Reader Ġ= ĠResponse Reader Ġ{ Ġrequest Sender . receive Response ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġconnection Scopes . on Worker Ġ Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( inbound Frame Ġin Ġframe Reader . inbound Frame Channel ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠQA Tool . run S af ely ({ Ġresponse Reader . receive Response Frame ( inbound Frame ) Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġrequest Sender ĊĠĠĠ Ġ} Ċ Ċ } Ċ