From 7da49ae6dfa9bd858cf7f4fa29ac8e31c634fc7e Mon Sep 17 00:00:00 2001 From: ameba23 Date: Tue, 2 Mar 2021 08:51:00 +0100 Subject: [PATCH] DarkCrystal implementation which calls SecretSharingWrapper --- .../android/socialbackup/DarkCrystalImpl.java | 44 ++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DarkCrystalImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DarkCrystalImpl.java index 7c75acf46..ed322c846 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DarkCrystalImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DarkCrystalImpl.java @@ -1,4 +1,46 @@ package org.briarproject.briar.android.socialbackup; +import org.briarproject.bramble.api.crypto.SecretKey; +import org.briarproject.briar.api.socialbackup.Shard; +import org.briarproject.briar.socialbackup.DarkCrystal; +import org.magmacollective.darkcrystal.secretsharingwrapper.SecretSharingWrapper; -public class DarkCrystalImpl { +import java.security.GeneralSecurityException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Random; + +import static org.briarproject.briar.socialbackup.SocialBackupConstants.SECRET_ID_BYTES; + +public class DarkCrystalImpl implements DarkCrystal { + + @Override + public List createShards(SecretKey secret, int numShards, + int threshold) { + Random random = new Random(); + byte[] secretId = new byte[SECRET_ID_BYTES]; + random.nextBytes(secretId); + List shardsBytes = SecretSharingWrapper.share(secret.getBytes(), numShards, threshold); + List shards = new ArrayList<>(numShards); + for (byte[] shardBytes : shardsBytes) { + shards.add(new Shard(secretId, shardBytes)); + } + 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(); + } + List shardsBytes = new ArrayList<>(shards.size()); + for (Shard shard : shards) { + shardsBytes.add(shard.getShard()); + } + byte[] secretBytes = SecretSharingWrapper.combine(shardsBytes); + return new SecretKey(secretBytes); + } }