package peergos.shared.crypto;
import peergos.shared.cbor.*;
import peergos.shared.crypto.asymmetric.*;
import peergos.shared.crypto.asymmetric.curve25519.*;
import peergos.shared.crypto.random.*;
import peergos.shared.util.*;
import java.io.*;
import java.util.*;
public class BoxingKeyPair implements Cborable
{
public final PublicBoxingKey publicBoxingKey;
public final SecretBoxingKey secretBoxingKey;
public BoxingKeyPair(PublicBoxingKey publicBoxingKey, SecretBoxingKey secretBoxingKey) {
this.publicBoxingKey = publicBoxingKey;
this.secretBoxingKey = secretBoxingKey;
}
@Override
public CborObject toCbor() {
return new CborObject.CborList(Arrays.asList(
publicBoxingKey.toCbor(),
secretBoxingKey.toCbor()));
}
public static BoxingKeyPair fromCbor(CborObject cbor) {
if (! (cbor instanceof CborObject.CborList))
throw new IllegalStateException("Incorrect cbor for SigningKeyPair: " + cbor);
List<CborObject> values = ((CborObject.CborList) cbor).value;
PublicBoxingKey pub = PublicBoxingKey.fromCbor(values.get(0));
SecretBoxingKey secret = SecretBoxingKey.fromCbor(values.get(1));
return new BoxingKeyPair(pub, secret);
}
public static BoxingKeyPair random(SafeRandom random, Curve25519 boxer) {
byte[] secretBoxBytes = new byte[32];
byte[] publicBoxBytes = new byte[32];
random.randombytes(secretBoxBytes, 0, 32);
return random(secretBoxBytes, publicBoxBytes, boxer, random);
}
private static BoxingKeyPair random(byte[] secretBoxBytes, byte[] publicBoxBytes,
Curve25519 boxer, SafeRandom random) {
boxer.crypto_box_keypair(publicBoxBytes, secretBoxBytes);
return new BoxingKeyPair(
new Curve25519PublicKey(publicBoxBytes, boxer, random),
new Curve25519SecretKey(secretBoxBytes, boxer));
}
public static BoxingKeyPair insecureRandom() {
byte[] secretBoxBytes = new byte[32];
byte[] publicBoxBytes = new byte[32];
Random rnd = new Random();
rnd.nextBytes(secretBoxBytes);
rnd.nextBytes(publicBoxBytes);
return random(secretBoxBytes, publicBoxBytes, new Curve25519.Java(), new SafeRandom.Java());
}
}