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 ;
1619import com .uid2 .admin .managers .CloudEncryptionKeyManager ;
1720import com .uid2 .admin .secret .*;
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 ),
@@ -263,7 +268,7 @@ public void run() {
263268 new PrivateSiteDataRefreshService (auth , jobDispatcher , writeLock , config , rotatingCloudEncryptionKeyProvider ),
264269 new JobDispatcherService (auth , jobDispatcher ),
265270 new SearchService (auth , clientKeyProvider , operatorKeyProvider ),
266- new CloudEncryptionKeyService (auth , rotatingCloudEncryptionKeyProvider )
271+ new CloudEncryptionKeyService (auth , rotatingCloudEncryptionKeyProvider , cloudEncryptionKeyStoreWriter , siteProvider , cloudEncryptionKeyRotationStrategy )
267272 };
268273
269274
@@ -279,7 +284,7 @@ public void run() {
279284 try {
280285 keysetProvider .loadContent ();
281286 } catch (CloudStorageException e ) {
282- if (e .getMessage ().contains ("The specified key does not exist" )){
287+ if (e .getMessage ().contains ("The specified key does not exist" )) {
283288 keysetStoreWriter .upload (new HashMap <>(), null );
284289 keysetProvider .loadContent ();
285290 } else {
@@ -305,7 +310,7 @@ public void run() {
305310 The jobs are executed after because they copy data from these files locations consumed by public and private operators.
306311 This caused an issue because the files were empty and the job started to fail so the operators got empty files.
307312 */
308- if (enableKeysets ) {
313+ if (enableKeysets ) {
309314 synchronized (writeLock ) {
310315 //UID2-628 keep keys.json and keyset_keys.json in sync. This function syncs them on start up
311316 keysetProvider .loadContent ();
@@ -342,7 +347,7 @@ public void run() {
342347 CompletableFuture <Boolean > privateSiteDataSyncJobFuture = jobDispatcher .executeNextJob ();
343348 privateSiteDataSyncJobFuture .get ();
344349
345- EncryptedFilesSyncJob encryptedFilesSyncJob = new EncryptedFilesSyncJob (config , writeLock ,rotatingCloudEncryptionKeyProvider );
350+ EncryptedFilesSyncJob encryptedFilesSyncJob = new EncryptedFilesSyncJob (config , writeLock , rotatingCloudEncryptionKeyProvider );
346351 jobDispatcher .enqueue (encryptedFilesSyncJob );
347352 CompletableFuture <Boolean > encryptedFilesSyncJobFuture = jobDispatcher .executeNextJob ();
348353 encryptedFilesSyncJobFuture .get ();
0 commit comments