TBR: security: Use VDL support for wire<->native conversions for Discharge.

(This change is accompanied by
https://vanadium-review.googlesource.com/6440)

VDL now supports automatic wire type <-> native type conversions
for union types, so use it for WireDischarge <-> Discharge.

Go developers can now naturally use, encode, decode Discharge objects
and not have to manually translate using the (now removed) functions
NewDischarge and MarshalDischarge.

MultiPart: 2/2
Change-Id: I2258b137138c54342562228b0229ea779b3d2131
diff --git a/profiles/internal/ipc/client.go b/profiles/internal/ipc/client.go
index 38bc2b5..2a32fd4 100644
--- a/profiles/internal/ipc/client.go
+++ b/profiles/internal/ipc/client.go
@@ -714,11 +714,6 @@
 	if fc.flow.LocalPrincipal() != nil {
 		blessingsRequest = clientEncodeBlessings(fc.flow.VCDataCache(), fc.blessings)
 	}
-
-	discharges := make([]security.WireDischarge, len(fc.discharges))
-	for i, d := range fc.discharges {
-		discharges[i] = security.MarshalDischarge(d)
-	}
 	req := ipc.Request{
 		Suffix:           suffix,
 		Method:           method,
@@ -726,7 +721,7 @@
 		Deadline:         vtime.Deadline{deadline},
 		GrantedBlessings: fc.grantedBlessings,
 		Blessings:        blessingsRequest,
-		Discharges:       discharges,
+		Discharges:       fc.discharges,
 		TraceRequest:     ivtrace.Request(fc.ctx),
 	}
 	if err := fc.enc.Encode(req); err != nil {
diff --git a/profiles/internal/ipc/discharges.go b/profiles/internal/ipc/discharges.go
index 88f25f7..3919a02 100644
--- a/profiles/internal/ipc/discharges.go
+++ b/profiles/internal/ipc/discharges.go
@@ -127,12 +127,11 @@
 					vlog.VI(3).Infof("Discharge fetch for %v failed: %v", tp, err)
 					return
 				}
-				var wire security.WireDischarge
-				if err := call.Finish(&wire); err != nil {
+				var d security.Discharge
+				if err := call.Finish(&d); err != nil {
 					vlog.VI(3).Infof("Discharge fetch for %v failed: (%v)", cav, err)
 					return
 				}
-				d := security.NewDischarge(wire)
 				discharges <- fetched{i, &d}
 			}(i, ctx, caveats[i])
 		}
diff --git a/profiles/internal/ipc/full_test.go b/profiles/internal/ipc/full_test.go
index 593684f..80a8be4 100644
--- a/profiles/internal/ipc/full_test.go
+++ b/profiles/internal/ipc/full_test.go
@@ -182,27 +182,23 @@
 	called bool
 }
 
-func (ds *dischargeServer) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.WireDischarge, error) {
+func (ds *dischargeServer) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	ds.mu.Lock()
 	ds.called = true
 	ds.mu.Unlock()
 	tp := cav.ThirdPartyDetails()
 	if tp == nil {
-		return nil, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
+		return security.Discharge{}, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
 	}
 	if err := tp.Dischargeable(call); err != nil {
-		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
+		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
 	}
 	// Add a fakeTimeCaveat to be able to control discharge expiration via 'clock'.
 	expiry, err := security.NewCaveat(fakeTimeCaveat, clock.Now())
 	if err != nil {
-		return nil, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
+		return security.Discharge{}, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
 	}
-	d, err := call.LocalPrincipal().MintDischarge(cav, expiry)
-	if err != nil {
-		return nil, err
-	}
-	return security.MarshalDischarge(d), nil
+	return call.LocalPrincipal().MintDischarge(cav, expiry)
 }
 
 func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns ns.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
@@ -837,10 +833,10 @@
 	traceid []uniqueid.Id
 }
 
-func (s *dischargeTestServer) Discharge(call ipc.ServerCall, cav security.Caveat, impetus security.DischargeImpetus) (security.WireDischarge, error) {
+func (s *dischargeTestServer) Discharge(call ipc.ServerCall, cav security.Caveat, impetus security.DischargeImpetus) (security.Discharge, error) {
 	s.impetus = append(s.impetus, impetus)
 	s.traceid = append(s.traceid, vtrace.GetSpan(call.Context()).Trace())
-	return nil, fmt.Errorf("discharges not issued")
+	return security.Discharge{}, fmt.Errorf("discharges not issued")
 }
 
 func (s *dischargeTestServer) Release() ([]security.DischargeImpetus, []uniqueid.Id) {
@@ -1756,13 +1752,13 @@
 	called bool
 }
 
-func (ed *expiryDischarger) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.WireDischarge, error) {
+func (ed *expiryDischarger) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	tp := cav.ThirdPartyDetails()
 	if tp == nil {
-		return nil, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
+		return security.Discharge{}, fmt.Errorf("discharger: %v does not represent a third-party caveat", cav)
 	}
 	if err := tp.Dischargeable(call); err != nil {
-		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
+		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
 	}
 	expDur := 10 * time.Millisecond
 	if ed.called {
@@ -1770,14 +1766,14 @@
 	}
 	expiry, err := security.ExpiryCaveat(time.Now().Add(expDur))
 	if err != nil {
-		return nil, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
+		return security.Discharge{}, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
 	}
 	d, err := call.LocalPrincipal().MintDischarge(cav, expiry)
 	if err != nil {
-		return nil, err
+		return security.Discharge{}, err
 	}
 	ed.called = true
-	return security.MarshalDischarge(d), nil
+	return d, nil
 }
 
 func TestDischargeClientFetchExpiredDischarges(t *testing.T) {
diff --git a/profiles/internal/ipc/server.go b/profiles/internal/ipc/server.go
index dac6a19..48a318a 100644
--- a/profiles/internal/ipc/server.go
+++ b/profiles/internal/ipc/server.go
@@ -1158,8 +1158,7 @@
 	fs.ackBlessings = true
 
 	for _, d := range req.Discharges {
-		dis := security.NewDischarge(d)
-		fs.discharges[dis.ID()] = dis
+		fs.discharges[d.ID()] = d
 	}
 	return nil
 }
diff --git a/profiles/internal/ipc/stream/vc/auth.go b/profiles/internal/ipc/stream/vc/auth.go
index d29edc2..beb8773 100644
--- a/profiles/internal/ipc/stream/vc/auth.go
+++ b/profiles/internal/ipc/stream/vc/auth.go
@@ -95,11 +95,7 @@
 	if err := enc.Encode(b); err != nil {
 		return err
 	}
-	if v >= version.IPCVersion7 {
-		if err := enc.Encode(marshalDischarges(discharges)); err != nil {
-			return err
-		}
-	} else if v >= version.IPCVersion5 {
+	if v >= version.IPCVersion5 {
 		if err := enc.Encode(discharges); err != nil {
 			return err
 		}
@@ -147,20 +143,9 @@
 		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 noBlessings, nil, err
-		}
-		if len(wired) > 0 {
-			discharges = make(map[string]security.Discharge)
-			for _, d := range unmarshalDischarges(wired) {
-				discharges[d.ID()] = d
-			}
-		}
-	} else if v >= version.IPCVersion5 {
+	if v >= version.IPCVersion5 {
 		var list []security.Discharge
-		if err = dec.Decode(&list); err != nil {
+		if err := dec.Decode(&list); err != nil {
 			return noBlessings, nil, err
 		}
 		if len(list) > 0 {
@@ -175,19 +160,3 @@
 	}
 	return blessings, discharges, nil
 }
-
-func marshalDischarges(discharges []security.Discharge) []security.WireDischarge {
-	wire := make([]security.WireDischarge, len(discharges))
-	for i, d := range discharges {
-		wire[i] = security.MarshalDischarge(d)
-	}
-	return wire
-}
-
-func unmarshalDischarges(wire []security.WireDischarge) []security.Discharge {
-	discharges := make([]security.Discharge, len(wire))
-	for i, w := range wire {
-		discharges[i] = security.NewDischarge(w)
-	}
-	return discharges
-}
diff --git a/profiles/internal/ipc/stream/vc/vc.go b/profiles/internal/ipc/stream/vc/vc.go
index 042044a..9d6ce00 100644
--- a/profiles/internal/ipc/stream/vc/vc.go
+++ b/profiles/internal/ipc/stream/vc/vc.go
@@ -612,7 +612,7 @@
 	}
 	enc, err := vom.NewEncoder(conn)
 	if err != nil {
-		vlog.Errorf("failed to create new encoder(conn=%v): %v", conn, err)
+		vlog.Errorf("failed to create new encoder for discharges on VC %v: %v", vc, err)
 		return
 	}
 	discharges := dc.PrepareDischarges(nil, tpCavs, security.DischargeImpetus{})
@@ -620,12 +620,12 @@
 		select {
 		case <-time.After(fetchDuration(expiry)):
 			discharges = dc.PrepareDischarges(nil, tpCavs, security.DischargeImpetus{})
-			if err := enc.Encode(marshalDischarges(discharges)); err != nil {
-				vlog.Errorf("encoding discharge(%v) failed: %v", discharges, err)
+			if err := enc.Encode(discharges); err != nil {
+				vlog.Errorf("encoding discharges on VC %v failed: %v", vc, err)
 				return
 			}
 		case <-vc.closeCh:
-			vlog.VI(3).Infof("closing sendDischargesLoop")
+			vlog.VI(3).Infof("closing sendDischargesLoop on VC %v", vc)
 			return
 		}
 	}
@@ -655,17 +655,16 @@
 	defer conn.Close()
 	dec, err := vom.NewDecoder(conn)
 	if err != nil {
-		vlog.Errorf("failed to create new decoder: %v", err)
+		vlog.Errorf("failed to create new decoder for discharges on %v: %v", vc, err)
 		return
 	}
 
 	for {
-		var wire []security.WireDischarge
-		if err := dec.Decode(&wire); err != nil {
-			vlog.VI(3).Infof("decoding discharge failed: %v", err)
+		var discharges []security.Discharge
+		if err := dec.Decode(&discharges); err != nil {
+			vlog.VI(3).Infof("decoding discharges on %v failed: %v", vc, err)
 			return
 		}
-		discharges := unmarshalDischarges(wire)
 		vc.mu.Lock()
 		for _, d := range discharges {
 			vc.remoteDischarges[d.ID()] = d
diff --git a/profiles/internal/rt/ipc_test.go b/profiles/internal/rt/ipc_test.go
index c106c42..559e7ca 100644
--- a/profiles/internal/rt/ipc_test.go
+++ b/profiles/internal/rt/ipc_test.go
@@ -38,13 +38,13 @@
 	mu     sync.Mutex
 }
 
-func (ds *dischargeService) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.WireDischarge, error) {
+func (ds *dischargeService) Discharge(call ipc.StreamServerCall, cav security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	tp := cav.ThirdPartyDetails()
 	if tp == nil {
-		return nil, fmt.Errorf("discharger: not a third party caveat (%v)", cav)
+		return security.Discharge{}, fmt.Errorf("discharger: not a third party caveat (%v)", cav)
 	}
 	if err := tp.Dischargeable(call); err != nil {
-		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
+		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
 	}
 	// If its the first time being called, add an expiry caveat and a MethodCaveat for "EchoBlessings".
 	// Otherwise, just add a MethodCaveat for "Foo".
@@ -59,11 +59,7 @@
 		}
 	}
 
-	d, err := call.LocalPrincipal().MintDischarge(cav, caveats[0], caveats[1:]...)
-	if err != nil {
-		return nil, err
-	}
-	return security.MarshalDischarge(d), nil
+	return call.LocalPrincipal().MintDischarge(cav, caveats[0], caveats[1:]...)
 }
 
 func newCtx(rootCtx *context.T) *context.T {
diff --git a/security/agent/client.go b/security/agent/client.go
index f8cb435..2458fd5 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -126,11 +126,11 @@
 }
 
 func (c *client) MintDischarge(forCaveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge ...security.Caveat) (security.Discharge, error) {
-	var discharge security.WireDischarge
+	var discharge security.Discharge
 	if err := c.caller.call("MintDischarge", results(&discharge), forCaveat, caveatOnDischarge, additionalCaveatsOnDischarge); err != nil {
 		return security.Discharge{}, err
 	}
-	return security.NewDischarge(discharge), nil
+	return discharge, nil
 }
 
 func (c *client) PublicKey() security.PublicKey {
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index 1879093..580449b 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -287,12 +287,8 @@
 	return a.principal.Sign(message)
 }
 
-func (a agentd) MintDischarge(_ ipc.ServerCall, forCaveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.WireDischarge, error) {
-	d, err := a.principal.MintDischarge(forCaveat, caveatOnDischarge, additionalCaveatsOnDischarge...)
-	if err != nil {
-		return nil, err
-	}
-	return security.MarshalDischarge(d), nil
+func (a agentd) MintDischarge(_ ipc.ServerCall, forCaveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error) {
+	return a.principal.MintDischarge(forCaveat, caveatOnDischarge, additionalCaveatsOnDischarge...)
 }
 
 func (a keymgr) newKey(in_memory bool) (id []byte, data *keyData, err error) {
diff --git a/security/agent/server/wire.vdl.go b/security/agent/server/wire.vdl.go
index 2f23811..401a360 100644
--- a/security/agent/server/wire.vdl.go
+++ b/security/agent/server/wire.vdl.go
@@ -20,7 +20,7 @@
 	Bless(ctx *context.T, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat, opts ...ipc.CallOpt) (security.Blessings, error)
 	BlessSelf(ctx *context.T, name string, caveats []security.Caveat, opts ...ipc.CallOpt) (security.Blessings, error)
 	Sign(ctx *context.T, message []byte, opts ...ipc.CallOpt) (security.Signature, error)
-	MintDischarge(ctx *context.T, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat, opts ...ipc.CallOpt) (security.WireDischarge, error)
+	MintDischarge(ctx *context.T, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat, opts ...ipc.CallOpt) (security.Discharge, error)
 	PublicKey(*context.T, ...ipc.CallOpt) ([]byte, error)
 	BlessingsByName(ctx *context.T, name security.BlessingPattern, opts ...ipc.CallOpt) ([]security.Blessings, error)
 	BlessingsInfo(ctx *context.T, blessings security.Blessings, opts ...ipc.CallOpt) (map[string][]security.Caveat, error)
@@ -97,7 +97,7 @@
 	return
 }
 
-func (c implAgentClientStub) MintDischarge(ctx *context.T, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat, opts ...ipc.CallOpt) (o0 security.WireDischarge, err error) {
+func (c implAgentClientStub) MintDischarge(ctx *context.T, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat, opts ...ipc.CallOpt) (o0 security.Discharge, err error) {
 	var call ipc.ClientCall
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "MintDischarge", []interface{}{i0, i1, i2}, opts...); err != nil {
 		return
@@ -306,7 +306,7 @@
 	Bless(ctx ipc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
 	BlessSelf(ctx ipc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
 	Sign(ctx ipc.ServerCall, message []byte) (security.Signature, error)
-	MintDischarge(ctx ipc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.WireDischarge, error)
+	MintDischarge(ctx ipc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
 	PublicKey(ipc.ServerCall) ([]byte, error)
 	BlessingsByName(ctx ipc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
 	BlessingsInfo(ctx ipc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
@@ -335,7 +335,7 @@
 	Bless(ctx ipc.ServerCall, key []byte, wit security.Blessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.Blessings, error)
 	BlessSelf(ctx ipc.ServerCall, name string, caveats []security.Caveat) (security.Blessings, error)
 	Sign(ctx ipc.ServerCall, message []byte) (security.Signature, error)
-	MintDischarge(ctx ipc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.WireDischarge, error)
+	MintDischarge(ctx ipc.ServerCall, forCaveat security.Caveat, caveatOnDischarge security.Caveat, additionalCaveatsOnDischarge []security.Caveat) (security.Discharge, error)
 	PublicKey(ipc.ServerCall) ([]byte, error)
 	BlessingsByName(ctx ipc.ServerCall, name security.BlessingPattern) ([]security.Blessings, error)
 	BlessingsInfo(ctx ipc.ServerCall, blessings security.Blessings) (map[string][]security.Caveat, error)
@@ -397,7 +397,7 @@
 	return s.impl.Sign(ctx, i0)
 }
 
-func (s implAgentServerStub) MintDischarge(ctx ipc.ServerCall, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat) (security.WireDischarge, error) {
+func (s implAgentServerStub) MintDischarge(ctx ipc.ServerCall, i0 security.Caveat, i1 security.Caveat, i2 []security.Caveat) (security.Discharge, error) {
 	return s.impl.MintDischarge(ctx, i0, i1, i2)
 }
 
@@ -513,7 +513,7 @@
 				{"additionalCaveatsOnDischarge", ``}, // []security.Caveat
 			},
 			OutArgs: []ipc.ArgDesc{
-				{"", ``}, // security.WireDischarge
+				{"", ``}, // security.Discharge
 			},
 		},
 		{
diff --git a/services/identity/revocation/revocation_test.go b/services/identity/revocation/revocation_test.go
index df6d5f5..04daac0 100644
--- a/services/identity/revocation/revocation_test.go
+++ b/services/identity/revocation/revocation_test.go
@@ -53,19 +53,19 @@
 	}
 
 	var impetus security.DischargeImpetus
-	if _, err = discharger.Discharge(ctx, caveat, impetus); err != nil {
+	if _, err := discharger.Discharge(ctx, caveat, impetus); err != nil {
 		t.Fatalf("failed to get discharge: %s", err)
 	}
-	if err = revoker.Revoke(tp.ID()); err != nil {
+	if err := revoker.Revoke(tp.ID()); err != nil {
 		t.Fatalf("failed to revoke: %s", err)
 	}
-	if discharge, err := discharger.Discharge(ctx, caveat, impetus); err == nil || discharge != nil {
+	if _, err := discharger.Discharge(ctx, caveat, impetus); err == nil {
 		t.Fatalf("got a discharge for a revoked caveat: %s", err)
 	}
-	if err = revoker.Revoke(tp.ID()); err != nil {
+	if err := revoker.Revoke(tp.ID()); err != nil {
 		t.Fatalf("failed to revoke again: %s", err)
 	}
-	if discharge, err := discharger.Discharge(ctx, caveat, impetus); err == nil || discharge != nil {
+	if _, err := discharger.Discharge(ctx, caveat, impetus); err == nil {
 		t.Fatalf("got a discharge for a doubly revoked caveat: %s", err)
 	}
 }
diff --git a/services/security/discharger.vdl.go b/services/security/discharger.vdl.go
index 9c4f1e1..3ea61b1 100644
--- a/services/security/discharger.vdl.go
+++ b/services/security/discharger.vdl.go
@@ -21,7 +21,7 @@
 	// Discharge is called by a principal that holds a blessing with a third
 	// party caveat and seeks to get a discharge that proves the fulfillment of
 	// this caveat.
-	Discharge(ctx *context.T, Caveat security.Caveat, Impetus security.DischargeImpetus, opts ...ipc.CallOpt) (Discharge security.WireDischarge, err error)
+	Discharge(ctx *context.T, Caveat security.Caveat, Impetus security.DischargeImpetus, opts ...ipc.CallOpt) (Discharge security.Discharge, err error)
 }
 
 // DischargerClientStub adds universal methods to DischargerClientMethods.
@@ -53,7 +53,7 @@
 	return v23.GetClient(ctx)
 }
 
-func (c implDischargerClientStub) Discharge(ctx *context.T, i0 security.Caveat, i1 security.DischargeImpetus, opts ...ipc.CallOpt) (o0 security.WireDischarge, err error) {
+func (c implDischargerClientStub) Discharge(ctx *context.T, i0 security.Caveat, i1 security.DischargeImpetus, opts ...ipc.CallOpt) (o0 security.Discharge, err error) {
 	var call ipc.ClientCall
 	if call, err = c.c(ctx).StartCall(ctx, c.name, "Discharge", []interface{}{i0, i1}, opts...); err != nil {
 		return
@@ -70,7 +70,7 @@
 	// Discharge is called by a principal that holds a blessing with a third
 	// party caveat and seeks to get a discharge that proves the fulfillment of
 	// this caveat.
-	Discharge(ctx ipc.ServerCall, Caveat security.Caveat, Impetus security.DischargeImpetus) (Discharge security.WireDischarge, err error)
+	Discharge(ctx ipc.ServerCall, Caveat security.Caveat, Impetus security.DischargeImpetus) (Discharge security.Discharge, err error)
 }
 
 // DischargerServerStubMethods is the server interface containing
@@ -108,7 +108,7 @@
 	gs   *ipc.GlobState
 }
 
-func (s implDischargerServerStub) Discharge(ctx ipc.ServerCall, i0 security.Caveat, i1 security.DischargeImpetus) (security.WireDischarge, error) {
+func (s implDischargerServerStub) Discharge(ctx ipc.ServerCall, i0 security.Caveat, i1 security.DischargeImpetus) (security.Discharge, error) {
 	return s.impl.Discharge(ctx, i0, i1)
 }
 
@@ -137,7 +137,7 @@
 				{"Impetus", ``}, // security.DischargeImpetus
 			},
 			OutArgs: []ipc.ArgDesc{
-				{"Discharge", ``}, // security.WireDischarge
+				{"Discharge", ``}, // security.Discharge
 			},
 		},
 	},
diff --git a/services/security/discharger/discharger.go b/services/security/discharger/discharger.go
index 4f67415..337fdb5 100644
--- a/services/security/discharger/discharger.go
+++ b/services/security/discharger/discharger.go
@@ -13,23 +13,19 @@
 // namespace with no additional caveats iff the caveat is valid.
 type dischargerd struct{}
 
-func (dischargerd) Discharge(call ipc.ServerCall, caveat security.Caveat, _ security.DischargeImpetus) (security.WireDischarge, error) {
+func (dischargerd) Discharge(call ipc.ServerCall, caveat security.Caveat, _ security.DischargeImpetus) (security.Discharge, error) {
 	tp := caveat.ThirdPartyDetails()
 	if tp == nil {
-		return nil, fmt.Errorf("Caveat %v does not represent a third party caveat", caveat)
+		return security.Discharge{}, fmt.Errorf("Caveat %v does not represent a third party caveat", caveat)
 	}
 	if err := tp.Dischargeable(call); err != nil {
-		return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
+		return security.Discharge{}, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", tp, err)
 	}
 	expiry, err := security.ExpiryCaveat(time.Now().Add(15 * time.Minute))
 	if err != nil {
-		return nil, fmt.Errorf("unable to create expiration caveat on the discharge: %v", err)
+		return security.Discharge{}, fmt.Errorf("unable to create expiration caveat on the discharge: %v", err)
 	}
-	d, err := call.LocalPrincipal().MintDischarge(caveat, expiry)
-	if err != nil {
-		return nil, err
-	}
-	return security.MarshalDischarge(d), nil
+	return call.LocalPrincipal().MintDischarge(caveat, expiry)
 }
 
 // NewDischarger returns a discharger service implementation that grants