// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: chromite/api/signing.proto

package api

import (
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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 CreatePreMPKeysRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Docker image to use for signing operations.
	// Should already be pulled down on the host.
	// This consists of the name of the docker image, followed by the tag, i.e.
	// "signing:1234".
	// This should be set programatically at run time, not manually.
	DockerImage string `protobuf:"bytes,5,opt,name=docker_image,json=dockerImage,proto3" json:"docker_image,omitempty"`
	// Path to the local checkout of the chromiumos/platform/release-keys.
	ReleaseKeysCheckout string `protobuf:"bytes,6,opt,name=release_keys_checkout,json=releaseKeysCheckout,proto3" json:"release_keys_checkout,omitempty"`
	// If set, will use the DevPreMPKeys keyset and will run the CloudKMS exporter
	// in dry run mode (so nothing will actually be exported to CloudKMS)..
	DryRun bool `protobuf:"varint,7,opt,name=dry_run,json=dryRun,proto3" json:"dry_run,omitempty"`
	// Build target to create the PreMP keyset for.
	BuildTarget *chromiumos.BuildTarget `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	// The version of the PreMP keyset, e.g. 2 in "FooPreMpKeys-v2".
	// Should only be set if the PreMP keys need to be regenerated for some
	// reason, e.g. if the existing keyset is broken or missing features.
	// Usually adding a LOEM to the existing keyset is sufficient.
	// Defaults to 1 (note that the "-v1" suffix is dropped, it is implicit).
	Version int32 `protobuf:"varint,2,opt,name=version,proto3" json:"version,omitempty"`
	// Whether to skip generating android keys.
	SkipAndroidKeys bool `protobuf:"varint,3,opt,name=skip_android_keys,json=skipAndroidKeys,proto3" json:"skip_android_keys,omitempty"`
	// Whether to generate UEFI keys.
	Uefi bool `protobuf:"varint,4,opt,name=uefi,proto3" json:"uefi,omitempty"`
}

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

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

func (*CreatePreMPKeysRequest) ProtoMessage() {}

func (x *CreatePreMPKeysRequest) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_signing_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 CreatePreMPKeysRequest.ProtoReflect.Descriptor instead.
func (*CreatePreMPKeysRequest) Descriptor() ([]byte, []int) {
	return file_chromite_api_signing_proto_rawDescGZIP(), []int{0}
}

func (x *CreatePreMPKeysRequest) GetDockerImage() string {
	if x != nil {
		return x.DockerImage
	}
	return ""
}

func (x *CreatePreMPKeysRequest) GetReleaseKeysCheckout() string {
	if x != nil {
		return x.ReleaseKeysCheckout
	}
	return ""
}

func (x *CreatePreMPKeysRequest) GetDryRun() bool {
	if x != nil {
		return x.DryRun
	}
	return false
}

func (x *CreatePreMPKeysRequest) GetBuildTarget() *chromiumos.BuildTarget {
	if x != nil {
		return x.BuildTarget
	}
	return nil
}

func (x *CreatePreMPKeysRequest) GetVersion() int32 {
	if x != nil {
		return x.Version
	}
	return 0
}

func (x *CreatePreMPKeysRequest) GetSkipAndroidKeys() bool {
	if x != nil {
		return x.SkipAndroidKeys
	}
	return false
}

func (x *CreatePreMPKeysRequest) GetUefi() bool {
	if x != nil {
		return x.Uefi
	}
	return false
}

type CreatePreMPKeysResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields
}

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

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

func (*CreatePreMPKeysResponse) ProtoMessage() {}

func (x *CreatePreMPKeysResponse) ProtoReflect() protoreflect.Message {
	mi := &file_chromite_api_signing_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 CreatePreMPKeysResponse.ProtoReflect.Descriptor instead.
func (*CreatePreMPKeysResponse) Descriptor() ([]byte, []int) {
	return file_chromite_api_signing_proto_rawDescGZIP(), []int{1}
}

var File_chromite_api_signing_proto protoreflect.FileDescriptor

var file_chromite_api_signing_proto_rawDesc = []byte{
	0x0a, 0x1a, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x73,
	0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x1c, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x61,
	0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74,
	0x6f, 0x22, 0x9e, 0x02, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x4d,
	0x50, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c,
	0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12,
	0x32, 0x0a, 0x15, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f,
	0x63, 0x68, 0x65, 0x63, 0x6b, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13,
	0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x43, 0x68, 0x65, 0x63, 0x6b,
	0x6f, 0x75, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x07,
	0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x12, 0x3a, 0x0a, 0x0c,
	0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x42, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x62, 0x75, 0x69,
	0x6c, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73,
	0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69,
	0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x61, 0x6e, 0x64, 0x72, 0x6f,
	0x69, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x73,
	0x6b, 0x69, 0x70, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12,
	0x0a, 0x04, 0x75, 0x65, 0x66, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x75, 0x65,
	0x66, 0x69, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x4d,
	0x50, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0x85, 0x01,
	0x0a, 0x0e, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x12, 0x60, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x4d, 0x50, 0x4b,
	0x65, 0x79, 0x73, 0x12, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50, 0x72, 0x65, 0x4d, 0x50, 0x4b, 0x65,
	0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x74, 0x65, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x50,
	0x72, 0x65, 0x4d, 0x50, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x22, 0x00, 0x1a, 0x11, 0xc2, 0xed, 0x1a, 0x0d, 0x0a, 0x07, 0x73, 0x69, 0x67, 0x6e, 0x69, 0x6e,
	0x67, 0x10, 0x02, 0x20, 0x02, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x74, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x62,
	0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromite_api_signing_proto_rawDescOnce sync.Once
	file_chromite_api_signing_proto_rawDescData = file_chromite_api_signing_proto_rawDesc
)

func file_chromite_api_signing_proto_rawDescGZIP() []byte {
	file_chromite_api_signing_proto_rawDescOnce.Do(func() {
		file_chromite_api_signing_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromite_api_signing_proto_rawDescData)
	})
	return file_chromite_api_signing_proto_rawDescData
}

var file_chromite_api_signing_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
var file_chromite_api_signing_proto_goTypes = []interface{}{
	(*CreatePreMPKeysRequest)(nil),  // 0: chromite.api.CreatePreMPKeysRequest
	(*CreatePreMPKeysResponse)(nil), // 1: chromite.api.CreatePreMPKeysResponse
	(*chromiumos.BuildTarget)(nil),  // 2: chromiumos.BuildTarget
}
var file_chromite_api_signing_proto_depIdxs = []int32{
	2, // 0: chromite.api.CreatePreMPKeysRequest.build_target:type_name -> chromiumos.BuildTarget
	0, // 1: chromite.api.SigningService.CreatePreMPKeys:input_type -> chromite.api.CreatePreMPKeysRequest
	1, // 2: chromite.api.SigningService.CreatePreMPKeys:output_type -> chromite.api.CreatePreMPKeysResponse
	2, // [2:3] is the sub-list for method output_type
	1, // [1:2] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_chromite_api_signing_proto_init() }
func file_chromite_api_signing_proto_init() {
	if File_chromite_api_signing_proto != nil {
		return
	}
	file_chromite_api_build_api_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromite_api_signing_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreatePreMPKeysRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromite_api_signing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CreatePreMPKeysResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromite_api_signing_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   2,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_chromite_api_signing_proto_goTypes,
		DependencyIndexes: file_chromite_api_signing_proto_depIdxs,
		MessageInfos:      file_chromite_api_signing_proto_msgTypes,
	}.Build()
	File_chromite_api_signing_proto = out.File
	file_chromite_api_signing_proto_rawDesc = nil
	file_chromite_api_signing_proto_goTypes = nil
	file_chromite_api_signing_proto_depIdxs = nil
}
