diff --git a/goKMS/kms/kms.go b/goKMS/kms/kms.go index f8588b483b4f01b71df3457cdfff0690bd869483..8f8616dfccab4eaa0827bd1390aa714db77cad1d 100644 --- a/goKMS/kms/kms.go +++ b/goKMS/kms/kms.go @@ -29,6 +29,7 @@ import ( "code.fbi.h-da.de/danet/quant/goKMS/kms/event" "code.fbi.h-da.de/danet/quant/goKMS/kms/peers" "code.fbi.h-da.de/danet/quant/goKMS/kms/store" + kmstls "code.fbi.h-da.de/danet/quant/goKMS/kms/tls" "code.fbi.h-da.de/danet/quant/goKMS/kms/util" pbQS "code.fbi.h-da.de/danet/quipsec/gen/go/quipsec" "github.com/google/uuid" @@ -67,7 +68,7 @@ type KMS struct { kmsUUID uuid.UUID interComAddr string quantumAddress string - tlsData TlsData + tlsData kmstls.TlsData // TODO create a mapping between ids and address remoteKMSMapping map[string]*RemoteKMS remoteKMSMappingMutex sync.RWMutex @@ -88,13 +89,6 @@ type KMS struct { CKMSAkmsServer *server.AKMSReceiverServer } -type TlsData struct { - TLS bool - CaFile string - CertFile string - KeyFile string -} - // Will keep information about the quantum elements that this EKMS is talking to // This actually constitutes a quantum element with only a single link @@ -124,7 +118,7 @@ func NewKMS(kmsUUID uuid.UUID, logOutput io.Writer, logLevel log.Level, logInJso log.SetReportCaller(false) } - tlsData := TlsData{ + tlsData := kmstls.TlsData{ TLS: config.TLS, CaFile: config.CAFile, CertFile: config.CertFile, @@ -197,7 +191,7 @@ func initializePeers(kms *KMS, config *config.Config) error { var gRPCTransportCreds credentials.TransportCredentials if config.TLS { - gRPCTransportCreds, err = util.GenerateGRPCClientTransportCredsWithTLS(config.CAFile, config.CertFile, config.KeyFile) + gRPCTransportCreds, err = kmstls.GenerateGRPCClientTransportCredsWithTLS(config.CAFile, config.CertFile, config.KeyFile) if err != nil { log.Error(err) return nil @@ -239,7 +233,7 @@ func initializePeers(kms *KMS, config *config.Config) error { return nil } -func (kms *KMS) startGRPC(interComAddr string, quantumAddress string, tlsData TlsData) { +func (kms *KMS) startGRPC(interComAddr string, quantumAddress string, tlsData kmstls.TlsData) { interKMSLis, err := net.Listen("tcp", interComAddr) if err != nil { log.Fatalf("failed to listen: %v", err) @@ -247,7 +241,7 @@ func (kms *KMS) startGRPC(interComAddr string, quantumAddress string, tlsData Tl var gRPCTransportCreds credentials.TransportCredentials if tlsData.TLS { - gRPCTransportCreds, err = util.GenerateGRPCServerTransportCredsWithTLS(tlsData.CaFile, tlsData.CertFile, tlsData.KeyFile) + gRPCTransportCreds, err = kmstls.GenerateGRPCServerTransportCredsWithTLS(tlsData.CaFile, tlsData.CertFile, tlsData.KeyFile) if err != nil { log.Fatalf("unable to generate TLS creds: %v", err) } @@ -502,7 +496,7 @@ func (kms *KMS) GenerateAndSendKSAKey(remoteKMSId string, pathId uuid.UUID, requ // send to remote var gRPCTransportCreds credentials.TransportCredentials if kms.tlsData.TLS { - gRPCTransportCreds, err = util.GenerateGRPCClientTransportCredsWithTLS(kms.tlsData.CaFile, kms.tlsData.CertFile, kms.tlsData.KeyFile) + gRPCTransportCreds, err = kmstls.GenerateGRPCClientTransportCredsWithTLS(kms.tlsData.CaFile, kms.tlsData.CertFile, kms.tlsData.KeyFile) if err != nil { log.Fatalf("unable to generate TLS creds: %v", err) } diff --git a/goKMS/kms/kmsintercom.go b/goKMS/kms/kmsintercom.go index 65e205912a3a9f168990d9376f992315fb6e91de..cc5845211a193f1ebed2618bea0bf6978ad1efe7 100644 --- a/goKMS/kms/kmsintercom.go +++ b/goKMS/kms/kmsintercom.go @@ -16,7 +16,7 @@ import ( "code.fbi.h-da.de/danet/quant/goKMS/kms/event" "code.fbi.h-da.de/danet/quant/goKMS/kms/peers" "code.fbi.h-da.de/danet/quant/goKMS/kms/store" - "code.fbi.h-da.de/danet/quant/goKMS/kms/util" + kmstls "code.fbi.h-da.de/danet/quant/goKMS/kms/tls" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" @@ -288,7 +288,7 @@ func (s *kmsTalkerServer) KeyForwarding(ctx context.Context, in *pb.KeyForwardin var gRPCTransportCreds credentials.TransportCredentials if s.KMS.tlsData.TLS { - gRPCTransportCreds, err = util.GenerateGRPCClientTransportCredsWithTLS(s.KMS.tlsData.CaFile, s.KMS.tlsData.CertFile, s.KMS.tlsData.KeyFile) + gRPCTransportCreds, err = kmstls.GenerateGRPCClientTransportCredsWithTLS(s.KMS.tlsData.CaFile, s.KMS.tlsData.CertFile, s.KMS.tlsData.KeyFile) if err != nil { log.Fatalf("unable to generate TLS creds: %v", err) } diff --git a/goKMS/kms/tls/tls.go b/goKMS/kms/tls/tls.go new file mode 100644 index 0000000000000000000000000000000000000000..026119b7b2b5cd0707569a84ef5d193813b8637b --- /dev/null +++ b/goKMS/kms/tls/tls.go @@ -0,0 +1,68 @@ +package kmstls + +import ( + "crypto/tls" + "crypto/x509" + "fmt" + "os" + + "google.golang.org/grpc/credentials" +) + +type TlsData struct { + TLS bool + CaFile string + CertFile string + KeyFile string +} + +func GenerateGRPCServerTransportCredsWithTLS(caFilePath, certFile, keyFile string) (credentials.TransportCredentials, error) { + cp := x509.NewCertPool() + b, err := os.ReadFile(caFilePath) + if err != nil { + return nil, err + } + + if !cp.AppendCertsFromPEM(b) { + return nil, fmt.Errorf("credentials: failed to append certificates") + } + + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS13, + ClientCAs: cp, + Certificates: []tls.Certificate{cert}, + ClientAuth: tls.RequireAndVerifyClientCert, + } + + return credentials.NewTLS(tlsConfig), nil +} + +func GenerateGRPCClientTransportCredsWithTLS(caFilePath, certFile, keyFile string) (credentials.TransportCredentials, error) { + cp := x509.NewCertPool() + + b, err := os.ReadFile(caFilePath) + if err != nil { + return nil, err + } + if !cp.AppendCertsFromPEM(b) { + return nil, fmt.Errorf("credentials: failed to append certificates") + } + + cert, err := tls.LoadX509KeyPair(certFile, keyFile) + if err != nil { + return nil, err + } + + tlsConfig := &tls.Config{ + MinVersion: tls.VersionTLS13, + RootCAs: cp, + Certificates: []tls.Certificate{cert}, + } + + return credentials.NewTLS(tlsConfig), nil +} diff --git a/goKMS/kms/util/util.go b/goKMS/kms/util/util.go index 6885636a423f33d062aa590b078edc9248888e99..14e926490bc655d3f399abe2609ce2e7a396c7ec 100644 --- a/goKMS/kms/util/util.go +++ b/goKMS/kms/util/util.go @@ -2,14 +2,10 @@ package util import ( "bytes" - "crypto/tls" - "crypto/x509" "fmt" "net/http" - "os" "github.com/hashicorp/go-multierror" - "google.golang.org/grpc/credentials" ) func RandomItemFromMap[T comparable, M any](m map[T]M) (T, M, error) { @@ -74,54 +70,3 @@ type KMSInfo struct { DecryptedMessage string `json:"DecryptedMessage"` Key string `json:"Key"` } - -func GenerateGRPCServerTransportCredsWithTLS(caFilePath, certFile, keyFile string) (credentials.TransportCredentials, error) { - cp := x509.NewCertPool() - b, err := os.ReadFile(caFilePath) - if err != nil { - return nil, err - } - - if !cp.AppendCertsFromPEM(b) { - return nil, fmt.Errorf("credentials: failed to append certificates") - } - - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS13, - ClientCAs: cp, - Certificates: []tls.Certificate{cert}, - ClientAuth: tls.RequireAndVerifyClientCert, - } - - return credentials.NewTLS(tlsConfig), nil -} - -func GenerateGRPCClientTransportCredsWithTLS(caFilePath, certFile, keyFile string) (credentials.TransportCredentials, error) { - cp := x509.NewCertPool() - - b, err := os.ReadFile(caFilePath) - if err != nil { - return nil, err - } - if !cp.AppendCertsFromPEM(b) { - return nil, fmt.Errorf("credentials: failed to append certificates") - } - - cert, err := tls.LoadX509KeyPair(certFile, keyFile) - if err != nil { - return nil, err - } - - tlsConfig := &tls.Config{ - MinVersion: tls.VersionTLS13, - RootCAs: cp, - Certificates: []tls.Certificate{cert}, - } - - return credentials.NewTLS(tlsConfig), nil -}