package Ġcom . r 3 . cord a . lib . ci Ċ Ċ import Ġco . parallel universe . fib ers . Suspend able Ċ import Ġnet . cord a . core . contracts . Unique Identifier Ċ import Ġnet . cord a . core . crypto . Secure Hash Ċ import Ġnet . cord a . core . flows . Flow Exception Ċ import Ġnet . cord a . core . flows . Flow Logic Ċ import Ġnet . cord a . core . flows . Flow Session Ċ import Ġnet . cord a . core . identity . Anonymous Party Ċ import Ġnet . cord a . core . identity . Party Ċ import Ġnet . cord a . core . serialization . deserialize Ċ import Ġnet . cord a . core . utilities . Progress Tracker Ċ import Ġnet . cord a . core . utilities . unwrap Ċ import Ġjava . security . PublicKey Ċ import Ġjava . util .* Ċ Ċ /** Ċ Ġ* ĠThis Ġflow Ġregisters Ġa Ġmapping Ġin Ġthe Ġ[ net . cord a . core . node . services . Identity Service ] Ġbetween Ġa Ġ[ PublicKey ] Ġand Ġa Ċ Ġ* Ġ[ Party ]. ĠIt Ġcan Ġgenerate Ġa Ġnew Ġkey Ġpair Ġfor Ġa Ġgiven Ġ[ UUID ] Ġand Ġregister Ġthe Ġnew Ġkey Ġmapping , Ġor Ġa Ġknown Ġ[ PublicKey ] Ċ Ġ* Ġcan Ġbe Ġsupplied Ġto Ġthe Ġflow Ġwhich Ġwill Ġregister Ġa Ġmapping Ġbetween Ġthis Ġkey Ġand Ġthe Ġrequesting Ġparty . Ċ Ġ* Ċ Ġ* ĠThe Ġgeneration Ġof Ġthe Ġ[ Signed Key For Account ] Ġis Ġdeleg ated Ġto Ġthe Ġcounter - party Ġwhich Ġconcaten ates Ġthe Ġoriginal Ċ Ġ* Ġ[ Challenge Response ] Ġwith Ġits Ġown Ġ[ Challenge Response ] Ġand Ġsigns Ġover Ġthe Ġconcaten ated Ġhash Ġbefore Ġsending Ġthis Ġvalue Ċ Ġ* Ġand Ġthe Ġ[ PublicKey ] Ġand Ġsends Ġit Ġback Ġto Ġthe Ġrequesting Ġnode . Ċ Ġ* Ċ Ġ* ĠThe Ġrequesting Ġnode Ġverifies Ġthe Ġsignature Ġon Ġthe Ġ[ Challenge Response ] Ġand Ġverifies Ġthe Ġconcaten ated Ċ Ġ* Ġ[ Challenge Response ] Ġis Ġthe Ġsame Ġas Ġthe Ġone Ġreceived Ġfrom Ġthe Ġcounter - party . Ċ Ġ* Ċ Ġ* Ġ@ property Ġsession Ġthe Ġsession Ġof Ġthe Ġnode Ġto Ġrequest Ġa Ġnew Ġkey Ġfrom Ċ Ġ* Ġ@ property Ġuuid Ġthe ĠaccountId / external Id Ġfor Ġthe Ġother Ġnode Ġto Ġgenerate Ġa Ġnew Ġkey Ġfor Ċ Ġ* Ġ@ property Ġkey Ġan Ġexisting Ġkey Ġa Ġproof Ġis Ġbeing Ġrequested Ġfor Ġ( this Ġis Ġusually Ġnull ) Ċ Ġ*/ Ċ class ĠRequest Key Flow Ċ private Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsession : ĠFlow Session , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġuuid : ĠUUID ?, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkey : ĠPublicKey ?) Ġ: ĠFlow Logic < Anonymous Party >() Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġrequesting Ġa Ġnew Ġkey Ġfrom Ġa Ġcounter - party Ġand Ġhave Ġthat Ġcounter - party Ġassign Ġit Ġto Ġa Ġspecified Ġaccount . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsession Ġexisting Ġflow Ġsession Ġfor Ġthe Ġcounter party ĊĠĠĠĠ Ġ* Ġ@ param Ġuuid Ġaccount Ġid Ġfor Ġthe Ġaccount Ġhosted Ġon Ġthe Ġcounter party Ġnode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( session : ĠFlow Session , Ġuuid : ĠUUID ) Ġ: Ġthis ( session , Ġuuid , Ġnull ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġrequesting Ġan Ġownership Ġclaim Ġthat Ġthe Ġspecified Ġpublic Ġkey Ġwas Ġgenerated Ġby Ġthe Ġnode Ġcorresponding Ġto Ġthe ĊĠĠĠĠ Ġ* Ġsupplied Ġflow Ġsession . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsession Ġexisting Ġflow Ġsession Ġfor Ġthe Ġcounter party ĊĠĠĠĠ Ġ* Ġ@ param Ġkey Ġthe Ġpublic Ġkey Ġto Ġrequest Ġan Ġownership Ġclaim Ġfor ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( session : ĠFlow Session , Ġkey : ĠPublicKey ) Ġ: Ġthis ( session , ĠUnique Identifier (). id , Ġkey ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġrequesting Ġa Ġnew Ġkey Ġfrom Ġa Ġcounter - party . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġsession Ġexisting Ġflow Ġsession Ġfor Ġthe Ġcounter party ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġconstructor ( session : ĠFlow Session ) Ġ: Ġthis ( session , Ġnull , Ġnull ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġobject ĠREQUEST ING _ KEY Ġ: ĠProgress Tracker . Step (" Request ing Ġa Ġpublic Ġkey ") ĊĠĠĠĠĠĠĠ Ġobject ĠVERIFY ING _ KEY Ġ: ĠProgress Tracker . Step (" Verify ing Ġcounter party 's Ġsignature ") ĊĠĠĠĠĠĠĠ Ġobject ĠKEY _ VER IFI ED Ġ: ĠProgress Tracker . Step (" Signature Ġis Ġcorrect ") ĊĠĠĠĠĠĠĠ Ġobject ĠVERIFY ING _ CH ALL EN GE _ RESPONSE Ġ: ĠProgress Tracker . Step (" Verify ing Ġthe Ġreceived ĠSHA - 2 5 6 Ġmatches Ġthe Ġoriginal Ġthat Ġwas Ġsent ") ĊĠĠĠĠĠĠĠ Ġobject ĠCH ALL EN GE _ RESPONSE _ VER IFI ED Ġ: ĠProgress Tracker . Step (" SHA - 2 5 6 Ġis Ġcorrect ") ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġtracker (): ĠProgress Tracker Ġ= ĠProgress Tracker ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠREQUEST ING _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERIFY ING _ KEY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠKEY _ VER IFI ED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠVERIFY ING _ CH ALL EN GE _ RESPONSE , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCH ALL EN GE _ RESPONSE _ VER IFI ED ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġprogress Tracker Ġ= Ġtracker () ĊĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġ@ Throws ( Flow Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠAn onymous Party Ġ{ ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠREQUEST ING _ KEY ĊĠĠĠĠĠĠĠ Ġval Ġchallenge Response Param Ġ= ĠSecure Hash . random SHA 2 5 6 () ĊĠĠĠĠĠĠĠ Ġ// ĠHandle Ġwhether Ġa Ġkey Ġis Ġalready Ġspecified Ġor Ġnot Ġand Ġwhether Ġa ĠUUID Ġis Ġspecified , Ġor Ġnot . ĊĠĠĠĠĠĠĠ Ġval Ġrequest Key Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ== Ġnull Ġ&& Ġuuid Ġ!= Ġnull Ġ-> ĠRequest Key For UUID ( challenge Response Param , Ġuuid ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ!= Ġnull Ġ-> ĠRequest For Known Key ( challenge Response Param , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠRequest Fresh Key ( challenge Response Param ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠEither Ġget Ġback Ġa Ġsigned Ġkey Ġor Ġa Ġflow Ġexception Ġis Ġthrown . ĊĠĠĠĠĠĠĠ Ġval Ġsigned Key For Account Ġ= Ġsession . send And Receive < Signed Key For Account >( request Key ). unwrap Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġneed Ġto Ġverify Ġthe Ġsignature Ġof Ġthe Ġresponse Ġand Ġcheck Ġthat Ġthe Ġpayload Ġis Ġequal Ġto Ġwhat Ġwe Ġexpect . ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠVERIFY ING _ KEY ĊĠĠĠĠĠĠĠ Ġverify Signed Challenge Response Signature ( signed Key For Account ) ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠKEY _ VER IFI ED ĊĠĠĠĠĠĠĠ Ġ// ĠEnsure Ġthe Ġhash Ġof Ġboth Ġchallenge Ġresponse Ġparameters Ġmatches Ġthe Ġreceived Ġhashed Ġfunction ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠVERIFY ING _ CH ALL EN GE _ RESPONSE ĊĠĠĠĠĠĠĠ Ġval Ġadditional Param Ġ= Ġsigned Key For Account . additional Challenge Response Param ĊĠĠĠĠĠĠĠ Ġval Ġresult Of Has hed Parameters Ġ= Ġchallenge Response Param . hash Concat ( additional Param ) ĊĠĠĠĠĠĠĠ Ġrequire ( result Of Has hed Parameters Ġ== Ġsigned Key For Account . signed Challenge Response . raw . deserialize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Challenge Ġresponse Ġinvalid " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprogress Tracker . current Step Ġ= ĠCH ALL EN GE _ RESPONSE _ VER IFI ED ĊĠĠĠĠĠĠĠ Ġ// ĠFlow Ġsessions Ġcan Ġonly Ġbe Ġopened Ġwith Ġparties Ġin Ġthe Ġnetwork Map Cache Ġso Ġwe Ġcan Ġbe Ġass ured Ġthis Ġis Ġa Ġvalid Ġparty ĊĠĠĠĠĠĠĠ Ġval Ġcounter Party Ġ= Ġsession . counter party ĊĠĠĠĠĠĠĠ Ġval Ġnew Key Ġ= Ġsigned Key For Account . publicKey ĊĠĠĠĠĠĠĠ Ġ// ĠStore Ġa Ġmapping Ġof Ġthe Ġkey Ġto Ġthe Ġx 5 0 0 Ġname ĊĠĠĠĠĠĠĠ Ġservice Hub . identity Service . register Key ( new Key , Ġcounter Party , Ġuuid ) ĊĠĠĠĠĠĠĠ Ġreturn ĠAn onymous Party ( new Key ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRes pon der Ġflow Ġto Ġ[ Request Key Flow ]. Ċ Ġ*/ Ċ class ĠProvide Key Flow ( private Ġval Ġother Session : ĠFlow Session ) Ġ: ĠFlow Logic < Anonymous Party >() Ġ{ ĊĠĠĠ Ġ@ Suspend able ĊĠĠĠ Ġoverride Ġfun Ġcall (): ĠAn onymous Party Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= Ġother Session . receive < Send Request ForKey Mapping >(). unwrap Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġwhen Ġ( request ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest Key For UUID Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Key Ġ= Ġcreate Signed Ownership Claim From UUID ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub Ġ= Ġservice Hub , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge Response Param Ġ= Ġrequest . challenge Response Param , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuuid Ġ= Ġrequest . external Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Session . send ( signed Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġcall ĠRegister Key Ġas Ġit 's Ġdone Ġby Ġcreate Signed Ownership Claim From UUID . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsigned Key . publicKey ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest For Known Key Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Key Ġ= Ġcreate Signed Ownership Claim From Known Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub Ġ= Ġservice Hub , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge Response Param Ġ= Ġrequest . challenge Response Param , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Key Ġ= Ġrequest . known Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Session . send ( signed Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDouble Ġcheck Ġthat Ġthe Ġkey Ġhas Ġnot Ġalready Ġbeen Ġregistered Ġto Ġanother Ġnode . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub . identity Service . register Key ( request . known Key , Ġour Identity ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠFlow Exception (" Could Ġnot Ġregister Ġa Ġnew Ġkey Ġfor Ġparty : Ġ$ our Identity Ġas Ġthe Ġprovided Ġpublic Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" key Ġis Ġalready Ġregistered Ġor Ġregistered Ġto Ġa Ġdifferent Ġparty .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest . known Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠRequest Fresh Key Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġneed Ġto Ġcall ĠRegister Key Ġas Ġit 's Ġdone Ġby Ġkey Management Service . fresh Key . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Key Ġ= Ġservice Hub . key Management Service . fresh Key () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsigned Key Ġ= Ġcreate Signed Ownership Claim From Known Key ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġservice Hub Ġ= Ġservice Hub , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchallenge Response Param Ġ= Ġrequest . challenge Response Param , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġknown Key Ġ= Ġnew Key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġother Session . send ( signed Key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Key ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAn onymous Party ( key ) ĊĠĠĠ Ġ} Ċ } Ċ