// Code generated by protoc-gen-go. DO NOT EDIT.
// source: grafeas/v1/build.proto

package grafeas

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// Note holding the version of the provider's builder and the signature of the
// provenance message in the build details occurrence.
type BuildNote struct {
	// Required. Immutable. Version of the builder which produced this build.
	BuilderVersion       string   `protobuf:"bytes,1,opt,name=builder_version,json=builderVersion,proto3" json:"builder_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BuildNote) Reset()         { *m = BuildNote{} }
func (m *BuildNote) String() string { return proto.CompactTextString(m) }
func (*BuildNote) ProtoMessage()    {}
func (*BuildNote) Descriptor() ([]byte, []int) {
	return fileDescriptor_056b00916e290af1, []int{0}
}

func (m *BuildNote) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildNote.Unmarshal(m, b)
}
func (m *BuildNote) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildNote.Marshal(b, m, deterministic)
}
func (m *BuildNote) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildNote.Merge(m, src)
}
func (m *BuildNote) XXX_Size() int {
	return xxx_messageInfo_BuildNote.Size(m)
}
func (m *BuildNote) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildNote.DiscardUnknown(m)
}

var xxx_messageInfo_BuildNote proto.InternalMessageInfo

func (m *BuildNote) GetBuilderVersion() string {
	if m != nil {
		return m.BuilderVersion
	}
	return ""
}

// Details of a build occurrence.
type BuildOccurrence struct {
	// Required. The actual provenance for the build.
	Provenance *BuildProvenance `protobuf:"bytes,1,opt,name=provenance,proto3" json:"provenance,omitempty"`
	// Serialized JSON representation of the provenance, used in generating the
	// build signature in the corresponding build note. After verifying the
	// signature, `provenance_bytes` can be unmarshalled and compared to the
	// provenance to confirm that it is unchanged. A base64-encoded string
	// representation of the provenance bytes is used for the signature in order
	// to interoperate with openssl which expects this format for signature
	// verification.
	//
	// The serialized form is captured both to avoid ambiguity in how the
	// provenance is marshalled to json as well to prevent incompatibilities with
	// future changes.
	ProvenanceBytes      string   `protobuf:"bytes,2,opt,name=provenance_bytes,json=provenanceBytes,proto3" json:"provenance_bytes,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BuildOccurrence) Reset()         { *m = BuildOccurrence{} }
func (m *BuildOccurrence) String() string { return proto.CompactTextString(m) }
func (*BuildOccurrence) ProtoMessage()    {}
func (*BuildOccurrence) Descriptor() ([]byte, []int) {
	return fileDescriptor_056b00916e290af1, []int{1}
}

func (m *BuildOccurrence) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildOccurrence.Unmarshal(m, b)
}
func (m *BuildOccurrence) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildOccurrence.Marshal(b, m, deterministic)
}
func (m *BuildOccurrence) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildOccurrence.Merge(m, src)
}
func (m *BuildOccurrence) XXX_Size() int {
	return xxx_messageInfo_BuildOccurrence.Size(m)
}
func (m *BuildOccurrence) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildOccurrence.DiscardUnknown(m)
}

var xxx_messageInfo_BuildOccurrence proto.InternalMessageInfo

func (m *BuildOccurrence) GetProvenance() *BuildProvenance {
	if m != nil {
		return m.Provenance
	}
	return nil
}

func (m *BuildOccurrence) GetProvenanceBytes() string {
	if m != nil {
		return m.ProvenanceBytes
	}
	return ""
}

func init() {
	proto.RegisterType((*BuildNote)(nil), "grafeas.v1.BuildNote")
	proto.RegisterType((*BuildOccurrence)(nil), "grafeas.v1.BuildOccurrence")
}

func init() { proto.RegisterFile("grafeas/v1/build.proto", fileDescriptor_056b00916e290af1) }

var fileDescriptor_056b00916e290af1 = []byte{
	// 232 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0x2f, 0x4a, 0x4c,
	0x4b, 0x4d, 0x2c, 0xd6, 0x2f, 0x33, 0xd4, 0x4f, 0x2a, 0xcd, 0xcc, 0x49, 0xd1, 0x2b, 0x28, 0xca,
	0x2f, 0xc9, 0x17, 0xe2, 0x82, 0x8a, 0xeb, 0x95, 0x19, 0x4a, 0x49, 0x23, 0xa9, 0x29, 0x28, 0xca,
	0x2f, 0x4b, 0xcd, 0x4b, 0xcc, 0x4b, 0x4e, 0x85, 0x28, 0x54, 0x32, 0xe1, 0xe2, 0x74, 0x02, 0xe9,
	0xf3, 0xcb, 0x2f, 0x49, 0x15, 0x52, 0xe7, 0xe2, 0x07, 0x1b, 0x92, 0x5a, 0x14, 0x5f, 0x96, 0x5a,
	0x54, 0x9c, 0x99, 0x9f, 0x27, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x19, 0xc4, 0x07, 0x15, 0x0e, 0x83,
	0x88, 0x2a, 0x55, 0x72, 0xf1, 0x83, 0x75, 0xf9, 0x27, 0x27, 0x97, 0x16, 0x15, 0xa5, 0xe6, 0x25,
	0xa7, 0x0a, 0x59, 0x73, 0x71, 0x21, 0x0c, 0x07, 0x6b, 0xe3, 0x36, 0x92, 0xd6, 0x43, 0x38, 0x43,
	0x0f, 0xac, 0x21, 0x00, 0xae, 0x24, 0x08, 0x49, 0xb9, 0x90, 0x26, 0x97, 0x00, 0x82, 0x17, 0x9f,
	0x54, 0x59, 0x92, 0x5a, 0x2c, 0xc1, 0x04, 0xb6, 0x99, 0x1f, 0x21, 0xee, 0x04, 0x12, 0x76, 0x0a,
	0xe4, 0xe2, 0xcd, 0xcc, 0x47, 0x32, 0x37, 0x80, 0x31, 0xca, 0x22, 0x3d, 0x3f, 0x3f, 0x3d, 0x27,
	0x55, 0x2f, 0x3d, 0x3f, 0x27, 0x31, 0x2f, 0x5d, 0x2f, 0xbf, 0x28, 0x5d, 0x3f, 0x3d, 0x35, 0x0f,
	0xec, 0x3f, 0x7d, 0x88, 0x54, 0x62, 0x41, 0x66, 0xb1, 0x3e, 0x22, 0x18, 0xac, 0xa1, 0xcc, 0x45,
	0x4c, 0xcc, 0xee, 0x41, 0x8e, 0x49, 0x6c, 0x60, 0xa5, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff,
	0xd7, 0x4a, 0x16, 0x20, 0x4d, 0x01, 0x00, 0x00,
}
