package peergos.shared.user;
import peergos.shared.crypto.*;
import peergos.shared.crypto.asymmetric.curve25519.*;
import peergos.shared.crypto.hash.*;
import peergos.shared.crypto.random.*;
import peergos.shared.crypto.symmetric.*;
import java.util.Arrays;
import java.util.concurrent.CompletableFuture;
public class UserUtil {
public static CompletableFuture<UserWithRoot> generateUser(String username,
String password,
LoginHasher hasher,
Salsa20Poly1305 provider,
SafeRandom random,
Ed25519 signer,
Curve25519 boxer,
UserGenerationAlgorithm algorithm) {
CompletableFuture<byte[]> fut = hasher.hashToKeyBytes(username, password, algorithm);
return fut.thenApply(keyBytes -> {
byte[] signBytesSeed = Arrays.copyOfRange(keyBytes, 0, 32);
byte[] secretBoxBytes = Arrays.copyOfRange(keyBytes, 32, 64);
byte[] rootKeyBytes = Arrays.copyOfRange(keyBytes, 64, 96);
byte[] secretSignBytes = Arrays.copyOf(signBytesSeed, 64);
byte[] publicSignBytes = new byte[32];
signer.crypto_sign_keypair(publicSignBytes, secretSignBytes);
byte[] pubilcBoxBytes = new byte[32];
boxer.crypto_box_keypair(pubilcBoxBytes, secretBoxBytes);
SigningKeyPair signingKeyPair = new SigningKeyPair(new Ed25519PublicKey(publicSignBytes, signer), new Ed25519SecretKey(secretSignBytes, signer));
BoxingKeyPair boxingKeyPair = new BoxingKeyPair(new Curve25519PublicKey(pubilcBoxBytes, boxer, random), new Curve25519SecretKey(secretBoxBytes, boxer));
SymmetricKey root = new TweetNaClKey(rootKeyBytes, false, provider, random);
return new UserWithRoot(signingKeyPair, boxingKeyPair, root);
});
}
}