m/n/core/localstorage: add helper functions for PKIDirectory

Change-Id: I2798b9d6fcaedcf7a5e8e01e322797ebb8a1389d
Reviewed-on: https://review.monogon.dev/c/monogon/+/1376
Tested-by: Jenkins CI
Reviewed-by: Lorenz Brun <lorenz@monogon.tech>
diff --git a/metropolis/node/core/identity/identity.go b/metropolis/node/core/identity/identity.go
index 8749b6d..a08bd6f 100644
--- a/metropolis/node/core/identity/identity.go
+++ b/metropolis/node/core/identity/identity.go
@@ -112,44 +112,19 @@
 
 // Save stores the given node credentials in local storage.
 func (n *NodeCredentials) Save(d *localstorage.PKIDirectory) error {
-	if err := d.CACertificate.Write(n.ca.Raw, 0400); err != nil {
-		return fmt.Errorf("when writing CA certificate: %w", err)
-	}
-	if err := d.Certificate.Write(n.node.Raw, 0400); err != nil {
-		return fmt.Errorf("when writing node certificate: %w", err)
-	}
-	if err := d.Key.Write(n.private, 0400); err != nil {
-		return fmt.Errorf("when writing node private key: %w", err)
-	}
-	return nil
+	return d.WriteAll(n.node.Raw, n.private, n.ca.Raw)
 }
 
 // Read initializes NodeCredentials' contents with the data stored in the
 // PKIDirectory d. It may return an I/O error, or a parsing error.
 func (n *NodeCredentials) Read(d *localstorage.PKIDirectory) error {
-	if car, err := d.CACertificate.Read(); err != nil {
-		return fmt.Errorf("while reading CA certificate: %w", err)
-	} else {
-		cert, err := x509.ParseCertificate(car)
-		if err != nil {
-			return fmt.Errorf("while parsing CA certificate: %w", err)
-		}
-		n.ca = cert
+	ca, cert, key, err := d.ReadAll()
+	if err != nil {
+		return err
 	}
-	if nr, err := d.Certificate.Read(); err != nil {
-		return fmt.Errorf("while reading node certificate: %w", err)
-	} else {
-		cert, err := x509.ParseCertificate(nr)
-		if err != nil {
-			return fmt.Errorf("while parsing node certificate: %w", err)
-		}
-		n.node = cert
-	}
-	if npr, err := d.Key.Read(); err != nil {
-		return fmt.Errorf("while reading node private key: %w", err)
-	} else {
-		n.private = npr
-	}
+	n.ca = ca
+	n.node = cert
+	n.private = key
 	return nil
 }