blob: b021eff2019c4f5024da64af1f409d8826c7d2ea [file] [log] [blame]
package goscaffold
import (
"crypto/tls"
"crypto/x509"
"encoding/pem"
"errors"
"fmt"
"io/ioutil"
)
func decodePEM(fileName string, pwFunc func() []byte) ([]byte, string, error) {
pb, err := ioutil.ReadFile(fileName)
if err != nil {
return nil, "", err
}
block, _ := pem.Decode(pb)
if x509.IsEncryptedPEMBlock(block) {
if pwFunc == nil {
return nil, "", errors.New("Cannot read encrypted file without password")
}
dec, err := x509.DecryptPEMBlock(block, pwFunc())
if err != nil {
return nil, "", err
}
return dec, block.Type, nil
}
return block.Bytes, block.Type, nil
}
func getCertificate(certFile, keyFile string, pwFunc func() []byte) (tls.Certificate, error) {
ret := tls.Certificate{}
certBytes, _, err := decodePEM(certFile, nil)
if err != nil {
return ret, err
}
ret.Certificate = [][]byte{certBytes}
keyBytes, keyType, err := decodePEM(keyFile, pwFunc)
if err != nil {
return ret, err
}
switch keyType {
case "RSA PRIVATE KEY":
pk, err := x509.ParsePKCS1PrivateKey(keyBytes)
if err != nil {
return ret, err
}
ret.PrivateKey = pk
default:
return ret, fmt.Errorf("Invalid private key type %s", keyType)
}
return ret, nil
}