pkg/decrypt/decrypt_linux.go (36 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package decrypt
import (
"bytes"
"fmt"
"os/exec"
"path"
"path/filepath"
"github.com/pkg/errors"
)
var getCertificateDir = func(configFolder string) (certificateFolder string) {
return path.Join(configFolder, "..", "..")
}
// decryptProtectedSettings decrypts the read protected settigns using certificates
func DecryptProtectedSettings(configFolder string, thumbprint string, decoded []byte) (string, error) {
// go two levels up where certs are placed (/var/lib/waagent)
crt := filepath.Join(getCertificateDir(configFolder), fmt.Sprintf("%s.crt", thumbprint))
prv := filepath.Join(getCertificateDir(configFolder), fmt.Sprintf("%s.prv", thumbprint))
// we use os/exec instead of azure-docker-extension/pkg/executil here as
// other extension handlers depend on this package for parsing handler
// settings.
//using cms command to support for FIPS 140-3
cmd := exec.Command("openssl", "cms", "-inform", "DER", "-decrypt", "-recip", crt, "-inkey", prv)
var bOut, bErr bytes.Buffer
var errMsg error
cmd.Stdin = bytes.NewReader(decoded)
cmd.Stdout = &bOut
cmd.Stderr = &bErr
//back up smime command in case cms fails
if err := cmd.Run(); err != nil {
errMsg = fmt.Errorf("decrypting protected settings with cms command failed: error=%v stderr=%s \n now decrypting with smime command", err, bErr.String())
cmd = exec.Command("openssl", "smime", "-inform", "DER", "-decrypt", "-recip", crt, "-inkey", prv)
cmd.Stdin = bytes.NewReader(decoded)
bOut.Reset()
bErr.Reset()
cmd.Stdout = &bOut
cmd.Stderr = &bErr
if err := cmd.Run(); err != nil {
return "", errors.Wrapf(errMsg, "decrypting protected settings with smime command failed: error=%v stderr=%s", err, bErr.String())
}
}
v := bOut.String()
return v, nil
}