package Ġio . pro venance . p 8 e . encryption . d ime Ċ Ċ import Ġcom . google . common . io . Base Encoding Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġcom . google . protobuf . Timestamp Ċ 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 . ec ies . EC Utils Ċ import Ġio . pro venance . p 8 e . encryption . ec ies . EC Utils . curve Name Ċ import Ġio . pro venance . p 8 e . encryption . ec ies . Provenance E CI ES Crypto gram Ċ import Ġio . pro venance . p 8 e . encryption . ec ies . Provenance Key Generator Ċ import Ġio . pro venance . p 8 e . encryption . experimental . aes . aes Decrypt Stream Ċ import Ġio . pro venance . p 8 e . encryption . experimental . extensions . aes Decrypt Ċ import Ġio . pro venance . p 8 e . encryption . experimental . extensions . to SecretKey Spec Ċ import Ġio . pro venance . p 8 e . encryption . model . DI ME Processing Model Ċ import Ġio . pro venance . p 8 e . encryption . model . DI ME Stream Processing Model Ċ import Ġio . p 8 e . proto . Util Ċ import Ġio . pro venance . p 8 e . encryption . ec ies . Provenance E CI ES Cipher Ċ import Ġio . pro venance . p 8 e . encryption . model . Key Ref Ċ import Ġio . pro venance . proto . encryption . Encryption Protos Ċ import Ġio . pro venance . proto . encryption . Encryption Protos . Audience Ċ import Ġio . pro venance . proto . encryption . Encryption Protos . Payload Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġjava . io . InputStream Ċ import Ġjava . security . KeyPair Ċ import Ġjava . security . PrivateKey Ċ import Ġjava . security . PublicKey Ċ import Ġjava . security . spec . Invalid KeySpec Exception Ċ import Ġjava . time . Offset DateTime Ċ import Ġjava . util . Base 6 4 Ċ import Ġjava . util . Properties Ċ import Ġjava . util . UUID Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ object ĠPro venance DI ME Ġ{ ĊĊĠĠĠ Ġconst Ġval ĠPROCESS ING _ KEYS Ġ= Ġ" PROCESS ING _ KEYS " ĊĠĠĠ Ġconst Ġval ĠPRO PO SER _ E 2 EE _ PUBLIC _ KEY Ġ= Ġ" PRO PO SER _ E 2 EE _ PUBLIC _ KEY " ĊĠĠĠ Ġval Ġlogger : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Provenance Key Generator :: class . java ) ĊĊĠĠĠ Ġprivate Ġfun Ġconvert Payload To DI ME Payload ( payload Id : ĠInt , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Authenticated Data : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey : ĠSecret KeySpec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlegacy Encoding : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠPayload Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvar Ġcipher Text Ġ= ĠPro venance AES Crypt . encrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġplain Text Ġ= Ġpayload Text . toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Authenticated Data Ġ= Ġadditional Authenticated Data , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Zero IV Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" The Ġpayload Text Ġcannot Ġbe Ġencrypted ") ĊĊĠĠĠĠĠĠĠ Ġif Ġ( legacy Encoding ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Text Ġ= ĠBase Encoding . base 6 4 (). encode ( cipher Text ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// convert Ġit Ġto ĠPayload ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Payload ( payload Id , Ġcipher Text ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġhandy Ġtesting / utility Ġservice Ġto Ġquick ĠD IME ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmock Processing Audience List () Ġ= Ġ( 0 .. 1 0 ). map Ġ{ ĠPro venance Key Generator . generate KeyPair () Ġ} ĊĊĠĠĠ Ġfun Ġmock Processing Audience List PrivateKey ( peer PublicKey : ĠByte String , Ġprocessing Audience List : ĠList < KeyPair >): ĠPrivate Key Ġ{ ĊĠĠĠĠĠĠĠ Ġprocessing Audience List . find Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEC Utils . publicKey Encoded ( it . public ) Ġ== Ġpeer PublicKey . toString Utf 8 () ĊĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit . private ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" private Ġkey Ġnot Ġfound Ġfor Ġ${ peer PublicKey . toString Utf 8 () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Payload ( payload Id : ĠInt , Ġpayload Text : ĠByteArray ?): ĠPayload Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠPayload . newBuilder (). setId ( payload Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Cipher Text ( ByteString . copyFrom ( payload Text )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Audience ( context Type : ĠEncryption Protos . Context Type , Ġencrypted DE K : ĠByteArray , ĠpublicKey : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id : ĠInt , Ġep hemeral PubKey : ĠPublicKey , Ġtag : ĠByteArray ): ĠAud ience Ġ{ ĊĊĠĠĠĠĠĠĠ Ġreturn ĠAud ience . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Context ( context Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Encrypted De k ( ByteString . copyFrom ( encrypted DE K )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Payload Id ( payload Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set PublicKey ( ByteString . copyFrom ( publicKey )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Ep hemeral Pub key ( ByteString . copyFrom ( Base Encoding . base 6 4 (). encode ( EC Utils . convert PublicKey ToBytes ( ep hemeral PubKey )). toByteArray ( Charsets . UTF _ 8 ))) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. setTag ( ByteString . copyFrom ( tag )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Owner Audience ( owner Encryption PublicKey : ĠPublicKey , Ġadditional Authenticated Data : ĠString Ġ= Ġ"", Ġkey : ĠSecret KeySpec , Ġpayload Id : ĠInt ): ĠAud ience Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str For Owner , Ġpro venance E CI ES Crypto gram For Owner ) Ġ= Ġget E CI ES Encoded Payload ( owner Encryption PublicKey , Ġadditional Authenticated Data , Ġkey ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Audience ( context Type Ġ= ĠEncryption Protos . Context Type . SUB MISSION , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram For Owner . ep hemeral PublicKey !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram For Owner . encrypted Data ). toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey Encoded Str For Owner . toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id Ġ= Ġpayload Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram For Owner . tag ). toByteArray ( Charsets . UTF _ 8 )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget E CI ES Encoded Payload ( publicKey : ĠPublicKey , Ġadditional Authenticated Data : ĠString Ġ= Ġ"", Ġkey : ĠSecret KeySpec ): ĠPair < String , ĠPro venance E CI ES Crypto gram > Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey Encoded Str Ġ= ĠBase Encoding . base 6 4 (). encode ( EC Utils . convert PublicKey ToBytes ( publicKey )) ĊĊĠĠĠĠĠĠĠ Ġval Ġpro venance E CI ES Crypto gram Ġ= ĠPro venance E CI ES Cipher . encrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBase Encoding . base 6 4 (). encode ( key . encoded ). toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Authenticated Data ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget DE K ( audience List : ĠList < Audience >, Ġencryption Key Ref : ĠKey Ref , Ġadditional Authenticated Data : ĠString Ġ= Ġ"", Ġexternal Key Cust ody Api : ĠExternal Key Cust ody Api ): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġget Audience ( audience List , Ġencryption Key Ref . publicKey ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpro venance E CI ES Crypto gram Ġ= ĠEC Utils . get Provenance Crypto gram ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudience . ep hemeral Pub key . toString ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudience . tag . toString ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudience . encrypted De k . toString ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencryption Key Ref . publicKey . curve Name ()) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPro venance E CI ES Cipher . decrypt ( pro venance E CI ES Crypto gram , Ġencryption Key Ref , Ġadditional Authenticated Data , Ġexternal Key Cust ody Api ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IllegalStateException :: class ) ĊĠĠĠ Ġfun Ġget Audience ( audience List : ĠList < Audience >, ĠpublicKey : ĠPublicKey ): ĠAud ience Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠpublicKey String Ġ= ĠBase Encoding . base 6 4 (). encode ( EC Utils . convert PublicKey ToBytes ( publicKey )) ĊĠĠĠĠĠĠĠ Ġreturn Ġaudience List . first OrNull Ġ{ ĠpublicKey String Ġ== Ġit . publicKey . toString ( Charsets . UTF _ 8 ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Audience Ġlist Ġdoes Ġnot Ġcontain ĠAud ience Ġof Ġmember .. ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt DI ME ( d ime : ĠEncryption Protos . DI ME , ĠDE K : ĠByteArray , Ġadditional Authenticated Data : ĠString Ġ= Ġ"") : ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecrypt Payload ( d ime . get Payload ( 0 ), ĠDE K , Ġadditional Authenticated Data ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCreated Ġto Ġavoid Ġan Ġimport Ġof Ġcore - extensions . ĊĠĠĠ Ġprivate Ġval Ġun base 6 4 : Ġ( ByteArray ) Ġ-> ĠByteArray Ġ= Ġ{ ĠBase 6 4 . get Decoder (). decode ( it ) Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt Payload ( payload : ĠPayload , ĠDE K : ĠByteArray , Ġadditional Authenticated Data : ĠString Ġ= Ġ"") : ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġun base 6 4 ( DE K ). to SecretKey Spec () ĊĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthe Ġcipher Text Ġfails Ġde cryption , Ġbase 6 4 Ġdecode Ġit Ġand Ġtry Ġagain . ĊĠĠĠĠĠĠĠ Ġ// Ġ* ĠThe Ġlegacy Ġd ime Ġcode Ġplaces Ġthe Ġbase 6 4 Ġencoded Ġcipher Text Ġinto Ġthe ĠPayload Ġobject . ĊĠĠĠĠĠĠĠ Ġ// Ġ* ĠThe Ġcurrent Ġd ime Ġcode Ġplaced Ġthe Ġraw Ġbytes Ġinto Ġthe ĠPayload . cipher Text Ġobject . ĊĠĠĠĠĠĠĠ Ġ// ĠĠĠ Ġ* ĠSee Ġsrc / test / resources / test - data . json ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĊĠĠĠĠĠĠĠ Ġ// ĠĠ ĠOrder Ġdoesn 't Ġ_ really _ Ġmatter Ġhere Ġ( over Ġ 1 0 k Ġiterations Ġthe Ġdifference Ġbetween Ġthe Ġtwo Ġops Ġis Ġne gl igible ). ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġpayload . cipher Text . toByteArray () ĊĠĠĠĠĠĠĠ Ġval Ġdecrypt or Ġ= Ġ{ Ġit : ĠByteArray Ġ-> Ġit . aes Decrypt ( key , Ġa ad Ġ= Ġadditional Authenticated Data . toByteArray ()) Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt or ( bytes ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLegacy Ġhandling : Ġcipher Text Ġwas Ġbase 6 4 Ġencoded . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecrypt or ( un base 6 4 ( bytes )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġdecrypt Payload ( stream : ĠInputStream , ĠDE K : ĠByteArray , Ġadditional Authenticated Data : ĠString Ġ= Ġ"") : ĠInputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġun base 6 4 ( DE K ). to SecretKey Spec () ĊĠĠĠĠĠĠĠ Ġreturn Ġaes Decrypt Stream ( stream , Ġkey , Ġa ad Ġ= Ġadditional Authenticated Data . toByteArray ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGet Ġall Ġaudience Ġkeys Ġfrom ĠK MS ( Mock ed Ġfor Ġnow ) ĠTODO Ġmove Ġout Ġto Ġit 's Ġown Ġutility ? ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Invalid KeySpec Exception :: class ) ĊĠĠĠ Ġfun Ġget Mock Processing Audience Keys (): ĠList < PublicKey > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproperties Ġ= ĠProperties () ĊĠĠĠĠĠĠĠ Ġproperties . load ( this :: class . java . getResource AsStream ("/ peer - certs / certs . properties ")) ĊĊĠĠĠĠĠĠĠ Ġval ĠlistOf Audience Keys Ġ= Ġmutable ListOf < PublicKey >() ĊĠĠĠĠĠĠĠ Ġproperties . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( k . toString (). startsWith (" public - key ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpublicKey Ġ= ĠEC Utils . convert Bytes To PublicKey ( EC Utils . decode String ( v . toString ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf Audience Keys . add ( publicKey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠlistOf Audience Keys ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Mock Processing Audience PrivateKey ( publicKey : ĠPublicKey ): ĠPrivate Key Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġkey Value : ĠString ĊĠĠĠĠĠĠĠ Ġval Ġprops Ġ= ĠProperties (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload ( Provenance DI ME :: class . java . getResource AsStream ("/ peer - certs / certs . properties ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprops . forEach Ġ{ Ġ( k , Ġv ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v Ġ== ĠBase Encoding . base 6 4 (). encode ( EC Utils . convert PublicKey ToBytes ( publicKey ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Value Ġ= Ġ( k Ġas ĠString ). replace (" public ", Ġ" private ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠEC Utils . privateKey From P added ByteArray ( props . getProperty ( key Value )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" No ĠPrivate ĠKey ĠFound Ġfor ĠPublic ĠKey ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConstructs Ġa ĠD IME Ġwith Ġencrypted Ġpayload s Ġfrom Ġthe Ġgiven Ġarguments ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġd ime Id ĠUUID Ġoptional ĊĠĠĠĠ Ġ* Ġ@ param Ġpayload Id ĠInt Ġpayload ĠID Ġ 0 Ġis Ġused Ġfor Ġthe Ġprimary Ġpayload Ġby Ġconvention . Ġother ĠIDs Ġare Ġused Ġto Ġcontain Ġadditional DE KS . ĠUnless Ġyou Ġknow Ġwhat Ġyou 're Ġdoing , Ġleave Ġthis Ġas Ġ 0 ĊĠĠĠĠ Ġ* Ġ@ param Ġpayload Text ĠString Ġun encrypted ĠJSON Ġstring Ġcontaining Ġpayload Ġdata ĊĠĠĠĠ Ġ* Ġ@ param Ġadditional Authenticated Data ĠString ĠTODO ĊĠĠĠĠ Ġ* Ġ@ param Ġowner Transaction Cert ĠPublicKey Ġpublic Ġkey Ġfor ĠD IME Ġowner ĊĠĠĠĠ Ġ* Ġ@ param Ġmetadata ĠMap ĠString Ġto ĠString Ġmap Ġof Ġun encrypted Ġdata Ġto Ġbe Ġprovided Ġoutside Ġthe Ġpayload Ġitself Ġ( ex : Ġasset Uuid ). ĠPri mar ily Ġused Ġon Ġchain Ġonly ĊĠĠĠĠ Ġ* Ġ@ param Ġadditional Audience ĠMap Ġof ĠContext Type Ġto ĠSet Ġof ĠPublic ĠKeys Ġfor Ġadditional Ġmembers Ġwho Ġshould Ġbe Ġable Ġto Ġdecrypt Ġor Ġotherwise Ġmanipulate Ġthe ĠD IME ĊĠĠĠĠ Ġ* Ġ@ param Ġadditional Audience Authenticated Data ĠMap ĠTODO ĊĠĠĠĠ Ġ* Ġ@ param Ġadditional DE KS ĠMap Ġof ĠString Ġto ĠSecret KeySpec , Ġused Ġby Ġchain code Ġto Ġfetch Ġand Ġdecrypt Ġadditional ĠD IME s Ġalready Ġstored Ġon Ġchain ĊĠĠĠĠ Ġ* Ġ@ param Ġadditional DE KS Authenticated Data ĠMap ĠTODO ĊĠĠĠĠ Ġ* Ġ@ param Ġprocessing Audience Keys ĠList Ġof ĠPublicKey , Ġused Ġby Ġindividual Ġchain code Ġcontainers Ġto Ġdecrypt Ġthe ĠD IME Ġfor Ġprocessing ĠNOTE : Ġthese Ġare Ġnever Ġstored Ġwithin Ġthe ĠD IME Ġitself ĊĠĠĠĠ Ġ* Ġ@ param Ġlegacy Encoding ĠOriginal ĠKotlin ĠD IME Ġcreation Ġwrapped Ġthe Ġencrypted Ġpayload Ġwith Ġan Ġadditional Ġlayer Ġof ĠBase 6 4 Ġencoding . ĠNode Ġdoes Ġnot . ĠAt Ġsome Ġpoint , Ġthis Ġflag Ġwill Ġbe Ġremoved Ġand Ġthe Ġadditional Ġencoding Ġwill Ġbe Ġskipped Ġfor Ġall Ġuse Ġcases . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcreate DI ME ( d ime Id : ĠUUID Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Text : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Authenticated Data : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Encryption PublicKey : ĠPublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Audience : ĠMap < Encryption Protos . Context Type , ĠSet < PublicKey >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Audience Authenticated Data : ĠMap < Encryption Protos . Context Type , ĠSet < Pair < PublicKey , ĠString >>> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional DE KS : ĠMap < String , ĠSecret KeySpec > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional DE KS Authenticated Data : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Audience Keys : ĠList < PublicKey >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovided DE K : ĠSecret KeySpec ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlegacy Encoding : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠD IME Processing Model Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage DI ME Ġ= ĠEncryption Protos . DI ME . newBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġprovided DE K . create IfNot Provided () ĊĠĠĠĠĠĠĠ Ġval Ġpayload Ġ= Ġconvert Payload To DI ME Payload ( payload Id , Ġpayload Text , Ġadditional Authenticated Data , Ġkey , Ġlegacy Encoding ) ĊĠĠĠĠĠĠĠ Ġmessage DI ME . add Payload ( payload ) ĊĊĠĠĠĠĠĠĠ Ġval Ġaudience List Ġ= Ġmutable ListOf < Audience >() ĊĠĠĠĠĠĠĠ Ġval Ġprocessing Scoped Audience List Ġ= Ġmutable ListOf < Audience >() ĊĠĠĠĠĠĠĠ Ġprocessing Audience Keys . forEach Ġ{ ĠpublicKey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) Ġ= Ġget E CI ES Encoded Payload ( publicKey , Ġadditional Authenticated Data , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġcreate Audience ( context Type Ġ= ĠEncryption Protos . Context Type . PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram . ep hemeral PublicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . encrypted Data ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠpublicKey Ġ= ĠpublicKey Encoded Str . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpayload Id Ġ= Ġpayload Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . tag ). toByteArray ( Charsets . UTF _ 8 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Scoped Audience List . add ( audience ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadditional Audience . forEach Ġ{ Ġadditional Audience Encryption Key Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Audience Encryption Key Ref . value . forEach Ġ{ Ġaudience PublicKey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Audience AAD Ġ= Ġadditional Audience Authenticated Data [ additional Audience Encryption Key Ref . key ]?. find Ġ{ Ġa ad Data Ġ-> Ġa ad Data . first Ġ== Ġaudience PublicKey Ġ} ?. second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) Ġ= Ġget E CI ES Encoded Payload ( audience PublicKey , Ġadditional Audience AAD Ġ?: Ġ"", Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġcreate Audience ( context Type Ġ= Ġadditional Audience Encryption Key Ref . key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram . ep hemeral PublicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . encrypted Data ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠpublicKey Ġ= ĠpublicKey Encoded Str . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpayload Id Ġ= Ġpayload Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . tag ). toByteArray ( Charsets . UTF _ 8 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudience List . add ( audience ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// starts Ġfrom Ġ 1 Ġsince Ġthe Ġactual Ġpayload Ġshould Ġocc upy .. if Ġwe Ġdo Ġpartial Ġencryption Ġi . e Ġparts Ġof Ġpayload Ġbeing Ġow ened Ġby Ġdifferent Ġowners .. then Ġthis Ġshould Ġchange ĊĠĠĠĠĠĠĠ Ġvar Ġpayload Id For DE KS Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġadditional DE KS . forEach Ġ{ Ġx Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional DE KA AD Ġ= Ġadditional DE KS Authenticated Data [ x . key ] ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Audience Keys . forEach Ġ{ Ġkey Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) Ġ= Ġget E CI ES Encoded Payload ( key Ref , Ġadditional DE KA AD Ġ?: Ġ"", Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġcreate Audience ( context Type Ġ= ĠEncryption Protos . Context Type . PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram . ep hemeral PublicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . encrypted Data ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠpublicKey Ġ= ĠpublicKey Encoded Str . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpayload Id Ġ= Ġpayload Id For DE KS ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . tag ). toByteArray ( Charsets . UTF _ 8 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Scoped Audience List . add ( audience ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġp Ġ= Ġconvert Payload To DI ME Payload ( payload Id For DE KS , Ġx . key , Ġadditional DE KA AD ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ"", Ġx . value , Ġlegacy Encoding ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage DI ME . add Payload ( p ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id For DE KS ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġget Owner Audience ( owner Encryption PublicKey , Ġadditional Authenticated Data , Ġkey , Ġpayload Id ) ĊĊĠĠĠĠĠĠĠ Ġ// add Ġthe Ġowner Ġto Ġthe Ġaudience .. Ġ?? ĊĠĠĠĠĠĠĠ Ġaudience List . add ( owner ) ĊĊĠĠĠĠĠĠĠ Ġval Ġd ime Ġ= Ġmessage DI ME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Audience ( audience List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Owner ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Uuid ( Util . UUID . newBuilder (). setValue ( d ime Id . toString ()). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put All Metadata ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audit Fields ( Util . Audit Fields . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Created Date ( Timestamp . getDefaultInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder ForType (). set Seconds ( Offset DateTime . now (). to Epoch Second ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Updated Date ( Timestamp . getDefaultInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder ForType (). set Seconds ( Offset DateTime . now (). to Epoch Second ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Version ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn ĠD IME Processing Model ( d ime , Ġprocessing Scoped Audience List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate DI ME ( d ime Id : ĠUUID Ġ= ĠUUID . randomUUID (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id : ĠInt Ġ= Ġ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload : ĠInputStream , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Authenticated Data : ĠString Ġ= Ġ"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġowner Encryption PublicKey : ĠPublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmetadata : ĠMap < String , ĠString > Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Audience : ĠMap < Encryption Protos . Context Type , ĠSet < PublicKey >> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadditional Audience Authenticated Data : ĠMap < Encryption Protos . Context Type , ĠSet < Pair < PublicKey , ĠString >>> Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Audience Keys : ĠList < PublicKey >, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovided DE K : ĠSecret KeySpec ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 : ĠBoolean Ġ= Ġfalse , ĊĠĠĠ Ġ): ĠD IME Stream Processing Model Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmessage DI ME Ġ= ĠEncryption Protos . DI ME . newBuilder () ĊĠĠĠĠĠĠĠ Ġval Ġkey Ġ= Ġprovided DE K . create IfNot Provided () ĊĊĠĠĠĠĠĠĠ Ġval Ġaudience List Ġ= Ġmutable ListOf < Audience >() ĊĠĠĠĠĠĠĠ Ġval Ġprocessing Scoped Audience List Ġ= Ġmutable ListOf < Audience >() ĊĊĠĠĠĠĠĠĠ Ġval Ġencrypted Payload Ġ= ĠPro venance AES Crypt . encrypt ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpayload , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġkey , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġuse Zero IV Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsha 2 5 6 Ġ= Ġsha 2 5 6 ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġprocessing Audience Keys . forEach Ġ{ Ġkey Ref Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) Ġ= Ġget E CI ES Encoded Payload ( key Ref , Ġadditional Authenticated Data , Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġcreate Audience ( context Type Ġ= ĠEncryption Protos . Context Type . PROCESS ING ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram . ep hemeral PublicKey ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . encrypted Data ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, ĠpublicKey Ġ= ĠpublicKey Encoded Str . toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġpayload Id Ġ= Ġpayload Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ, Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . tag ). toByteArray ( Charsets . UTF _ 8 )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocessing Scoped Audience List . add ( audience ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġadditional Audience . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . value . forEach Ġ{ Ġaudience PublicKey Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġadditional Audience AAD Ġ= Ġadditional Audience Authenticated Data [ it . key ]?. find Ġ{ Ġa ad Data Ġ-> Ġa ad Data . first Ġ== Ġaudience PublicKey Ġ} ?. second ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( publicKey Encoded Str , Ġpro venance E CI ES Crypto gram ) Ġ= Ġget E CI ES Encoded Payload ( audience PublicKey , Ġadditional Audience AAD Ġ?: Ġ"", Ġkey ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġaudience Ġ= Ġcreate Audience ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Type Ġ= Ġit . key , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġep hemeral PubKey Ġ= Ġpro venance E CI ES Crypto gram . ep hemeral PublicKey , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted DE K Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . encrypted Data ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠpublicKey Ġ= ĠpublicKey Encoded Str . toByteArray ( Charsets . UTF _ 8 ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpayload Id Ġ= Ġpayload Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtag Ġ= ĠBase Encoding . base 6 4 (). encode ( pro venance E CI ES Crypto gram . tag ). toByteArray ( Charsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaudience List . add ( audience ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġowner Ġ= Ġget Owner Audience ( owner Encryption PublicKey , Ġadditional Authenticated Data , Ġkey , Ġpayload Id ) ĊĊĠĠĠĠĠĠĠ Ġ// add Ġthe Ġowner Ġto Ġthe Ġaudience .. Ġ?? ĊĠĠĠĠĠĠĠ Ġaudience List . add ( owner ) ĊĊĠĠĠĠĠĠĠ Ġval Ġd ime Ġ= Ġmessage DI ME ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addAll Audience ( audience List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Owner ( owner ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Uuid ( Util . UUID . newBuilder (). setValue ( d ime Id . toString ()). build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. put All Metadata ( metadata ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Payload ( Payload . newBuilder (). build ()) Ġ// ĠHave Ġto Ġplace Ġan Ġempty Ġpayload Ġor Ġelse Ġother Ġcode Ġbreaks Ġon Ġassumption Ġthere 's Ġa Ġ 0 th Ġindexed Ġpayload ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Audit Fields ( Util . Audit Fields . newBuilder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Created Date ( Timestamp . getDefaultInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder ForType (). set Seconds ( Offset DateTime . now (). to Epoch Second ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Updated Date ( Timestamp . getDefaultInstance () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. newBuilder ForType (). set Seconds ( Offset DateTime . now (). to Epoch Second ())) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Version ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġreturn ĠD IME Stream Processing Model ( d ime , Ġprocessing Scoped Audience List , Ġencrypted Payload ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSecret KeySpec ?. create IfNot Provided () Ġ= Ġthis . take If Ġ{ Ġit Ġ!= Ġnull Ġ} Ġ?: ĠPro venance AES Crypt . secret KeySpec Generate () Ċ Ċ } Ċ