43 lines
1.1 KiB
Go
43 lines
1.1 KiB
Go
package googlecompute
|
|
|
|
import (
|
|
"crypto/x509"
|
|
"encoding/pem"
|
|
"errors"
|
|
"fmt"
|
|
"io/ioutil"
|
|
)
|
|
|
|
// processPrivateKeyFile takes a private key file and an optional passphrase
|
|
// and decodes it to a byte slice.
|
|
func processPrivateKeyFile(privateKeyFile, passphrase string) ([]byte, error) {
|
|
rawPrivateKeyBytes, err := ioutil.ReadFile(privateKeyFile)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Failed loading private key file: %s", err)
|
|
}
|
|
|
|
PEMBlock, _ := pem.Decode(rawPrivateKeyBytes)
|
|
if PEMBlock == nil {
|
|
return nil, fmt.Errorf("%s does not contain a vaild private key", privateKeyFile)
|
|
}
|
|
|
|
if x509.IsEncryptedPEMBlock(PEMBlock) {
|
|
if passphrase == "" {
|
|
return nil, errors.New("a passphrase must be specified when using an encrypted private key")
|
|
}
|
|
|
|
decryptedPrivateKeyBytes, err := x509.DecryptPEMBlock(PEMBlock, []byte(passphrase))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("Failed decrypting private key: %s", err)
|
|
}
|
|
|
|
b := &pem.Block{
|
|
Type: "RSA PRIVATE KEY",
|
|
Bytes: decryptedPrivateKeyBytes,
|
|
}
|
|
return pem.EncodeToMemory(b), nil
|
|
}
|
|
|
|
return rawPrivateKeyBytes, nil
|
|
}
|