You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: tor_service_descriptor.go
    path of file: ./repos/scan4all/vendor/github.com/zmap/zcrypto/x509
    
    the code of the file until where you have to start completion: package x509

import (
	"github.com/zmap/zcrypto/encoding/asn1"
	"github.com/zmap/zcrypto/x509/pkix"
)

var (
	// oidBRTorServiceDescriptor is the assigned OID for the CAB Forum Tor Service
	// Descriptor Hash extension (see EV Guidelines Appendix F)
	oidBRTorServiceDescriptor = asn1.ObjectIdentifier{2, 23, 140, 1, 31}
)

// TorServiceDescriptorHash is a structure corrsponding to the
// TorServiceDescriptorHash SEQUENCE described in Appendix F ("Issuance of
// Certificates for .onion Domain Names").
//
// Each TorServiceDescriptorHash holds an onion URI (a utf8 string with the
// .onion 
    
func parseTorServiceDescriptorSyntax(ext pkix.Extension) ([]*TorServiceDescriptorHash, error) {
	// TorServiceDescriptorSyntax ::=
	//    SEQUENCE ( 1..MAX ) of TorServiceDescriptorHash
	var seq asn1.RawValue
	rest, err := asn1.Unmarshal(ext.Value, &seq)
	if err != nil {
		return nil, asn1.SyntaxError{
			Msg: "unable to unmarshal outer TorServiceDescriptor SEQUENCE",
		}
	}
	if len(rest) != 0 {
		return nil, asn1.SyntaxError{
			Msg: "trailing data after outer TorServiceDescriptor SEQUENCE",
		}
	}
	if seq.Tag != asn1.TagSequence || seq.Class != asn1.ClassUniversal || !seq.IsCompound {
		return nil, asn1.SyntaxError{
			Msg: "invalid outer TorServiceDescriptor SEQUENCE",
		}
	}

	var descriptors []*TorServiceDescriptorHash
	rest = seq.Bytes
	for len(rest) > 0 {
		var descriptor *TorServiceDescriptorHash
		descriptor, rest, err = parseTorServiceDescriptorHash(rest)
		if err != nil {
			return nil, err
		}
		descriptors = append(descriptors, descriptor)
	}
	return descriptors, nil
}