package network.thunder.core.communication.objects.messages.impl; import network.thunder.core.communication.objects.messages.impl.message.lnpayment.OnionObject; import network.thunder.core.communication.objects.messages.impl.message.lnpayment.PeeledOnion; import network.thunder.core.communication.objects.messages.interfaces.helper.LNOnionHelper; import network.thunder.core.etc.Tools; import org.bitcoinj.core.ECKey; import org.junit.Before; import org.junit.Test; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import static org.junit.Assert.assertTrue; /** * Created by matsjerratsch on 25/01/2016. */ public class LNOnionHelperImplTest { List<ECKey> keyList = new ArrayList<>(); LNOnionHelper onionHelper = new LNOnionHelperImpl(); @Before public void prepare () { } @Test public void shouldBuildAndDeconstructCorrectFullOnion () { buildKeylist(OnionObject.MAX_HOPS); OnionObject object = onionHelper.createOnionObject(getByteList(keyList), null); List<byte[]> listFromOnion = new ArrayList<>(); listFromOnion.add(keyList.get(0).getPubKey()); for (ECKey key : keyList) { LNOnionHelper helperTemp = new LNOnionHelperImpl(); PeeledOnion peeledOnion = helperTemp.loadMessage(key, object); if (peeledOnion.isLastHop) { listFromOnion.add(key.getPubKey()); } else { listFromOnion.add(peeledOnion.nextHop.getPubKey()); object = peeledOnion.onionObject; } } for (int i = 0; i < keyList.size(); ++i) { ECKey key = keyList.get(i); byte[] keyOnion = listFromOnion.get(i); System.out.println(Tools.bytesToHex(key.getPubKey()) + " " + Tools.bytesToHex(keyOnion)); assertTrue(Arrays.equals(key.getPubKey(), keyOnion)); } } @Test public void shouldBuildAndDeconstructCorrectHalfOnion () { buildKeylist(OnionObject.MAX_HOPS - 4); OnionObject object = onionHelper.createOnionObject(getByteList(keyList), null); List<byte[]> listFromOnion = new ArrayList<>(); listFromOnion.add(keyList.get(0).getPubKey()); for (ECKey key : keyList) { LNOnionHelper helperTemp = new LNOnionHelperImpl(); PeeledOnion peeledOnion = helperTemp.loadMessage(key, object); if (peeledOnion.isLastHop) { listFromOnion.add(key.getPubKey()); } else { listFromOnion.add(peeledOnion.nextHop.getPubKey()); object = peeledOnion.onionObject; } } for (int i = 0; i < keyList.size(); ++i) { ECKey key = keyList.get(i); byte[] keyOnion = listFromOnion.get(i); System.out.println(Tools.bytesToHex(key.getPubKey()) + " " + Tools.bytesToHex(keyOnion)); assertTrue(Arrays.equals(key.getPubKey(), keyOnion)); } } public void buildKeylist (int hops) { for (int i = 0; i < hops; ++i) { keyList.add(new ECKey()); System.out.println(Tools.bytesToHex(keyList.get(i).getPubKey())); } } public static List<byte[]> getByteList (List<ECKey> keyList) { List<byte[]> byteList = new ArrayList<>(); for (ECKey key : keyList) { byteList.add(key.getPubKey()); } return byteList; } }