/* Ċ Ġ* ĠCopyright ĠIBM ĠCorp . ĠAll ĠRights ĠReserved . Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ġ*/ Ċ Ċ package Ġcom . we aver . cord a . app . interop . flows Ċ Ċ import Ġarrow . core . Either Ċ import Ġarrow . core . Left Ċ import Ġarrow . core . Right Ċ import Ġarrow . core . flatMap Ċ import Ġcom . we aver . cord a . app . interop . states . Member Ċ import Ġcom . we aver . cord a . app . interop . states . Membership State Ċ import Ġjava . security . cert . X 5 0 9 Certificate Ċ import Ġjava . time . LocalDateTime Ċ import Ġjava . time . Zone Id Ċ Ċ /** Ċ Ġ* ĠThe Ġis Certificate Within Expiry Ġfunction Ġchecks Ġwhether Ġthe Ġprovided Ġcertificate Ġis Ġwithin Ġits Ġvalidity Ġperiod . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcertificate ĠThe ĠX 5 0 9 Ġcertificate . Ċ Ġ* Ġ@ return ĠReturns Ġan ĠEither Ġwith Ġan ĠError Ġif Ġthe Ġcertificate Ġis Ġnot Ġwithin Ġits Ġvalidity Ġperiod , Ġor Ġtrue . Ċ Ġ*/ Ċ fun Ġis Certificate Within Expiry ( certificate : ĠX 5 0 9 Certificate ): ĠEither < Error , ĠX 5 0 9 Certificate > Ġ= Ġtry Ġ{ ĊĠĠĠ Ġval Ġcurrent Date Ġ= ĠLocalDateTime . now () ĊĠĠĠ Ġval Ġcert Not Before Date Ġ= Ġcertificate . not Before . to Instant () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. at Zone ( Zone Id . system Default ()). to LocalDateTime () ĊĠĠĠ Ġval Ġcert Not After Date Ġ= Ġcertificate . not After . to Instant () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. at Zone ( Zone Id . system Default ()). to LocalDateTime () ĊĠĠĠ Ġif Ġ(! Ġ( current Date Ġ> Ġcert Not Before Date Ġ&& Ġcurrent Date Ġ< Ġcert Not After Date )) Ġ{ ĊĠĠĠĠĠĠĠ Ġprintln (" Verification ĠError : ĠCertificate Ġvalid Ġbetween Ġ$ cert Not Before Date Ġand Ġ$ cert Not After Date .\ n ") ĊĠĠĠĠĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠCertificate Ġis Ġout Ġof Ġdate ")) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ ĠRight ( certificate ) ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġprintln (" Error Ġvalidating Ġthat Ġcertificate Ġis Ġwithin Ġits Ġvalidity Ġperiod : Ġ${ e . message }. \ n ") ĊĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠCertificate Ġis Ġout Ġof Ġdate : Ġ${ e . message } ")) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġverify Ca Certificate Ġfunction Ġis Ġused Ġto Ġverify Ġthe Ġidentity Ġof Ġan Ġexternal Ġentity Ġwhen Ġthe Ċ Ġ* Ġcorresponding Ġ[ Member ] Ġfor Ġthe Ġentity Ġin Ġits Ġ[ Membership State ] Ġis Ġrepresented Ġby Ġa Ġcertificate Ġauthority . Ċ Ġ* Ċ Ġ* ĠThe Ġcertificate Ġauthority Ġmember Ġvalidation Ġtype Ġallows Ġfor Ġany Ġuser Ġor Ġapplication Ġin Ġthe Ġexternal Ċ Ġ* Ġentity Ġto Ġbe Ġidentified Ġas Ġa Ġvalid Ġmember Ġof Ġthe Ġmembership Ġas Ġalong Ġas Ġthe Ġcertificate Ġpresented Ċ Ġ* Ġwas Ġissued Ġby Ġthe Ġmember 's ĠCA . Ċ Ġ* Ċ Ġ* Ġ@ param Ġrequest er Certificate ĠThe ĠX 5 0 9 Ġcertificate Ġof Ġthe Ġrequest er . Ċ Ġ* Ġ@ param Ġmember CAC ert String ĠThe Ġcertificate Ġstring Ġof Ġthe Ġmember 's ĠCA . Ċ Ġ* Ġ@ return ĠReturns Ġan ĠEither Ġwith Ġan ĠError Ġif Ġthe Ġrequest er 's Ġcertificate Ġwas Ġnot Ġissued Ġby Ġthe Ġmember 's ĠCA , Ċ Ġ* Ġor Ġif Ġan Ġexception Ġwas Ġthrown . ĠWill Ġreturn Ġtrue Ġif Ġthe Ġverification Ġwas Ġsuccessful . Ċ Ġ*/ Ċ fun Ġverify Ca Certificate ( ĊĠĠĠĠĠĠĠ Ġrequest er Certificate : ĠX 5 0 9 Certificate , ĊĠĠĠĠĠĠĠ Ġmember CAC ert String : ĠString ): ĠEither < Error , ĠUnit > Ġ= Ġtry Ġ{ ĊĠĠĠ Ġprintln (" Verify ing Ġthe Ġcertificate Ġwas Ġissued Ġby Ġthe Ġmember 's Ġcertificate Ġauthority ") ĊĊĠĠĠ Ġget Certificate FromString ( member CAC ert String ). flatMap Ġ{ Ġmember CAC ertificate Ġ-> ĊĠĠĠĠĠĠĠ Ġis Certificate Within Expiry ( member CAC ertificate ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġrequest er 's Ġcertificate Ġwas Ġissued Ġby Ġthe Ġmember 's ĠCA ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( requester Certificate . issuer X 5 0 0 Principal Ġ!= Ġmember CAC ertificate . subject X 5 0 0 Principal ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Verification ĠError : ĠRequest er 's Ġcertificate Ġnot Ġissued Ġby Ġthe Ġmember 's ĠCA ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠRequest er 's Ġcertificate Ġnot Ġissued Ġby Ġthe Ġmember 's ĠCA ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthat Ġthe Ġiss uing Ġsignature Ġon Ġthe Ġrequest er 's Ġcertificate Ġis Ġvalid ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest er Certificate . verify ( member CAC ertificate . publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Verification Ġof Ġcertificate Ġaccording Ġto Ġthe Ġmember 's ĠCA Ġwas Ġsuccessful .\ n ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRight ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġprintln (" Error Ġverify ing Ġthe Ġcertificate Ġwas Ġissued Ġby Ġthe Ġmember 's ĠCA : Ġ${ e . message }\ n ") ĊĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠError Ġverify ing Ġthe Ġcertificate Ġwas Ġissued Ġby Ġthe Ġmember 's ĠCA : Ġ${ e . message } ")) Ċ } Ċ Ċ /** Ċ Ġ* ĠThe Ġverify Certificate Chain Ġfunction Ġis Ġused Ġto Ġverify Ġthe Ġidentity Ġof Ġan Ġexternal Ġentity Ġwhen Ġthe Ċ Ġ* Ġcorresponding Ġ[ Member ] Ġfor Ġthe Ġentity Ġin Ġits Ġ[ Membership State ] Ġcaptures Ġthe Ġcertificates Ġof Ġrequesting Ċ Ġ* Ġentities , Ġand Ġthe Ġcertificate Ġchain Ġup Ġto Ġthe Ġroot ĠCA . Ċ Ġ* Ċ Ġ* ĠThe Ġcertificate Ġmember Ġvalidation Ġtype Ġallows Ġfor Ġfine - gr ained Ġcontrol Ġof Ġa Ġsource Ġnetwork Ġon Ġwhich Ċ Ġ* Ġident ities Ġin Ġan Ġexternal Ġnetwork Ġthey Ġtrust . ĠTo Ġverify Ġident ities Ġusing Ġthis Ġvalidation Ġtype , Ġthe Ċ Ġ* Ġrequesting Ġcertificate Ġissuer Ġshould Ġbe Ġrepresented Ġby Ġthe Ġhead Ġof Ġthe Ġlist Ġof Ġcertificates Ġin Ġthe Ċ Ġ* Ġcertificate Ġchain . ĠThis Ġcertificate Ġshould Ġbe Ġissued Ġby Ġthe Ġnext Ġcertificate Ġin Ġthe Ġlist . ĠOnce Ġthe Ġlast Ċ Ġ* Ġelement Ġin Ġthe Ġlist Ġis Ġreached , Ġthe Ġlast Ġcertificate Ġin Ġthe Ġlist Ġshould Ġbe Ġthe Ġroot ĠCA , Ġand Ġshould Ġbe Ċ Ġ* Ġself - iss ued . Ċ Ġ* Ċ Ġ* Ġ@ param Ġcertificate ĠThe ĠX 5 0 9 Ġcertificate Ġof Ġthe Ġrequest er . Ċ Ġ* Ġ@ param Ġcertificate Chain ĠThe Ġchain Ġof Ġiss uing Ġcertificates . Ċ Ġ* Ġ@ return ĠReturns Ġan ĠEither Ġwith Ġan ĠError Ġif Ġthe Ġchain Ġof Ġcertificates Ġcould Ġnot Ġbe Ġverified , Ġor Ġtrue Ċ Ġ* Ġif Ġthe Ġverification Ġwas Ġsuccessful . Ċ Ġ*/ Ċ fun Ġverify Certificate Chain ( ĊĠĠĠĠĠĠĠ Ġcertificate : ĠX 5 0 9 Certificate , ĊĠĠĠĠĠĠĠ Ġcertificate Chain : ĠList < String >): ĠEither < Error , ĠUnit > Ġ= Ġtry Ġ{ ĊĠĠĠ Ġ// ĠIf Ġcertificate Chain Ġlist Ġis Ġempty Ġwe Ġshould Ġbe Ġat Ġthe Ġroot Ġcert Ġso Ġcheck Ġthat Ġthe Ġcertificate Ġis Ġself - signed ĊĠĠĠ Ġif Ġ( certificate Chain . isEmpty () Ġ&& Ġcertificate . subject X 5 0 0 Principal Ġ!= Ġcertificate . issuer X 5 0 0 Principal ) Ġ{ ĊĠĠĠĠĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠError Ġverify ing Ġcertificate Ġchain ")) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( certificate Chain . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠRight ( Unit ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcertificate Ġchain Ġis Ġnot Ġempty , Ġcheck Ġthe Ġcertificate Ġis Ġissued Ġby Ġthe Ġhead Ġof Ġthe Ġlist ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Certificate FromString ( certificate Chain . last ()). flatMap Ġ{ iss uing Certificate Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCheck Ġthe Ġiss uing Ġcert Ġis Ġwithin Ġits Ġexpiry ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Certificate Within Expiry ( iss uing Certificate ). flatMap Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcertificate . verify ( iss uing Certificate . publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġverify Certificate Chain ( iss uing Certificate , Ġcertificate Chain . drop Last ( 1 )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠ Ġprintln (" Error Ġverify ing Ġthe Ġcertificate Ġchain : Ġ${ e . message }") ĊĠĠĠ ĠLeft ( Error (" Verification ĠError : ĠError Ġverify ing Ġcertificate Ġchain : Ġ${ e . message } ")) Ċ } Ċ