woodpecker/pkg/yaml/secure/secure.go

73 lines
1.7 KiB
Go
Raw Normal View History

package secure
import (
"crypto/rsa"
2015-08-19 14:11:24 +00:00
"crypto/sha256"
"hash"
"github.com/drone/drone/Godeps/_workspace/src/gopkg.in/yaml.v2"
2015-08-19 14:11:24 +00:00
"github.com/drone/drone/pkg/utils/sshutil"
)
// Parse parses and returns the secure section of the
// yaml file as plaintext parameters.
func Parse(privateKeyPEM, repoHash, raw string) (map[string]string, error) {
params, err := parseSecure(raw)
if err != nil {
return nil, err
}
hasher := ToHash(repoHash)
privKey := sshutil.UnMarshalPrivateKey([]byte(privateKeyPEM))
err = DecryptMap(hasher, privKey, params)
2015-08-19 14:11:24 +00:00
return params, err
}
2015-08-19 14:11:24 +00:00
// DecryptMap decrypts values of a map of named parameters
// from base64 to decrypted strings.
func DecryptMap(hasher hash.Hash, privKey *rsa.PrivateKey, params map[string]string) error {
var err error
2015-08-19 14:11:24 +00:00
for name, encrypted := range params {
params[name], err = sshutil.Decrypt(hasher, privKey, encrypted)
if err != nil {
return err
}
}
return nil
}
2015-08-19 14:11:24 +00:00
// EncryptMap encrypts values of a map of named parameters
func EncryptMap(hasher hash.Hash, pubKey *rsa.PublicKey, params map[string]string) error {
var err error
2015-08-19 14:11:24 +00:00
for name, value := range params {
params[name], err = sshutil.Encrypt(hasher, pubKey, value)
if err != nil {
return err
}
}
return nil
}
2015-08-19 14:11:24 +00:00
// parseSecure is helper function to parse the Secure data from
// the raw yaml file.
func parseSecure(raw string) (map[string]string, error) {
data := struct {
Secure map[string]string
}{}
err := yaml.Unmarshal([]byte(raw), &data)
2015-08-19 14:11:24 +00:00
return data.Secure, err
}
2015-08-19 14:11:24 +00:00
// ToHash is helper function to generate Hash of given string
func ToHash(key string) hash.Hash {
2015-08-19 14:11:24 +00:00
hasher := sha256.New()
hasher.Write([]byte(key))
hasher.Reset()
return hasher
}