55import com .uid2 .admin .auth .OktaAuthProvider ;
66import com .uid2 .admin .auth .AuthProvider ;
77import com .uid2 .admin .auth .TokenRefreshHandler ;
8+ import com .uid2 .admin .cloudencryption .CloudKeyRotationStrategy ;
9+ import com .uid2 .admin .cloudencryption .ExpiredKeyCountRetentionStrategy ;
810import com .uid2 .admin .job .JobDispatcher ;
911import com .uid2 .admin .job .jobsync .EncryptedFilesSyncJob ;
1012import com .uid2 .admin .job .jobsync .PrivateSiteDataSyncJob ;
1113import com .uid2 .admin .job .jobsync .keyset .ReplaceSharingTypesWithSitesJob ;
1214import com .uid2 .admin .legacy .LegacyClientKeyStoreWriter ;
1315import com .uid2 .admin .legacy .RotatingLegacyClientKeyProvider ;
1416import com .uid2 .admin .managers .KeysetManager ;
17+ import com .uid2 .admin .cloudencryption .CloudSecretGenerator ;
1518import com .uid2 .admin .monitoring .DataStoreMetrics ;
16- import com .uid2 .admin .managers .CloudEncryptionKeyManager ;
19+ import com .uid2 .admin .cloudencryption .CloudEncryptionKeyManager ;
1720import com .uid2 .admin .secret .*;
1821import com .uid2 .admin .store .*;
1922import com .uid2 .admin .store .reader .RotatingAdminKeysetStore ;
2932import com .uid2 .admin .vertx .service .*;
3033import com .uid2 .shared .Const ;
3134import com .uid2 .shared .Utils ;
32- import com .uid2 .shared .secret .IKeyGenerator ;
3335import com .uid2 .shared .secret .KeyHasher ;
3436import com .uid2 .shared .secret .SecureKeyGenerator ;
3537import com .uid2 .shared .auth .EnclaveIdentifierProvider ;
@@ -74,7 +76,6 @@ public class Main {
7476
7577 private final Vertx vertx ;
7678 private final JsonObject config ;
77-
7879 public Main (Vertx vertx , JsonObject config ) {
7980 this .vertx = vertx ;
8081 this .config = config ;
@@ -122,7 +123,7 @@ public void run() {
122123 try {
123124 adminKeysetProvider .loadContent ();
124125 } catch (CloudStorageException e ) {
125- if (e .getMessage ().contains ("The specified key does not exist" )){
126+ if (e .getMessage ().contains ("The specified key does not exist" )) {
126127 adminKeysetStoreWriter .upload (new HashMap <>(), null );
127128 adminKeysetProvider .loadContent ();
128129 } else {
@@ -134,7 +135,7 @@ public void run() {
134135 GlobalScope keysetKeysGlobalScope = new GlobalScope (keysetKeyMetadataPath );
135136 RotatingKeysetKeyStore keysetKeysProvider = new RotatingKeysetKeyStore (cloudStorage , keysetKeysGlobalScope );
136137 KeysetKeyStoreWriter keysetKeyStoreWriter = new KeysetKeyStoreWriter (keysetKeysProvider , fileManager , versionGenerator , clock , keysetKeysGlobalScope , enableKeysets );
137- if (enableKeysets ) {
138+ if (enableKeysets ) {
138139 try {
139140 keysetKeysProvider .loadContent ();
140141 } catch (CloudStorageException e ) {
@@ -154,7 +155,7 @@ public void run() {
154155 try {
155156 clientSideKeypairProvider .loadContent ();
156157 } catch (CloudStorageException e ) {
157- if (e .getMessage ().contains ("The specified key does not exist" )) {
158+ if (e .getMessage ().contains ("The specified key does not exist" )) {
158159 clientSideKeypairStoreWriter .upload (new HashSet <>(), null );
159160 clientSideKeypairProvider .loadContent ();
160161 } else {
@@ -163,13 +164,13 @@ public void run() {
163164 }
164165
165166 CloudPath serviceMetadataPath = new CloudPath (config .getString (Const .Config .ServiceMetadataPathProp ));
166- GlobalScope serviceGlobalScope = new GlobalScope (serviceMetadataPath );
167+ GlobalScope serviceGlobalScope = new GlobalScope (serviceMetadataPath );
167168 RotatingServiceStore serviceProvider = new RotatingServiceStore (cloudStorage , serviceGlobalScope );
168169 ServiceStoreWriter serviceStoreWriter = new ServiceStoreWriter (serviceProvider , fileManager , jsonWriter , versionGenerator , clock , serviceGlobalScope );
169170 try {
170171 serviceProvider .loadContent ();
171172 } catch (CloudStorageException e ) {
172- if (e .getMessage ().contains ("The specified key does not exist" )) {
173+ if (e .getMessage ().contains ("The specified key does not exist" )) {
173174 serviceStoreWriter .upload (new HashSet <>(), null );
174175 serviceProvider .loadContent ();
175176 } else {
@@ -178,13 +179,13 @@ public void run() {
178179 }
179180
180181 CloudPath serviceLinkMetadataPath = new CloudPath (config .getString (Const .Config .ServiceLinkMetadataPathProp ));
181- GlobalScope serviceLinkGlobalScope = new GlobalScope (serviceLinkMetadataPath );
182+ GlobalScope serviceLinkGlobalScope = new GlobalScope (serviceLinkMetadataPath );
182183 RotatingServiceLinkStore serviceLinkProvider = new RotatingServiceLinkStore (cloudStorage , serviceLinkGlobalScope );
183184 ServiceLinkStoreWriter serviceLinkStoreWriter = new ServiceLinkStoreWriter (serviceLinkProvider , fileManager , jsonWriter , versionGenerator , clock , serviceLinkGlobalScope );
184185 try {
185186 serviceLinkProvider .loadContent ();
186187 } catch (CloudStorageException e ) {
187- if (e .getMessage ().contains ("The specified key does not exist" )) {
188+ if (e .getMessage ().contains ("The specified key does not exist" )) {
188189 serviceLinkStoreWriter .upload (new HashSet <>(), null );
189190 serviceLinkProvider .loadContent ();
190191 } else {
@@ -202,8 +203,7 @@ public void run() {
202203 GlobalScope cloudEncryptionKeyGlobalScope = new GlobalScope (cloudEncryptionKeyMetadataPath );
203204 RotatingCloudEncryptionKeyProvider rotatingCloudEncryptionKeyProvider = new RotatingCloudEncryptionKeyProvider (cloudStorage , cloudEncryptionKeyGlobalScope );
204205 CloudEncryptionKeyStoreWriter cloudEncryptionKeyStoreWriter = new CloudEncryptionKeyStoreWriter (rotatingCloudEncryptionKeyProvider , fileManager , jsonWriter , versionGenerator , clock , cloudEncryptionKeyGlobalScope );
205- IKeyGenerator keyGenerator = new SecureKeyGenerator ();
206- CloudEncryptionKeyManager cloudEncryptionKeyManager = new CloudEncryptionKeyManager (rotatingCloudEncryptionKeyProvider , cloudEncryptionKeyStoreWriter ,keyGenerator );
206+ SecureKeyGenerator keyGenerator = new SecureKeyGenerator ();
207207 try {
208208 rotatingCloudEncryptionKeyProvider .loadContent ();
209209 } catch (CloudStorageException e ) {
@@ -247,6 +247,11 @@ public void run() {
247247
248248 ClientSideKeypairService clientSideKeypairService = new ClientSideKeypairService (config , auth , writeLock , clientSideKeypairStoreWriter , clientSideKeypairProvider , siteProvider , keysetManager , keypairGenerator , clock );
249249
250+ var cloudEncryptionSecretGenerator = new CloudSecretGenerator (keyGenerator );
251+ var cloudEncryptionKeyManager = new CloudEncryptionKeyManager (rotatingCloudEncryptionKeyProvider , cloudEncryptionKeyStoreWriter , cloudEncryptionSecretGenerator );
252+ var cloudEncryptionKeyRetentionStrategy = new ExpiredKeyCountRetentionStrategy (clock , 5 );
253+ var cloudEncryptionKeyRotationStrategy = new CloudKeyRotationStrategy (cloudEncryptionSecretGenerator , clock , cloudEncryptionKeyRetentionStrategy );
254+
250255 IService [] services = {
251256 new ClientKeyService (config , auth , writeLock , clientKeyStoreWriter , clientKeyProvider , siteProvider , keysetManager , keyGenerator , keyHasher ),
252257 new EnclaveIdService (auth , writeLock , enclaveStoreWriter , enclaveIdProvider , clock ),
@@ -264,7 +269,7 @@ public void run() {
264269 new EncryptedFilesSyncService (auth , jobDispatcher , writeLock , config , rotatingCloudEncryptionKeyProvider ),
265270 new JobDispatcherService (auth , jobDispatcher ),
266271 new SearchService (auth , clientKeyProvider , operatorKeyProvider ),
267- new CloudEncryptionKeyService (auth , rotatingCloudEncryptionKeyProvider )
272+ new CloudEncryptionKeyService (auth , rotatingCloudEncryptionKeyProvider , cloudEncryptionKeyStoreWriter , operatorKeyProvider , cloudEncryptionKeyRotationStrategy )
268273 };
269274
270275
@@ -280,7 +285,7 @@ public void run() {
280285 try {
281286 keysetProvider .loadContent ();
282287 } catch (CloudStorageException e ) {
283- if (e .getMessage ().contains ("The specified key does not exist" )){
288+ if (e .getMessage ().contains ("The specified key does not exist" )) {
284289 keysetStoreWriter .upload (new HashMap <>(), null );
285290 keysetProvider .loadContent ();
286291 } else {
@@ -306,7 +311,7 @@ public void run() {
306311 The jobs are executed after because they copy data from these files locations consumed by public and private operators.
307312 This caused an issue because the files were empty and the job started to fail so the operators got empty files.
308313 */
309- if (enableKeysets ) {
314+ if (enableKeysets ) {
310315 synchronized (writeLock ) {
311316 //UID2-628 keep keys.json and keyset_keys.json in sync. This function syncs them on start up
312317 keysetProvider .loadContent ();
@@ -343,7 +348,7 @@ public void run() {
343348 CompletableFuture <Boolean > privateSiteDataSyncJobFuture = jobDispatcher .executeNextJob ();
344349 privateSiteDataSyncJobFuture .get ();
345350
346- EncryptedFilesSyncJob encryptedFilesSyncJob = new EncryptedFilesSyncJob (config , writeLock ,rotatingCloudEncryptionKeyProvider );
351+ EncryptedFilesSyncJob encryptedFilesSyncJob = new EncryptedFilesSyncJob (config , writeLock , rotatingCloudEncryptionKeyProvider );
347352 jobDispatcher .enqueue (encryptedFilesSyncJob );
348353 CompletableFuture <Boolean > encryptedFilesSyncJobFuture = jobDispatcher .executeNextJob ();
349354 encryptedFilesSyncJobFuture .get ();
0 commit comments