// ĠCopyright Ġ 2 0 2 0 ĠThe ĠCross - Media ĠMeasurement ĠAuthors Ċ // Ċ // ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ // Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ // ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ // Ċ // ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ // Ċ // ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ // Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ // ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ // ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ // Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ċ package Ġorg . wf an et . measurement . integration . common Ċ Ċ import Ġcom . google . protobuf . ByteString Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġkotlinx . coroutines . Global Scope Ċ import Ġkotlinx . coroutines . Job Ċ import Ġkotlinx . coroutines . cancel And Join Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . flow Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġorg . junit . rules . Test Rule Ċ import Ġorg . junit . runner . Description Ċ import Ġorg . junit . runners . model . Statement Ċ import Ġorg . wf an et . an ys k etch . crypto . Encrypt Sketch Request Ċ import Ġorg . wf an et . an ys k etch . crypto . Encrypt Sketch Request . Destroyed Register Strategy . FLAG GED _ KEY Ċ import Ġorg . wf an et . an ys k etch . crypto . Encrypt Sketch Response Ċ import Ġorg . wf an et . an ys k etch . crypto . Sketch Encrypt er Adapter Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Combined PublicKey Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . El G amal PublicKey Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Get Combined PublicKey Request Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . List Metric Re quis itions Request Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Metric Re quisition Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Publisher Data Grpc Kt . Publisher Data Coroutine Stub Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Sketch Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Sketch Config Ċ import Ġorg . wf an et . measurement . api . v 1 alpha . Upload Metric Value Request Ċ import Ġorg . wf an et . measurement . common . identity . External Id Ċ import Ġorg . wf an et . measurement . common . load Library Ċ import Ġorg . wf an et . measurement . common . log And Suppress Exception Suspend Ċ import Ġorg . wf an et . measurement . common . parse Text Proto Ċ import Ġorg . wf an et . measurement . common . th rott ler . Minimum Interval Th rott ler Ċ Ċ /** Ċ Ġ* ĠJ Unit Ġrule Ġfor Ġsp aw ning Ġfake ĠData Provider Ġjobs Ġthat Ġattempt Ġto Ġfulfill Ġall Ġtheir Ġrequis itions . Ċ Ġ*/ Ċ class ĠFake DataProvider Rule Ġ: ĠTest Rule Ġ{ ĊĠ Ġprivate Ġvar Ġjobs Ġ= Ġmutable ListOf < Job >() ĊĊĠ Ġfun Ġstart DataProvider For Campaign ( ĊĠĠĠ Ġexternal DataProvider Id : ĠExternal Id , ĊĠĠĠ Ġexternal Campaign Id : ĠExternal Id , ĊĠĠĠ Ġpublisher Data Stub : ĠPublisher Data Coroutine Stub ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġjobs . add ( ĊĠĠĠĠĠ ĠGlobal Scope . launch Ġ{ ĊĠĠĠĠĠĠĠ Ġrun DataProvider ( external DataProvider Id , Ġexternal Campaign Id , Ġpublisher Data Stub ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun Ġrun DataProvider ( ĊĠĠĠ Ġexternal DataProvider Id : ĠExternal Id , ĊĠĠĠ Ġexternal Campaign Id : ĠExternal Id , ĊĠĠĠ Ġpublisher Data Stub : ĠPublisher Data Coroutine Stub ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġval Ġth rott ler Ġ= ĠMinimum Interval Th rott ler ( Clock . system UTC (), ĠDuration . of Millis ( 2 5 0 )) ĊĠĠĠ Ġval ĠpublicKey Cache Ġ= Ġmutable Map Of < String , ĠCom bined PublicKey >() ĊĠĠĠ Ġvar Ġlast PageToken Ġ= Ġ"" ĊĊĠĠĠ Ġth rott ler . loop On Ready Ġ{ ĊĠĠĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠĠĠ ĠList Metric Re quis itions Request . newBuilder () ĊĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparent Builder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Provider Id Ġ= Ġexternal DataProvider Id . api Id . value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcampaign Id Ġ= Ġexternal Campaign Id . api Id . value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Builder . add States ( Metric Re quisition . State . UN FUL FIL LED ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpage Token Ġ= Ġlast PageToken ĊĠĠĠĠĠĠĠĠĠĠĠ ĠpageSize Ġ= Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠ Ġval Ġresponse Ġ= Ġpublisher Data Stub . list Metric Re quis itions ( request ) ĊĠĠĠĠĠ Ġlast PageToken Ġ= Ġresponse . next PageToken ĊĠĠĠĠĠ Ġfor Ġ( metric Re quisition Ġin Ġresponse . metric Re quis itions List ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresource Key Ġ= Ġmetric Re quisition . combined PublicKey ĊĠĠĠĠĠĠĠ Ġval Ġcombined PublicKey Ġ= ĊĠĠĠĠĠĠĠĠĠ ĠpublicKey Cache . get Or Put ( resource Key . combined PublicKey Id ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher Data Stub . get Combined PublicKey ( resource Key ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġpublisher Data Stub . upload Metric Value ( ĊĠĠĠĠĠĠĠĠĠ Ġmake Metric Value Flow ( combined PublicKey . encryption Key , Ġmetric Re quisition ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġmake Metric Value Flow ( ĊĠĠĠ Ġcombined PublicKey : ĠEl G amal PublicKey , ĊĠĠĠ Ġmetric Re quisition : ĠMetric Re quisition ĊĠ Ġ): ĠFlow < Upload Metric Value Request > Ġ= Ġflow Ġ{ ĊĠĠĠ Ġemit ( ĊĠĠĠĠĠ ĠUpload Metric Value Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġheader Builder . apply Ġ{ Ġkey Ġ= Ġmetric Re quisition . key Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġemit ( ĊĠĠĠĠĠ ĠUpload Metric Value Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġchunk Builder . data Ġ= Ġgenerate Fake Encrypted Sketch ( combined PublicKey ) Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun Ġgenerate Fake Encrypted Sketch ( combined El G amal Key : ĠEl G amal PublicKey ): ĠByte String Ġ{ ĊĠĠĠ Ġval Ġsketch Ġ= ĊĠĠĠĠĠ ĠSk etch . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġconfig Ġ= Ġsketch Config ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAdds Ġ 7 Ġnormal Ġregisters Ġwith Ġcount Ġ 1 ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 L .. 7 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Registers Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAdds Ġ 3 Ġnormal Ġregisters Ġwith Ġcount Ġ 2 ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 1 L .. 1 3 L ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Registers Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠAdds Ġanother Ġlocally Ġdestroyed Ġregister . ĊĠĠĠĠĠĠĠĠĠ Ġadd Registers Builder (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġindex Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values (- 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Values ( 1 ) Ġ// Ġthis Ġvalue Ġdoesn 't Ġmatter ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġrequest Ġ= ĊĠĠĠĠĠ ĠEncrypt Sketch Request . newBuilder () ĊĠĠĠĠĠĠĠ Ġ. apply Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġthis . sketch Ġ= Ġsketch ĊĠĠĠĠĠĠĠĠĠ Ġcurve Id Ġ= Ġcombined El G amal Key . elli ptic Curve Id . to Long () ĊĠĠĠĠĠĠĠĠĠ Ġmaximum Value Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠ Ġel G amal Keys Builder . apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgenerator Ġ= Ġcombined El G amal Key . generator ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Ġ= Ġcombined El G amal Key . element ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġchoose Ġstrategy Ġaccording Ġto Ġthe Ġprotocol Ġtype . ĊĠĠĠĠĠĠĠĠĠ Ġdestroyed Register Strategy Ġ= ĠFLAG GED _ KEY ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠ Ġval Ġresponse Ġ= ĊĠĠĠĠĠ ĠEncrypt Sketch Response . parseFrom ( Sketch Encrypt er Adapter . Encrypt Sketch ( request . toByteArray ())) ĊĠĠĠ Ġreturn Ġresponse . encrypted Sketch ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġapply ( base : ĠStatement , Ġdescription : ĠDescription ): ĠStatement Ġ{ ĊĠĠĠ Ġreturn Ġobject Ġ: ĠStatement () Ġ{ ĊĠĠĠĠĠ Ġoverride Ġfun Ġevaluate () Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġbase . evaluate () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ Ġjobs . forEach Ġ{ Ġlog And Suppress Exception Suspend Ġ{ Ġit . cancel And Join () Ġ} Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun ĠPublisher Data Coroutine Stub . get Combined PublicKey ( ĊĠĠĠ Ġresource Key : ĠCom bined PublicKey . Key ĊĠ Ġ): ĠCom bined PublicKey Ġ{ ĊĠĠĠ Ġreturn Ġget Combined PublicKey ( ĊĠĠĠĠĠ ĠGet Combined PublicKey Request . newBuilder (). apply Ġ{ Ġkey Ġ= Ġresource Key Ġ}. build () ĊĠĠĠ Ġ) ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġload Library ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ" sketch _ encrypt er _ adapter ", ĊĠĠĠĠĠĠĠ Ġdirectory Path Ġ= ĠPaths . get (" any _ sketch _ java / src / main / java / org / wf an et / an ys k etch / crypto ") ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġsketch Config : ĠSk etch Config ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġval Ġconfig Path Ġ= ĊĠĠĠĠĠĠĠ Ġ"/ org / wf an et / measurement / load test / config / liquid _ leg ions _ sketch _ config . text proto " ĊĠĠĠĠĠ Ġval Ġresource Ġ= Ġthis :: class . java . getResource ( config Path ) ĊĊĠĠĠĠĠ Ġsketch Config Ġ= ĊĠĠĠĠĠĠĠ Ġresource . open Stream (). use Ġ{ Ġinput Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġparse Text Proto ( input . buffered Reader (), ĠSk etch Config . getDefaultInstance ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ