diff --git a/kms/kms.go b/kms/kms.go index 153b3fd942f200861515ea0a87e660e9b5121015..80ca057612426a0cbbd76259db4a5d038e55de07 100644 --- a/kms/kms.go +++ b/kms/kms.go @@ -69,7 +69,8 @@ func (kms *EKMS) AddQuantumElement(kmsUDPAddrr string) *QuantumElement { //Get an emulated Quantumlayer ql := quantumlayer.NewQuantumlayerEmuPRNG() - ql.PowerOn(kmsUDPAddrr) + ql.Configure(kmsUDPAddrr) + ql.PowerOn() ksl := kmsKeyStore{ keyStore: make(map[string]kmsKSElement), diff --git a/quantumlayer/quantumlayer-emu-prng.go b/quantumlayer/quantumlayer-emu-prng.go index a074502454d58e05e618a6f73730734677fa9d4c..9417e5ff919cf7d27956898060d9286ce39c8384 100644 --- a/quantumlayer/quantumlayer-emu-prng.go +++ b/quantumlayer/quantumlayer-emu-prng.go @@ -29,11 +29,13 @@ type QuantumPayloadElement struct { } type QuantumlayerEmuPRNG struct { + configured bool poweron bool incomingRandNums chan QuantumPayloadElement outgoingRandNums chan QuantumPayloadElement peerNumbers *NumberStore myNumbers *NumberStore + localQLAddress string udpSrvConn *net.UDPConn qlPeer string qlPeerCancel context.CancelFunc @@ -43,6 +45,7 @@ type QuantumlayerEmuPRNG struct { func NewQuantumlayerEmuPRNG() (newql *QuantumlayerEmuPRNG) { return &QuantumlayerEmuPRNG{ + configured: false, poweron: false, incomingRandNums: make(chan QuantumPayloadElement), outgoingRandNums: make(chan QuantumPayloadElement), @@ -52,31 +55,41 @@ 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(localQLAddress ...string) { - qlemuprng.poweron = false - log.Println("QuantumlayerEmuPRNG is powering on...charging.") +// Configure the quantum emulation, but do not start if yet +func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) { // Start receiving numberstores go qlemuprng.peerNumbers.receiveNumbers(qlemuprng.incomingRandNums) go qlemuprng.myNumbers.receiveNumbers(qlemuprng.outgoingRandNums) + // Determine if a local UDP address should be used or not + if len(localQLAddress) == 0 { + // No input + qlemuprng.localQLAddress = ":0" + } else { + qlemuprng.localQLAddress = localQLAddress[0] + } + qlemuprng.configured = true +} + +// Power on the quantum layer, i.e., open up the communication ports for the +// other quantum module +func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { + if qlemuprng.configured == false { + // nothing do here move on + log.Printf("Sorry, the quantum layer is not configured for action. You've missed Configure()") + return + } + qlemuprng.poweron = false + log.Println("QuantumlayerEmuPRNG is powering on...charging.") + // 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]) + log.Printf("localQLAddress is %s", qlemuprng.localQLAddress) // This reads random numbers from other Quantum end - udpSrvPort, err := net.ResolveUDPAddr("udp", udpAddrString) + udpSrvPort, err := net.ResolveUDPAddr("udp", qlemuprng.localQLAddress) if err != nil { log.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) return @@ -158,23 +171,25 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr net.UDPAddr) { case <-ctx.Done(): return default: - // retrieve a new back of random numbers - newNumberBatch := qlemuprng.GenerateRandomNumbers() - // TODO: Replace this by some generic encapsulation reader and not just JSON - //Get JSON for transmission ready - qpe := QuantumPayloadElement{time.Now().UnixNano(), len(newNumberBatch), &newNumberBatch} - - // XXX/TODO: error must be handled - jsonPayload, err := json.Marshal(qpe) - if err != nil { - log.Printf("json.Marshal error %s", err) - } + if qlemuprng.poweron == true { + // retrieve a new back of random numbers + newNumberBatch := qlemuprng.GenerateRandomNumbers() + // TODO: Replace this by some generic encapsulation reader and not just JSON + //Get JSON for transmission ready + qpe := QuantumPayloadElement{time.Now().UnixNano(), len(newNumberBatch), &newNumberBatch} + + // XXX/TODO: error must be handled + jsonPayload, err := json.Marshal(qpe) + if err != nil { + log.Printf("json.Marshal error %s", err) + } - _, _, err = qlemuprng.udpSrvConn.WriteMsgUDPAddrPort(jsonPayload, nil, addr.AddrPort()) - if err != nil { - log.Fatalf("WriteMsgUDPAddrPort failed: %s", err) + _, _, err = qlemuprng.udpSrvConn.WriteMsgUDPAddrPort(jsonPayload, nil, addr.AddrPort()) + if err != nil { + log.Fatalf("WriteMsgUDPAddrPort failed: %s", err) + } + qlemuprng.outgoingRandNums <- qpe } - qlemuprng.outgoingRandNums <- qpe time.Sleep(5 * time.Second) } } diff --git a/quantumlayer/quantumlayer.go b/quantumlayer/quantumlayer.go index 603027867ccebb915f712cc3a36071a9ac15a887..8c68e348f69f0fd705dd20ca307482751d968394 100644 --- a/quantumlayer/quantumlayer.go +++ b/quantumlayer/quantumlayer.go @@ -11,7 +11,8 @@ type QuantumLayerBulkKey struct { } type QuantumLayer interface { - PowerOn(...string) // switch on the quantum layer element + Configure(...string) // configure the interface, e.g., used IP/Port config if emulated + PowerOn() // 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