diff --git a/pkg/types/alpine/v0.0.1/entry.go b/pkg/types/alpine/v0.0.1/entry.go
index c27a3ae49f0ca76de42579a8aaec7059a94776c8..18c1c7fe43534ee0d78f8425d789c4405bbe9522 100644
--- a/pkg/types/alpine/v0.0.1/entry.go
+++ b/pkg/types/alpine/v0.0.1/entry.go
@@ -138,19 +138,7 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error {
 	defer hashR.Close()
 	defer apkR.Close()
 
-	closePipesOnError := func(err error) error {
-		pipeReaders := []*io.PipeReader{hashR, apkR}
-		pipeWriters := []*io.PipeWriter{hashW, apkW}
-		for idx := range pipeReaders {
-			if e := pipeReaders[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-			if e := pipeWriters[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-		}
-		return err
-	}
+	closePipesOnError := types.PipeCloser(hashR, hashW, apkR, apkW)
 
 	oldSHA := ""
 	if v.AlpineModel.Package.Hash != nil && v.AlpineModel.Package.Hash.Value != nil {
diff --git a/pkg/types/helm/v0.0.1/entry.go b/pkg/types/helm/v0.0.1/entry.go
index 627ecd62ff8dd9d49782671d9c2ba63ef3a69d20..530764bb87de9c0fb93c1221603a2dd788947cba 100644
--- a/pkg/types/helm/v0.0.1/entry.go
+++ b/pkg/types/helm/v0.0.1/entry.go
@@ -142,22 +142,9 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error {
 	g, ctx := errgroup.WithContext(ctx)
 
 	provenanceR, provenanceW := io.Pipe()
-
 	defer provenanceR.Close()
 
-	closePipesOnError := func(err error) error {
-		pipeReaders := []*io.PipeReader{provenanceR}
-		pipeWriters := []*io.PipeWriter{provenanceW}
-		for idx := range pipeReaders {
-			if e := pipeReaders[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-			if e := pipeWriters[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-		}
-		return err
-	}
+	closePipesOnError := types.PipeCloser(provenanceR, provenanceW)
 
 	g.Go(func() error {
 		defer provenanceW.Close()
diff --git a/pkg/types/rekord/v0.0.1/entry.go b/pkg/types/rekord/v0.0.1/entry.go
index 24f89970928f0ff7199c8df0f0f9c8083e425a7d..d0423f973c8de1133b53b68dff25e3a1b5945fb5 100644
--- a/pkg/types/rekord/v0.0.1/entry.go
+++ b/pkg/types/rekord/v0.0.1/entry.go
@@ -129,19 +129,7 @@ func (v *V001Entry) FetchExternalEntities(ctx context.Context) error {
 	defer hashR.Close()
 	defer sigR.Close()
 
-	closePipesOnError := func(err error) error {
-		pipeReaders := []*io.PipeReader{hashR, sigR}
-		pipeWriters := []*io.PipeWriter{hashW, sigW}
-		for idx := range pipeReaders {
-			if e := pipeReaders[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-			if e := pipeWriters[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-		}
-		return err
-	}
+	closePipesOnError := types.PipeCloser(hashR, hashW, sigR, sigW)
 
 	oldSHA := ""
 	if v.RekordObj.Data.Hash != nil && v.RekordObj.Data.Hash.Value != nil {
@@ -282,12 +270,6 @@ func (v *V001Entry) Canonicalize(ctx context.Context) ([]byte, error) {
 	if err := v.FetchExternalEntities(ctx); err != nil {
 		return nil, err
 	}
-	if v.sigObj == nil {
-		return nil, errors.New("signature object not initialized before canonicalization")
-	}
-	if v.keyObj == nil {
-		return nil, errors.New("key object not initialized before canonicalization")
-	}
 
 	canonicalEntry := models.RekordV001Schema{}
 
@@ -329,7 +311,7 @@ func (v *V001Entry) Canonicalize(ctx context.Context) ([]byte, error) {
 // validate performs cross-field validation for fields in object
 func (v V001Entry) validate() error {
 	sig := v.RekordObj.Signature
-	if sig == nil {
+	if v.RekordObj.Signature == nil {
 		return errors.New("missing signature")
 	}
 	if len(sig.Content) == 0 && sig.URL.String() == "" {
diff --git a/pkg/types/rpm/v0.0.1/entry.go b/pkg/types/rpm/v0.0.1/entry.go
index 5e915f1ab3357365c035d9df1625fabab40cb329..ae6bbf49f02a79c7d7a08a63f70a98aa58c80057 100644
--- a/pkg/types/rpm/v0.0.1/entry.go
+++ b/pkg/types/rpm/v0.0.1/entry.go
@@ -139,19 +139,7 @@ func (v *V001Entry) FetchExternalEntities(ctx context.Context) error {
 	defer sigR.Close()
 	defer rpmR.Close()
 
-	closePipesOnError := func(err error) error {
-		pipeReaders := []*io.PipeReader{hashR, sigR, rpmR}
-		pipeWriters := []*io.PipeWriter{hashW, sigW, rpmW}
-		for idx := range pipeReaders {
-			if e := pipeReaders[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-			if e := pipeWriters[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-		}
-		return err
-	}
+	closePipesOnError := types.PipeCloser(hashR, hashW, sigR, sigW, rpmR, rpmW)
 
 	oldSHA := ""
 	if v.RPMModel.Package.Hash != nil && v.RPMModel.Package.Hash.Value != nil {
diff --git a/pkg/types/tuf/v0.0.1/entry.go b/pkg/types/tuf/v0.0.1/entry.go
index 2af629161f52098c15790aa8fa341675aa8f0e29..f92dc2c579042ad0060299abbf9687312a5f7684 100644
--- a/pkg/types/tuf/v0.0.1/entry.go
+++ b/pkg/types/tuf/v0.0.1/entry.go
@@ -161,19 +161,7 @@ func (v *V001Entry) fetchExternalEntities(ctx context.Context) error {
 	defer metaR.Close()
 	defer rootR.Close()
 
-	closePipesOnError := func(err error) error {
-		pipeReaders := []*io.PipeReader{metaR, rootR}
-		pipeWriters := []*io.PipeWriter{metaW, rootW}
-		for idx := range pipeReaders {
-			if e := pipeReaders[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-			if e := pipeWriters[idx].CloseWithError(err); e != nil {
-				log.Logger.Error(fmt.Errorf("error closing pipe: %w", e))
-			}
-		}
-		return err
-	}
+	closePipesOnError := types.PipeCloser(metaR, metaW, rootR, rootW)
 
 	// verify artifact signature
 	artifactFactory, err := pki.NewArtifactFactory(pki.Tuf)
diff --git a/pkg/types/types.go b/pkg/types/types.go
index 85961f8b92cd62c1f079227cbb5b257fa05e9c62..b271fd7611f7e493fc810d15bd0e47b5d4a5a67f 100644
--- a/pkg/types/types.go
+++ b/pkg/types/types.go
@@ -22,6 +22,7 @@ import (
 	"sync"
 
 	"github.com/sigstore/rekor/pkg/generated/models"
+	"github.com/sigstore/rekor/pkg/log"
 )
 
 // TypeMap stores mapping between type strings and entry constructors
@@ -78,3 +79,18 @@ func ListImplementedTypes() []string {
 	})
 	return retVal
 }
+
+type errCloser interface {
+	CloseWithError(error) error
+}
+
+func PipeCloser(errClosers ...errCloser) func(err error) error {
+	return func(err error) error {
+		for _, p := range errClosers {
+			if err := p.CloseWithError(err); err != nil {
+				log.Logger.Error(fmt.Errorf("error closing pipe: %w", err))
+			}
+		}
+		return err
+	}
+}