// Copyright 2021 The Grafeas Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.26.0
// 	protoc        v3.12.2
// source: grafeas/v1/dsse_attestation.proto

package grafeas

import (
	reflect "reflect"
	sync "sync"

	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type DSSEAttestationNote struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// DSSEHint hints at the purpose of the attestation authority.
	Hint *DSSEAttestationNote_DSSEHint `protobuf:"bytes,1,opt,name=hint,proto3" json:"hint,omitempty"`
}

func (x *DSSEAttestationNote) Reset() {
	*x = DSSEAttestationNote{}
	if protoimpl.UnsafeEnabled {
		mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DSSEAttestationNote) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DSSEAttestationNote) ProtoMessage() {}

func (x *DSSEAttestationNote) ProtoReflect() protoreflect.Message {
	mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DSSEAttestationNote.ProtoReflect.Descriptor instead.
func (*DSSEAttestationNote) Descriptor() ([]byte, []int) {
	return file_grafeas_v1_dsse_attestation_proto_rawDescGZIP(), []int{0}
}

func (x *DSSEAttestationNote) GetHint() *DSSEAttestationNote_DSSEHint {
	if x != nil {
		return x.Hint
	}
	return nil
}

// Deprecated. Prefer to use a regular Occurrence, and populate the
// Envelope at the top level of the Occurrence.
type DSSEAttestationOccurrence struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// If doing something security critical, make sure to verify the signatures in
	// this metadata.
	Envelope *Envelope `protobuf:"bytes,1,opt,name=envelope,proto3" json:"envelope,omitempty"`
	// Types that are assignable to DecodedPayload:
	//	*DSSEAttestationOccurrence_Statement
	DecodedPayload isDSSEAttestationOccurrence_DecodedPayload `protobuf_oneof:"decoded_payload"`
}

func (x *DSSEAttestationOccurrence) Reset() {
	*x = DSSEAttestationOccurrence{}
	if protoimpl.UnsafeEnabled {
		mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DSSEAttestationOccurrence) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DSSEAttestationOccurrence) ProtoMessage() {}

func (x *DSSEAttestationOccurrence) ProtoReflect() protoreflect.Message {
	mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DSSEAttestationOccurrence.ProtoReflect.Descriptor instead.
func (*DSSEAttestationOccurrence) Descriptor() ([]byte, []int) {
	return file_grafeas_v1_dsse_attestation_proto_rawDescGZIP(), []int{1}
}

func (x *DSSEAttestationOccurrence) GetEnvelope() *Envelope {
	if x != nil {
		return x.Envelope
	}
	return nil
}

func (m *DSSEAttestationOccurrence) GetDecodedPayload() isDSSEAttestationOccurrence_DecodedPayload {
	if m != nil {
		return m.DecodedPayload
	}
	return nil
}

func (x *DSSEAttestationOccurrence) GetStatement() *InTotoStatement {
	if x, ok := x.GetDecodedPayload().(*DSSEAttestationOccurrence_Statement); ok {
		return x.Statement
	}
	return nil
}

type isDSSEAttestationOccurrence_DecodedPayload interface {
	isDSSEAttestationOccurrence_DecodedPayload()
}

type DSSEAttestationOccurrence_Statement struct {
	Statement *InTotoStatement `protobuf:"bytes,2,opt,name=statement,proto3,oneof"`
}

func (*DSSEAttestationOccurrence_Statement) isDSSEAttestationOccurrence_DecodedPayload() {}

// This submessage provides human-readable hints about the purpose of the
// authority. Because the name of a note acts as its resource reference, it is
// important to disambiguate the canonical name of the Note (which might be a
// UUID for security purposes) from "readable" names more suitable for debug
// output. Note that these hints should not be used to look up authorities in
// security sensitive contexts, such as when looking up attestations to
// verify.
type DSSEAttestationNote_DSSEHint struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. The human readable name of this attestation authority, for
	// example "cloudbuild-prod".
	HumanReadableName string `protobuf:"bytes,1,opt,name=human_readable_name,json=humanReadableName,proto3" json:"human_readable_name,omitempty"`
}

func (x *DSSEAttestationNote_DSSEHint) Reset() {
	*x = DSSEAttestationNote_DSSEHint{}
	if protoimpl.UnsafeEnabled {
		mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DSSEAttestationNote_DSSEHint) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DSSEAttestationNote_DSSEHint) ProtoMessage() {}

func (x *DSSEAttestationNote_DSSEHint) ProtoReflect() protoreflect.Message {
	mi := &file_grafeas_v1_dsse_attestation_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DSSEAttestationNote_DSSEHint.ProtoReflect.Descriptor instead.
func (*DSSEAttestationNote_DSSEHint) Descriptor() ([]byte, []int) {
	return file_grafeas_v1_dsse_attestation_proto_rawDescGZIP(), []int{0, 0}
}

func (x *DSSEAttestationNote_DSSEHint) GetHumanReadableName() string {
	if x != nil {
		return x.HumanReadableName
	}
	return ""
}

var File_grafeas_v1_dsse_attestation_proto protoreflect.FileDescriptor

var file_grafeas_v1_dsse_attestation_proto_rawDesc = []byte{
	0x0a, 0x21, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x73, 0x73,
	0x65, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2e, 0x76, 0x31, 0x1a,
	0x17, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d,
	0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x21, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61,
	0x73, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x74, 0x6f, 0x74, 0x6f, 0x5f, 0x73, 0x74, 0x61, 0x74,
	0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x01, 0x0a, 0x13,
	0x44, 0x53, 0x53, 0x45, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e,
	0x6f, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x04, 0x68, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x28, 0x2e, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44,
	0x53, 0x53, 0x45, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x6f,
	0x74, 0x65, 0x2e, 0x44, 0x53, 0x53, 0x45, 0x48, 0x69, 0x6e, 0x74, 0x52, 0x04, 0x68, 0x69, 0x6e,
	0x74, 0x1a, 0x3a, 0x0a, 0x08, 0x44, 0x53, 0x53, 0x45, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x2e, 0x0a,
	0x13, 0x68, 0x75, 0x6d, 0x61, 0x6e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x5f,
	0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x68, 0x75, 0x6d, 0x61,
	0x6e, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x9d, 0x01,
	0x0a, 0x19, 0x44, 0x53, 0x53, 0x45, 0x41, 0x74, 0x74, 0x65, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x4f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x08, 0x65,
	0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e,
	0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x76, 0x65, 0x6c,
	0x6f, 0x70, 0x65, 0x52, 0x08, 0x65, 0x6e, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x12, 0x3b, 0x0a,
	0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x1b, 0x2e, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e,
	0x54, 0x6f, 0x74, 0x6f, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52,
	0x09, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x64, 0x65,
	0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x51, 0x0a,
	0x0d, 0x69, 0x6f, 0x2e, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2e, 0x76, 0x31, 0x50, 0x01,
	0x5a, 0x38, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e,
	0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0x2f,
	0x76, 0x31, 0x3b, 0x67, 0x72, 0x61, 0x66, 0x65, 0x61, 0x73, 0xa2, 0x02, 0x03, 0x47, 0x52, 0x41,
	0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_grafeas_v1_dsse_attestation_proto_rawDescOnce sync.Once
	file_grafeas_v1_dsse_attestation_proto_rawDescData = file_grafeas_v1_dsse_attestation_proto_rawDesc
)

func file_grafeas_v1_dsse_attestation_proto_rawDescGZIP() []byte {
	file_grafeas_v1_dsse_attestation_proto_rawDescOnce.Do(func() {
		file_grafeas_v1_dsse_attestation_proto_rawDescData = protoimpl.X.CompressGZIP(file_grafeas_v1_dsse_attestation_proto_rawDescData)
	})
	return file_grafeas_v1_dsse_attestation_proto_rawDescData
}

var file_grafeas_v1_dsse_attestation_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_grafeas_v1_dsse_attestation_proto_goTypes = []interface{}{
	(*DSSEAttestationNote)(nil),          // 0: grafeas.v1.DSSEAttestationNote
	(*DSSEAttestationOccurrence)(nil),    // 1: grafeas.v1.DSSEAttestationOccurrence
	(*DSSEAttestationNote_DSSEHint)(nil), // 2: grafeas.v1.DSSEAttestationNote.DSSEHint
	(*Envelope)(nil),                     // 3: grafeas.v1.Envelope
	(*InTotoStatement)(nil),              // 4: grafeas.v1.InTotoStatement
}
var file_grafeas_v1_dsse_attestation_proto_depIdxs = []int32{
	2, // 0: grafeas.v1.DSSEAttestationNote.hint:type_name -> grafeas.v1.DSSEAttestationNote.DSSEHint
	3, // 1: grafeas.v1.DSSEAttestationOccurrence.envelope:type_name -> grafeas.v1.Envelope
	4, // 2: grafeas.v1.DSSEAttestationOccurrence.statement:type_name -> grafeas.v1.InTotoStatement
	3, // [3:3] is the sub-list for method output_type
	3, // [3:3] is the sub-list for method input_type
	3, // [3:3] is the sub-list for extension type_name
	3, // [3:3] is the sub-list for extension extendee
	0, // [0:3] is the sub-list for field type_name
}

func init() { file_grafeas_v1_dsse_attestation_proto_init() }
func file_grafeas_v1_dsse_attestation_proto_init() {
	if File_grafeas_v1_dsse_attestation_proto != nil {
		return
	}
	file_grafeas_v1_common_proto_init()
	file_grafeas_v1_intoto_statement_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_grafeas_v1_dsse_attestation_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DSSEAttestationNote); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_grafeas_v1_dsse_attestation_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DSSEAttestationOccurrence); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_grafeas_v1_dsse_attestation_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DSSEAttestationNote_DSSEHint); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_grafeas_v1_dsse_attestation_proto_msgTypes[1].OneofWrappers = []interface{}{
		(*DSSEAttestationOccurrence_Statement)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_grafeas_v1_dsse_attestation_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   3,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_grafeas_v1_dsse_attestation_proto_goTypes,
		DependencyIndexes: file_grafeas_v1_dsse_attestation_proto_depIdxs,
		MessageInfos:      file_grafeas_v1_dsse_attestation_proto_msgTypes,
	}.Build()
	File_grafeas_v1_dsse_attestation_proto = out.File
	file_grafeas_v1_dsse_attestation_proto_rawDesc = nil
	file_grafeas_v1_dsse_attestation_proto_goTypes = nil
	file_grafeas_v1_dsse_attestation_proto_depIdxs = nil
}
