scripts/gpgkey/main.go (65 lines of code) (raw):
// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
// or more contributor license agreements. Licensed under the Elastic License;
// you may not use this file except in compliance with the Elastic License.
package main
import (
"log"
"os"
"strings"
"github.com/ProtonMail/gopenpgp/v2/crypto"
)
const (
signerPassphraseEnv = "ELASTIC_PACKAGE_SIGNER_PASSPHRASE"
privateKeyPathEnv = "ELASTIC_PACKAGE_SIGNER_PRIVATE_KEYFILE"
)
func main() {
passphrase := readPassphrase()
privateKeyPath, publicKeyPath := getKeyPaths()
rsaKeyArmor, rsaPublicKeyArmor := genKey(passphrase)
err := os.WriteFile(privateKeyPath, rsaKeyArmor, 0644)
if err != nil {
log.Fatal(err)
}
err = os.WriteFile(publicKeyPath, rsaPublicKeyArmor, 0644)
if err != nil {
log.Fatal(err)
}
}
func genKey(passphrase []byte) ([]byte, []byte) {
const (
name = "Elastic Package Test"
rsaBits = 2048
)
rsaKey, err := crypto.GenerateKey(name, "", "rsa", rsaBits)
if err != nil {
log.Fatal(err)
}
rsaKey, err = rsaKey.Lock(passphrase)
if err != nil {
log.Fatal(err)
}
rsaKeyArmor, err := rsaKey.Armor()
if err != nil {
log.Fatal(err)
}
rsaPublicKeyArmor, err := rsaKey.GetArmoredPublicKey()
if err != nil {
log.Fatal(err)
}
return []byte(rsaKeyArmor), []byte(rsaPublicKeyArmor)
}
func readPassphrase() []byte {
passphrase := os.Getenv(signerPassphraseEnv)
if passphrase == "" {
log.Fatalf("Environment variable %s empty or not set", signerPassphraseEnv)
}
return []byte(passphrase)
}
func getKeyPaths() (string, string) {
privateKeyPath := os.Getenv(privateKeyPathEnv)
if privateKeyPath == "" {
log.Fatalf("Environment variable %s empty or not set", privateKeyPathEnv)
}
publicKeyPath := strings.ReplaceAll(privateKeyPath, "private", "public")
if privateKeyPath == publicKeyPath {
log.Fatalf("The path indicated in %s is expected to contain \"private\", found: %s", privateKeyPathEnv, privateKeyPath)
}
return privateKeyPath, publicKeyPath
}