services/device/internal/impl: Accept unsigned packages

Allow unsigned packages to be used alongside a signed binary.

There are also a few go vet fixes in this change.

Change-Id: If593a3835cca60929535c01c998416018096d7b0
diff --git a/services/device/internal/impl/app_service.go b/services/device/internal/impl/app_service.go
index 5b6a762..dd5c50e 100644
--- a/services/device/internal/impl/app_service.go
+++ b/services/device/internal/impl/app_service.go
@@ -550,7 +550,7 @@
 	if err != nil {
 		return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("PublicKey().MarshalBinary() failed: %v", err))
 	}
-	if err := call.SendStream().Send(device.BlessServerMessageInstancePublicKey{mPubKey}); err != nil {
+	if err := call.SendStream().Send(device.BlessServerMessageInstancePublicKey{Value: mPubKey}); err != nil {
 		return err
 	}
 	if !call.RecvStream().Advance() {
@@ -851,7 +851,7 @@
 	} else {
 		cmd.Env = append(cmd.Env, ref.EnvCredentials+"="+filepath.Join(instanceDir, "credentials"))
 	}
-	handle := vexec.NewParentHandle(cmd, vexec.ConfigOpt{cfg})
+	handle := vexec.NewParentHandle(cmd, vexec.ConfigOpt{Config: cfg})
 	defer func() {
 		if handle != nil {
 			if err := handle.Clean(); err != nil {
@@ -1473,10 +1473,10 @@
 	switch len(i.suffix) {
 	case 2:
 		status, err := i.installationStatus(ctx)
-		return device.StatusInstallation{status}, err
+		return device.StatusInstallation{Value: status}, err
 	case 3:
 		status, err := i.instanceStatus(ctx)
-		return device.StatusInstance{status}, err
+		return device.StatusInstance{Value: status}, err
 	default:
 		return nil, verror.New(ErrInvalidSuffix, ctx)
 	}
diff --git a/services/device/internal/impl/util.go b/services/device/internal/impl/util.go
index 1f42989..317fcae 100644
--- a/services/device/internal/impl/util.go
+++ b/services/device/internal/impl/util.go
@@ -11,6 +11,7 @@
 	"os"
 	"os/exec"
 	"path/filepath"
+	"reflect"
 	"strings"
 	"time"
 
@@ -74,8 +75,11 @@
 		if err != nil {
 			return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("ReadPackage(%v) failed: %v", path, err))
 		}
-		if err := verifySignature(data, publisher, pkgName.Signature); err != nil {
-			return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Publisher package(%v:%v) signature verification failed", localPkg, pkgName))
+		// If a nonempty signature is present, verify it. (i.e., we accept unsigned packages.)
+		if !reflect.DeepEqual(pkgName.Signature, security.Signature{}) {
+			if err := verifySignature(data, publisher, pkgName.Signature); err != nil {
+				return verror.New(ErrOperationFailed, ctx, fmt.Sprintf("Publisher package(%v:%v) signature verification failed", localPkg, pkgName))
+			}
 		}
 	}
 	return nil