aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--key/boxgen.go4
-rw-r--r--key/file.go4
-rw-r--r--key/siggen.go47
3 files changed, 51 insertions, 4 deletions
diff --git a/key/boxgen.go b/key/boxgen.go
index bb4a61e..06ff360 100644
--- a/key/boxgen.go
+++ b/key/boxgen.go
@@ -18,14 +18,14 @@ func generateBoxKeypair() error {
util.Logf("generating new encryption/decryption keypair...")
// Create public key file.
- pubFile, err := createFile(boxPubKeyFile, pubFileMode)
+ pubFile, err := createFileIfNotExist(boxPubKeyFile, pubFileMode)
if err != nil {
return err
}
defer pubFile.Close()
// Create private key file.
- privFile, err := createFile(boxPrivKeyFile, privFileMode)
+ privFile, err := createFileIfNotExist(boxPrivKeyFile, privFileMode)
if err != nil {
pubFile.Close()
_ = os.Remove(boxPubKeyFile)
diff --git a/key/file.go b/key/file.go
index 59039ba..cdc32cd 100644
--- a/key/file.go
+++ b/key/file.go
@@ -26,9 +26,9 @@ var (
privFileMode os.FileMode = 0600
)
-// createFile creates a file with the specified permissions and returns it for writing.
+// createFileIfNotExist creates a file with the specified permissions and returns it for writing.
// It does not truncate an existing file. If the file already exists, an error is returned.
-func createFile(name string, mode os.FileMode) (*os.File, error) {
+func createFileIfNotExist(name string, mode os.FileMode) (*os.File, error) {
exists, err := fileExists(name)
if err != nil {
return nil, err // unexpected error.
diff --git a/key/siggen.go b/key/siggen.go
new file mode 100644
index 0000000..84d26fb
--- /dev/null
+++ b/key/siggen.go
@@ -0,0 +1,47 @@
+package key
+
+import (
+ crypto_rand "crypto/rand"
+ "encoding/hex"
+ "golang.org/x/crypto/nacl/sign"
+
+ "git.samanthony.xyz/hose/util"
+)
+
+func generateSigKeypair() error {
+ util.Logf("generating new sign/verify keypair...")
+
+ // Create public key file.
+ pubFile, err := createFileIfNotExist(sigPubKeyFile, pubFileMode)
+ if err != nil {
+ return err
+ }
+ defer pubFile.Close()
+
+ // Create private key file.
+ privFile, err := createFileIfNotExist(sigPrivKeyFile, privFileMode)
+ if err != nil {
+ return err
+ }
+ defer privFile.Close()
+
+ // Generate keypair.
+ pubkey, privkey, err := sign.GenerateKey(crypto_rand.Reader)
+ if err != nil {
+ return err
+ }
+
+ // Write keypair to files.
+ buf := make([]byte, hex.EncodedLen(len(*pubkey)))
+ hex.Encode(buf, (*pubkey)[:])
+ if _, err := pubFile.Write(buf); err != nil {
+ return err
+ }
+ buf = make([]byte, hex.EncodedLen(len(*privkey)))
+ hex.Encode(buf, (*privkey)[:])
+ if _, err := privFile.Write(buf); err != nil {
+ return err
+ }
+
+ return nil
+}