wroofauth/internal/keystore/keystore.go

76 lines
1.4 KiB
Go

package keystore
import (
"crypto/rand"
"encoding/base64"
"os"
"git.1in9.net/raider/wroofauth/internal/logger"
"github.com/lestrrat-go/jwx/jwk"
"github.com/spf13/viper"
"go.uber.org/zap"
)
var (
Global jwk.Set
)
func GenerateRandomBytes(n uint32) ([]byte, error) {
b := make([]byte, n)
_, err := rand.Read(b)
if err != nil {
return nil, err
}
return b, nil
}
func GenerateKeyID() (string, error) {
random, err := GenerateRandomBytes(64)
if err != nil {
return "", err
}
kid := base64.StdEncoding.EncodeToString(random)
return kid, nil
}
func LoadKeystore() {
if viper.GetString("crypto.keyfile") != "" {
keystoreContent, err := os.ReadFile(viper.GetString("crypto.keyfile"))
if err != nil {
logger.Logger.Fatal("Unable to load keyfile", zap.Error(err))
return
}
fileKeyStore, err := jwk.Parse(keystoreContent)
if err != nil {
logger.Logger.Fatal("Unable to load keyfile", zap.Error(err))
return
}
Global = fileKeyStore
if key, found := Global.Get(0); found {
viper.SetDefault("crypto.use_key", key.KeyID())
}
return
}
configKeyStore := jwk.NewSet()
err := viper.UnmarshalKey("crypto.keys", &configKeyStore)
if err != nil {
logger.Logger.Fatal("Unable to load keys", zap.Error(err))
return
}
Global = configKeyStore
if key, found := Global.Get(0); found {
viper.SetDefault("crypto.use_key", key.KeyID())
}
return
}