package peergos.shared.crypto; import peergos.shared.cbor.*; import peergos.shared.crypto.symmetric.SymmetricKey; import peergos.shared.crypto.symmetric.TweetNaClKey; import peergos.shared.util.ArrayOps; import java.util.Arrays; public class SymmetricLink implements Cborable { private final byte[] nonce, link; public SymmetricLink(byte[] link) { this.nonce = Arrays.copyOfRange(link, 0, TweetNaClKey.NONCE_BYTES); this.link = Arrays.copyOfRange(link, TweetNaClKey.NONCE_BYTES, link.length); } public byte[] serialize() { return ArrayOps.concat(nonce, link); } @Override public CborObject toCbor() { return new CborObject.CborByteArray(serialize()); } public SymmetricKey target(SymmetricKey from) { byte[] encoded = from.decrypt(link, nonce); return SymmetricKey.fromByteArray(encoded); } public static SymmetricLink fromCbor(CborObject cbor) { if (! (cbor instanceof CborObject.CborByteArray)) throw new IllegalStateException("Incorrect cbor type for SymmetricLink: " + cbor); return new SymmetricLink(((CborObject.CborByteArray) cbor).value); } public static SymmetricLink fromPair(SymmetricKey from, SymmetricKey to) { byte[] nonce = from.createNonce(); return new SymmetricLink(ArrayOps.concat(nonce, from.encrypt(to.serialize(), nonce))); } }