diff --git a/quantumlayer-emu-prng.go b/quantumlayer-emu-prng.go index 6865c8210b47dfa518a4825ab1c30d717e55c170..0f8e7e712d144792b9ed578e2f9c90f0a9a082cf 100644 --- a/quantumlayer-emu-prng.go +++ b/quantumlayer-emu-prng.go @@ -54,19 +54,28 @@ func NewQuantumlayerEmuPRNG() (newql *QuantumlayerEmuPRNG) { // Power on the quantum layer, i.e., open up the communication ports for the // other quantum module -func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { +func (qlemuprng *QuantumlayerEmuPRNG) PowerOn(localQLAddress ...string) { qlemuprng.poweron = false log.Println("QuantumlayerEmuPRNG is powering on...charging.") - // Start receiving numberstore + // Start receiving numberstores go qlemuprng.peerNumbers.receiveNumbers(qlemuprng.incomingRandNums) go qlemuprng.myNumbers.receiveNumbers(qlemuprng.outgoingRandNums) // serve UDP incoming go func() { // Get UDP server part going... + // Determine if a local UDP address should be used or not + var udpAddrString string + if len(localQLAddress) == 0 { + // No input + udpAddrString = ":0" + } else { + udpAddrString = localQLAddress[0] + } + log.Printf("localQLAddress is %s", localQLAddress[0]) // This reads random numbers from other Quantum end - udpSrvPort, err := net.ResolveUDPAddr("udp", ":0") + udpSrvPort, err := net.ResolveUDPAddr("udp", udpAddrString) if err != nil { log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) return @@ -160,7 +169,10 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr net.UDPAddr) { log.Printf("json.Marshal error %s", err) } - qlemuprng.udpSrvConn.WriteMsgUDPAddrPort(jsonPayload, nil, addr.AddrPort()) + _, _, err = qlemuprng.udpSrvConn.WriteMsgUDPAddrPort(jsonPayload, nil, addr.AddrPort()) + if err != nil { + log.Fatalf("WriteMsgUDPAddrPort failed: %s", err) + } qlemuprng.outgoingRandNums <- qpe time.Sleep(5 * time.Second) } diff --git a/quantumlayer-emu-prng_test.go b/quantumlayer-emu-prng_test.go new file mode 100644 index 0000000000000000000000000000000000000000..69d30b582e35da3b1ebd99fca9a1ba38eb78a3a4 --- /dev/null +++ b/quantumlayer-emu-prng_test.go @@ -0,0 +1,63 @@ +package quantumlayer + +// Some tests + +import ( + "fmt" + "net" + "testing" + "time" +) + +func TestQuantumLayer(t *testing.T) { + + ql1 := NewQuantumlayerEmuPRNG() + ql1.PowerOn() + defer ql1.PowerOff() + + ql2 := NewQuantumlayerEmuPRNG() + ql2.PowerOn() + defer ql2.PowerOff() + + // Generate UDPAddr for ql1 peer + udpQL2AddrString := fmt.Sprintf("127.0.0.1:%d", ql2.GetLocalQLPort().Port) + udpQL2Addr, err := net.ResolveUDPAddr("udp", udpQL2AddrString) + if err != nil { + t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + return + } + + // Generate UDPAddr for ql2 peer + udpQL1AddrString := fmt.Sprintf("127.0.0.1:%d", ql1.GetLocalQLPort().Port) + udpQL1Addr, err := net.ResolveUDPAddr("udp", udpQL1AddrString) + if err != nil { + t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) + return + } + + ql1.AddPeer(*udpQL2Addr) + ql2.AddPeer(*udpQL1Addr) + + for n := 0; n < 2; n++ { + resultQl1, err := ql1.GetKeyBatchPeer() + if err == nil { + t.Logf("run %d, *ql1* keyid %d \t keylen %d", n, resultQl1.BulkKeyId, resultQl1.BulkKeyLength) + } + + //resultQl2 := ql2.GetBatchPeer() + resultQl2, err := ql2.GetKeyBatchPeer() + if err == nil { + t.Logf("*ql2* keyid %d \t keylen %d", resultQl2.BulkKeyId, resultQl1.BulkKeyLength) + } + + resultQL2Local, err := ql2.GetKeyBatchLocal() + if err == nil { + t.Logf("Current key IDs are for ql2 local %d and for peer ql1 %d", resultQL2Local.BulkKeyId, resultQl1.BulkKeyId) + + } + + time.Sleep(5 * time.Second) + + } + +} diff --git a/quantumlayer.go b/quantumlayer.go index 28749e520c19beda172d404952768ebe46132c8d..603027867ccebb915f712cc3a36071a9ac15a887 100644 --- a/quantumlayer.go +++ b/quantumlayer.go @@ -11,7 +11,7 @@ type QuantumLayerBulkKey struct { } type QuantumLayer interface { - PowerOn() // switch on the quantum layer element + PowerOn(...string) // switch on the quantum layer element PowerOff() // switch off the quantum layer element AddPeer() // Adds a Quantum Layer Peer to the peer list RemovePeer() // Remmoves a Quantum Layer Peer to the peer list