Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
util.go 1.75 KiB
package kms

import (
	"bytes"
	"encoding/base64"
	"fmt"
	"net/http"

	etsi14 "code.fbi.h-da.de/danet/ekms/api/go/rest/etsi/client"
	"github.com/google/uuid"
)

func randomItemFromMap[T comparable, M any](m map[T]M) (M, error) {
	for _, item := range m {
		return item, nil
	}

	var r M
	return r, fmt.Errorf("Could not return a random item from map %v", m)
}

func randomItemFromMapAndRemove[T comparable, M any](m map[T]M) (M, error) {
	for key, item := range m {
		delete(m, key)
		return item, nil
	}

	var r M
	return r, fmt.Errorf("Could not return a random item from map %v and delete it.", m)
}

func keysOfMap[T comparable, M any](m map[T]M) []T {
	keys := make([]T, len(m))

	i := 0
	for k := range m {
		keys[i] = k
		i++
	}

	return keys
}

func addETSIKeysToKeystore(keyStore *kmsKeyStore, keyContainer []etsi14.KeyContainerKeysInner) error {
	for _, keyItem := range keyContainer {
		// decode base64 encoded key string
		key, err := base64.StdEncoding.DecodeString(keyItem.GetKey())
		if err != nil {
			return err
		}
		keyId, err := uuid.Parse(keyItem.GetKeyID())
		if err != nil {
			return err
		}
		// add to keystore
		keyStore.addKey(keyId, key)
	}
	return nil
}

// NOTE: For demo purpose only
func sendKmsInfoMessage(url string, json []byte) error {
	request, err := http.NewRequest("POST", url, bytes.NewBuffer(json))
	if err != nil {
		return err
	}
	request.Header.Set("Content-Type", "application/json; charset=UTF-8")
	client := &http.Client{}
	response, err := client.Do(request)
	defer response.Body.Close()
	if err != nil {
		return err
	}
	return nil
}

type KMSInfo struct {
	Name             string `json:"Name"`
	EncryptedMessage string `json:"EncryptedMessage"`
	DecryptedMessage string `json:"DecryptedMessage"`
	Key              string `json:"Key"`
}