76 lines
1.4 KiB
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
|
|
}
|