package Ġio . pro venance . p 8 e . encryption . ec ies Ċ Ċ import Ġio . pro venance . p 8 e . encryption . util . External Key Cust ody Api Ċ import Ġio . pro venance . p 8 e . encryption . aes . Provenance AES Crypt Ċ import Ġio . pro venance . p 8 e . encryption . experimental . extensions . to Ag ree Key Ċ import Ġio . pro venance . p 8 e . encryption . experimental . extensions . to Transient Security Object Ċ import Ġio . pro venance . p 8 e . encryption . k df . Provenance HK DF SHA 2 5 6 Ċ import Ġio . pro venance . p 8 e . encryption . model . Key Providers . SM ART KEY Ċ import Ġio . pro venance . p 8 e . encryption . model . Key Ref Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . security . Invalid Key Exception Ċ import Ġjava . security . PublicKey Ċ import Ġjava . util . Arrays Ċ import Ġjavax . crypto . Bad Padding Exception Ċ import Ġjavax . crypto . Illegal BlockSize Exception Ċ Ċ object ĠPro venance E CI ES Cipher Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġlogger Ġ= ĠLoggerFactory . getLogger ( Provenance E CI ES Cipher :: class . java ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠEncrypt Ġdata Ġusing ĠE CI ES Ġwith Ġinstance Ġpublic Ġkey Ġand Ġadditional Ġinfo Ġfor ĠK DF Ġfunction . ĊĠĠĠĠ Ġ* Ġ@ param Ġdata ĠData Ġto Ġbe Ġencrypted . ĊĠĠĠĠ Ġ* Ġ@ return ĠPro venance E CI ES Crypto gram ĊĠĠĠĠ Ġ* Ġ@ throws ĠPro venance E CI ES Encrypt Exception ĠIn Ġcase Ġdata Ġencryption Ġfails Ġdue Ġto Ġinvalid Ġkey . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠIf ĠPro venance E CI ES Encrypt Ġhas Ġalready Ġbeen Ġused .. ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠIf ĠUnable Ġto Ġgenerate Ġan Ġep hemeral Ġkey Ġpair ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Provenance E CI ES Encrypt Exception :: class , ĠIllegalArgumentException :: class ) ĊĠĠĠ Ġfun Ġencrypt ( data : ĠByteArray , ĠpublicKey : ĠPublicKey , Ġadditional Authenticated Data : ĠString ?): ĠPro venance E CI ES Crypto gram Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġep hemeral KeyPair Ġ= ĠPro venance Key Generator . generate KeyPair ( publicKey ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDer ive Ġa Ġsecret Ġkey Ġfrom Ġthe Ġpublic Ġkey Ġof Ġthe Ġrecipient Ġand Ġthe Ġep hemeral Ġprivate Ġkey . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġep hemeral Derived SecretKey Ġ= ĠPro venance Key Generator . compute Shared Key ( ep hemeral KeyPair . private , ĠpublicKey ). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro venance HK DF SHA 2 5 6 . derive ( it . encoded , null , ĠEC Utils . K DF _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠEncrypt Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Key Bytes Ġ= ĠArrays . copyOf ( ep hemeral Derived SecretKey , Ġ 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Key Ġ= ĠPro venance AES Crypt . secret KeySpec Generate ( enc Key Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbody Ġ= ĠPro venance AES Crypt . encrypt ( data , Ġadditional Authenticated Data , Ġenc Key ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompute ĠMAC Ġof Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmac Key Bytes Ġ= ĠArrays . copyOf Range ( ep hemeral Derived SecretKey , Ġ 3 2 , Ġ 6 4 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtag Ġ= ĠPro venance AES Crypt . encrypt ( plain Text Ġ= Ġmac Key Bytes !! , Ġadditional Authenticated Data Ġ= Ġadditional Authenticated Data , Ġkey Ġ= Ġenc Key , Ġuse Zero IV Ġ= Ġtrue ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠReturn Ġencrypted Ġpayload ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPro venance E CI ES Crypto gram ( ep hemeral KeyPair . public !! , Ġtag !! , Ġbody !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Invalid Ġkey Ġexception ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Encrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBad Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Bad Ġpadding Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Encrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal BlockSize Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Illegal Ġblock Ġsize Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Encrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDecrypt Ġprovided Ġencrypted Ġpayload . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġpayload Ġ{@ code ĠPro venance E CI ES Crypto gram } ĠPayload Ġto Ġbe Ġdecrypted . ĊĠĠĠĠ Ġ* Ġ@ return ĠDecrypt ed Ġbytes . ĊĠĠĠĠ Ġ* Ġ@ throws ĠPro venance E CI ES Decrypt Exception ĠIn Ġcase Ġde cryption Ġfails Ġdue Ġto Ġinvalid Ġkey Ġor Ġinvalid ĠMAC Ġvalue . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException ĠIn Ġcase Ġde cryption Ġfails Ġdue Ġto Ġinvalid Ġlife - cycle Ġphase , ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Provenance E CI ES Decrypt Exception :: class ) ĊĠĠĠ Ġfun Ġdecrypt ( payload : ĠPro venance E CI ES Crypto gram , Ġkey Ref : ĠKey Ref , Ġadditional Authenticated Data : ĠString ?, Ġext Key Cust ody Api : ĠExternal Key Cust ody Api ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġep hemeral Derived SecretKey Ġ= Ġif ( key Ref . type Ġ== ĠSM ART KEY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġtransient Ġsecurity Ġobject Ġout Ġof Ġthe Ġep hemeral Ġpublic Ġkey Ġfrom Ġthe Ġpayload . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtransient Ep hemeral S Obj Ġ= Ġpayload . ep hemeral PublicKey . to Transient Security Object ( ext Key Cust ody Api . get Smart Key Security Obj ()) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCompute Ġthe Ġshared / agree Ġkey Ġvia ĠSmart Key 's ĠAPI ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= Ġkey Ref . uuid . toString (). to Ag ree Key ( transient Ep hemeral S Obj . transient Key , Ġext Key Cust ody Api . get Smart Key Security Obj ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro venance HK DF SHA 2 5 6 . derive ( secret Key . value , Ġnull , ĠEC Utils . K DF _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret Key Ġ= ĠPro venance Key Generator . compute Shared Key ( key Ref . privateKey !! , Ġpayload . ep hemeral PublicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPro venance HK DF SHA 2 5 6 . derive ( EC Utils . convert Shared SecretKey ToBytes ( secret Key ), Ġnull , ĠEC Utils . K DF _ SIZE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠValidate Ġdata ĠMAC Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Key Bytes Ġ= ĠArrays . copyOf ( ep hemeral Derived SecretKey , Ġ 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Key Ġ= ĠPro venance AES Crypt . secret KeySpec Generate ( enc Key Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmac Key Bytes Ġ= ĠArrays . copyOf Range ( ep hemeral Derived SecretKey , Ġ 3 2 , Ġ 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmac Ġ= ĠPro venance AES Crypt . encrypt ( mac Key Bytes , Ġadditional Authenticated Data Ġ= Ġadditional Authenticated Data , Ġkey Ġ= Ġenc Key , Ġuse Zero IV Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Arrays . equals ( mac , Ġpayload . tag )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" invalid Ġmac Ġ", ĠIllegalArgumentException (" Invalid ĠMAC ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Decrypt Exception (" Invalid ĠMAC ", ĠIllegalArgumentException (" Invalid ĠMAC ")) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDecrypt Ġthe Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPro venance AES Crypt . decrypt ( payload . encrypted Data , Ġenc Key . encoded , Ġadditional Authenticated Data ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠInvalid Key Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" invalid Ġkey Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Decrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegal BlockSize Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Illegal Ġblock Ġsize Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Decrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠBad Padding Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Bad Ġpadding Ġ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠPro venance E CI ES Decrypt Exception (" De cryption Ġerror Ġoccurred ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ