vom: move magicbyte handling into encode/decode.

  * move magicbyte handling into encode/decode and change
   New{Encoder,Decoder} API to no return error any more.

MultiPart: 2/3
Change-Id: I9ceef311128c4b422494d4cd7929bfc1e420508f
diff --git a/cmd/principal/main.go b/cmd/principal/main.go
index c569599..2c76e3a 100644
--- a/cmd/principal/main.go
+++ b/cmd/principal/main.go
@@ -1141,10 +1141,7 @@
 func base64VomEncode(i interface{}) (string, error) {
 	buf := &bytes.Buffer{}
 	closer := base64.NewEncoder(base64.URLEncoding, buf)
-	enc, err := vom.NewEncoder(closer)
-	if err != nil {
-		return "", err
-	}
+	enc := vom.NewEncoder(closer)
 	if err := enc.Encode(i); err != nil {
 		return "", err
 	}
@@ -1161,10 +1158,7 @@
 	if err != nil {
 		return err
 	}
-	dec, err := vom.NewDecoder(bytes.NewBuffer(b))
-	if err != nil {
-		return err
-	}
+	dec := vom.NewDecoder(bytes.NewBuffer(b))
 	return dec.Decode(i)
 }
 
diff --git a/cmd/vom/vom.go b/cmd/vom/vom.go
index 58d4fdc..d8d82a0 100644
--- a/cmd/vom/vom.go
+++ b/cmd/vom/vom.go
@@ -124,10 +124,7 @@
 	reader := bytes.NewBuffer(binbytes)
 	// Decode the binary bytes.
 	// TODO(toddw): Add a flag to set a specific type to decode into.
-	decoder, err := vom.NewDecoder(reader)
-	if err != nil {
-		return err
-	}
+	decoder := vom.NewDecoder(reader)
 	var result *vdl.Value
 	if err := decoder.Decode(&result); err != nil {
 		return err
diff --git a/cmd/vomtestgen/generate.go b/cmd/vomtestgen/generate.go
index c4b67f9..e6382b3 100644
--- a/cmd/vomtestgen/generate.go
+++ b/cmd/vomtestgen/generate.go
@@ -201,7 +201,7 @@
 	Value      any    // Value to test
 	TypeString string // The string representation of the Type
 	Hex        string // Hex pattern representing vom encoding
-	HexMagic   string // Hex pattern representing vom encoding of MagicByte
+	HexVersion string // Hex pattern representing vom encoding of Version
 	HexType    string // Hex pattern representing vom encoding of Type
 	HexValue   string // Hex pattern representing vom encoding of Value
 }
@@ -222,7 +222,7 @@
 			value = value.Elem()
 		}
 		valstr := vdlgen.TypedConst(value, testpkg, imports)
-		hexmagic, hextype, hexvalue, vomdump, err := toVomHex(value)
+		hexversion, hextype, hexvalue, vomdump, err := toVomHex(value)
 		if err != nil {
 			return nil, err
 		}
@@ -234,7 +234,7 @@
 		%[2]q,
 		%[3]q,
 		%[4]q, %[5]q, %[6]q,
-	},`, valstr, value.Type().String(), hexmagic+hextype+hexvalue, hexmagic, hextype, hexvalue, vomdump)
+	},`, valstr, value.Type().String(), hexversion+hextype+hexvalue, hexversion, hextype, hexvalue, vomdump)
 	}
 	fmt.Fprintf(buf, `
 }
@@ -318,27 +318,22 @@
 
 func toVomHex(value *vdl.Value) (string, string, string, string, error) {
 	var buf, typebuf bytes.Buffer
-	typeenc, err := vom.NewTypeEncoder(&typebuf)
-	if err != nil {
-		return "", "", "", "", fmt.Errorf("vom.NewTypeEncoder failed: %v", err)
-	}
-	encoder, err := vom.NewEncoderWithTypeEncoder(&buf, typeenc)
-	if err != nil {
-		return "", "", "", "", fmt.Errorf("vom.NewEncoderWithTypeEncoder failed: %v", err)
-	}
+	encoder := vom.NewEncoderWithTypeEncoder(&buf, vom.NewTypeEncoder(&typebuf))
 	if err := encoder.Encode(value); err != nil {
 		return "", "", "", "", fmt.Errorf("vom.Encode(%v) failed: %v", value, err)
 	}
-	magic, _ := buf.ReadByte() // Read the magic byte.
-	vombytes := append(typebuf.Bytes(), buf.Bytes()...)
-	typebuf.ReadByte() // Remove the magic byte.
+	version, _ := buf.ReadByte() // Read the version byte.
+	if typebuf.Len() > 0 {
+		typebuf.ReadByte() // Remove the version byte.
+	}
+	vombytes := append(append([]byte{version}, typebuf.Bytes()...), buf.Bytes()...)
 	const pre = "\t// "
 	vomdump := pre + strings.Replace(vom.Dump(vombytes), "\n", "\n"+pre, -1)
 	if strings.HasSuffix(vomdump, "\n"+pre) {
 		vomdump = vomdump[:len(vomdump)-len("\n"+pre)]
 	}
 	// TODO(toddw): Add hex pattern bracketing for map and set.
-	return fmt.Sprintf("%x", magic), fmt.Sprintf("%x", typebuf.Bytes()), fmt.Sprintf("%x", buf.Bytes()), vomdump, nil
+	return fmt.Sprintf("%x", version), fmt.Sprintf("%x", typebuf.Bytes()), fmt.Sprintf("%x", buf.Bytes()), vomdump, nil
 }
 
 func writeFile(data []byte, outName string) error {
diff --git a/lib/security/serialization/signing_writer.go b/lib/security/serialization/signing_writer.go
index 840f6cb..93245d7 100644
--- a/lib/security/serialization/signing_writer.go
+++ b/lib/security/serialization/signing_writer.go
@@ -17,9 +17,8 @@
 )
 
 var (
-	errCantBeNilSigner   = verror.Register(pkgPath+".errCantBeNilSigner", verror.NoRetry, "{1:}{2:} data:{3} signature:{4} signer:{5} cannot be nil{:_}")
-	errCantCreateEncoder = verror.Register(pkgPath+".errCantCreateEncoder", verror.NoRetry, "{1:}{2:} failed to create new encoder{:_}")
-	errCantSign          = verror.Register(pkgPath+".errCantSign", verror.NoRetry, "{1:}{2:} signing failed{:_}")
+	errCantBeNilSigner = verror.Register(pkgPath+".errCantBeNilSigner", verror.NoRetry, "{1:}{2:} data:{3} signature:{4} signer:{5} cannot be nil{:_}")
+	errCantSign        = verror.Register(pkgPath+".errCantSign", verror.NoRetry, "{1:}{2:} signing failed{:_}")
 )
 
 const defaultChunkSizeBytes = 1 << 20
@@ -98,10 +97,7 @@
 	if (data == nil) || (signature == nil) || (s == nil) {
 		return nil, verror.New(errCantBeNilSigner, nil, data, signature, s)
 	}
-	enc, err := vom.NewEncoder(signature)
-	if err != nil {
-		return nil, verror.New(errCantCreateEncoder, nil, err)
-	}
+	enc := vom.NewEncoder(signature)
 	w := &signingWriter{data: data, signature: signature, signer: s, signatureHash: sha256.New(), chunkSizeBytes: defaultChunkSizeBytes, sigEnc: enc}
 
 	if opts != nil {
diff --git a/lib/security/serialization/verifying_reader.go b/lib/security/serialization/verifying_reader.go
index 28c736a..5427009 100644
--- a/lib/security/serialization/verifying_reader.go
+++ b/lib/security/serialization/verifying_reader.go
@@ -21,7 +21,6 @@
 var (
 	errCantBeNilVerifier      = verror.Register(pkgPath+".errCantBeNilVerifier", verror.NoRetry, "{1:}{2:} data:{3} signature:{4} key:{5} cannot be nil{:_}")
 	errModifiedSinceWritten   = verror.Register(pkgPath+".errModifiedSinceWritten", verror.NoRetry, "{1:}{2:} data has been modified since being written{:_}")
-	errCantCreateDecoder      = verror.Register(pkgPath+".errCantCreateDecoder", verror.NoRetry, "{1:}{2:} failed to create new decoder{:_}")
 	errCantDecodeHeader       = verror.Register(pkgPath+".errCantDecodeHeader", verror.NoRetry, "{1:}{2:} failed to decode header{:_}")
 	errCantVerifySig          = verror.Register(pkgPath+".errCantVerifySig", verror.NoRetry, "{1:}{2:} signature verification failed{:_}")
 	errBadTypeFromSigReader   = verror.Register(pkgPath+".errBadTypeFromSigReader", verror.NoRetry, "{1:}{2:} invalid data of type: {3} read from signature Reader{:_}")
@@ -93,10 +92,7 @@
 
 func (r *verifyingReader) verifySignature(signature io.Reader, key security.PublicKey) error {
 	signatureHash := sha256.New()
-	dec, err := vom.NewDecoder(signature)
-	if err != nil {
-		return verror.New(errCantCreateDecoder, nil, err)
-	}
+	dec := vom.NewDecoder(signature)
 	var h SignedHeader
 	if err := dec.Decode(&h); err != nil {
 		return verror.New(errCantDecodeHeader, nil, err)
diff --git a/lib/security/storage.go b/lib/security/storage.go
index 1690c91..07058f3 100644
--- a/lib/security/storage.go
+++ b/lib/security/storage.go
@@ -25,11 +25,7 @@
 	if err != nil {
 		return err
 	}
-	enc, err := vom.NewEncoder(swc)
-	if err != nil {
-		swc.Close()
-		return err
-	}
+	enc := vom.NewEncoder(swc)
 	if err := enc.Encode(obj); err != nil {
 		swc.Close()
 		return err
@@ -47,9 +43,6 @@
 	if err != nil {
 		return err
 	}
-	dec, err := vom.NewDecoder(vr)
-	if err != nil {
-		return err
-	}
+	dec := vom.NewDecoder(vr)
 	return dec.Decode(obj)
 }
diff --git a/profiles/internal/rpc/client.go b/profiles/internal/rpc/client.go
index 6ba7074..2efc1b3 100644
--- a/profiles/internal/rpc/client.go
+++ b/profiles/internal/rpc/client.go
@@ -52,8 +52,6 @@
 	errNonRootedName             = reg(".errNonRootedName", "{3} does not appear to contain an address")
 	errInvalidEndpoint           = reg(".errInvalidEndpoint", "failed to parse endpoint")
 	errIncompatibleEndpoint      = reg(".errIncompatibleEndpoint", "incompatible endpoint")
-	errVomEncoder                = reg(".errVomEncoder", "failed to create vom encoder{:3}")
-	errVomDecoder                = reg(".errVomDecoder", "failed to create vom decoder{:3}")
 	errRequestEncoding           = reg(".errRequestEncoding", "failed to encode request {3}{:4}")
 	errDischargeEncoding         = reg(".errDischargeEncoding", "failed to encode discharges {:3}")
 	errBlessingEncoding          = reg(".errBlessingEncoding", "failed to encode blessing {3}{:4}")
@@ -785,30 +783,14 @@
 		server: server,
 		dc:     dc,
 	}
-	var err error
 	typeenc := flow.VCDataCache().Get(vc.TypeEncoderKey{})
 	if typeenc == nil {
-		if fc.enc, err = vom.NewEncoder(flow); err != nil {
-			// In practice, this will never fail because of a networking
-			// problem since the encoder writes the 'magic byte' which
-			// will be buffered and not written to the network immediately.
-			berr := verror.AddSubErrs(verror.New(errVomEncoder, fc.ctx), fc.ctx, verror.SubErr{Err: err})
-			return nil, fc.close(berr)
-		}
-		if fc.dec, err = vom.NewDecoder(flow); err != nil {
-			berr := verror.AddSubErrs(verror.New(errVomDecoder, fc.ctx), fc.ctx, verror.SubErr{Err: err})
-			return nil, fc.close(berr)
-		}
+		fc.enc = vom.NewEncoder(flow)
+		fc.dec = vom.NewDecoder(flow)
 	} else {
-		if fc.enc, err = vom.NewEncoderWithTypeEncoder(flow, typeenc.(*vom.TypeEncoder)); err != nil {
-			berr := verror.AddSubErrs(verror.New(errVomEncoder, fc.ctx), fc.ctx, verror.SubErr{Err: err})
-			return nil, fc.close(berr)
-		}
+		fc.enc = vom.NewEncoderWithTypeEncoder(flow, typeenc.(*vom.TypeEncoder))
 		typedec := flow.VCDataCache().Get(vc.TypeDecoderKey{})
-		if fc.dec, err = vom.NewDecoderWithTypeDecoder(flow, typedec.(*vom.TypeDecoder)); err != nil {
-			berr := verror.AddSubErrs(verror.New(errVomDecoder, fc.ctx), fc.ctx, verror.SubErr{Err: err})
-			return nil, fc.close(berr)
-		}
+		fc.dec = vom.NewDecoderWithTypeDecoder(flow, typedec.(*vom.TypeDecoder))
 	}
 	return fc, nil
 }
@@ -850,7 +832,7 @@
 		}
 	}
 	switch verror.ErrorID(err) {
-	case errVomDecoder.ID, errVomEncoder.ID, errRequestEncoding.ID, errArgEncoding.ID, errResponseDecoding.ID:
+	case errRequestEncoding.ID, errArgEncoding.ID, errResponseDecoding.ID:
 		return verror.New(verror.ErrBadProtocol, fc.ctx, err)
 	}
 	return err
@@ -874,7 +856,7 @@
 		Language:         string(i18n.GetLangID(fc.ctx)),
 	}
 	if err := fc.enc.Encode(req); err != nil {
-		berr := verror.New(errRequestEncoding, fc.ctx, fmt.Sprintf("%#v", req), err)
+		berr := verror.New(verror.ErrBadProtocol, fc.ctx, verror.New(errRequestEncoding, fc.ctx, fmt.Sprintf("%#v", req), err))
 		return fc.close(berr)
 	}
 	for ix, arg := range args {
diff --git a/profiles/internal/rpc/server.go b/profiles/internal/rpc/server.go
index 95ebf68..a715691 100644
--- a/profiles/internal/rpc/server.go
+++ b/profiles/internal/rpc/server.go
@@ -965,27 +965,14 @@
 		flow:       flow,
 		discharges: make(map[string]security.Discharge),
 	}
-	var err error
 	typeenc := flow.VCDataCache().Get(vc.TypeEncoderKey{})
 	if typeenc == nil {
-		if fs.enc, err = vom.NewEncoder(flow); err != nil {
-			flow.Close()
-			return nil, err
-		}
-		if fs.dec, err = vom.NewDecoder(flow); err != nil {
-			flow.Close()
-			return nil, err
-		}
+		fs.enc = vom.NewEncoder(flow)
+		fs.dec = vom.NewDecoder(flow)
 	} else {
-		if fs.enc, err = vom.NewEncoderWithTypeEncoder(flow, typeenc.(*vom.TypeEncoder)); err != nil {
-			flow.Close()
-			return nil, err
-		}
+		fs.enc = vom.NewEncoderWithTypeEncoder(flow, typeenc.(*vom.TypeEncoder))
 		typedec := flow.VCDataCache().Get(vc.TypeDecoderKey{})
-		if fs.dec, err = vom.NewDecoderWithTypeDecoder(flow, typedec.(*vom.TypeDecoder)); err != nil {
-			flow.Close()
-			return nil, err
-		}
+		fs.dec = vom.NewDecoderWithTypeDecoder(flow, typedec.(*vom.TypeDecoder))
 	}
 	return fs, nil
 }
diff --git a/profiles/internal/rpc/server_test.go b/profiles/internal/rpc/server_test.go
index 900db9a..a5d1b7d 100644
--- a/profiles/internal/rpc/server_test.go
+++ b/profiles/internal/rpc/server_test.go
@@ -131,7 +131,8 @@
 type statusServer struct{ ch chan struct{} }
 
 func (s *statusServer) Hang(*context.T, rpc.ServerCall) error {
-	<-s.ch
+	s.ch <- struct{}{} // Notify the server has received a call.
+	<-s.ch             // Wait for the server to be ready to go.
 	return nil
 }
 
@@ -178,10 +179,11 @@
 	}
 	go makeCall(ctx)
 
-	// Wait for RPC to start
+	// Wait for RPC to start and the server has received the call.
 	if err := <-progress; err != nil {
 		t.Fatalf(err.Error())
 	}
+	<-serverChan
 
 	// Stop server asynchronously
 	go func() {
diff --git a/profiles/internal/rpc/stream/manager/listener.go b/profiles/internal/rpc/stream/manager/listener.go
index 2af4149..869e50f 100644
--- a/profiles/internal/rpc/stream/manager/listener.go
+++ b/profiles/internal/rpc/stream/manager/listener.go
@@ -46,8 +46,6 @@
 	// level errors and hence {1}{2} is omitted from their format
 	// strings to avoid repeating these n-times in the final error
 	// message visible to the user.
-	errVomEncoder                 = reg(".errVomEncoder", "failed to create vom encoder{:3}")
-	errVomDecoder                 = reg(".errVomDecoder", "failed to create vom decoder{:3}")
 	errVomEncodeRequest           = reg(".errVomEncodeRequest", "failed to encode request to proxy{:3}")
 	errVomDecodeResponse          = reg(".errVomDecodeRequest", "failed to decoded response from proxy{:3}")
 	errProxyError                 = reg(".errProxyError", "proxy error {:3}")
@@ -346,23 +344,13 @@
 			return nil, nil, verror.New(stream.ErrSecurity, nil, verror.New(errRefusedProxyLogin, nil, err))
 		}
 	}
-	enc, err := vom.NewEncoder(flow)
-	if err != nil {
-		flow.Close()
-		vf.StopAccepting()
-		return nil, nil, verror.New(stream.ErrNetwork, nil, verror.New(errVomDecoder, nil, err))
-	}
+	enc := vom.NewEncoder(flow)
 	if err := enc.Encode(request); err != nil {
 		flow.Close()
 		vf.StopAccepting()
 		return nil, nil, verror.New(stream.ErrNetwork, nil, verror.New(errVomEncodeRequest, nil, err))
 	}
-	dec, err := vom.NewDecoder(flow)
-	if err != nil {
-		flow.Close()
-		vf.StopAccepting()
-		return nil, nil, verror.New(stream.ErrNetwork, nil, verror.New(errVomDecoder, nil, err))
-	}
+	dec := vom.NewDecoder(flow)
 	if err := dec.Decode(&response); err != nil {
 		flow.Close()
 		vf.StopAccepting()
diff --git a/profiles/internal/rpc/stream/proxy/proxy.go b/profiles/internal/rpc/stream/proxy/proxy.go
index 414b759..1022b10 100644
--- a/profiles/internal/rpc/stream/proxy/proxy.go
+++ b/profiles/internal/rpc/stream/proxy/proxy.go
@@ -53,8 +53,6 @@
 	errNoRoutingTableEntry       = reg(".errNoRoutingTableEntry", "routing table has no entry for the VC")
 	errProcessVanished           = reg(".errProcessVanished", "remote process vanished")
 	errDuplicateSetupVC          = reg(".errDuplicateSetupVC", "duplicate SetupVC request")
-	errVomDecoder                = reg(".errVomDecoder", "failed to create vom decoder{:3}")
-	errVomEncoder                = reg(".errVomEncoder", "failed to create vom encoder{:3}")
 	errVomEncodeResponse         = reg(".errVomEncodeResponse", "failed to encode response from proxy{:3}")
 	errNoRequest                 = reg(".errNoRequest", "unable to read Request{:3}")
 	errServerClosedByProxy       = reg(".errServerClosedByProxy", "server closed by proxy")
@@ -343,10 +341,8 @@
 	server.Process.InitVCI(server.VC.VCI())
 	var request Request
 	var response Response
-	dec, err := vom.NewDecoder(conn)
-	if err != nil {
-		response.Error = verror.New(stream.ErrProxy, nil, verror.New(errVomDecoder, nil, err))
-	} else if err := dec.Decode(&request); err != nil {
+	dec := vom.NewDecoder(conn)
+	if err := dec.Decode(&request); err != nil {
 		response.Error = verror.New(stream.ErrProxy, nil, verror.New(errNoRequest, nil, err))
 	} else if err := p.authorize(server.VC, request); err != nil {
 		response.Error = err
@@ -362,12 +358,7 @@
 		}
 		response.Endpoint = ep.String()
 	}
-	enc, err := vom.NewEncoder(conn)
-	if err != nil {
-		proxyLog().Infof("Failed to create Encoder for server %v: %v", server, err)
-		server.Close(verror.New(stream.ErrProxy, nil, verror.New(errVomEncoder, nil, err)))
-		return
-	}
+	enc := vom.NewEncoder(conn)
 	if err := enc.Encode(response); err != nil {
 		proxyLog().Infof("Failed to encode response %#v for server %v", response, server)
 		server.Close(verror.New(stream.ErrProxy, nil, verror.New(errVomEncodeResponse, nil, err)))
diff --git a/profiles/internal/rpc/stream/vc/auth.go b/profiles/internal/rpc/stream/vc/auth.go
index e19d10f..ade2e49 100644
--- a/profiles/internal/rpc/stream/vc/auth.go
+++ b/profiles/internal/rpc/stream/vc/auth.go
@@ -28,8 +28,6 @@
 	// level errors and hence {1}{2} is omitted from their format
 	// strings to avoid repeating these n-times in the final error
 	// message visible to the user.
-	errVomDecoder                   = reg(".errVomDecoder", "failed to create vom decoder{:3}")
-	errVomEncoder                   = reg(".errVomEncoder", "failed to create vom encoder{:3}")
 	errVomEncodeBlessing            = reg(".errVomEncodeRequest", "failed to encode blessing{:3}")
 	errHandshakeMessage             = reg(".errHandshakeMessage", "failed to read hanshake message{:3}")
 	errInvalidSignatureInMessage    = reg(".errInvalidSignatureInMessage", "signature does not verify in authentication handshake message")
@@ -100,10 +98,7 @@
 		return err
 	}
 	var buf bytes.Buffer
-	enc, err := vom.NewEncoder(&buf)
-	if err != nil {
-		return verror.New(stream.ErrNetwork, nil, verror.New(errVomEncoder, nil, err))
-	}
+	enc := vom.NewEncoder(&buf)
 	if err := enc.Encode(signature); err != nil {
 		return verror.New(stream.ErrNetwork, nil, verror.New(errVomEncodeBlessing, nil, err))
 	}
@@ -118,10 +113,7 @@
 		return err
 	}
 	defer msg.Release()
-	enc, err = vom.NewEncoder(w)
-	if err != nil {
-		return verror.New(stream.ErrNetwork, nil, verror.New(errVomEncoder, nil, err))
-	}
+	enc = vom.NewEncoder(w)
 	if err := enc.Encode(msg.Contents); err != nil {
 		return verror.New(stream.ErrNetwork, nil, verror.New(errVomEncodeBlessing, nil, err))
 	}
@@ -131,10 +123,7 @@
 func readBlessings(r io.Reader, tag []byte, crypter crypto.Crypter, v version.RPCVersion) (security.Blessings, map[string]security.Discharge, error) {
 	var msg []byte
 	var noBlessings security.Blessings
-	dec, err := vom.NewDecoder(r)
-	if err != nil {
-		return noBlessings, nil, verror.New(stream.ErrNetwork, nil, verror.New(errVomDecoder, nil, err))
-	}
+	dec := vom.NewDecoder(r)
 	if err := dec.Decode(&msg); err != nil {
 		return noBlessings, nil, verror.New(stream.ErrNetwork, nil, verror.New(errHandshakeMessage, nil, err))
 	}
@@ -143,11 +132,7 @@
 		return noBlessings, nil, err
 	}
 	defer buf.Release()
-	dec, err = vom.NewDecoder(bytes.NewReader(buf.Contents))
-	if err != nil {
-		return noBlessings, nil, verror.New(stream.ErrNetwork, nil, verror.New(errVomDecoder, nil, err))
-	}
-
+	dec = vom.NewDecoder(bytes.NewReader(buf.Contents))
 	var (
 		blessings security.Blessings
 		sig       security.Signature
diff --git a/profiles/internal/rpc/stream/vc/vc.go b/profiles/internal/rpc/stream/vc/vc.go
index 7a8a567..7846d4e 100644
--- a/profiles/internal/rpc/stream/vc/vc.go
+++ b/profiles/internal/rpc/stream/vc/vc.go
@@ -52,8 +52,6 @@
 	errClosedDuringHandshake          = reg(".errCloseDuringHandshake", "VC closed during handshake{:3}")
 	errFailedToDecryptPayload         = reg(".errFailedToDecryptPayload", "failed to decrypt payload{:3}")
 	errIgnoringMessageOnClosedVC      = reg(".errIgnoringMessageOnClosedVC", "ignoring message for Flow {3} on closed VC {4}")
-	errVomTypeDecoder                 = reg(".errVomDecoder", "failed to create vom type decoder{:3}")
-	errVomTypeEncoder                 = reg(".errVomEncoder", "failed to create vom type encoder{:3}")
 	errFailedToCreateFlowForAuth      = reg(".errFailedToCreateFlowForAuth", "failed to create a Flow for authentication{:3}")
 	errAuthFlowNotAccepted            = reg(".errAuthFlowNotAccepted", "authentication Flow not accepted{:3}")
 	errFailedToCreateFlowForWireType  = reg(".errFailedToCreateFlowForWireType", "fail to create a Flow for wire type{:3}")
@@ -702,11 +700,7 @@
 	if dc == nil {
 		return
 	}
-	enc, err := vom.NewEncoder(conn)
-	if err != nil {
-		vlog.Errorf("failed to create new encoder for discharges on VC %v: %v", vc, err)
-		return
-	}
+	enc := vom.NewEncoder(conn)
 	discharges := dc.PrepareDischarges(nil, tpCavs, security.DischargeImpetus{})
 	for expiry := minExpiryTime(discharges, tpCavs); !expiry.IsZero(); expiry = minExpiryTime(discharges, tpCavs) {
 		select {
@@ -756,12 +750,7 @@
 
 func (vc *VC) recvDischargesLoop(conn io.ReadCloser) {
 	defer conn.Close()
-	dec, err := vom.NewDecoder(conn)
-	if err != nil {
-		vlog.Errorf("failed to create new decoder for discharges on %v: %v", vc, err)
-		return
-	}
-
+	dec := vom.NewDecoder(conn)
 	for {
 		var discharges []security.Discharge
 		if err := dec.Decode(&discharges); err != nil {
@@ -787,18 +776,8 @@
 	if err != nil {
 		return verror.New(stream.ErrSecurity, nil, verror.New(errFailedToCreateFlowForWireType, nil, err))
 	}
-	typeEnc, err := vom.NewTypeEncoder(conn)
-	if err != nil {
-		conn.Close()
-		return verror.New(stream.ErrSecurity, nil, verror.New(errVomTypeEncoder, nil, err))
-	}
-	vc.dataCache.Insert(TypeEncoderKey{}, typeEnc)
-	typeDec, err := vom.NewTypeDecoder(conn)
-	if err != nil {
-		conn.Close()
-		return verror.New(stream.ErrSecurity, nil, verror.New(errVomTypeDecoder, nil, err))
-	}
-	vc.dataCache.Insert(TypeDecoderKey{}, typeDec)
+	vc.dataCache.Insert(TypeEncoderKey{}, vom.NewTypeEncoder(conn))
+	vc.dataCache.Insert(TypeDecoderKey{}, vom.NewTypeDecoder(conn))
 
 	if vc.Version() < version.RPCVersion10 {
 		return nil
@@ -823,18 +802,8 @@
 	if err != nil {
 		return verror.New(errFlowForWireTypeNotAccepted, nil, err)
 	}
-	typeEnc, err := vom.NewTypeEncoder(conn)
-	if err != nil {
-		conn.Close()
-		return verror.New(errVomTypeEncoder, nil, err)
-	}
-	vc.dataCache.Insert(TypeEncoderKey{}, typeEnc)
-	typeDec, err := vom.NewTypeDecoder(conn)
-	if err != nil {
-		conn.Close()
-		return verror.New(errVomTypeDecoder, nil, err)
-	}
-	vc.dataCache.Insert(TypeDecoderKey{}, typeDec)
+	vc.dataCache.Insert(TypeEncoderKey{}, vom.NewTypeEncoder(conn))
+	vc.dataCache.Insert(TypeDecoderKey{}, vom.NewTypeDecoder(conn))
 
 	if vc.Version() < version.RPCVersion10 {
 		return nil
diff --git a/profiles/internal/rpc/test/client_test.go b/profiles/internal/rpc/test/client_test.go
index 961384a..04a77db 100644
--- a/profiles/internal/rpc/test/client_test.go
+++ b/profiles/internal/rpc/test/client_test.go
@@ -398,8 +398,8 @@
 
 func dropDataDialer(network, address string, timeout time.Duration) (net.Conn, error) {
 	matcher := func(read bool, msg message.T) bool {
-		switch msg.(type) {
-		case *message.Data:
+		// Drop and close the connection when reading the first data message.
+		if _, ok := msg.(*message.Data); ok && read {
 			return true
 		}
 		return false
@@ -440,7 +440,7 @@
 
 	nctx, _ := context.WithTimeout(ctx, time.Minute)
 	call, err := client.StartCall(nctx, "name", "noname", nil, options.NoRetry{}, options.SecurityNone)
-	if verror.ErrorID(err) != verror.ErrBadProtocol.ID {
+	if verror.ErrorID(err) != verror.ErrNoServers.ID {
 		t.Fatalf("wrong error: %s", err)
 	}
 	if call != nil {
diff --git a/services/internal/fs/simplestore.go b/services/internal/fs/simplestore.go
index eca4974..8ae5457 100644
--- a/services/internal/fs/simplestore.go
+++ b/services/internal/fs/simplestore.go
@@ -254,10 +254,7 @@
 		return nil, verror.New(errFileSystemError, nil, err)
 	}
 
-	decoder, err := vom.NewDecoder(file)
-	if err != nil {
-		return nil, verror.New(errDecodeFailedBadData, nil, err)
-	}
+	decoder := vom.NewDecoder(file)
 	if err := decoder.Decode(&data); err != nil {
 		return nil, verror.New(errDecodeFailedBadData, nil, err)
 	}
@@ -563,11 +560,7 @@
 	if _, err := file.Write([]byte{byte(vomGobMagicByte)}); err != nil {
 		return err
 	}
-	enc, err := vom.NewEncoder(file)
-	if err != nil {
-		return err
-	}
-	err = enc.Encode(ms.data)
+	enc := vom.NewEncoder(file)
 	if err := enc.Encode(ms.data); err != nil {
 		return verror.New(errEncodeFailed, nil, err)
 	}
diff --git a/services/wspr/internal/app/app.go b/services/wspr/internal/app/app.go
index 1496e41..c789fc6 100644
--- a/services/wspr/internal/app/app.go
+++ b/services/wspr/internal/app/app.go
@@ -497,12 +497,7 @@
 		w.Error(verror.Convert(verror.ErrInternal, ctx, fmt.Errorf("Error decoding hex string %q: %v", data, err)))
 		return
 	}
-	decoder, err := vom.NewDecoder(bytes.NewReader(binbytes))
-	if err != nil {
-		w.Error(verror.Convert(verror.ErrInternal, ctx, err))
-		return
-	}
-
+	decoder := vom.NewDecoder(bytes.NewReader(binbytes))
 	var msg RpcRequest
 	if err := decoder.Decode(&msg); err != nil {
 		w.Error(verror.Convert(verror.ErrInternal, ctx, err))
diff --git a/services/wspr/internal/app/app_test.go b/services/wspr/internal/app/app_test.go
index e259890..9821146 100644
--- a/services/wspr/internal/app/app_test.go
+++ b/services/wspr/internal/app/app_test.go
@@ -295,10 +295,7 @@
 
 func makeRequest(rpc RpcRequest, args ...interface{}) (string, error) {
 	var buf bytes.Buffer
-	encoder, err := vom.NewEncoder(&buf)
-	if err != nil {
-		return "", err
-	}
+	encoder := vom.NewEncoder(&buf)
 	if err := encoder.Encode(rpc); err != nil {
 		return "", err
 	}
diff --git a/services/wspr/internal/app/messaging.go b/services/wspr/internal/app/messaging.go
index 4a9e4d8..4fab9a9 100644
--- a/services/wspr/internal/app/messaging.go
+++ b/services/wspr/internal/app/messaging.go
@@ -133,19 +133,13 @@
 // TODO(bprosnitz) Don't double-encode
 func ConstructOutgoingMessage(messageId int32, messageType lib.ResponseType, data interface{}) (string, error) {
 	var buf bytes.Buffer
-	enc, err := vom.NewEncoder(&buf)
-	if err != nil {
-		return "", err
-	}
+	enc := vom.NewEncoder(&buf)
 	if err := enc.Encode(lib.Response{Type: messageType, Message: data}); err != nil {
 		return "", err
 	}
 
 	var buf2 bytes.Buffer
-	enc2, err := vom.NewEncoder(&buf2)
-	if err != nil {
-		return "", err
-	}
+	enc2 := vom.NewEncoder(&buf2)
 	if err := enc2.Encode(Message{Id: messageId, Data: fmt.Sprintf("%x", buf.Bytes())}); err != nil {
 		return "", err
 	}
diff --git a/services/wspr/internal/app/mock_jsServer_test.go b/services/wspr/internal/app/mock_jsServer_test.go
index 75e33ce..8fef5ee 100644
--- a/services/wspr/internal/app/mock_jsServer_test.go
+++ b/services/wspr/internal/app/mock_jsServer_test.go
@@ -273,10 +273,7 @@
 	}
 
 	var b bytes.Buffer
-	enc, err := vom.NewEncoder(&b)
-	if err != nil {
-		panic(err)
-	}
+	enc := vom.NewEncoder(&b)
 	if err := enc.Encode(resp); err != nil {
 		panic(err)
 	}
diff --git a/services/wspr/internal/browspr/browspr_test.go b/services/wspr/internal/browspr/browspr_test.go
index effb936..0debf32 100644
--- a/services/wspr/internal/browspr/browspr_test.go
+++ b/services/wspr/internal/browspr/browspr_test.go
@@ -186,10 +186,7 @@
 	}
 
 	var buf bytes.Buffer
-	encoder, err := vom.NewEncoder(&buf)
-	if err != nil {
-		t.Fatalf("Failed to vom encode rpc message: %v", err)
-	}
+	encoder := vom.NewEncoder(&buf)
 	if err := encoder.Encode(rpc); err != nil {
 		t.Fatalf("Failed to vom encode rpc message: %v", err)
 	}
diff --git a/services/wspr/internal/channel/channel_nacl/channel_nacl.go b/services/wspr/internal/channel/channel_nacl/channel_nacl.go
index 347a355..96ae623 100644
--- a/services/wspr/internal/channel/channel_nacl/channel_nacl.go
+++ b/services/wspr/internal/channel/channel_nacl/channel_nacl.go
@@ -21,10 +21,7 @@
 
 func sendMessageToBrowser(ppapiInst ppapi.Instance, m channel.Message) {
 	var outBuf bytes.Buffer
-	enc, err := vom.NewEncoder(&outBuf)
-	if err != nil {
-		panic(fmt.Sprintf("Error beginning encoding: %v", err))
-	}
+	enc := vom.NewEncoder(&outBuf)
 	if err := enc.Encode(m); err != nil {
 		panic(fmt.Sprintf("Error encoding message %v: %v", m, err))
 	}
@@ -58,11 +55,7 @@
 	}
 
 	buf := bytes.NewBuffer(b)
-	dec, err := vom.NewDecoder(buf)
-	if err != nil {
-		panic(fmt.Sprintf("Error beginning decoding: %v", err))
-	}
-
+	dec := vom.NewDecoder(buf)
 	var m channel.Message
 	if err := dec.Decode(&m); err != nil {
 		panic(fmt.Sprintf("Error decoding message: %v", err))
diff --git a/services/wspr/internal/lib/vom.go b/services/wspr/internal/lib/vom.go
index 2ddbcfb..ef1f09d 100644
--- a/services/wspr/internal/lib/vom.go
+++ b/services/wspr/internal/lib/vom.go
@@ -14,10 +14,7 @@
 
 func VomEncode(v interface{}) (string, error) {
 	var buf bytes.Buffer
-	encoder, err := vom.NewEncoder(&buf)
-	if err != nil {
-		return "", err
-	}
+	encoder := vom.NewEncoder(&buf)
 	if err := encoder.Encode(v); err != nil {
 		return "", err
 	}
@@ -37,9 +34,6 @@
 	if err != nil {
 		return fmt.Errorf("Error decoding hex string %q: %v", data, err)
 	}
-	decoder, err := vom.NewDecoder(bytes.NewReader(binbytes))
-	if err != nil {
-		return err
-	}
+	decoder := vom.NewDecoder(bytes.NewReader(binbytes))
 	return decoder.Decode(v)
 }
diff --git a/services/wspr/internal/principal/principal.go b/services/wspr/internal/principal/principal.go
index da21e59..f13ac68 100644
--- a/services/wspr/internal/principal/principal.go
+++ b/services/wspr/internal/principal/principal.go
@@ -160,12 +160,7 @@
 		return nil, err
 	}
 
-	decoder, err := vom.NewDecoder(vr)
-
-	if err != nil {
-		return nil, err
-	}
-
+	decoder := vom.NewDecoder(vr)
 	if err := decoder.Decode(&result.state); err != nil {
 		return nil, err
 	}
@@ -182,11 +177,7 @@
 		return err
 	}
 
-	encoder, err := vom.NewEncoder(swc)
-
-	if err != nil {
-		return err
-	}
+	encoder := vom.NewEncoder(swc)
 	if err := encoder.Encode(i.state); err != nil {
 		return err
 	}
diff --git a/services/wspr/internal/principal/principal_test.go b/services/wspr/internal/principal/principal_test.go
index 2f86ef4..638727c 100644
--- a/services/wspr/internal/principal/principal_test.go
+++ b/services/wspr/internal/principal/principal_test.go
@@ -68,19 +68,11 @@
 	// Validate the integrity of the bits.
 	buf := new(bytes.Buffer)
 
-	encoder, err := vom.NewEncoder(buf)
-
-	if err != nil {
-		return err
-	}
-
+	encoder := vom.NewEncoder(buf)
 	if encoder.Encode(bOrigin); err != nil {
 		return err
 	}
-	decoder, err := vom.NewDecoder(buf)
-	if err != nil {
-		return err
-	}
+	decoder := vom.NewDecoder(buf)
 	var decoded security.Blessings
 	if err := decoder.Decode(&decoded); err != nil {
 		return err