diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystal.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystal.java index 9bac55e28..da991acbe 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystal.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystal.java @@ -4,10 +4,12 @@ import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.api.socialbackup.Shard; +import java.security.GeneralSecurityException; import java.util.List; @NotNullByDefault interface DarkCrystal { List createShards(SecretKey secret, int shards, int threshold); + SecretKey combineShards(List shards) throws GeneralSecurityException; } diff --git a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystalStub.java b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystalStub.java index fbb90ce3e..6671b14ff 100644 --- a/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystalStub.java +++ b/briar-core/src/main/java/org/briarproject/briar/socialbackup/DarkCrystalStub.java @@ -4,7 +4,9 @@ import org.briarproject.bramble.api.crypto.SecretKey; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.api.socialbackup.Shard; +import java.security.GeneralSecurityException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Random; @@ -33,4 +35,19 @@ class DarkCrystalStub implements DarkCrystal { } return shards; } + + @Override + public SecretKey combineShards(List shards) throws + GeneralSecurityException { + // Check each shard has the same secret Id + byte[] secretId = shards.get(0).getSecretId(); + for (Shard shard : shards) { + if (!Arrays.equals(shard.getSecretId(), secretId)) throw new GeneralSecurityException(); + } + + Random random = new Random(); + byte[] secretBytes = new byte[SecretKey.LENGTH]; + random.nextBytes(secretId); + return new SecretKey(secretBytes); + } }