package peergos.shared.crypto.asymmetric.curve25519;
import peergos.shared.cbor.*;
import peergos.shared.crypto.asymmetric.PublicSigningKey;
import peergos.shared.crypto.asymmetric.SecretSigningKey;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.*;
public class Ed25519SecretKey implements SecretSigningKey {
private final byte[] secretKey;
private final Ed25519 implementation;
public Ed25519SecretKey(byte[] secretKey, Ed25519 provider) {
this.secretKey = secretKey;
this.implementation = provider;
}
public PublicSigningKey.Type type() {
return PublicSigningKey.Type.Ed25519;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ed25519SecretKey that = (Ed25519SecretKey) o;
return Arrays.equals(secretKey, that.secretKey);
}
@Override
public int hashCode() {
return Arrays.hashCode(secretKey);
}
@Override
public CborObject toCbor() {
return new CborObject.CborList(Arrays.asList(new CborObject.CborLong(type().value), new CborObject.CborByteArray(secretKey)));
}
public byte[] signMessage(byte[] message) {
return implementation.crypto_sign(message, secretKey);
}
public static SecretSigningKey fromCbor(CborObject cbor, Ed25519 provider) {
if (! (cbor instanceof CborObject.CborList))
throw new IllegalStateException("Invalid cbor for Ed25519 secret key! " + cbor);
CborObject.CborByteArray key = (CborObject.CborByteArray) ((CborObject.CborList) cbor).value.get(1);
return new Ed25519SecretKey(key.value, provider);
}
}