aboutsummaryrefslogtreecommitdiff
path: root/encoding/pem/write.go
diff options
context:
space:
mode:
Diffstat (limited to 'encoding/pem/write.go')
-rw-r--r--encoding/pem/write.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/encoding/pem/write.go b/encoding/pem/write.go
new file mode 100644
index 0000000..c239f8e
--- /dev/null
+++ b/encoding/pem/write.go
@@ -0,0 +1,62 @@
1package pem
2
3import (
4 "bytes"
5 "crypto/ecdsa"
6 "crypto/rsa"
7 "crypto/x509"
8 "encoding/pem"
9 "io"
10 "os"
11)
12
13func pemWrite(filename, header string, data [][]byte) error {
14 out, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0600)
15 if err != nil {
16 return err
17 }
18 defer out.Close()
19
20 for _, d := range data {
21 err = pem.Encode(out, &pem.Block{
22 Type: header,
23 Bytes: d,
24 })
25 if err != nil {
26 return err
27 }
28 }
29
30 return nil
31}
32
33func WriteRSAPrivateKey(filename string, key *rsa.PrivateKey) error {
34 return pemWrite(filename, "RSA PRIVATE KEY", [][]byte{x509.MarshalPKCS1PrivateKey(key)})
35}
36
37func WriteCertificateChain(filename string, der [][]byte) error {
38 return pemWrite(filename, "CERTIFICATE", der)
39}
40
41func WriteECPrivateKey(filename string, key *ecdsa.PrivateKey) error {
42 m, err := x509.MarshalECPrivateKey(key)
43 if err != nil {
44 return err
45 }
46
47 return pemWrite(filename, "EC PRIVATE KEY", [][]byte{m})
48}
49
50func CSRToPEMReader(der []byte) (io.ReadCloser, error) {
51 out := &bytes.Buffer{}
52
53 err := pem.Encode(out, &pem.Block{
54 Type: "CERTIFICATE REQUEST",
55 Bytes: der,
56 })
57 if err != nil {
58 return nil, err
59 }
60
61 return io.NopCloser(out), nil
62}