aboutsummaryrefslogtreecommitdiff
path: root/load_private_key.go
diff options
context:
space:
mode:
Diffstat (limited to 'load_private_key.go')
-rw-r--r--load_private_key.go53
1 files changed, 53 insertions, 0 deletions
diff --git a/load_private_key.go b/load_private_key.go
new file mode 100644
index 0000000..4678862
--- /dev/null
+++ b/load_private_key.go
@@ -0,0 +1,53 @@
+package main
+
+import (
+ "fmt"
+ "os"
+
+ "github.com/gibheer/pki"
+)
+
+func loadPrivateKey(path string) (pki.PrivateKey, error) {
+ if path == "" {
+ return nil, fmt.Errorf("no path given")
+ }
+ var err error
+ file, err := os.Open(path)
+ if err != nil {
+ return nil, err
+ }
+ defer file.Close()
+ info, err := file.Stat()
+ if err != nil {
+ return nil, err
+ }
+ if info.Mode().Perm().String()[4:] != "------" {
+ return nil, fmt.Errorf("private key must not be readable for group or world")
+ }
+
+ pems, err := parseFile(file)
+ if err != nil {
+ return nil, err
+ }
+ if len(pems) > 1 {
+ return nil, fmt.Errorf("more than one object in file")
+ }
+
+ var pk pki.PrivateKey
+ for key, parts := range pems {
+ if len(parts) > 1 {
+ return nil, fmt.Errorf("more than one object found")
+ }
+ switch key {
+ case pki.PemLabelRsa:
+ pk, err = pki.LoadPrivateKeyRsa(parts[0])
+ case pki.PemLabelEd25519:
+ pk, err = pki.LoadPrivateKeyEd25519(parts[0])
+ case pki.PemLabelEcdsa:
+ pk, err = pki.LoadPrivateKeyEcdsa(parts[0])
+ default:
+ return nil, fmt.Errorf("unknown private key format %s", key)
+ }
+ }
+ return pk, err
+}