security: Make Blessings a struct instead of an interface.

Accompanies: https://vanadium-review.googlesource.com/6040

Motivations:
- In any case, we disallowed implementations of this interface outside
  the security package because we wanted to discourage other
  implementations that may skip over critical security considerations.
- There was only one implementation
- This will allow us to use the VOM native<->wire conversions, thereby
  preventing users from having to worry about conversion to and from
  the wire format.

MultiPart: 2/2
Change-Id: I2a6a44c7d13a131bf98b9b6fa6db7235063b21e9
diff --git a/lib/testutil/security/util.go b/lib/testutil/security/util.go
index 148e70e..3901177 100644
--- a/lib/testutil/security/util.go
+++ b/lib/testutil/security/util.go
@@ -71,9 +71,8 @@
 // initialize a Runtime.
 func NewCredentials(requiredName string, otherNames ...string) (string, security.Principal) {
 	dir, p := newCredentials()
-	if def := selfBlessings(p, append([]string{requiredName}, otherNames...)...); def != nil {
-		SetDefaultBlessings(p, def)
-	}
+	def := selfBlessings(p, append([]string{requiredName}, otherNames...)...)
+	SetDefaultBlessings(p, def)
 	return dir, p
 }
 
@@ -107,9 +106,7 @@
 			panic(err)
 		}
 	}
-	if def != nil {
-		SetDefaultBlessings(p, def)
-	}
+	SetDefaultBlessings(p, def)
 	return dir, p
 }
 
@@ -123,9 +120,8 @@
 	if err != nil {
 		panic(err)
 	}
-	if def := selfBlessings(p, defaultBlessings...); def != nil {
-		SetDefaultBlessings(p, def)
-	}
+	def := selfBlessings(p, defaultBlessings...)
+	SetDefaultBlessings(p, def)
 	return p
 }
 
@@ -203,11 +199,7 @@
 	if len(caveats) == 0 {
 		caveats = append(caveats, security.UnconstrainedUse())
 	}
-	blessings, err := idp.p.Bless(p.PublicKey(), idp.b, extension, caveats[0], caveats[1:]...)
-	if err != nil {
-		return nil, err
-	}
-	return blessings, nil
+	return idp.p.Bless(p.PublicKey(), idp.b, extension, caveats[0], caveats[1:]...)
 }
 
 // PublicKey is the public key of the identity provider.
diff --git a/lib/testutil/security/util_test.go b/lib/testutil/security/util_test.go
index b8bd2d9..1cf1853 100644
--- a/lib/testutil/security/util_test.go
+++ b/lib/testutil/security/util_test.go
@@ -105,10 +105,10 @@
 	}
 	def := p.BlessingStore().Default()
 	peers := p.BlessingStore().ForPeer("anyone_else")
-	if def == nil {
+	if def.IsZero() {
 		t.Errorf("BlessingStore should have a default blessing")
 	}
-	if peers != def {
+	if !reflect.DeepEqual(peers, def) {
 		t.Errorf("ForPeer(...) returned %v, want %v", peers, def)
 	}
 	// TODO(ashankar): Implement a security.Context and test the string
diff --git a/runtimes/google/ipc/blessings_cache.go b/runtimes/google/ipc/blessings_cache.go
index ac71eee..204715a 100644
--- a/runtimes/google/ipc/blessings_cache.go
+++ b/runtimes/google/ipc/blessings_cache.go
@@ -133,10 +133,10 @@
 }
 
 func (c *serverBlessingsCache) getOrInsert(req ipc.BlessingsRequest, stats *ipcStats) (security.Blessings, error) {
-	// In the case that the key sent is 0, we are running in VCSecurityNone and should
-	// return nil for the client Blessings.
+	// In the case that the key sent is 0, we are running in VCSecurityNone
+	// and should return the zero value.
 	if req.Key == 0 {
-		return nil, nil
+		return security.Blessings{}, nil
 	}
 	if req.Blessings == nil {
 		// Fastpath, lookup based on the key.
@@ -144,7 +144,7 @@
 		cached, exists := c.m[req.Key]
 		c.RUnlock()
 		if !exists {
-			return nil, fmt.Errorf("ipc: key was not in the cache")
+			return security.Blessings{}, fmt.Errorf("ipc: key was not in the cache")
 		}
 		stats.recordBlessingCache(true)
 		return cached, nil
@@ -155,14 +155,14 @@
 	// the same as what's in the cache.
 	recv, err := security.NewBlessings(*req.Blessings)
 	if err != nil {
-		return nil, fmt.Errorf("ipc: create new client blessings failed: %v", err)
+		return security.Blessings{}, fmt.Errorf("ipc: create new client blessings failed: %v", err)
 	}
 	c.Lock()
 	defer c.Unlock()
 	if cached, exists := c.m[req.Key]; exists {
 		// TODO(suharshs): Replace this reflect.DeepEqual() with a less expensive check.
 		if !reflect.DeepEqual(cached, recv) {
-			return nil, fmt.Errorf("client sent invalid Blessings")
+			return security.Blessings{}, fmt.Errorf("client sent invalid Blessings")
 		}
 		return cached, nil
 	}
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index b107f56..6c0936d 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -647,8 +647,8 @@
 // server that are authorized for this purpose and any blessings that are to be granted to
 // the server (via ipc.Granter implementations in opts.)
 func (c *client) authorizeServer(ctx *context.T, flow stream.Flow, name, method string, serverPatterns []string, opts []ipc.CallOpt) (serverBlessings []string, grantedBlessings security.Blessings, err error) {
-	if flow.RemoteBlessings() == nil {
-		return nil, nil, verror.New(errNoBlessings, ctx)
+	if flow.RemoteBlessings().IsZero() {
+		return nil, security.Blessings{}, verror.New(errNoBlessings, ctx)
 	}
 	ctxt := security.NewContext(&security.ContextParams{
 		LocalPrincipal:   flow.LocalPrincipal(),
@@ -666,7 +666,7 @@
 		switch v := o.(type) {
 		case options.ServerPublicKey:
 			if remoteKey, key := flow.RemoteBlessings().PublicKey(), v.PublicKey; !reflect.DeepEqual(remoteKey, key) {
-				return nil, nil, verror.New(errAuthServerKeyNotAllowed, ctx, remoteKey, key)
+				return nil, security.Blessings{}, verror.New(errAuthServerKeyNotAllowed, ctx, remoteKey, key)
 			}
 		case options.AllowedServersPolicy:
 			allowed := false
@@ -677,15 +677,15 @@
 				}
 			}
 			if !allowed {
-				return nil, nil, verror.New(errAuthServerNotAllowed, ctx, v, serverBlessings)
+				return nil, security.Blessings{}, verror.New(errAuthServerNotAllowed, ctx, v, serverBlessings)
 			}
 		case options.SkipResolveAuthorization:
 			ignorePatterns = true
 		case ipc.Granter:
 			if b, err := v.Grant(flow.RemoteBlessings()); err != nil {
-				return nil, nil, verror.New(errBlessingGrant, ctx, serverBlessings, err)
+				return nil, security.Blessings{}, verror.New(errBlessingGrant, ctx, serverBlessings, err)
 			} else if grantedBlessings, err = security.UnionOfBlessings(grantedBlessings, b); err != nil {
-				return nil, nil, verror.New(errBlessingAdd, ctx, serverBlessings, err)
+				return nil, security.Blessings{}, verror.New(errBlessingAdd, ctx, serverBlessings, err)
 			}
 		}
 	}
@@ -698,11 +698,11 @@
 			}
 		}
 		if !matched {
-			return nil, nil, verror.New(errAuthNoPatternMatch, ctx, serverBlessings, serverPatterns, rejectedBlessings)
+			return nil, security.Blessings{}, verror.New(errAuthNoPatternMatch, ctx, serverBlessings, serverPatterns, rejectedBlessings)
 		}
 	} else if enableSecureServerAuth && !ignorePatterns {
 		if err := (defaultAuthorizer{}).Authorize(ctxt); err != nil {
-			return nil, nil, verror.New(errDefaultAuthDenied, ctx, serverBlessings)
+			return nil, security.Blessings{}, verror.New(errDefaultAuthDenied, ctx, serverBlessings)
 		}
 	}
 	return serverBlessings, grantedBlessings, nil
@@ -789,7 +789,7 @@
 func (fc *flowClient) start(suffix, method string, args []interface{}, timeout time.Duration, blessings security.Blessings) error {
 	// Fetch any discharges for third-party caveats on the client's blessings
 	// if this client owns a discharge-client.
-	if self := fc.flow.LocalBlessings(); self != nil && fc.dc != nil {
+	if self := fc.flow.LocalBlessings(); fc.dc != nil {
 		impetus, err := mkDischargeImpetus(fc.server, method, args)
 		if err != nil {
 			// TODO(toddw): Fix up the internal error.
diff --git a/runtimes/google/ipc/default_authorizer_test.go b/runtimes/google/ipc/default_authorizer_test.go
index 72351f9..fba7c85 100644
--- a/runtimes/google/ipc/default_authorizer_test.go
+++ b/runtimes/google/ipc/default_authorizer_test.go
@@ -25,12 +25,12 @@
 		// bless(ali, bob, "friend") will generate a blessing for ali, calling him "bob/friend".
 		bless = func(target, extend security.Blessings, extension string) security.Blessings {
 			var p security.Principal
-			switch extend {
-			case ali:
+			switch extend.PublicKey() {
+			case ali.PublicKey():
 				p = pali
-			case bob:
+			case bob.PublicKey():
 				p = pbob
-			case che:
+			case che.PublicKey():
 				p = pche
 			default:
 				panic(extend)
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 9bab076..5c5e3fb 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -539,8 +539,8 @@
 			t.Errorf(`%s: client.StartCall: got error "%v", want to match "%v"`, name, err, test.err)
 		} else if call != nil {
 			blessings, proof := call.RemoteBlessings()
-			if proof == nil {
-				t.Errorf("%s: Returned nil for remote blessings", name)
+			if proof.IsZero() {
+				t.Errorf("%s: Returned zero value for remote blessings", name)
 			}
 			// Currently all tests are configured so that the only
 			// blessings presented by the server that are
@@ -778,7 +778,7 @@
 		startErrID, finishErrID       verror.IDAction
 		blessing, starterr, finisherr string
 	}{
-		{blessing: "<nil>"},
+		{blessing: ""},
 		{granter: granter{b: bless(pclient, pserver, "blessed")}, blessing: "client/blessed"},
 		{granter: granter{err: errors.New("hell no")}, startErrID: verror.ErrNotTrusted, starterr: "hell no"},
 		{granter: granter{b: pclient.BlessingStore().Default()}, finishErrID: verror.ErrNoAccess, finisherr: "blessing granted not bound to this server"},
@@ -1086,7 +1086,7 @@
 	// own blessings to share.
 	pclient.AddToRoots(pserver.BlessingStore().Default())
 	// tsecurity.NewPrincipal sets up a principal that shares blessings with all servers, undo that.
-	pclient.BlessingStore().Set(nil, security.AllPrincipals)
+	pclient.BlessingStore().Set(security.Blessings{}, security.AllPrincipals)
 
 	for _, test := range tests {
 		name := fmt.Sprintf("%q.%s(%v) by %v", test.name, test.method, test.args, test.blessings)
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 09b70b3..06c6404 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -210,11 +210,10 @@
 	s.listenerOpts = append(s.listenerOpts, dc)
 	s.listenerOpts = append(s.listenerOpts, vc.DialContext{ctx})
 	blessingsStatsName := naming.Join(statsPrefix, "security", "blessings")
-	if blessings != nil {
-		// TODO(caprita): revist printing the blessings with %s, and
-		// instead expose them as a list.
-		stats.NewString(blessingsStatsName).Set(fmt.Sprintf("%s", blessings))
-	} else if principal != nil { // principal should have been passed in, but just in case.
+	// TODO(caprita): revist printing the blessings with %s, and
+	// instead expose them as a list.
+	stats.NewString(blessingsStatsName).Set(fmt.Sprintf("%s", blessings))
+	if principal != nil { // principal should have been passed in, but just in case.
 		stats.NewStringFunc(blessingsStatsName, func() string {
 			return fmt.Sprintf("%s (default)", principal.BlessingStore().Default())
 		})
@@ -1162,7 +1161,7 @@
 	// the server's identity as the blessing. Figure out what we want to do about
 	// this - should servers be able to assume that a blessing is something that
 	// does not have the authorizations that the server's own identity has?
-	if blessings != nil && !reflect.DeepEqual(blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey()) {
+	if blessings.PublicKey() != nil && !reflect.DeepEqual(blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey()) {
 		return verror.New(verror.ErrNoAccess, fs.T, fmt.Sprintf("blessing granted not bound to this server(%v vs %v)", blessings.PublicKey(), fs.flow.LocalPrincipal().PublicKey()))
 	}
 	fs.clientBlessings, err = serverDecodeBlessings(fs.flow.VCDataCache(), req.Blessings, fs.server.stats)
@@ -1174,9 +1173,7 @@
 		fs.server.streamMgr.ShutdownEndpoint(fs.RemoteEndpoint())
 		return verror.New(verror.ErrBadProtocol, fs.T, newErrBadBlessingsCache(fs.T, err))
 	}
-	if fs.clientBlessings != nil {
-		fs.ackBlessings = true
-	}
+	fs.ackBlessings = true
 
 	for _, d := range req.Discharges {
 		dis := security.NewDischarge(d)
@@ -1291,7 +1288,7 @@
 }
 func (fs *flowServer) RemoteBlessings() security.Blessings {
 	//nologcall
-	if fs.clientBlessings != nil {
+	if !fs.clientBlessings.IsZero() {
 		return fs.clientBlessings
 	}
 	return fs.flow.RemoteBlessings()
diff --git a/runtimes/google/ipc/stream/vc/auth.go b/runtimes/google/ipc/stream/vc/auth.go
index e7c12f2..b8d8bfa 100644
--- a/runtimes/google/ipc/stream/vc/auth.go
+++ b/runtimes/google/ipc/stream/vc/auth.go
@@ -33,8 +33,8 @@
 // returns the blessings used to authenticate the client.
 func AuthenticateAsServer(conn io.ReadWriteCloser, principal security.Principal, server security.Blessings, dc DischargeClient, crypter crypto.Crypter, v version.IPCVersion) (client security.Blessings, clientDischarges map[string]security.Discharge, err error) {
 	defer conn.Close()
-	if server == nil {
-		return nil, nil, errors.New("no blessings to present as a server")
+	if server.IsZero() {
+		return security.Blessings{}, nil, errors.New("no blessings to present as a server")
 	}
 	var discharges []security.Discharge
 	if tpcavs := server.ThirdPartyCaveats(); len(tpcavs) > 0 && dc != nil {
@@ -76,8 +76,9 @@
 		Context: ctx,
 	}))
 	client = principal.BlessingStore().ForPeer(serverB...)
-	if client == nil {
-		return nil, nil, nil, NewErrNoBlessingsForPeer(ctx, serverB, invalidB)
+	if client.IsZero() {
+		err = NewErrNoBlessingsForPeer(ctx, serverB, invalidB)
+		return
 	}
 	var discharges []security.Discharge
 	if dc != nil {
@@ -132,21 +133,22 @@
 
 func readBlessings(r io.Reader, tag []byte, crypter crypto.Crypter, v version.IPCVersion) (security.Blessings, map[string]security.Discharge, error) {
 	var msg []byte
+	var noBlessings security.Blessings
 	dec, err := vom.NewDecoder(r)
 	if err != nil {
-		return nil, nil, fmt.Errorf("failed to create new decoder: %v", err)
+		return noBlessings, nil, fmt.Errorf("failed to create new decoder: %v", err)
 	}
 	if err := dec.Decode(&msg); err != nil {
-		return nil, nil, fmt.Errorf("failed to read handshake message: %v", err)
+		return noBlessings, nil, fmt.Errorf("failed to read handshake message: %v", err)
 	}
 	buf, err := crypter.Decrypt(iobuf.NewSlice(msg))
 	if err != nil {
-		return nil, nil, err
+		return noBlessings, nil, err
 	}
 	defer buf.Release()
 	dec, err = vom.NewDecoder(bytes.NewReader(buf.Contents))
 	if err != nil {
-		return nil, nil, fmt.Errorf("failed to create new decoder: %v", err)
+		return noBlessings, nil, fmt.Errorf("failed to create new decoder: %v", err)
 	}
 
 	var (
@@ -154,16 +156,16 @@
 		sig   security.Signature
 	)
 	if err = dec.Decode(&sig); err != nil {
-		return nil, nil, err
+		return noBlessings, nil, err
 	}
 	if err = dec.Decode(&wireb); err != nil {
-		return nil, nil, err
+		return noBlessings, nil, err
 	}
 	var discharges map[string]security.Discharge
 	if v >= version.IPCVersion7 {
 		var wired []security.WireDischarge
 		if err = dec.Decode(&wired); err != nil {
-			return nil, nil, err
+			return noBlessings, nil, err
 		}
 		if len(wired) > 0 {
 			discharges = make(map[string]security.Discharge)
@@ -175,7 +177,7 @@
 	} else if v >= version.IPCVersion5 {
 		var list []security.Discharge
 		if err = dec.Decode(&list); err != nil {
-			return nil, nil, err
+			return noBlessings, nil, err
 		}
 		if len(list) > 0 {
 			discharges = make(map[string]security.Discharge)
@@ -186,13 +188,10 @@
 	}
 	blessings, err := security.NewBlessings(wireb)
 	if err != nil {
-		return nil, nil, err
-	}
-	if blessings == nil {
-		return nil, nil, errNoCertificatesReceived
+		return noBlessings, nil, err
 	}
 	if !sig.Verify(blessings.PublicKey(), append(tag, crypter.ChannelBinding()...)) {
-		return nil, nil, errInvalidSignatureInMessage
+		return noBlessings, nil, errInvalidSignatureInMessage
 	}
 	return blessings, discharges, nil
 }
diff --git a/runtimes/google/ipc/stream/vc/init.go b/runtimes/google/ipc/stream/vc/init.go
index efa0cab..bf322fa 100644
--- a/runtimes/google/ipc/stream/vc/init.go
+++ b/runtimes/google/ipc/stream/vc/init.go
@@ -35,7 +35,7 @@
 }
 
 func (s *anonymousBlessingStore) Set(security.Blessings, security.BlessingPattern) (security.Blessings, error) {
-	return nil, fmt.Errorf("cannot store blessings with an anonymous principal")
+	return security.Blessings{}, fmt.Errorf("cannot store blessings with an anonymous principal")
 }
 
 func (s *anonymousBlessingStore) ForPeer(...string) security.Blessings {
diff --git a/runtimes/google/ipc/stream/vc/listener_test.go b/runtimes/google/ipc/stream/vc/listener_test.go
index 6cabc70..1d81edd 100644
--- a/runtimes/google/ipc/stream/vc/listener_test.go
+++ b/runtimes/google/ipc/stream/vc/listener_test.go
@@ -22,8 +22,8 @@
 
 // Other stream.Flow methods
 func (*noopFlow) LocalPrincipal() security.Principal              { return nil }
-func (*noopFlow) LocalBlessings() security.Blessings              { return nil }
-func (*noopFlow) RemoteBlessings() security.Blessings             { return nil }
+func (*noopFlow) LocalBlessings() security.Blessings              { return security.Blessings{} }
+func (*noopFlow) RemoteBlessings() security.Blessings             { return security.Blessings{} }
 func (*noopFlow) RemoteDischarges() map[string]security.Discharge { return nil }
 func (*noopFlow) SetDeadline(<-chan struct{})                     {}
 func (*noopFlow) VCDataCache() stream.VCDataCache                 { return nil }
diff --git a/runtimes/google/ipc/stream/vc/vc.go b/runtimes/google/ipc/stream/vc/vc.go
index 5c45530..5c36305 100644
--- a/runtimes/google/ipc/stream/vc/vc.go
+++ b/runtimes/google/ipc/stream/vc/vc.go
@@ -511,7 +511,7 @@
 		if principal == nil {
 			principal = AnonymousPrincipal
 		}
-		if lBlessings == nil {
+		if lBlessings.IsZero() {
 			lBlessings = principal.BlessingStore().Default()
 		}
 	case options.VCSecurityNone:
diff --git a/runtimes/google/ipc/stream/vc/vc_test.go b/runtimes/google/ipc/stream/vc/vc_test.go
index ef35895..7d5cf9d 100644
--- a/runtimes/google/ipc/stream/vc/vc_test.go
+++ b/runtimes/google/ipc/stream/vc/vc_test.go
@@ -87,10 +87,10 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	if flow.RemoteBlessings() != nil {
+	if !flow.RemoteBlessings().IsZero() {
 		t.Errorf("Server sent blessing %v over insecure transport", flow.RemoteBlessings())
 	}
-	if flow.LocalBlessings() != nil {
+	if !flow.LocalBlessings().IsZero() {
 		t.Errorf("Client sent blessing %v over insecure transport", flow.LocalBlessings())
 	}
 }
@@ -131,7 +131,7 @@
 	if err != nil {
 		t.Fatal(err)
 	}
-	client.BlessingStore().Set(nil, security.AllPrincipals)
+	client.BlessingStore().Set(security.Blessings{}, security.AllPrincipals)
 	client.BlessingStore().Set(forServer1, security.BlessingPattern("server1"))
 	client.BlessingStore().Set(forServer2, security.BlessingPattern("server2"))
 
diff --git a/runtimes/google/ipc/stream/vif/auth.go b/runtimes/google/ipc/stream/vif/auth.go
index f02d085..c280ebd 100644
--- a/runtimes/google/ipc/stream/vif/auth.go
+++ b/runtimes/google/ipc/stream/vif/auth.go
@@ -208,7 +208,7 @@
 		if principal == nil {
 			principal = vc.AnonymousPrincipal
 		}
-		if lBlessings == nil {
+		if lBlessings.IsZero() {
 			lBlessings = principal.BlessingStore().Default()
 		}
 	case options.VCSecurityNone:
diff --git a/runtimes/google/naming/namespace/mount.go b/runtimes/google/naming/namespace/mount.go
index 844baed..4d3f993 100644
--- a/runtimes/google/naming/namespace/mount.go
+++ b/runtimes/google/naming/namespace/mount.go
@@ -65,7 +65,7 @@
 		// process.
 		p := v23.GetPrincipal(ctx)
 		b := p.BlessingStore().Default()
-		if b == nil {
+		if b.IsZero() {
 			return fmt.Errorf("must provide a MountedServerBlessingsOpt")
 		}
 		for str, _ := range p.BlessingsInfo(b) {
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index ff80214..6b582f7 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -225,7 +225,7 @@
 
 	// Setup up the client's blessing store so that it can talk to the server.
 	rootClient := mkBlessings(root.NewBlessings(pclient, "client"))
-	if _, err := pclient.BlessingStore().Set(nil, security.AllPrincipals); err != nil {
+	if _, err := pclient.BlessingStore().Set(security.Blessings{}, security.AllPrincipals); err != nil {
 		t.Fatal(err)
 	}
 	if _, err := pclient.BlessingStore().Set(rootClient, "root/server"); err != nil {
diff --git a/runtimes/google/rt/rt_test.go b/runtimes/google/rt/rt_test.go
index 3119e49..19db102 100644
--- a/runtimes/google/rt/rt_test.go
+++ b/runtimes/google/rt/rt_test.go
@@ -41,11 +41,11 @@
 	if p.BlessingStore() == nil {
 		t.Fatalf("The principal must have a BlessingStore")
 	}
-	if p.BlessingStore().Default() == nil {
-		t.Errorf("Principal().BlessingStore().Default() should not be nil")
+	if p.BlessingStore().Default().IsZero() {
+		t.Errorf("Principal().BlessingStore().Default() should not be the zero value")
 	}
-	if p.BlessingStore().ForPeer() == nil {
-		t.Errorf("Principal().BlessingStore().ForPeer() should not be nil")
+	if p.BlessingStore().ForPeer().IsZero() {
+		t.Errorf("Principal().BlessingStore().ForPeer() should not be the zero value")
 	}
 }
 
@@ -92,14 +92,10 @@
 	if p == nil {
 		return fmt.Errorf("nil principal")
 	}
-	blessings := p.BlessingStore().Default()
-	if blessings == nil {
-		return fmt.Errorf("rt.Principal().BlessingStore().Default() returned nil")
-	}
 	ctx := security.NewContext(&security.ContextParams{LocalPrincipal: p})
-	validBlessings, err := blessings.ForContext(ctx)
-	if n := len(validBlessings); n != 1 {
-		return fmt.Errorf("rt.Principal().BlessingStore().Default() returned Blessing %v with %d recognized blessings, want exactly one recognized blessing: %v", blessings, n, err)
+	blessings, rejected := p.BlessingStore().Default().ForContext(ctx)
+	if n := len(blessings); n != 1 {
+		return fmt.Errorf("rt.Principal().BlessingStore().Default() return blessings:%v (rejected:%v), want exactly one recognized blessing", blessings, rejected)
 	}
 	return nil
 }
diff --git a/runtimes/google/testing/mocks/ipc/simple_client.go b/runtimes/google/testing/mocks/ipc/simple_client.go
index 0eeae54..40442d7 100644
--- a/runtimes/google/testing/mocks/ipc/simple_client.go
+++ b/runtimes/google/testing/mocks/ipc/simple_client.go
@@ -116,7 +116,7 @@
 
 // RemoteBlessings implements ipc.Call
 func (*mockCall) RemoteBlessings() ([]string, security.Blessings) {
-	return []string{}, nil
+	return []string{}, security.Blessings{}
 }
 
 //mockStream implements ipc.Stream
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index dbb7226..821033b 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -183,8 +183,8 @@
 func runDefaultBenchmark(b *testing.B, p security.Principal) {
 	b.ResetTimer()
 	for i := 0; i < b.N; i++ {
-		if d := p.BlessingStore().Default(); d == nil {
-			b.Fatal("nil")
+		if d := p.BlessingStore().Default(); d.IsZero() {
+			b.Fatal("empty blessings")
 		}
 	}
 }
diff --git a/security/agent/cache/cache_test.go b/security/agent/cache/cache_test.go
index 2093f29..9025fb2 100644
--- a/security/agent/cache/cache_test.go
+++ b/security/agent/cache/cache_test.go
@@ -191,6 +191,7 @@
 func TestSet(t *testing.T) {
 	p := tsecurity.NewPrincipal("bob")
 	store, cache := createStore(p)
+	var noBlessings security.Blessings
 
 	bob := store.Default()
 	alice, err := p.BlessSelf("alice")
@@ -199,35 +200,31 @@
 	}
 	john := tsecurity.NewPrincipal("john").BlessingStore().Default()
 
-	store.Set(nil, "...")
-	blessings, err := cache.Set(bob, "bob")
-	if err != nil {
+	store.Set(noBlessings, "...")
+	if _, err := cache.Set(bob, "bob"); err != nil {
 		t.Errorf("Set() failed: %v", err)
 	}
-	if blessings != nil {
-		t.Errorf("Got unexpected previous blessings %v", blessings)
-	}
 
 	if got := cache.ForPeer("bob/server"); !reflect.DeepEqual(bob, got) {
 		t.Errorf("ForPeer(bob/server) got: %v, want: %v", got, bob)
 	}
 
-	blessings, err = cache.Set(nil, "bob")
+	blessings, err := cache.Set(noBlessings, "bob")
 	if err != nil {
 		t.Errorf("Set() failed: %v", err)
 	}
 	if !reflect.DeepEqual(bob, blessings) {
 		t.Errorf("Previous blessings %v, wanted %v", blessings, bob)
 	}
-	if got := cache.ForPeer("bob/server"); !reflect.DeepEqual(nil, got) {
-		t.Errorf("ForPeer(bob/server) got: %v, want: %v", got, nil)
+	if got, want := cache.ForPeer("bob/server"), (security.Blessings{}); !reflect.DeepEqual(want, got) {
+		t.Errorf("ForPeer(bob/server) got: %v, want: %v", got, want)
 	}
 
 	blessings, err = cache.Set(john, "john")
 	if err == nil {
 		t.Errorf("No error from set")
 	}
-	if got := cache.ForPeer("john/server"); got != nil {
+	if got := cache.ForPeer("john/server"); got.PublicKey() != nil {
 		t.Errorf("ForPeer(john/server) got: %v, want: %v", got, nil)
 	}
 
@@ -235,16 +232,10 @@
 	if err != nil {
 		t.Errorf("Set() failed: %v", err)
 	}
-	if blessings != nil {
-		t.Errorf("Got unexpected previous blessings %v", blessings)
-	}
 	blessings, err = cache.Set(alice, "bob")
 	if err != nil {
 		t.Errorf("Set() failed: %v", err)
 	}
-	if blessings != nil {
-		t.Errorf("Got unexpected previous blessings %v", blessings)
-	}
 
 	expected, err := security.UnionOfBlessings(bob, alice)
 	if err != nil {
@@ -265,7 +256,7 @@
 		t.Fatalf("BlessSelf failed: %v", err)
 	}
 
-	store.Set(nil, "...")
+	store.Set(security.Blessings{}, "...")
 	store.Set(bob, "bob")
 
 	if got := cache.ForPeer("bob/server"); !reflect.DeepEqual(bob, got) {
diff --git a/security/agent/client.go b/security/agent/client.go
index e32e886..6209b7f 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -108,20 +108,18 @@
 	var blessings security.WireBlessings
 	marshalledKey, err := key.MarshalBinary()
 	if err != nil {
-		return nil, err
+		return security.Blessings{}, err
 	}
-	err = c.caller.call("Bless", results(&blessings), marshalledKey, security.MarshalBlessings(with), extension, caveat, additionalCaveats)
-	if err != nil {
-		return nil, err
+	if err = c.caller.call("Bless", results(&blessings), marshalledKey, security.MarshalBlessings(with), extension, caveat, additionalCaveats); err != nil {
+		return security.Blessings{}, err
 	}
 	return security.NewBlessings(blessings)
 }
 
 func (c *client) BlessSelf(name string, caveats ...security.Caveat) (security.Blessings, error) {
 	var blessings security.WireBlessings
-	err := c.caller.call("BlessSelf", results(&blessings), name, caveats)
-	if err != nil {
-		return nil, err
+	if err := c.caller.call("BlessSelf", results(&blessings), name, caveats); err != nil {
+		return security.Blessings{}, err
 	}
 	return security.NewBlessings(blessings)
 }
@@ -189,9 +187,8 @@
 
 func (b *blessingStore) Set(blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error) {
 	var resultBlessings security.WireBlessings
-	err := b.caller.call("BlessingStoreSet", results(&resultBlessings), security.MarshalBlessings(blessings), forPeers)
-	if err != nil {
-		return nil, err
+	if err := b.caller.call("BlessingStoreSet", results(&resultBlessings), security.MarshalBlessings(blessings), forPeers); err != nil {
+		return security.Blessings{}, err
 	}
 	return security.NewBlessings(resultBlessings)
 }
@@ -201,12 +198,12 @@
 	err := b.caller.call("BlessingStoreForPeer", results(&resultBlessings), peerBlessings)
 	if err != nil {
 		vlog.Errorf("error calling BlessingStoreForPeer: %v", err)
-		return nil
+		return security.Blessings{}
 	}
 	blessings, err := security.NewBlessings(resultBlessings)
 	if err != nil {
 		vlog.Errorf("error creating Blessings from WireBlessings: %v", err)
-		return nil
+		return security.Blessings{}
 	}
 	return blessings
 }
@@ -220,12 +217,11 @@
 	err := b.caller.call("BlessingStoreDefault", results(&resultBlessings))
 	if err != nil {
 		vlog.Errorf("error calling BlessingStoreDefault: %v", err)
-		return nil
+		return security.Blessings{}
 	}
 	blessings, err := security.NewBlessings(resultBlessings)
 	if err != nil {
 		vlog.Errorf("error creating Blessing from WireBlessings: %v", err)
-		return nil
 	}
 	return blessings
 }
diff --git a/security/agent/test_principal/main.go b/security/agent/test_principal/main.go
index c5126f3..f69c3d9 100644
--- a/security/agent/test_principal/main.go
+++ b/security/agent/test_principal/main.go
@@ -85,11 +85,11 @@
 		errorf("Roots().Recognized: %v", err)
 	}
 	// BlessingStore: Defaults
-	if err := p.BlessingStore().SetDefault(nil); err != nil {
+	if err := p.BlessingStore().SetDefault(security.Blessings{}); err != nil {
 		errorf("BlessingStore().SetDefault: %v", err)
 	}
-	if def := p.BlessingStore().Default(); def != nil {
-		errorf("BlessingStore().Default returned %v, want nil", def)
+	if def := p.BlessingStore().Default(); !def.IsZero() {
+		errorf("BlessingStore().Default returned %v, want empty", def)
 	}
 	if err := p.BlessingStore().SetDefault(b); err != nil {
 		errorf("BlessingStore().SetDefault: %v", err)
@@ -99,13 +99,13 @@
 	}
 	// BlessingStore: Set & ForPeer
 	// First, clear out the self-generated default of the blessing store.
-	if _, err := p.BlessingStore().Set(nil, security.AllPrincipals); err != nil {
+	if _, err := p.BlessingStore().Set(security.Blessings{}, security.AllPrincipals); err != nil {
 		errorf("BlessingStore().Set(nil, %q): %v", security.AllPrincipals, err)
 	}
-	if forpeer := p.BlessingStore().ForPeer("superman/friend"); forpeer != nil {
+	if forpeer := p.BlessingStore().ForPeer("superman/friend"); !forpeer.IsZero() {
 		errorf("BlessingStore().ForPeer unexpectedly returned %v", forpeer)
 	}
-	if old, err := p.BlessingStore().Set(b, "superman"); old != nil || err != nil {
+	if old, err := p.BlessingStore().Set(b, "superman"); err != nil {
 		errorf("BlessingStore().Set returned (%v, %v)", old, err)
 	}
 	if forpeer := p.BlessingStore().ForPeer("superman/friend"); !reflect.DeepEqual(forpeer, b) {
diff --git a/security/audit/principal.go b/security/audit/principal.go
index f1095b8..abc88f3 100644
--- a/security/audit/principal.go
+++ b/security/audit/principal.go
@@ -21,10 +21,12 @@
 
 type args []interface{}
 
+var noBlessings security.Blessings
+
 func (p *auditingPrincipal) Bless(key security.PublicKey, with security.Blessings, extension string, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Blessings, error) {
 	blessings, err := p.principal.Bless(key, with, extension, caveat, additionalCaveats...)
 	if err = p.audit(err, "Bless", addCaveats(args{key, with, extension, caveat}, additionalCaveats...), blessings); err != nil {
-		return nil, err
+		return noBlessings, err
 	}
 	return blessings, nil
 }
@@ -32,7 +34,7 @@
 func (p *auditingPrincipal) BlessSelf(name string, caveats ...security.Caveat) (security.Blessings, error) {
 	blessings, err := p.principal.BlessSelf(name, caveats...)
 	if err = p.audit(err, "BlessSelf", addCaveats(args{name}, caveats...), blessings); err != nil {
-		return nil, err
+		return noBlessings, err
 	}
 	return blessings, nil
 }
diff --git a/security/blessingstore.go b/security/blessingstore.go
index a683dd8..cb9eed5 100644
--- a/security/blessingstore.go
+++ b/security/blessingstore.go
@@ -18,26 +18,30 @@
 
 type blessings struct {
 	Value       security.WireBlessings
-	unmarshaled security.Blessings
+	unmarshaled *security.Blessings
 }
 
 func (w *blessings) Blessings() security.Blessings {
 	if w == nil {
-		return nil
+		return security.Blessings{}
 	}
-	return w.unmarshaled
+	return *w.unmarshaled
 }
 
 func (w *blessings) Verify() error {
-	var err error
-	if w.unmarshaled == nil {
-		w.unmarshaled, err = security.NewBlessings(w.Value)
+	if w.unmarshaled != nil {
+		return nil
 	}
-	return err
+	b, err := security.NewBlessings(w.Value)
+	if err != nil {
+		return err
+	}
+	w.unmarshaled = &b
+	return nil
 }
 
 func newWireBlessings(b security.Blessings) *blessings {
-	return &blessings{Value: security.MarshalBlessings(b), unmarshaled: b}
+	return &blessings{Value: security.MarshalBlessings(b), unmarshaled: &b}
 }
 
 type state struct {
@@ -62,15 +66,15 @@
 
 func (bs *blessingStore) Set(blessings security.Blessings, forPeers security.BlessingPattern) (security.Blessings, error) {
 	if !forPeers.IsValid() {
-		return nil, fmt.Errorf("%q is an invalid BlessingPattern", forPeers)
+		return security.Blessings{}, fmt.Errorf("%q is an invalid BlessingPattern", forPeers)
 	}
-	if blessings != nil && !reflect.DeepEqual(blessings.PublicKey(), bs.publicKey) {
-		return nil, errStoreAddMismatch
+	if !blessings.IsZero() && !reflect.DeepEqual(blessings.PublicKey(), bs.publicKey) {
+		return security.Blessings{}, errStoreAddMismatch
 	}
 	bs.mu.Lock()
 	defer bs.mu.Unlock()
 	old, hadold := bs.state.Store[forPeers]
-	if blessings != nil {
+	if !blessings.IsZero() {
 		bs.state.Store[forPeers] = newWireBlessings(blessings)
 	} else {
 		delete(bs.state.Store, forPeers)
@@ -81,7 +85,7 @@
 		} else {
 			delete(bs.state.Store, forPeers)
 		}
-		return nil, err
+		return security.Blessings{}, err
 	}
 	return old.Blessings(), nil
 }
@@ -116,7 +120,7 @@
 func (bs *blessingStore) SetDefault(blessings security.Blessings) error {
 	bs.mu.Lock()
 	defer bs.mu.Unlock()
-	if blessings != nil && !reflect.DeepEqual(blessings.PublicKey(), bs.publicKey) {
+	if !blessings.IsZero() && !reflect.DeepEqual(blessings.PublicKey(), bs.publicKey) {
 		return errStoreAddMismatch
 	}
 	oldDefault := bs.state.Default
@@ -218,7 +222,7 @@
 		if err := wb.Verify(); err != nil {
 			return err
 		}
-		if b := wb.Blessings(); b != nil && !reflect.DeepEqual(b.PublicKey(), key) {
+		if b := wb.Blessings(); !reflect.DeepEqual(b.PublicKey(), key) {
 			return fmt.Errorf("read Blessings: %v that are not for provided PublicKey: %v", b, key)
 		}
 		return nil
diff --git a/security/blessingstore_test.go b/security/blessingstore_test.go
index f855419..a441bf0 100644
--- a/security/blessingstore_test.go
+++ b/security/blessingstore_test.go
@@ -50,12 +50,11 @@
 	if got := s.Default(); !reflect.DeepEqual(got, currentDefault) {
 		return fmt.Errorf("Default(): got: %v, want: %v", got, currentDefault)
 	}
-	// SetDefault(nil)
-	if err := s.SetDefault(nil); err != nil {
-		return fmt.Errorf("SetDefault(nil): %v", err)
+	if err := s.SetDefault(security.Blessings{}); err != nil {
+		return fmt.Errorf("SetDefault({}): %v", err)
 	}
-	if got := s.Default(); got != nil {
-		return fmt.Errorf("Default returned %v, want nil", got)
+	if got := s.Default(); !got.IsZero() {
+		return fmt.Errorf("Default returned %v, wanted empty", got)
 	}
 	if err := s.SetDefault(t.def); err != nil {
 		return fmt.Errorf("SetDefault(%v): %v", t.def, err)
@@ -188,6 +187,7 @@
 		alice = blessSelf(p, "alice")
 		bob   = blessSelf(p, "bob")
 		s     = p.BlessingStore()
+		empty security.Blessings
 	)
 	// {alice, bob} is shared with "alice", whilst {bob} is shared with "alice/tv"
 	if _, err := s.Set(alice, "alice/$"); err != nil {
@@ -205,7 +205,7 @@
 
 	// Clear out the blessing associated with "alice".
 	// Now, bob should be shared with both alice and alice/friend.
-	if _, err := s.Set(nil, "alice/$"); err != nil {
+	if _, err := s.Set(empty, "alice/$"); err != nil {
 		t.Fatal(err)
 	}
 	if got, want := s.ForPeer("alice"), bob; !reflect.DeepEqual(got, want) {
@@ -216,7 +216,7 @@
 	}
 
 	// Clearing out an association that doesn't exist should have no effect.
-	if _, err := s.Set(nil, "alice/enemy/$"); err != nil {
+	if _, err := s.Set(empty, "alice/enemy/$"); err != nil {
 		t.Fatal(err)
 	}
 	if got, want := s.ForPeer("alice"), bob; !reflect.DeepEqual(got, want) {
@@ -227,14 +227,14 @@
 	}
 
 	// Clear everything
-	if _, err := s.Set(nil, "alice"); err != nil {
+	if _, err := s.Set(empty, "alice"); err != nil {
 		t.Fatal(err)
 	}
-	if got := s.ForPeer("alice"); got != nil {
-		t.Errorf("Got %v, want nil", got)
+	if got := s.ForPeer("alice"); !got.IsZero() {
+		t.Errorf("Got %v, want empty", got)
 	}
-	if got := s.ForPeer("alice/friend"); got != nil {
-		t.Errorf("Got %v, want nil", got)
+	if got := s.ForPeer("alice/friend"); !got.IsZero() {
+		t.Errorf("Got %v, want empty", got)
 	}
 }
 
@@ -247,10 +247,11 @@
 		alice = blessSelf(p, "alice")
 		bob   = blessSelf(p, "bob")
 		s     = p.BlessingStore()
+		empty security.Blessings
 	)
 
-	if old, err := s.Set(alice, security.AllPrincipals); old != nil || err != nil {
-		t.Errorf("Got (%v, %v)", old, err)
+	if old, err := s.Set(alice, security.AllPrincipals); !reflect.DeepEqual(old, empty) || err != nil {
+		t.Errorf("Got (%v, %v), want (%v, nil)", old, err)
 	}
 	if old, err := s.Set(alice, security.AllPrincipals); !reflect.DeepEqual(old, alice) || err != nil {
 		t.Errorf("Got (%v, %v) want (%v, nil)", old, err, alice)
@@ -258,7 +259,7 @@
 	if old, err := s.Set(bob, security.AllPrincipals); !reflect.DeepEqual(old, alice) || err != nil {
 		t.Errorf("Got (%v, %v) want (%v, nil)", old, err, alice)
 	}
-	if old, err := s.Set(nil, security.AllPrincipals); !reflect.DeepEqual(old, bob) || err != nil {
+	if old, err := s.Set(empty, security.AllPrincipals); !reflect.DeepEqual(old, bob) || err != nil {
 		t.Errorf("Got (%v, %v) want (%v, nil)", old, err, bob)
 	}
 }
diff --git a/security/testutil_test.go b/security/testutil_test.go
index 973d753..1b07c49 100644
--- a/security/testutil_test.go
+++ b/security/testutil_test.go
@@ -26,7 +26,7 @@
 		panic(err)
 	}
 	if len(selfblessings) == 0 {
-		return p, nil
+		return p, security.Blessings{}
 	}
 	var def security.Blessings
 	for _, str := range selfblessings {
diff --git a/services/mgmt/device/impl/app_service.go b/services/mgmt/device/impl/app_service.go
index 909d27b..3bea982 100644
--- a/services/mgmt/device/impl/app_service.go
+++ b/services/mgmt/device/impl/app_service.go
@@ -471,10 +471,10 @@
 	if err := mkdir(pkgDir); err != nil {
 		return "", verror.New(ErrOperationFailed, nil)
 	}
-	// We use a nil publisher, meaning that any signatures present in the
+	// We use a zero value publisher, meaning that any signatures present in the
 	// package files are not verified.
 	// TODO(caprita): Issue warnings when signatures are present and ignored.
-	if err := downloadPackages(call.Context(), nil, packages, pkgDir); err != nil {
+	if err := downloadPackages(call.Context(), security.Blessings{}, packages, pkgDir); err != nil {
 		return "", err
 	}
 	if _, err := newVersion(call.Context(), installationDir, envelope, ""); err != nil {
@@ -592,7 +592,7 @@
 	// Take the blessings conferred upon us by the Start-er, extend them
 	// with the app title.
 	grantedBlessings := call.Blessings()
-	if grantedBlessings == nil {
+	if grantedBlessings.IsZero() {
 		return verror.New(ErrInvalidBlessing, nil)
 	}
 	// TODO(caprita): Revisit UnconstrainedUse.
diff --git a/services/mgmt/device/impl/claim.go b/services/mgmt/device/impl/claim.go
index a2af1b0..8c57d12 100644
--- a/services/mgmt/device/impl/claim.go
+++ b/services/mgmt/device/impl/claim.go
@@ -38,7 +38,7 @@
 		principal = ctx.LocalPrincipal()
 		store     = principal.BlessingStore()
 	)
-	if granted == nil {
+	if granted.IsZero() {
 		return verror.New(ErrInvalidBlessing, ctx.Context())
 	}
 	c.mu.Lock()
diff --git a/services/mgmt/device/impl/util.go b/services/mgmt/device/impl/util.go
index ade3572..63ecb34 100644
--- a/services/mgmt/device/impl/util.go
+++ b/services/mgmt/device/impl/util.go
@@ -29,7 +29,7 @@
 )
 
 func verifySignature(data []byte, publisher security.Blessings, sig security.Signature) error {
-	if publisher != nil {
+	if !publisher.IsZero() {
 		h := sha256.Sum256(data)
 		if !sig.Verify(publisher.PublicKey(), h[:]) {
 			return verror.New(ErrOperationFailed, nil)
diff --git a/services/mounttable/lib/mounttable.go b/services/mounttable/lib/mounttable.go
index 0c4a192..b8e5357 100644
--- a/services/mounttable/lib/mounttable.go
+++ b/services/mounttable/lib/mounttable.go
@@ -167,15 +167,11 @@
 		return nil
 	}
 	// "Self-RPCs" are always authorized.
-	if l, r := ctx.LocalBlessings(), ctx.RemoteBlessings(); l != nil && r != nil && reflect.DeepEqual(l.PublicKey(), r.PublicKey()) {
+	if l, r := ctx.LocalBlessings().PublicKey(), ctx.RemoteBlessings().PublicKey(); l != nil && reflect.DeepEqual(l, r) {
 		return nil
 	}
 	// Match client's blessings against the ACLs.
-	var blessings []string
-	var invalidB []security.RejectedBlessing
-	if ctx.RemoteBlessings() != nil {
-		blessings, invalidB = ctx.RemoteBlessings().ForContext(ctx)
-	}
+	blessings, invalidB := ctx.RemoteBlessings().ForContext(ctx)
 	for _, tag := range tags {
 		if acl, exists := n.acls.GetACLForTag(string(tag)); exists && acl.Includes(blessings...) {
 			return nil
@@ -208,11 +204,7 @@
 		return nil
 	}
 	// Match client's blessings against the ACLs.
-	var blessings []string
-	var invalidB []security.RejectedBlessing
-	if ctx.RemoteBlessings() != nil {
-		blessings, invalidB = ctx.RemoteBlessings().ForContext(ctx)
-	}
+	blessings, invalidB := ctx.RemoteBlessings().ForContext(ctx)
 	for _, tag := range tags {
 		if acl, exists := n.amTemplate[string(tag)]; exists && expand(&acl, name).Includes(blessings...) {
 			return nil
@@ -231,10 +223,7 @@
 		return nil
 	}
 	acls := cur.acls.Copy()
-	var blessings []string
-	if ctx.RemoteBlessings() != nil {
-		blessings, _ = ctx.RemoteBlessings().ForContext(ctx)
-	}
+	blessings, _ := ctx.RemoteBlessings().ForContext(ctx)
 	for _, b := range blessings {
 		acls.Add(security.BlessingPattern(b), string(mounttable.Admin))
 	}
diff --git a/services/wsprd/app/app.go b/services/wsprd/app/app.go
index 3ddbf3c..26d1c07 100644
--- a/services/wsprd/app/app.go
+++ b/services/wsprd/app/app.go
@@ -13,6 +13,10 @@
 	"time"
 
 	vsecurity "v.io/core/veyron/security"
+	"v.io/core/veyron/services/wsprd/ipc/server"
+	"v.io/core/veyron/services/wsprd/lib"
+	"v.io/core/veyron/services/wsprd/namespace"
+	"v.io/core/veyron/services/wsprd/principal"
 	"v.io/v23"
 	"v.io/v23/context"
 	"v.io/v23/ipc"
@@ -25,10 +29,6 @@
 	"v.io/v23/vlog"
 	"v.io/v23/vom"
 	"v.io/v23/vtrace"
-	"v.io/core/veyron/services/wsprd/ipc/server"
-	"v.io/core/veyron/services/wsprd/lib"
-	"v.io/core/veyron/services/wsprd/namespace"
-	"v.io/core/veyron/services/wsprd/principal"
 )
 
 // pkgPath is the prefix os errors in this package.
@@ -383,7 +383,7 @@
 	return nil
 }
 func (l *localCall) Recv(interface{}) error                          { return nil }
-func (l *localCall) Blessings() security.Blessings                   { return nil }
+func (l *localCall) Blessings() security.Blessings                   { return security.Blessings{} }
 func (l *localCall) Server() ipc.Server                              { return nil }
 func (l *localCall) Context() *context.T                             { return l.ctx }
 func (l *localCall) Timestamp() (t time.Time)                        { return }
@@ -393,8 +393,8 @@
 func (l *localCall) Suffix() string                                  { return "" }
 func (l *localCall) RemoteDischarges() map[string]security.Discharge { return nil }
 func (l *localCall) LocalPrincipal() security.Principal              { return nil }
-func (l *localCall) LocalBlessings() security.Blessings              { return nil }
-func (l *localCall) RemoteBlessings() security.Blessings             { return nil }
+func (l *localCall) LocalBlessings() security.Blessings              { return security.Blessings{} }
+func (l *localCall) RemoteBlessings() security.Blessings             { return security.Blessings{} }
 func (l *localCall) LocalEndpoint() naming.Endpoint                  { return nil }
 func (l *localCall) RemoteEndpoint() naming.Endpoint                 { return nil }
 func (l *localCall) VanadiumContext() *context.T                     { return l.ctx }
@@ -687,7 +687,7 @@
 	duration time.Duration,
 	extension string) (int32, string, error) {
 	var blessee security.Blessings
-	if blessee = c.blessingsStore.Get(handle); blessee == nil {
+	if blessee = c.blessingsStore.Get(handle); blessee.IsZero() {
 		return 0, "", verror.New(invalidBlessingsHandle, nil)
 	}
 
diff --git a/services/wsprd/browspr/browspr_account_test.go b/services/wsprd/browspr/browspr_account_test.go
index 9eb94f7..e0d128c 100644
--- a/services/wsprd/browspr/browspr_account_test.go
+++ b/services/wsprd/browspr/browspr_account_test.go
@@ -79,7 +79,7 @@
 	}
 
 	// Verify that principalManager has the new account
-	if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b == nil {
+	if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() {
 		t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err)
 	}
 
@@ -111,10 +111,10 @@
 	}
 
 	// Verify that principalManager has both accounts
-	if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b == nil {
+	if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() {
 		t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err)
 	}
-	if b, err := browspr.principalManager.BlessingsForAccount(account2.RawString()); err != nil || b == nil {
+	if b, err := browspr.principalManager.BlessingsForAccount(account2.RawString()); err != nil || b.IsZero() {
 		t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account2, b, err)
 	}
 }
diff --git a/services/wsprd/ipc/server/server.go b/services/wsprd/ipc/server/server.go
index a90527a..c3dc133 100644
--- a/services/wsprd/ipc/server/server.go
+++ b/services/wsprd/ipc/server/server.go
@@ -384,7 +384,7 @@
 		remoteEndpoint = ctx.RemoteEndpoint().String()
 	}
 	var localBlessings principal.BlessingsHandle
-	if ctx.LocalBlessings() != nil {
+	if !ctx.LocalBlessings().IsZero() {
 		localBlessings = s.convertBlessingsToHandle(ctx.LocalBlessings())
 	}
 	anymtags := make([]*vdl.Value, len(ctx.MethodTags()))
diff --git a/services/wsprd/principal/js_blessings_store_test.go b/services/wsprd/principal/js_blessings_store_test.go
index 8fdee60..8daa97c 100644
--- a/services/wsprd/principal/js_blessings_store_test.go
+++ b/services/wsprd/principal/js_blessings_store_test.go
@@ -15,7 +15,7 @@
 	}
 
 	s.Remove(h)
-	if got := s.Get(h); got != nil {
+	if got := s.Get(h); !got.IsZero() {
 		t.Fatalf("Get after removing: got: %v, want nil", got)
 	}
 }
diff --git a/services/wsprd/principal/principal.go b/services/wsprd/principal/principal.go
index 23b5fdc..cf46168 100644
--- a/services/wsprd/principal/principal.go
+++ b/services/wsprd/principal/principal.go
@@ -244,7 +244,7 @@
 
 	wireBlessings, found := i.state.Accounts[account]
 	if !found {
-		return nil, verror.New(errUnknownAccount, nil, account)
+		return security.Blessings{}, verror.New(errUnknownAccount, nil, account)
 	}
 	return security.NewBlessings(wireBlessings)
 }
diff --git a/services/wsprd/principal/principal_test.go b/services/wsprd/principal/principal_test.go
index 147d150..9a26460 100644
--- a/services/wsprd/principal/principal_test.go
+++ b/services/wsprd/principal/principal_test.go
@@ -114,7 +114,7 @@
 		return fmt.Errorf("BlessingsForAccount(%v): got: %v, %v, want: %v, nil", t.facebookAccount, got, err, t.facebookBlessings)
 	}
 	nonExistingAccount := "nonExistingAccount"
-	if got, err := m.BlessingsForAccount(nonExistingAccount); got != nil {
+	if got, err := m.BlessingsForAccount(nonExistingAccount); !got.IsZero() {
 		return fmt.Errorf("BlessingsForAccount(%v): got: %v, want nil", nonExistingAccount, got)
 	} else if merr := matchesError(err, "unknown account"); merr != nil {
 		return fmt.Errorf("BlessingsForAccount(%v) returned error: %v", nonExistingAccount, merr)
diff --git a/tools/principal/bless.go b/tools/principal/bless.go
index 7831729..3b4d851 100644
--- a/tools/principal/bless.go
+++ b/tools/principal/bless.go
@@ -24,7 +24,7 @@
 func exchangeMacaroonForBlessing(ctx *context.T, macaroonChan <-chan string) (security.Blessings, error) {
 	service, macaroon, rootKey, err := prepareBlessArgs(ctx, macaroonChan)
 	if err != nil {
-		return nil, err
+		return security.Blessings{}, err
 	}
 
 	ctx, cancel := context.WithTimeout(ctx, time.Minute)
@@ -36,11 +36,11 @@
 	// service is not a trusted root yet.
 	reply, err = identity.MacaroonBlesserClient(service).Bless(ctx, macaroon, options.SkipResolveAuthorization{}, options.ServerPublicKey{rootKey})
 	if err != nil {
-		return nil, fmt.Errorf("failed to get blessing from %q: %v", service, err)
+		return security.Blessings{}, fmt.Errorf("failed to get blessing from %q: %v", service, err)
 	}
 	blessings, err := security.NewBlessings(reply)
 	if err != nil {
-		return nil, fmt.Errorf("failed to construct Blessings object from response: %v", err)
+		return security.Blessings{}, fmt.Errorf("failed to construct Blessings object from response: %v", err)
 	}
 	return blessings, nil
 }
diff --git a/tools/principal/main.go b/tools/principal/main.go
index 83d7c77..2d22948 100644
--- a/tools/principal/main.go
+++ b/tools/principal/main.go
@@ -8,7 +8,6 @@
 	"crypto/rand"
 	"crypto/subtle"
 	"encoding/base64"
-	"errors"
 	"fmt"
 	"io"
 	"os"
@@ -747,14 +746,14 @@
 func decodeBlessings(fname string) (security.Blessings, error) {
 	var wire security.WireBlessings
 	if err := decode(fname, &wire); err != nil {
-		return nil, err
+		return security.Blessings{}, err
 	}
 	return security.NewBlessings(wire)
 }
 
 func dumpBlessings(blessings security.Blessings) error {
-	if blessings == nil {
-		return errors.New("no blessings found")
+	if blessings.IsZero() {
+		return fmt.Errorf("no blessings found")
 	}
 	str, err := base64VomEncode(security.MarshalBlessings(blessings))
 	if err != nil {
@@ -856,7 +855,7 @@
 
 func (r *recvBlessingsService) Grant(call ipc.ServerCall, token string) error {
 	b := call.Blessings()
-	if b == nil {
+	if b.IsZero() {
 		return fmt.Errorf("no blessings granted by sender")
 	}
 	if len(token) != len(r.token) {
@@ -906,7 +905,7 @@
 		// abort the RPC before sending the request to the server.
 		// Thus, there is no concern about leaking the token to an
 		// imposter server.
-		return nil, fmt.Errorf("key mismatch: Remote end has public key %v, want %v", got, g.serverKey)
+		return security.Blessings{}, fmt.Errorf("key mismatch: Remote end has public key %v, want %v", got, g.serverKey)
 	}
 	return g.p.Bless(server.PublicKey(), g.with, g.extension, g.caveats[0], g.caveats[1:]...)
 }