public void HandlePrepareRekeyRequest() { byte[] fake = new byte[] { 1, 1, 1 }; PrepareRekey rekey = new PrepareRekey(fake); tunnel.PacketInterceptor(p => { Assert.That(p.RPCs.Count > 0); Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.RekeyResponse); RekeyResponse ok = (RekeyResponse)p.RPCs.First; Assert.IsTrue(ok.NextPublicKey.Length == 32); }); tunnel.RekeyInterceptor(k => { Assert.That(k[0] == fake[0]); Assert.That(k[1] == fake[1]); Assert.That(k[2] == fake[2]); }); ControlPipe c = new ControlPipe(tunnel); EncryptedPacket packet = new EncryptedPacket(tunnel.ID, 0); packet.RPCs.Add(rekey); c.HandlePacket(packet); }
public void HandleRekey() { //A rekey cannot happen until a prepare rekey rpc has been sent (note that they can be send together) //todo: add a test to send a prepare rekey and rekey together bool trigger1, trigger2, trigger3; trigger1 = trigger2 = trigger3 = false; KeyPair pair = Sodium.PublicKeyBox.GenerateKeyPair(); PrepareRekey prepareRekey = new PrepareRekey(pair.PublicKey); RekeyNow rekey = new RekeyNow(); tunnel.PacketInterceptor(p => { Assert.That(p.RPCs.Count > 0); Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.Refuse); Refuse rpc = (Refuse)p.RPCs.First; trigger1 = true; }); ControlPipe c = new ControlPipe(tunnel); EncryptedPacket packet = new EncryptedPacket(tunnel.ID, 0); packet.RPCs.Add(rekey); c.HandlePacket(packet); Assert.IsTrue(trigger1, "Refuse block never called"); tunnel.PacketInterceptor(p => { Assert.That(p.RPCs.Count > 0); Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.RekeyResponse); RekeyResponse ok = (RekeyResponse)p.RPCs.First; Assert.IsTrue(ok.NextPublicKey.Length == 32); trigger2 = true; }); packet = new EncryptedPacket(tunnel.ID, 0); packet.RPCs.Add(new PrepareRekey(new byte[] { 1, 2, 3 })); c.HandlePacket(packet); Assert.IsTrue(trigger2, "Rekey ack block never called"); tunnel.PacketInterceptor(p => { Assert.That(p.RPCs.Count > 0); Assert.That(p.RPCs.First.SerializationTag == (byte)RPCType.Ok); OkRPC ok = (OkRPC)p.RPCs.First; Assert.IsTrue(ok.RPCID == rekey.RequestID); trigger3 = true; }); packet = new EncryptedPacket(tunnel.ID, 0); packet.RPCs.Add(rekey); c.HandlePacket(packet); Assert.IsTrue(trigger1, "Rekey now block never called"); Assert.IsTrue(trigger3); }
private void HandlePrepareRekey(IHasSerializationTag rpc) { var p = (PrepareRekey)rpc; this.mTunnel.SetNextRecipentPublicKey(p.NextPublicKey); RekeyResponse response = new RekeyResponse((PrepareRekey)this.mTunnel.PrepareRekey()); EncryptedPacket packet = new EncryptedPacket(this.mTunnel.ID, this.ID); packet.RPCs.Add(response); this.mTunnel.EncryptAndSendPacket(packet); rekeyReady = true; }