Skip to content
Snippets Groups Projects
Commit 1d25e490 authored by Martin Stiemerling's avatar Martin Stiemerling :speech_balloon: Committed by Malte Bauch
Browse files

Wg4 qle config generating side

parent a97e5359
No related branches found
No related tags found
1 merge request!8Create a monorepo for ekms and quantumlayer
...@@ -32,7 +32,8 @@ type QuantumPayloadElement struct { ...@@ -32,7 +32,8 @@ type QuantumPayloadElement struct {
type QuantumlayerEmuPRNG struct { type QuantumlayerEmuPRNG struct {
configured bool configured bool
poweron bool poweron bool // set to yes if operation, i.e., generating keys
generateKeys bool // set to yes, if this qle should generate random number.
incomingRandNums chan QuantumPayloadElement incomingRandNums chan QuantumPayloadElement
outgoingRandNums chan QuantumPayloadElement outgoingRandNums chan QuantumPayloadElement
peerNumbers *NumberStore peerNumbers *NumberStore
...@@ -74,6 +75,7 @@ func NewQuantumlayerEmuPRNG(logOutput io.Writer, logLevel logi.Level, logInJson ...@@ -74,6 +75,7 @@ func NewQuantumlayerEmuPRNG(logOutput io.Writer, logLevel logi.Level, logInJson
return &QuantumlayerEmuPRNG{ return &QuantumlayerEmuPRNG{
configured: false, configured: false,
poweron: false, poweron: false,
generateKeys: false,
incomingRandNums: make(chan QuantumPayloadElement), incomingRandNums: make(chan QuantumPayloadElement),
outgoingRandNums: make(chan QuantumPayloadElement), outgoingRandNums: make(chan QuantumPayloadElement),
peerNumbers: NewNumberStore(40000), peerNumbers: NewNumberStore(40000),
...@@ -101,8 +103,8 @@ func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) { ...@@ -101,8 +103,8 @@ func (qlemuprng *QuantumlayerEmuPRNG) Configure(localQLAddress ...string) {
// Power on the quantum layer, i.e., open up the communication ports for the // Power on the quantum layer, i.e., open up the communication ports for the
// other quantum module // other quantum module
func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { func (qlemuprng *QuantumlayerEmuPRNG) PowerOn(enableKeyGeneration bool) {
if qlemuprng.configured == false { if !qlemuprng.configured {
// nothing do here move on // nothing do here move on
log.Errorf("QuantumlayerEmuPRNG: Sorry, the quantum layer is not configured for action. You've missed Configure()") log.Errorf("QuantumlayerEmuPRNG: Sorry, the quantum layer is not configured for action. You've missed Configure()")
return return
...@@ -110,6 +112,11 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() { ...@@ -110,6 +112,11 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOn() {
//qlemuprng.poweron = false //qlemuprng.poweron = false
log.Infof("QuantumlayerEmuPRNG: is powering on...charging.") log.Infof("QuantumlayerEmuPRNG: is powering on...charging.")
if enableKeyGeneration {
log.Infof("QuantumlayerEmuPRNG: will GENERATE random keys")
}
qlemuprng.generateKeys = enableKeyGeneration
// serve UDP incoming // serve UDP incoming
if qlemuprng.udpSrvConn == nil { if qlemuprng.udpSrvConn == nil {
go func() { go func() {
...@@ -181,7 +188,7 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOff() { ...@@ -181,7 +188,7 @@ func (qlemuprng *QuantumlayerEmuPRNG) PowerOff() {
} }
func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) {
if qlemuprng.poweron == false { if !qlemuprng.poweron {
return return
} }
//TODO/XXX check the incoming addr //TODO/XXX check the incoming addr
...@@ -191,40 +198,43 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) { ...@@ -191,40 +198,43 @@ func (qlemuprng *QuantumlayerEmuPRNG) AddPeer(addr *net.UDPAddr) {
qlemuprng.qlPeer = addr.String() qlemuprng.qlPeer = addr.String()
qlemuprng.qlPeerMutex.Unlock() qlemuprng.qlPeerMutex.Unlock()
ctx, cancel := context.WithCancel(context.Background()) // generate only keys if requested to do so.
qlemuprng.qlPeerCancel = cancel if qlemuprng.generateKeys {
ctx, cancel := context.WithCancel(context.Background())
qlemuprng.qlPeerCancel = cancel
// Start the generation and shipping of random numbers // Start the generation and shipping of random numbers
go func(ctx context.Context) { go func(ctx context.Context) {
for { for {
select { select {
case <-ctx.Done(): case <-ctx.Done():
return return
default: default:
if qlemuprng.poweron == true { if qlemuprng.poweron {
// retrieve a new back of random numbers // retrieve a new back of random numbers
newNumberBatch := qlemuprng.GenerateRandomNumbers() newNumberBatch := qlemuprng.GenerateRandomNumbers()
// TODO: Replace this by some generic encapsulation reader and not just JSON // TODO: Replace this by some generic encapsulation reader and not just JSON
//Get JSON for transmission ready //Get JSON for transmission ready
qpe := QuantumPayloadElement{time.Now().UnixNano(), len(newNumberBatch), &newNumberBatch} qpe := QuantumPayloadElement{time.Now().UnixNano(), len(newNumberBatch), &newNumberBatch}
// XXX/TODO: error must be handled // XXX/TODO: error must be handled
jsonPayload, err := json.Marshal(qpe) jsonPayload, err := json.Marshal(qpe)
if err != nil { if err != nil {
log.Errorf("QuantumlayerEmuPRNG: json.Marshal error %s", err) log.Errorf("QuantumlayerEmuPRNG: json.Marshal error %s", err)
} }
_, _, err = qlemuprng.udpSrvConn.WriteMsgUDP(jsonPayload, nil, addr) _, _, err = qlemuprng.udpSrvConn.WriteMsgUDP(jsonPayload, nil, addr)
if err != nil { if err != nil {
log.Fatalf("QuantumlayerEmuPRNG: WriteMsgUDPAddrPort failed: %s", err) log.Fatalf("QuantumlayerEmuPRNG: WriteMsgUDPAddrPort failed: %s", err)
}
qlemuprng.outgoingRandNums <- qpe
} }
qlemuprng.outgoingRandNums <- qpe // TODO: This sleep timer has to replaced by something for clever.
time.Sleep(5 * time.Second)
} }
// TODO: This sleep timer has to replaced by something for clever.
time.Sleep(5 * time.Second)
} }
} }(ctx)
}(ctx) }
} }
func (qlemuprng *QuantumlayerEmuPRNG) RemovePeer() { func (qlemuprng *QuantumlayerEmuPRNG) RemovePeer() {
......
...@@ -5,22 +5,17 @@ package quantumlayer ...@@ -5,22 +5,17 @@ package quantumlayer
import ( import (
"fmt" "fmt"
"net" "net"
"os"
"testing" "testing"
"time" "time"
logrus "github.com/sirupsen/logrus"
) )
func TestQuantumLayer(t *testing.T) { func TestQuantumLayer(t *testing.T) {
ql1 := NewQuantumlayerEmuPRNG()
ql1.PowerOn()
defer ql1.PowerOff()
ql2 := NewQuantumlayerEmuPRNG()
ql2.PowerOn()
defer ql2.PowerOff()
// Generate UDPAddr for ql1 peer // Generate UDPAddr for ql1 peer
udpQL2AddrString := fmt.Sprintf("127.0.0.1:%d", ql2.GetLocalQLPort().Port) udpQL2AddrString := fmt.Sprintf("127.0.0.1:%d", 5002)
udpQL2Addr, err := net.ResolveUDPAddr("udp", udpQL2AddrString) udpQL2Addr, err := net.ResolveUDPAddr("udp", udpQL2AddrString)
if err != nil { if err != nil {
t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err)
...@@ -28,34 +23,55 @@ func TestQuantumLayer(t *testing.T) { ...@@ -28,34 +23,55 @@ func TestQuantumLayer(t *testing.T) {
} }
// Generate UDPAddr for ql2 peer // Generate UDPAddr for ql2 peer
udpQL1AddrString := fmt.Sprintf("127.0.0.1:%d", ql1.GetLocalQLPort().Port) udpQL1AddrString := fmt.Sprintf("127.0.0.1:%d", 5001)
udpQL1Addr, err := net.ResolveUDPAddr("udp", udpQL1AddrString) udpQL1Addr, err := net.ResolveUDPAddr("udp", udpQL1AddrString)
if err != nil { if err != nil {
t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err) t.Fatalf("QuantumlayerEmuPRNG UDP failure: %s", err)
return return
} }
ql1 := NewQuantumlayerEmuPRNG(os.Stdout, logrus.DebugLevel, false)
ql1.Configure(udpQL1AddrString)
ql1.PowerOn(true) // this one generates keys
defer ql1.PowerOff()
ql2 := NewQuantumlayerEmuPRNG(os.Stdout, logrus.DebugLevel, false)
ql2.Configure(udpQL2AddrString)
ql2.PowerOn(false) // this one does NOT generate keys
defer ql2.PowerOff()
ql1.AddPeer(udpQL2Addr) ql1.AddPeer(udpQL2Addr)
ql2.AddPeer(udpQL1Addr) ql2.AddPeer(udpQL1Addr)
// Wait for key gen to get up and running
time.Sleep(5 * time.Second)
for n := 0; n < 2; n++ { for n := 0; n < 2; n++ {
resultQl1, err := ql1.GetKeyBatchPeer() resultQl1, err := ql1.GetKeyBatchLocal()
if err == nil { if err == nil {
t.Logf("run %d, *ql1* keyid %d \t keylen %d", n, resultQl1.BulkKeyId, resultQl1.BulkKeyLength) t.Logf("run %d, *ql1* keyid %d \t keylen %d", n, resultQl1.BulkKeyId, resultQl1.BulkKeyLength)
} else {
t.Fatalf("Couldn't read local ql1 batch with error %s", err)
} }
//resultQl2 := ql2.GetBatchPeer() //resultQl2 := ql2.GetBatchPeer()
resultQl2, err := ql2.GetKeyBatchPeer() resultQl2, err := ql2.GetKeyBatchPeer()
if err == nil { if err == nil {
t.Logf("*ql2* keyid %d \t keylen %d", resultQl2.BulkKeyId, resultQl1.BulkKeyLength) t.Logf("*ql2* keyid %d \t keylen %d", resultQl2.BulkKeyId, resultQl2.BulkKeyLength)
} else {
t.Fatalf("Couldn't read local ql2 batch with error %s", err)
} }
resultQL2Local, err := ql2.GetKeyBatchLocal() if resultQl1.BulkKeyId != resultQl2.BulkKeyId {
if err == nil { log.Fatalf("Mismatching BulkKeyIds ql1 (%d) != ql2 (%d)", resultQl1.BulkKeyId, resultQl2.BulkKeyId)
t.Logf("Current key IDs are for ql2 local %d and for peer ql1 %d", resultQL2Local.BulkKeyId, resultQl1.BulkKeyId) }
if resultQl1.BulkKeyLength != resultQl2.BulkKeyLength {
log.Fatalf("Mismatching BulkKeyLengths ql1 (%d) != ql2 (%d)", resultQl1.BulkKeyLength, resultQl2.BulkKeyLength)
} }
// TODO: Calculate checksum of BulkKey
time.Sleep(5 * time.Second) time.Sleep(5 * time.Second)
} }
......
...@@ -12,7 +12,7 @@ type QuantumLayerBulkKey struct { ...@@ -12,7 +12,7 @@ type QuantumLayerBulkKey struct {
type QuantumLayer interface { type QuantumLayer interface {
Configure(...string) // configure the interface, e.g., used IP/Port config if emulated Configure(...string) // configure the interface, e.g., used IP/Port config if emulated
PowerOn() // switch on the quantum layer element PowerOn(enableKeyGeneration bool) // switch on the quantum layer element
PowerOff() // switch off the quantum layer element PowerOff() // switch off the quantum layer element
GetStatus() (poweredOn bool) // returns true if quantum layer element is powered on GetStatus() (poweredOn bool) // returns true if quantum layer element is powered on
AddPeer() // Adds a Quantum Layer Peer to the peer list AddPeer() // Adds a Quantum Layer Peer to the peer list
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment