diff --git a/java-spanner/google-cloud-spanner/pom.xml b/java-spanner/google-cloud-spanner/pom.xml index c26501188ec7..6e069b339706 100644 --- a/java-spanner/google-cloud-spanner/pom.xml +++ b/java-spanner/google-cloud-spanner/pom.xml @@ -532,6 +532,16 @@ 2.94.0-SNAPSHOT test + + org.bouncycastle + bcprov-jdk18on + 1.78 + + + com.google.crypto.tink + tink + 1.13.0 + diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java index e7624242077a..40cd4a56f73a 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/SpannerOptions.java @@ -53,6 +53,7 @@ import com.google.cloud.spanner.admin.database.v1.stub.DatabaseAdminStubSettings; import com.google.cloud.spanner.admin.instance.v1.InstanceAdminSettings; import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStubSettings; +import com.google.cloud.spanner.omni.SpannerOmniCredentials; import com.google.cloud.spanner.spi.SpannerRpcFactory; import com.google.cloud.spanner.spi.v1.ChannelEndpointCacheFactory; import com.google.cloud.spanner.spi.v1.GapicSpannerRpc; @@ -66,6 +67,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.crypto.tink.util.SecretBytes; import com.google.spanner.v1.DirectedReadOptions; import com.google.spanner.v1.ExecuteSqlRequest; import com.google.spanner.v1.ExecuteSqlRequest.QueryOptions; @@ -1239,9 +1241,20 @@ private static Builder prepareBuilder(Builder builder) { builder.sessionPoolOptions = builder.sessionPoolOptions.toBuilder().setExperimentalHost().build(); } - if (builder.credentials == null) { + if (builder.username != null && builder.secretBytes != null) { + builder.setCredentials( + new SpannerOmniCredentials(builder.username, builder.secretBytes, builder.host)); + } else if (builder.credentials == null) { builder.setCredentials(environment.getDefaultSpannerOmniCredentials()); } + if (builder.credentials instanceof SpannerOmniCredentials) { + ((SpannerOmniCredentials) builder.credentials) + .initChannel(builder.usePlainText, builder.mTLSContext); + } + } else { + if (builder.username != null || builder.secretBytes != null) { + throw new IllegalStateException("login() can only be used with InstanceType.OMNI."); + } } return builder; } @@ -1296,6 +1309,8 @@ private static Builder prepareBuilder(Builder builder) { DEFAULT_ADMIN_REQUESTS_LIMIT_EXCEEDED_RETRY_SETTINGS; private boolean autoThrottleAdministrativeRequests = false; private boolean trackTransactionStarter = false; + private String username; + private SecretBytes secretBytes; private Map defaultQueryOptions = new HashMap<>(); private boolean enableGrpcGcpOtelMetrics = SpannerOptions.environment.isEnableGrpcGcpOtelMetrics(); @@ -1910,6 +1925,28 @@ public Builder setType(InstanceType instanceType) { return this; } + /** + * Authenticates to Spanner Omni using the provided username and password, and configures the + * resulting token for use in subsequent Spanner API calls. + * + *

Note: The provided {@code password} array will be cleared (zeroed out) by this method for + * security purposes. + * + * @param username The username for login. + * @param password The password for login. + * @return this builder + */ + public Builder login(String username, char[] password) { + Preconditions.checkArgument( + username != null && !username.isEmpty(), "username cannot be null or empty"); + Preconditions.checkArgument( + password != null && password.length > 0, "password cannot be null or empty"); + + this.username = username; + this.secretBytes = SpannerOmniCredentials.convertToSecretBytes(password); + return this; + } + /** Enables gRPC-GCP extension with the default settings. This option is enabled by default. */ public Builder enableGrpcGcpExtension() { return this.enableGrpcGcpExtension(null); diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java index e940d1b6bd80..cccb80c63c00 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionOptions.java @@ -89,12 +89,14 @@ import com.google.cloud.spanner.SpannerOptions; import com.google.cloud.spanner.connection.ClientSideStatementValueConverters.GrpcInterceptorProviderConverter; import com.google.cloud.spanner.connection.StatementExecutor.StatementExecutorType; +import com.google.cloud.spanner.omni.SpannerOmniCredentials; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; +import com.google.crypto.tink.util.SecretBytes; import io.grpc.Deadline; import io.grpc.Deadline.Ticker; import io.opentelemetry.api.OpenTelemetry; @@ -154,6 +156,8 @@ public class ConnectionOptions { static final boolean DEFAULT_USE_PLAIN_TEXT = false; static final boolean DEFAULT_IS_EXPERIMENTAL_HOST = false; static final SpannerOptions.InstanceType DEFAULT_TYPE = SpannerOptions.InstanceType.CLOUD; + static final String DEFAULT_USERNAME = ""; + static final String DEFAULT_PASSWORD = ""; static final boolean DEFAULT_AUTOCOMMIT = true; static final boolean DEFAULT_READONLY = false; static final boolean DEFAULT_RETRY_ABORTS_INTERNALLY = true; @@ -224,6 +228,12 @@ public class ConnectionOptions { /** The type of Spanner instance to connect to (cloud, omni, or emulator). */ public static final String TYPE_PROPERTY_NAME = "type"; + /** Username for OPAQUE login */ + public static final String USERNAME_PROPERTY_NAME = "username"; + + /** Password for OPAQUE login */ + public static final String PASSWORD_PROPERTY_NAME = "password"; + /** Client certificate path to establish mTLS */ static final String CLIENT_CERTIFICATE_PROPERTY_NAME = "clientCertificate"; @@ -775,6 +785,8 @@ private ConnectionOptions(Builder builder) { System.getenv()); GoogleCredentials defaultSpannerOmniCredentials = SpannerOptions.getDefaultSpannerOmniCredentialsFromSysEnv(); + String username = getInitialConnectionPropertyValue(ConnectionProperties.USERNAME); + String password = getInitialConnectionPropertyValue(ConnectionProperties.PASSWORD); // Using credentials on a plain text connection is not allowed, so if the user has not specified // any credentials and is using a plain text connection, we should not try to get the // credentials from the environment, but default to NoCredentials. @@ -783,12 +795,18 @@ && getInitialConnectionPropertyValue(CREDENTIALS_URL) == null && getInitialConnectionPropertyValue(ENCODED_CREDENTIALS) == null && getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER) == null && getInitialConnectionPropertyValue(OAUTH_TOKEN) == null + && Strings.isNullOrEmpty(getInitialConnectionPropertyValue(ConnectionProperties.USERNAME)) && usePlainText) { this.credentials = NoCredentials.getInstance(); } else if (getInitialConnectionPropertyValue(OAUTH_TOKEN) != null) { this.credentials = new GoogleCredentials( new AccessToken(getInitialConnectionPropertyValue(OAUTH_TOKEN), null)); + } else if ((isSpannerOmniPattern || isSpannerOmni()) + && !Strings.isNullOrEmpty(username) + && !Strings.isNullOrEmpty(password)) { + SecretBytes secretBytes = SpannerOmniCredentials.convertToSecretBytes(password.toCharArray()); + this.credentials = new SpannerOmniCredentials(username, secretBytes, this.host); } else if ((isSpannerOmniPattern || isSpannerOmni()) && defaultSpannerOmniCredentials != null) { this.credentials = defaultSpannerOmniCredentials; } else if (getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER) != null) { diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java index 1236fcb4431d..5c6b0606c4d8 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/connection/ConnectionProperties.java @@ -279,6 +279,20 @@ public class ConnectionProperties { }, InstanceTypeConverter.INSTANCE, Context.STARTUP); + static final ConnectionProperty USERNAME = + create( + ConnectionOptions.USERNAME_PROPERTY_NAME, + "The username to use for OPAQUE login.", + ConnectionOptions.DEFAULT_USERNAME, + StringValueConverter.INSTANCE, + Context.STARTUP); + static final ConnectionProperty PASSWORD = + create( + ConnectionOptions.PASSWORD_PROPERTY_NAME, + "The password to use for OPAQUE login.", + ConnectionOptions.DEFAULT_PASSWORD, + StringValueConverter.INSTANCE, + Context.STARTUP); static final ConnectionProperty CLIENT_CERTIFICATE = create( CLIENT_CERTIFICATE_PROPERTY_NAME, diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Authentication.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Authentication.java new file mode 100644 index 000000000000..c8245d6e3d14 --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Authentication.java @@ -0,0 +1,1448 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: authentication.proto + +package com.google.cloud.spanner.omni; + +final class Authentication { + private Authentication() {} + + public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {} + + public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); + } + + /** Protobuf enum {@code google.spanner.auth.v1.PasswordAuthenticationProtocol} */ + public enum PasswordAuthenticationProtocol implements com.google.protobuf.ProtocolMessageEnum { + /** PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED = 0; */ + PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED(0), + /** PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE = 2; */ + PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE(2), + UNRECOGNIZED(-1), + ; + + /** PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED = 0; */ + public static final int PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED_VALUE = 0; + + /** PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE = 2; */ + public static final int PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE_VALUE = 2; + + public final int getNumber() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalArgumentException( + "Can't get the number of an unknown enum value."); + } + return value; + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static PasswordAuthenticationProtocol valueOf(int value) { + return forNumber(value); + } + + /** + * @param value The numeric wire value of the corresponding enum entry. + * @return The enum associated with the given numeric wire value. + */ + public static PasswordAuthenticationProtocol forNumber(int value) { + switch (value) { + case 0: + return PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED; + case 2: + return PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE; + default: + return null; + } + } + + public static com.google.protobuf.Internal.EnumLiteMap + internalGetValueMap() { + return internalValueMap; + } + + private static final com.google.protobuf.Internal.EnumLiteMap + internalValueMap = + new com.google.protobuf.Internal.EnumLiteMap() { + public PasswordAuthenticationProtocol findValueByNumber(int number) { + return PasswordAuthenticationProtocol.forNumber(number); + } + }; + + public final com.google.protobuf.Descriptors.EnumValueDescriptor getValueDescriptor() { + if (this == UNRECOGNIZED) { + throw new java.lang.IllegalStateException( + "Can't get the descriptor of an unrecognized enum value."); + } + return getDescriptor().getValues().get(ordinal()); + } + + public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() { + return getDescriptor(); + } + + public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication.getDescriptor().getEnumTypes().get(0); + } + + private static final PasswordAuthenticationProtocol[] VALUES = values(); + + public static PasswordAuthenticationProtocol valueOf( + com.google.protobuf.Descriptors.EnumValueDescriptor desc) { + if (desc.getType() != getDescriptor()) { + throw new java.lang.IllegalArgumentException("EnumValueDescriptor is not for this type."); + } + if (desc.getIndex() == -1) { + return UNRECOGNIZED; + } + return VALUES[desc.getIndex()]; + } + + private final int value; + + private PasswordAuthenticationProtocol(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:google.spanner.auth.v1.PasswordAuthenticationProtocol) + } + + public interface PasswordAuthenticationHandshakeRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest) + com.google.protobuf.MessageOrBuilder {} + + /** Protobuf type {@code google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest} */ + public static final class PasswordAuthenticationHandshakeRequest + extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest) + PasswordAuthenticationHandshakeRequestOrBuilder { + private static final long serialVersionUID = 0L; + + // Use PasswordAuthenticationHandshakeRequest.newBuilder() to construct. + private PasswordAuthenticationHandshakeRequest( + com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private PasswordAuthenticationHandshakeRequest() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new PasswordAuthenticationHandshakeRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .class, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder.class); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj + instanceof + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest other = + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) obj; + + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest) + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .class, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder.class); + } + + // Construct using + // com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + build() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest result = + buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + buildPartial() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest result = + new com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest( + this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other + instanceof + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) { + return mergeFrom( + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) + other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + other) { + if (other + == com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest) + private static final com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = + new com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest(); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public PasswordAuthenticationHandshakeRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface PasswordAuthenticationHandshakeResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The enum numeric value on the wire for passwordAuthenticationProtocol. + */ + int getPasswordAuthenticationProtocolValue(); + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The passwordAuthenticationProtocol. + */ + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + getPasswordAuthenticationProtocol(); + + /** + * string user_id = 2; + * + * @return The userId. + */ + java.lang.String getUserId(); + + /** + * string user_id = 2; + * + * @return The bytes for userId. + */ + com.google.protobuf.ByteString getUserIdBytes(); + } + + /** Protobuf type {@code google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse} */ + public static final class PasswordAuthenticationHandshakeResponse + extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse) + PasswordAuthenticationHandshakeResponseOrBuilder { + private static final long serialVersionUID = 0L; + + // Use PasswordAuthenticationHandshakeResponse.newBuilder() to construct. + private PasswordAuthenticationHandshakeResponse( + com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private PasswordAuthenticationHandshakeResponse() { + passwordAuthenticationProtocol_ = 0; + userId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new PasswordAuthenticationHandshakeResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .class, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder.class); + } + + public static final int PASSWORD_AUTHENTICATION_PROTOCOL_FIELD_NUMBER = 1; + private int passwordAuthenticationProtocol_ = 0; + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The enum numeric value on the wire for passwordAuthenticationProtocol. + */ + @java.lang.Override + public int getPasswordAuthenticationProtocolValue() { + return passwordAuthenticationProtocol_; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The passwordAuthenticationProtocol. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + getPasswordAuthenticationProtocol() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol result = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol.forNumber( + passwordAuthenticationProtocol_); + return result == null + ? com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol.UNRECOGNIZED + : result; + } + + public static final int USER_ID_FIELD_NUMBER = 2; + + @SuppressWarnings("serial") + private volatile java.lang.Object userId_ = ""; + + /** + * string user_id = 2; + * + * @return The userId. + */ + @java.lang.Override + public java.lang.String getUserId() { + java.lang.Object ref = userId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + userId_ = s; + return s; + } + } + + /** + * string user_id = 2; + * + * @return The bytes for userId. + */ + @java.lang.Override + public com.google.protobuf.ByteString getUserIdBytes() { + java.lang.Object ref = userId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + userId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (passwordAuthenticationProtocol_ + != com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + .PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED + .getNumber()) { + output.writeEnum(1, passwordAuthenticationProtocol_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, userId_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (passwordAuthenticationProtocol_ + != com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + .PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED + .getNumber()) { + size += + com.google.protobuf.CodedOutputStream.computeEnumSize( + 1, passwordAuthenticationProtocol_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, userId_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj + instanceof + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse other = + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse) + obj; + + if (passwordAuthenticationProtocol_ != other.passwordAuthenticationProtocol_) return false; + if (!getUserId().equals(other.getUserId())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + PASSWORD_AUTHENTICATION_PROTOCOL_FIELD_NUMBER; + hash = (53 * hash) + passwordAuthenticationProtocol_; + hash = (37 * hash) + USER_ID_FIELD_NUMBER; + hash = (53 * hash) + getUserId().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom(com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse) + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .class, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder.class); + } + + // Construct using + // com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + passwordAuthenticationProtocol_ = 0; + userId_ = ""; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + build() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + buildPartial() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + result = + new com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.passwordAuthenticationProtocol_ = passwordAuthenticationProtocol_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.userId_ = userId_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other + instanceof + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse) { + return mergeFrom( + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse) + other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + other) { + if (other + == com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .getDefaultInstance()) return this; + if (other.passwordAuthenticationProtocol_ != 0) { + setPasswordAuthenticationProtocolValue(other.getPasswordAuthenticationProtocolValue()); + } + if (!other.getUserId().isEmpty()) { + userId_ = other.userId_; + bitField0_ |= 0x00000002; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: + { + passwordAuthenticationProtocol_ = input.readEnum(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 18: + { + userId_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000002; + break; + } // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private int passwordAuthenticationProtocol_ = 0; + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The enum numeric value on the wire for passwordAuthenticationProtocol. + */ + @java.lang.Override + public int getPasswordAuthenticationProtocolValue() { + return passwordAuthenticationProtocol_; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @param value The enum numeric value on the wire for passwordAuthenticationProtocol to set. + * @return This builder for chaining. + */ + public Builder setPasswordAuthenticationProtocolValue(int value) { + passwordAuthenticationProtocol_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return The passwordAuthenticationProtocol. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + getPasswordAuthenticationProtocol() { + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol result = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol.forNumber( + passwordAuthenticationProtocol_); + return result == null + ? com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol + .UNRECOGNIZED + : result; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @param value The passwordAuthenticationProtocol to set. + * @return This builder for chaining. + */ + public Builder setPasswordAuthenticationProtocol( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000001; + passwordAuthenticationProtocol_ = value.getNumber(); + onChanged(); + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationProtocol password_authentication_protocol = 1; + * + * + * @return This builder for chaining. + */ + public Builder clearPasswordAuthenticationProtocol() { + bitField0_ = (bitField0_ & ~0x00000001); + passwordAuthenticationProtocol_ = 0; + onChanged(); + return this; + } + + private java.lang.Object userId_ = ""; + + /** + * string user_id = 2; + * + * @return The userId. + */ + public java.lang.String getUserId() { + java.lang.Object ref = userId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + userId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string user_id = 2; + * + * @return The bytes for userId. + */ + public com.google.protobuf.ByteString getUserIdBytes() { + java.lang.Object ref = userId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + userId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string user_id = 2; + * + * @param value The userId to set. + * @return This builder for chaining. + */ + public Builder setUserId(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + userId_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * string user_id = 2; + * + * @return This builder for chaining. + */ + public Builder clearUserId() { + userId_ = getDefaultInstance().getUserId(); + bitField0_ = (bitField0_ & ~0x00000002); + onChanged(); + return this; + } + + /** + * string user_id = 2; + * + * @param value The bytes for userId to set. + * @return This builder for chaining. + */ + public Builder setUserIdBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + userId_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse) + private static final com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = + new com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse(); + } + + public static com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public PasswordAuthenticationHandshakeResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor descriptor; + + static { + java.lang.String[] descriptorData = { + "\n\024authentication.proto\022\026google.spanner.a" + + "uth.v1\"(\n&PasswordAuthenticationHandshak" + + "eRequest\"\234\001\n\'PasswordAuthenticationHands" + + "hakeResponse\022`\n password_authentication_" + + "protocol\030\001 \001(\01626.google.spanner.auth.v1." + + "PasswordAuthenticationProtocol\022\017\n\007user_i" + + "d\030\002 \001(\t*\177\n\036PasswordAuthenticationProtoco" + + "l\0220\n,PASSWORD_AUTHENTICATION_PROTOCOL_UN" + + "SPECIFIED\020\000\022+\n\'PASSWORD_AUTHENTICATION_P" + + "ROTOCOL_OPAQUE\020\002B1\n\035com.google.cloud.spa" + + "nner.omniB\016AuthenticationP\000b\006proto3" + }; + descriptor = + com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( + descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor, + new java.lang.String[] {}); + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeResponse_descriptor, + new java.lang.String[] { + "PasswordAuthenticationProtocol", "UserId", + }); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Login.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Login.java new file mode 100644 index 000000000000..b8d72b9ae03a --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Login.java @@ -0,0 +1,8119 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: login.proto + +package com.google.cloud.spanner.omni; + +final class Login { + private Login() {} + + public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {} + + public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); + } + + public interface AccessTokenOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.AccessToken) + com.google.protobuf.MessageOrBuilder { + + /** + * string token = 1; + * + * @return The token. + */ + java.lang.String getToken(); + + /** + * string token = 1; + * + * @return The bytes for token. + */ + com.google.protobuf.ByteString getTokenBytes(); + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return Whether the expirationTime field is set. + */ + boolean hasExpirationTime(); + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return The expirationTime. + */ + com.google.protobuf.Timestamp getExpirationTime(); + + /** .google.protobuf.Timestamp expiration_time = 3; */ + com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder(); + } + + /** Protobuf type {@code google.spanner.auth.v1.AccessToken} */ + public static final class AccessToken extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.AccessToken) + AccessTokenOrBuilder { + private static final long serialVersionUID = 0L; + + // Use AccessToken.newBuilder() to construct. + private AccessToken(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private AccessToken() { + token_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new AccessToken(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_AccessToken_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_AccessToken_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.AccessToken.class, + com.google.cloud.spanner.omni.Login.AccessToken.Builder.class); + } + + public static final int TOKEN_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object token_ = ""; + + /** + * string token = 1; + * + * @return The token. + */ + @java.lang.Override + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } + } + + /** + * string token = 1; + * + * @return The bytes for token. + */ + @java.lang.Override + public com.google.protobuf.ByteString getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int EXPIRATION_TIME_FIELD_NUMBER = 3; + private com.google.protobuf.Timestamp expirationTime_; + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return Whether the expirationTime field is set. + */ + @java.lang.Override + public boolean hasExpirationTime() { + return expirationTime_ != null; + } + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return The expirationTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getExpirationTime() { + return expirationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : expirationTime_; + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder() { + return expirationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : expirationTime_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(token_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, token_); + } + if (expirationTime_ != null) { + output.writeMessage(3, getExpirationTime()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(token_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, token_); + } + if (expirationTime_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getExpirationTime()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.AccessToken)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.AccessToken other = + (com.google.cloud.spanner.omni.Login.AccessToken) obj; + + if (!getToken().equals(other.getToken())) return false; + if (hasExpirationTime() != other.hasExpirationTime()) return false; + if (hasExpirationTime()) { + if (!getExpirationTime().equals(other.getExpirationTime())) return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getToken().hashCode(); + if (hasExpirationTime()) { + hash = (37 * hash) + EXPIRATION_TIME_FIELD_NUMBER; + hash = (53 * hash) + getExpirationTime().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.cloud.spanner.omni.Login.AccessToken prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.AccessToken} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.AccessToken) + com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_AccessToken_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_AccessToken_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.AccessToken.class, + com.google.cloud.spanner.omni.Login.AccessToken.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.AccessToken.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + token_ = ""; + expirationTime_ = null; + if (expirationTimeBuilder_ != null) { + expirationTimeBuilder_.dispose(); + expirationTimeBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_AccessToken_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken build() { + com.google.cloud.spanner.omni.Login.AccessToken result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken buildPartial() { + com.google.cloud.spanner.omni.Login.AccessToken result = + new com.google.cloud.spanner.omni.Login.AccessToken(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0(com.google.cloud.spanner.omni.Login.AccessToken result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.token_ = token_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.expirationTime_ = + expirationTimeBuilder_ == null ? expirationTime_ : expirationTimeBuilder_.build(); + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.AccessToken) { + return mergeFrom((com.google.cloud.spanner.omni.Login.AccessToken) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.AccessToken other) { + if (other == com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance()) + return this; + if (!other.getToken().isEmpty()) { + token_ = other.token_; + bitField0_ |= 0x00000001; + onChanged(); + } + if (other.hasExpirationTime()) { + mergeExpirationTime(other.getExpirationTime()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + token_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 26: + { + input.readMessage( + getExpirationTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } // case 26 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private java.lang.Object token_ = ""; + + /** + * string token = 1; + * + * @return The token. + */ + public java.lang.String getToken() { + java.lang.Object ref = token_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + token_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string token = 1; + * + * @return The bytes for token. + */ + public com.google.protobuf.ByteString getTokenBytes() { + java.lang.Object ref = token_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + token_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string token = 1; + * + * @param value The token to set. + * @return This builder for chaining. + */ + public Builder setToken(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + token_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string token = 1; + * + * @return This builder for chaining. + */ + public Builder clearToken() { + token_ = getDefaultInstance().getToken(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string token = 1; + * + * @param value The bytes for token to set. + * @return This builder for chaining. + */ + public Builder setTokenBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + token_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private com.google.protobuf.Timestamp expirationTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + expirationTimeBuilder_; + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return Whether the expirationTime field is set. + */ + public boolean hasExpirationTime() { + return ((bitField0_ & 0x00000002) != 0); + } + + /** + * .google.protobuf.Timestamp expiration_time = 3; + * + * @return The expirationTime. + */ + public com.google.protobuf.Timestamp getExpirationTime() { + if (expirationTimeBuilder_ == null) { + return expirationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : expirationTime_; + } else { + return expirationTimeBuilder_.getMessage(); + } + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public Builder setExpirationTime(com.google.protobuf.Timestamp value) { + if (expirationTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + expirationTime_ = value; + } else { + expirationTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public Builder setExpirationTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (expirationTimeBuilder_ == null) { + expirationTime_ = builderForValue.build(); + } else { + expirationTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public Builder mergeExpirationTime(com.google.protobuf.Timestamp value) { + if (expirationTimeBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) + && expirationTime_ != null + && expirationTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getExpirationTimeBuilder().mergeFrom(value); + } else { + expirationTime_ = value; + } + } else { + expirationTimeBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public Builder clearExpirationTime() { + bitField0_ = (bitField0_ & ~0x00000002); + expirationTime_ = null; + if (expirationTimeBuilder_ != null) { + expirationTimeBuilder_.dispose(); + expirationTimeBuilder_ = null; + } + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public com.google.protobuf.Timestamp.Builder getExpirationTimeBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getExpirationTimeFieldBuilder().getBuilder(); + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + public com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder() { + if (expirationTimeBuilder_ != null) { + return expirationTimeBuilder_.getMessageOrBuilder(); + } else { + return expirationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : expirationTime_; + } + } + + /** .google.protobuf.Timestamp expiration_time = 3; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getExpirationTimeFieldBuilder() { + if (expirationTimeBuilder_ == null) { + expirationTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getExpirationTime(), getParentForChildren(), isClean()); + expirationTime_ = null; + } + return expirationTimeBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.AccessToken) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.AccessToken) + private static final com.google.cloud.spanner.omni.Login.AccessToken DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.AccessToken(); + } + + public static com.google.cloud.spanner.omni.Login.AccessToken getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public AccessToken parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface InitialOpaqueLoginRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.InitialOpaqueLoginRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * bytes blinded_message = 1; + * + * @return The blindedMessage. + */ + com.google.protobuf.ByteString getBlindedMessage(); + + /** + * bytes client_nonce = 2; + * + * @return The clientNonce. + */ + com.google.protobuf.ByteString getClientNonce(); + + /** + * bytes client_public_keyshare = 3; + * + * @return The clientPublicKeyshare. + */ + com.google.protobuf.ByteString getClientPublicKeyshare(); + } + + /** Protobuf type {@code google.spanner.auth.v1.InitialOpaqueLoginRequest} */ + public static final class InitialOpaqueLoginRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.InitialOpaqueLoginRequest) + InitialOpaqueLoginRequestOrBuilder { + private static final long serialVersionUID = 0L; + + // Use InitialOpaqueLoginRequest.newBuilder() to construct. + private InitialOpaqueLoginRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private InitialOpaqueLoginRequest() { + blindedMessage_ = com.google.protobuf.ByteString.EMPTY; + clientNonce_ = com.google.protobuf.ByteString.EMPTY; + clientPublicKeyshare_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new InitialOpaqueLoginRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder.class); + } + + public static final int BLINDED_MESSAGE_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString blindedMessage_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes blinded_message = 1; + * + * @return The blindedMessage. + */ + @java.lang.Override + public com.google.protobuf.ByteString getBlindedMessage() { + return blindedMessage_; + } + + public static final int CLIENT_NONCE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString clientNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_nonce = 2; + * + * @return The clientNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientNonce() { + return clientNonce_; + } + + public static final int CLIENT_PUBLIC_KEYSHARE_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString clientPublicKeyshare_ = + com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_public_keyshare = 3; + * + * @return The clientPublicKeyshare. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientPublicKeyshare() { + return clientPublicKeyshare_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!blindedMessage_.isEmpty()) { + output.writeBytes(1, blindedMessage_); + } + if (!clientNonce_.isEmpty()) { + output.writeBytes(2, clientNonce_); + } + if (!clientPublicKeyshare_.isEmpty()) { + output.writeBytes(3, clientPublicKeyshare_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!blindedMessage_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, blindedMessage_); + } + if (!clientNonce_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, clientNonce_); + } + if (!clientPublicKeyshare_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(3, clientPublicKeyshare_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest other = + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) obj; + + if (!getBlindedMessage().equals(other.getBlindedMessage())) return false; + if (!getClientNonce().equals(other.getClientNonce())) return false; + if (!getClientPublicKeyshare().equals(other.getClientPublicKeyshare())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + BLINDED_MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getBlindedMessage().hashCode(); + hash = (37 * hash) + CLIENT_NONCE_FIELD_NUMBER; + hash = (53 * hash) + getClientNonce().hashCode(); + hash = (37 * hash) + CLIENT_PUBLIC_KEYSHARE_FIELD_NUMBER; + hash = (53 * hash) + getClientPublicKeyshare().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.InitialOpaqueLoginRequest} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.InitialOpaqueLoginRequest) + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + blindedMessage_ = com.google.protobuf.ByteString.EMPTY; + clientNonce_ = com.google.protobuf.ByteString.EMPTY; + clientPublicKeyshare_ = com.google.protobuf.ByteString.EMPTY; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest build() { + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest buildPartial() { + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest result = + new com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.blindedMessage_ = blindedMessage_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.clientNonce_ = clientNonce_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.clientPublicKeyshare_ = clientPublicKeyshare_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) { + return mergeFrom((com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest other) { + if (other + == com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance()) + return this; + if (other.getBlindedMessage() != com.google.protobuf.ByteString.EMPTY) { + setBlindedMessage(other.getBlindedMessage()); + } + if (other.getClientNonce() != com.google.protobuf.ByteString.EMPTY) { + setClientNonce(other.getClientNonce()); + } + if (other.getClientPublicKeyshare() != com.google.protobuf.ByteString.EMPTY) { + setClientPublicKeyshare(other.getClientPublicKeyshare()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + blindedMessage_ = input.readBytes(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: + { + clientNonce_ = input.readBytes(); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: + { + clientPublicKeyshare_ = input.readBytes(); + bitField0_ |= 0x00000004; + break; + } // case 26 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private com.google.protobuf.ByteString blindedMessage_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes blinded_message = 1; + * + * @return The blindedMessage. + */ + @java.lang.Override + public com.google.protobuf.ByteString getBlindedMessage() { + return blindedMessage_; + } + + /** + * bytes blinded_message = 1; + * + * @param value The blindedMessage to set. + * @return This builder for chaining. + */ + public Builder setBlindedMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + blindedMessage_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * bytes blinded_message = 1; + * + * @return This builder for chaining. + */ + public Builder clearBlindedMessage() { + bitField0_ = (bitField0_ & ~0x00000001); + blindedMessage_ = getDefaultInstance().getBlindedMessage(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString clientNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_nonce = 2; + * + * @return The clientNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientNonce() { + return clientNonce_; + } + + /** + * bytes client_nonce = 2; + * + * @param value The clientNonce to set. + * @return This builder for chaining. + */ + public Builder setClientNonce(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + clientNonce_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * bytes client_nonce = 2; + * + * @return This builder for chaining. + */ + public Builder clearClientNonce() { + bitField0_ = (bitField0_ & ~0x00000002); + clientNonce_ = getDefaultInstance().getClientNonce(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString clientPublicKeyshare_ = + com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_public_keyshare = 3; + * + * @return The clientPublicKeyshare. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientPublicKeyshare() { + return clientPublicKeyshare_; + } + + /** + * bytes client_public_keyshare = 3; + * + * @param value The clientPublicKeyshare to set. + * @return This builder for chaining. + */ + public Builder setClientPublicKeyshare(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + clientPublicKeyshare_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * bytes client_public_keyshare = 3; + * + * @return This builder for chaining. + */ + public Builder clearClientPublicKeyshare() { + bitField0_ = (bitField0_ & ~0x00000004); + clientPublicKeyshare_ = getDefaultInstance().getClientPublicKeyshare(); + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.InitialOpaqueLoginRequest) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.InitialOpaqueLoginRequest) + private static final com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest(); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public InitialOpaqueLoginRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface FinalOpaqueLoginRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.FinalOpaqueLoginRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * bytes client_mac = 1; + * + * @return The clientMac. + */ + com.google.protobuf.ByteString getClientMac(); + } + + /** Protobuf type {@code google.spanner.auth.v1.FinalOpaqueLoginRequest} */ + public static final class FinalOpaqueLoginRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.FinalOpaqueLoginRequest) + FinalOpaqueLoginRequestOrBuilder { + private static final long serialVersionUID = 0L; + + // Use FinalOpaqueLoginRequest.newBuilder() to construct. + private FinalOpaqueLoginRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private FinalOpaqueLoginRequest() { + clientMac_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new FinalOpaqueLoginRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder.class); + } + + public static final int CLIENT_MAC_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString clientMac_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_mac = 1; + * + * @return The clientMac. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientMac() { + return clientMac_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!clientMac_.isEmpty()) { + output.writeBytes(1, clientMac_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!clientMac_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, clientMac_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest other = + (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) obj; + + if (!getClientMac().equals(other.getClientMac())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + CLIENT_MAC_FIELD_NUMBER; + hash = (53 * hash) + getClientMac().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.FinalOpaqueLoginRequest} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.FinalOpaqueLoginRequest) + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + clientMac_ = com.google.protobuf.ByteString.EMPTY; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest build() { + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest buildPartial() { + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest result = + new com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.clientMac_ = clientMac_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) { + return mergeFrom((com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest other) { + if (other + == com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance()) + return this; + if (other.getClientMac() != com.google.protobuf.ByteString.EMPTY) { + setClientMac(other.getClientMac()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + clientMac_ = input.readBytes(); + bitField0_ |= 0x00000001; + break; + } // case 10 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private com.google.protobuf.ByteString clientMac_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes client_mac = 1; + * + * @return The clientMac. + */ + @java.lang.Override + public com.google.protobuf.ByteString getClientMac() { + return clientMac_; + } + + /** + * bytes client_mac = 1; + * + * @param value The clientMac to set. + * @return This builder for chaining. + */ + public Builder setClientMac(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + clientMac_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * bytes client_mac = 1; + * + * @return This builder for chaining. + */ + public Builder clearClientMac() { + bitField0_ = (bitField0_ & ~0x00000001); + clientMac_ = getDefaultInstance().getClientMac(); + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.FinalOpaqueLoginRequest) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.FinalOpaqueLoginRequest) + private static final com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest(); + } + + public static com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FinalOpaqueLoginRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface InitialOpaqueLoginResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.InitialOpaqueLoginResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * bytes server_nonce = 1; + * + * @return The serverNonce. + */ + com.google.protobuf.ByteString getServerNonce(); + + /** + * bytes server_public_keyshare = 2; + * + * @return The serverPublicKeyshare. + */ + com.google.protobuf.ByteString getServerPublicKeyshare(); + + /** + * bytes server_mac = 3; + * + * @return The serverMac. + */ + com.google.protobuf.ByteString getServerMac(); + + /** + * bytes evaluated_message = 4; + * + * @return The evaluatedMessage. + */ + com.google.protobuf.ByteString getEvaluatedMessage(); + + /** + * bytes masking_nonce = 5; + * + * @return The maskingNonce. + */ + com.google.protobuf.ByteString getMaskingNonce(); + + /** + * bytes masked_response = 6; + * + * @return The maskedResponse. + */ + com.google.protobuf.ByteString getMaskedResponse(); + } + + /** Protobuf type {@code google.spanner.auth.v1.InitialOpaqueLoginResponse} */ + public static final class InitialOpaqueLoginResponse + extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.InitialOpaqueLoginResponse) + InitialOpaqueLoginResponseOrBuilder { + private static final long serialVersionUID = 0L; + + // Use InitialOpaqueLoginResponse.newBuilder() to construct. + private InitialOpaqueLoginResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private InitialOpaqueLoginResponse() { + serverNonce_ = com.google.protobuf.ByteString.EMPTY; + serverPublicKeyshare_ = com.google.protobuf.ByteString.EMPTY; + serverMac_ = com.google.protobuf.ByteString.EMPTY; + evaluatedMessage_ = com.google.protobuf.ByteString.EMPTY; + maskingNonce_ = com.google.protobuf.ByteString.EMPTY; + maskedResponse_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new InitialOpaqueLoginResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.class, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder.class); + } + + public static final int SERVER_NONCE_FIELD_NUMBER = 1; + private com.google.protobuf.ByteString serverNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_nonce = 1; + * + * @return The serverNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerNonce() { + return serverNonce_; + } + + public static final int SERVER_PUBLIC_KEYSHARE_FIELD_NUMBER = 2; + private com.google.protobuf.ByteString serverPublicKeyshare_ = + com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_public_keyshare = 2; + * + * @return The serverPublicKeyshare. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerPublicKeyshare() { + return serverPublicKeyshare_; + } + + public static final int SERVER_MAC_FIELD_NUMBER = 3; + private com.google.protobuf.ByteString serverMac_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_mac = 3; + * + * @return The serverMac. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerMac() { + return serverMac_; + } + + public static final int EVALUATED_MESSAGE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString evaluatedMessage_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes evaluated_message = 4; + * + * @return The evaluatedMessage. + */ + @java.lang.Override + public com.google.protobuf.ByteString getEvaluatedMessage() { + return evaluatedMessage_; + } + + public static final int MASKING_NONCE_FIELD_NUMBER = 5; + private com.google.protobuf.ByteString maskingNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes masking_nonce = 5; + * + * @return The maskingNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getMaskingNonce() { + return maskingNonce_; + } + + public static final int MASKED_RESPONSE_FIELD_NUMBER = 6; + private com.google.protobuf.ByteString maskedResponse_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes masked_response = 6; + * + * @return The maskedResponse. + */ + @java.lang.Override + public com.google.protobuf.ByteString getMaskedResponse() { + return maskedResponse_; + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!serverNonce_.isEmpty()) { + output.writeBytes(1, serverNonce_); + } + if (!serverPublicKeyshare_.isEmpty()) { + output.writeBytes(2, serverPublicKeyshare_); + } + if (!serverMac_.isEmpty()) { + output.writeBytes(3, serverMac_); + } + if (!evaluatedMessage_.isEmpty()) { + output.writeBytes(4, evaluatedMessage_); + } + if (!maskingNonce_.isEmpty()) { + output.writeBytes(5, maskingNonce_); + } + if (!maskedResponse_.isEmpty()) { + output.writeBytes(6, maskedResponse_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!serverNonce_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(1, serverNonce_); + } + if (!serverPublicKeyshare_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(2, serverPublicKeyshare_); + } + if (!serverMac_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(3, serverMac_); + } + if (!evaluatedMessage_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(4, evaluatedMessage_); + } + if (!maskingNonce_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(5, maskingNonce_); + } + if (!maskedResponse_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(6, maskedResponse_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse other = + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) obj; + + if (!getServerNonce().equals(other.getServerNonce())) return false; + if (!getServerPublicKeyshare().equals(other.getServerPublicKeyshare())) return false; + if (!getServerMac().equals(other.getServerMac())) return false; + if (!getEvaluatedMessage().equals(other.getEvaluatedMessage())) return false; + if (!getMaskingNonce().equals(other.getMaskingNonce())) return false; + if (!getMaskedResponse().equals(other.getMaskedResponse())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SERVER_NONCE_FIELD_NUMBER; + hash = (53 * hash) + getServerNonce().hashCode(); + hash = (37 * hash) + SERVER_PUBLIC_KEYSHARE_FIELD_NUMBER; + hash = (53 * hash) + getServerPublicKeyshare().hashCode(); + hash = (37 * hash) + SERVER_MAC_FIELD_NUMBER; + hash = (53 * hash) + getServerMac().hashCode(); + hash = (37 * hash) + EVALUATED_MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getEvaluatedMessage().hashCode(); + hash = (37 * hash) + MASKING_NONCE_FIELD_NUMBER; + hash = (53 * hash) + getMaskingNonce().hashCode(); + hash = (37 * hash) + MASKED_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getMaskedResponse().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.InitialOpaqueLoginResponse} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.InitialOpaqueLoginResponse) + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.class, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + serverNonce_ = com.google.protobuf.ByteString.EMPTY; + serverPublicKeyshare_ = com.google.protobuf.ByteString.EMPTY; + serverMac_ = com.google.protobuf.ByteString.EMPTY; + evaluatedMessage_ = com.google.protobuf.ByteString.EMPTY; + maskingNonce_ = com.google.protobuf.ByteString.EMPTY; + maskedResponse_ = com.google.protobuf.ByteString.EMPTY; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse build() { + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse buildPartial() { + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse result = + new com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.serverNonce_ = serverNonce_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.serverPublicKeyshare_ = serverPublicKeyshare_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.serverMac_ = serverMac_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.evaluatedMessage_ = evaluatedMessage_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.maskingNonce_ = maskingNonce_; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.maskedResponse_ = maskedResponse_; + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) { + return mergeFrom((com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse other) { + if (other + == com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.getDefaultInstance()) + return this; + if (other.getServerNonce() != com.google.protobuf.ByteString.EMPTY) { + setServerNonce(other.getServerNonce()); + } + if (other.getServerPublicKeyshare() != com.google.protobuf.ByteString.EMPTY) { + setServerPublicKeyshare(other.getServerPublicKeyshare()); + } + if (other.getServerMac() != com.google.protobuf.ByteString.EMPTY) { + setServerMac(other.getServerMac()); + } + if (other.getEvaluatedMessage() != com.google.protobuf.ByteString.EMPTY) { + setEvaluatedMessage(other.getEvaluatedMessage()); + } + if (other.getMaskingNonce() != com.google.protobuf.ByteString.EMPTY) { + setMaskingNonce(other.getMaskingNonce()); + } + if (other.getMaskedResponse() != com.google.protobuf.ByteString.EMPTY) { + setMaskedResponse(other.getMaskedResponse()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + serverNonce_ = input.readBytes(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 18: + { + serverPublicKeyshare_ = input.readBytes(); + bitField0_ |= 0x00000002; + break; + } // case 18 + case 26: + { + serverMac_ = input.readBytes(); + bitField0_ |= 0x00000004; + break; + } // case 26 + case 34: + { + evaluatedMessage_ = input.readBytes(); + bitField0_ |= 0x00000008; + break; + } // case 34 + case 42: + { + maskingNonce_ = input.readBytes(); + bitField0_ |= 0x00000010; + break; + } // case 42 + case 50: + { + maskedResponse_ = input.readBytes(); + bitField0_ |= 0x00000020; + break; + } // case 50 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int bitField0_; + + private com.google.protobuf.ByteString serverNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_nonce = 1; + * + * @return The serverNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerNonce() { + return serverNonce_; + } + + /** + * bytes server_nonce = 1; + * + * @param value The serverNonce to set. + * @return This builder for chaining. + */ + public Builder setServerNonce(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + serverNonce_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * bytes server_nonce = 1; + * + * @return This builder for chaining. + */ + public Builder clearServerNonce() { + bitField0_ = (bitField0_ & ~0x00000001); + serverNonce_ = getDefaultInstance().getServerNonce(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString serverPublicKeyshare_ = + com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_public_keyshare = 2; + * + * @return The serverPublicKeyshare. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerPublicKeyshare() { + return serverPublicKeyshare_; + } + + /** + * bytes server_public_keyshare = 2; + * + * @param value The serverPublicKeyshare to set. + * @return This builder for chaining. + */ + public Builder setServerPublicKeyshare(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + serverPublicKeyshare_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * bytes server_public_keyshare = 2; + * + * @return This builder for chaining. + */ + public Builder clearServerPublicKeyshare() { + bitField0_ = (bitField0_ & ~0x00000002); + serverPublicKeyshare_ = getDefaultInstance().getServerPublicKeyshare(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString serverMac_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes server_mac = 3; + * + * @return The serverMac. + */ + @java.lang.Override + public com.google.protobuf.ByteString getServerMac() { + return serverMac_; + } + + /** + * bytes server_mac = 3; + * + * @param value The serverMac to set. + * @return This builder for chaining. + */ + public Builder setServerMac(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + serverMac_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * bytes server_mac = 3; + * + * @return This builder for chaining. + */ + public Builder clearServerMac() { + bitField0_ = (bitField0_ & ~0x00000004); + serverMac_ = getDefaultInstance().getServerMac(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString evaluatedMessage_ = + com.google.protobuf.ByteString.EMPTY; + + /** + * bytes evaluated_message = 4; + * + * @return The evaluatedMessage. + */ + @java.lang.Override + public com.google.protobuf.ByteString getEvaluatedMessage() { + return evaluatedMessage_; + } + + /** + * bytes evaluated_message = 4; + * + * @param value The evaluatedMessage to set. + * @return This builder for chaining. + */ + public Builder setEvaluatedMessage(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + evaluatedMessage_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + /** + * bytes evaluated_message = 4; + * + * @return This builder for chaining. + */ + public Builder clearEvaluatedMessage() { + bitField0_ = (bitField0_ & ~0x00000008); + evaluatedMessage_ = getDefaultInstance().getEvaluatedMessage(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString maskingNonce_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes masking_nonce = 5; + * + * @return The maskingNonce. + */ + @java.lang.Override + public com.google.protobuf.ByteString getMaskingNonce() { + return maskingNonce_; + } + + /** + * bytes masking_nonce = 5; + * + * @param value The maskingNonce to set. + * @return This builder for chaining. + */ + public Builder setMaskingNonce(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + maskingNonce_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * bytes masking_nonce = 5; + * + * @return This builder for chaining. + */ + public Builder clearMaskingNonce() { + bitField0_ = (bitField0_ & ~0x00000010); + maskingNonce_ = getDefaultInstance().getMaskingNonce(); + onChanged(); + return this; + } + + private com.google.protobuf.ByteString maskedResponse_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes masked_response = 6; + * + * @return The maskedResponse. + */ + @java.lang.Override + public com.google.protobuf.ByteString getMaskedResponse() { + return maskedResponse_; + } + + /** + * bytes masked_response = 6; + * + * @param value The maskedResponse to set. + * @return This builder for chaining. + */ + public Builder setMaskedResponse(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + maskedResponse_ = value; + bitField0_ |= 0x00000020; + onChanged(); + return this; + } + + /** + * bytes masked_response = 6; + * + * @return This builder for chaining. + */ + public Builder clearMaskedResponse() { + bitField0_ = (bitField0_ & ~0x00000020); + maskedResponse_ = getDefaultInstance().getMaskedResponse(); + onChanged(); + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.InitialOpaqueLoginResponse) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.InitialOpaqueLoginResponse) + private static final com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse(); + } + + public static com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public InitialOpaqueLoginResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpaqueLoginRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.OpaqueLoginRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return Whether the initialRequest field is set. + */ + boolean hasInitialRequest(); + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return The initialRequest. + */ + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest getInitialRequest(); + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder + getInitialRequestOrBuilder(); + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return Whether the finalRequest field is set. + */ + boolean hasFinalRequest(); + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return The finalRequest. + */ + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest getFinalRequest(); + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder getFinalRequestOrBuilder(); + + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.RequestCase getRequestCase(); + } + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginRequest} */ + public static final class OpaqueLoginRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.OpaqueLoginRequest) + OpaqueLoginRequestOrBuilder { + private static final long serialVersionUID = 0L; + + // Use OpaqueLoginRequest.newBuilder() to construct. + private OpaqueLoginRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpaqueLoginRequest() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpaqueLoginRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder.class); + } + + private int requestCase_ = 0; + private java.lang.Object request_; + + public enum RequestCase + implements + com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + INITIAL_REQUEST(1), + FINAL_REQUEST(2), + REQUEST_NOT_SET(0); + private final int value; + + private RequestCase(int value) { + this.value = value; + } + + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static RequestCase valueOf(int value) { + return forNumber(value); + } + + public static RequestCase forNumber(int value) { + switch (value) { + case 1: + return INITIAL_REQUEST; + case 2: + return FINAL_REQUEST; + case 0: + return REQUEST_NOT_SET; + default: + return null; + } + } + + public int getNumber() { + return this.value; + } + }; + + public RequestCase getRequestCase() { + return RequestCase.forNumber(requestCase_); + } + + public static final int INITIAL_REQUEST_FIELD_NUMBER = 1; + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return Whether the initialRequest field is set. + */ + @java.lang.Override + public boolean hasInitialRequest() { + return requestCase_ == 1; + } + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return The initialRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest getInitialRequest() { + if (requestCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder + getInitialRequestOrBuilder() { + if (requestCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + + public static final int FINAL_REQUEST_FIELD_NUMBER = 2; + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return Whether the finalRequest field is set. + */ + @java.lang.Override + public boolean hasFinalRequest() { + return requestCase_ == 2; + } + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return The finalRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest getFinalRequest() { + if (requestCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder + getFinalRequestOrBuilder() { + if (requestCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (requestCase_ == 1) { + output.writeMessage( + 1, (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_); + } + if (requestCase_ == 2) { + output.writeMessage( + 2, (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (requestCase_ == 1) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 1, (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_); + } + if (requestCase_ == 2) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 2, (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginRequest)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest other = + (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) obj; + + if (!getRequestCase().equals(other.getRequestCase())) return false; + switch (requestCase_) { + case 1: + if (!getInitialRequest().equals(other.getInitialRequest())) return false; + break; + case 2: + if (!getFinalRequest().equals(other.getFinalRequest())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + switch (requestCase_) { + case 1: + hash = (37 * hash) + INITIAL_REQUEST_FIELD_NUMBER; + hash = (53 * hash) + getInitialRequest().hashCode(); + break; + case 2: + hash = (37 * hash) + FINAL_REQUEST_FIELD_NUMBER; + hash = (53 * hash) + getFinalRequest().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginRequest} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.OpaqueLoginRequest) + com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (initialRequestBuilder_ != null) { + initialRequestBuilder_.clear(); + } + if (finalRequestBuilder_ != null) { + finalRequestBuilder_.clear(); + } + requestCase_ = 0; + request_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest build() { + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest buildPartial() { + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest result = + new com.google.cloud.spanner.omni.Login.OpaqueLoginRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + buildPartialOneofs(result); + onBuilt(); + return result; + } + + private void buildPartial0(com.google.cloud.spanner.omni.Login.OpaqueLoginRequest result) { + int from_bitField0_ = bitField0_; + } + + private void buildPartialOneofs( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest result) { + result.requestCase_ = requestCase_; + result.request_ = this.request_; + if (requestCase_ == 1 && initialRequestBuilder_ != null) { + result.request_ = initialRequestBuilder_.build(); + } + if (requestCase_ == 2 && finalRequestBuilder_ != null) { + result.request_ = finalRequestBuilder_.build(); + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) { + return mergeFrom((com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.OpaqueLoginRequest other) { + if (other == com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance()) + return this; + switch (other.getRequestCase()) { + case INITIAL_REQUEST: + { + mergeInitialRequest(other.getInitialRequest()); + break; + } + case FINAL_REQUEST: + { + mergeFinalRequest(other.getFinalRequest()); + break; + } + case REQUEST_NOT_SET: + { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage( + getInitialRequestFieldBuilder().getBuilder(), extensionRegistry); + requestCase_ = 1; + break; + } // case 10 + case 18: + { + input.readMessage(getFinalRequestFieldBuilder().getBuilder(), extensionRegistry); + requestCase_ = 2; + break; + } // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int requestCase_ = 0; + private java.lang.Object request_; + + public RequestCase getRequestCase() { + return RequestCase.forNumber(requestCase_); + } + + public Builder clearRequest() { + requestCase_ = 0; + request_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder> + initialRequestBuilder_; + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return Whether the initialRequest field is set. + */ + @java.lang.Override + public boolean hasInitialRequest() { + return requestCase_ == 1; + } + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; + * + * @return The initialRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest getInitialRequest() { + if (initialRequestBuilder_ == null) { + if (requestCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } else { + if (requestCase_ == 1) { + return initialRequestBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + public Builder setInitialRequest( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest value) { + if (initialRequestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + initialRequestBuilder_.setMessage(value); + } + requestCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + public Builder setInitialRequest( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder builderForValue) { + if (initialRequestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + initialRequestBuilder_.setMessage(builderForValue.build()); + } + requestCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + public Builder mergeInitialRequest( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest value) { + if (initialRequestBuilder_ == null) { + if (requestCase_ == 1 + && request_ + != com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest + .getDefaultInstance()) { + request_ = + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.newBuilder( + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_) + .mergeFrom(value) + .buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + if (requestCase_ == 1) { + initialRequestBuilder_.mergeFrom(value); + } else { + initialRequestBuilder_.setMessage(value); + } + } + requestCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + public Builder clearInitialRequest() { + if (initialRequestBuilder_ == null) { + if (requestCase_ == 1) { + requestCase_ = 0; + request_ = null; + onChanged(); + } + } else { + if (requestCase_ == 1) { + requestCase_ = 0; + request_ = null; + } + initialRequestBuilder_.clear(); + } + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder + getInitialRequestBuilder() { + return getInitialRequestFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder + getInitialRequestOrBuilder() { + if ((requestCase_ == 1) && (initialRequestBuilder_ != null)) { + return initialRequestBuilder_.getMessageOrBuilder(); + } else { + if (requestCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginRequest initial_request = 1; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder> + getInitialRequestFieldBuilder() { + if (initialRequestBuilder_ == null) { + if (!(requestCase_ == 1)) { + request_ = + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.getDefaultInstance(); + } + initialRequestBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequestOrBuilder>( + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginRequest) request_, + getParentForChildren(), + isClean()); + request_ = null; + } + requestCase_ = 1; + onChanged(); + return initialRequestBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder> + finalRequestBuilder_; + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return Whether the finalRequest field is set. + */ + @java.lang.Override + public boolean hasFinalRequest() { + return requestCase_ == 2; + } + + /** + * .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; + * + * @return The finalRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest getFinalRequest() { + if (finalRequestBuilder_ == null) { + if (requestCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } else { + if (requestCase_ == 2) { + return finalRequestBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + public Builder setFinalRequest( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest value) { + if (finalRequestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + finalRequestBuilder_.setMessage(value); + } + requestCase_ = 2; + return this; + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + public Builder setFinalRequest( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder builderForValue) { + if (finalRequestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + finalRequestBuilder_.setMessage(builderForValue.build()); + } + requestCase_ = 2; + return this; + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + public Builder mergeFinalRequest( + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest value) { + if (finalRequestBuilder_ == null) { + if (requestCase_ == 2 + && request_ + != com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest + .getDefaultInstance()) { + request_ = + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.newBuilder( + (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_) + .mergeFrom(value) + .buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + if (requestCase_ == 2) { + finalRequestBuilder_.mergeFrom(value); + } else { + finalRequestBuilder_.setMessage(value); + } + } + requestCase_ = 2; + return this; + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + public Builder clearFinalRequest() { + if (finalRequestBuilder_ == null) { + if (requestCase_ == 2) { + requestCase_ = 0; + request_ = null; + onChanged(); + } + } else { + if (requestCase_ == 2) { + requestCase_ = 0; + request_ = null; + } + finalRequestBuilder_.clear(); + } + return this; + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder + getFinalRequestBuilder() { + return getFinalRequestFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder + getFinalRequestOrBuilder() { + if ((requestCase_ == 2) && (finalRequestBuilder_ != null)) { + return finalRequestBuilder_.getMessageOrBuilder(); + } else { + if (requestCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.FinalOpaqueLoginRequest final_request = 2; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder> + getFinalRequestFieldBuilder() { + if (finalRequestBuilder_ == null) { + if (!(requestCase_ == 2)) { + request_ = + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.getDefaultInstance(); + } + finalRequestBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequestOrBuilder>( + (com.google.cloud.spanner.omni.Login.FinalOpaqueLoginRequest) request_, + getParentForChildren(), + isClean()); + request_ = null; + } + requestCase_ = 2; + onChanged(); + return finalRequestBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.OpaqueLoginRequest) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.OpaqueLoginRequest) + private static final com.google.cloud.spanner.omni.Login.OpaqueLoginRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.OpaqueLoginRequest(); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public OpaqueLoginRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface OpaqueLoginResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.OpaqueLoginResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return Whether the initialResponse field is set. + */ + boolean hasInitialResponse(); + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return The initialResponse. + */ + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse getInitialResponse(); + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder + getInitialResponseOrBuilder(); + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return Whether the finalResponse field is set. + */ + boolean hasFinalResponse(); + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return The finalResponse. + */ + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse getFinalResponse(); + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder + getFinalResponseOrBuilder(); + + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.ResponseCase getResponseCase(); + } + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginResponse} */ + public static final class OpaqueLoginResponse extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.OpaqueLoginResponse) + OpaqueLoginResponseOrBuilder { + private static final long serialVersionUID = 0L; + + // Use OpaqueLoginResponse.newBuilder() to construct. + private OpaqueLoginResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private OpaqueLoginResponse() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new OpaqueLoginResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder.class); + } + + public interface FinalResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse) + com.google.protobuf.MessageOrBuilder {} + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse} */ + public static final class FinalResponse extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse) + FinalResponseOrBuilder { + private static final long serialVersionUID = 0L; + + // Use FinalResponse.newBuilder() to construct. + private FinalResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private FinalResponse() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new FinalResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder + .class); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj + instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse other = + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) obj; + + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + parseDelimitedFrom(java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse) + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder + .class); + } + + // Construct using + // com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse build() { + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse result = + buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + buildPartial() { + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse result = + new com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse(this); + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other + instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) { + return mergeFrom( + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse other) { + if (other + == com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance()) return this; + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse) + private static final com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = + new com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse(); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public FinalResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private int responseCase_ = 0; + private java.lang.Object response_; + + public enum ResponseCase + implements + com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + INITIAL_RESPONSE(1), + FINAL_RESPONSE(2), + RESPONSE_NOT_SET(0); + private final int value; + + private ResponseCase(int value) { + this.value = value; + } + + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ResponseCase valueOf(int value) { + return forNumber(value); + } + + public static ResponseCase forNumber(int value) { + switch (value) { + case 1: + return INITIAL_RESPONSE; + case 2: + return FINAL_RESPONSE; + case 0: + return RESPONSE_NOT_SET; + default: + return null; + } + } + + public int getNumber() { + return this.value; + } + }; + + public ResponseCase getResponseCase() { + return ResponseCase.forNumber(responseCase_); + } + + public static final int INITIAL_RESPONSE_FIELD_NUMBER = 1; + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return Whether the initialResponse field is set. + */ + @java.lang.Override + public boolean hasInitialResponse() { + return responseCase_ == 1; + } + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return The initialResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse getInitialResponse() { + if (responseCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.getDefaultInstance(); + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder + getInitialResponseOrBuilder() { + if (responseCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.getDefaultInstance(); + } + + public static final int FINAL_RESPONSE_FIELD_NUMBER = 2; + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return Whether the finalResponse field is set. + */ + @java.lang.Override + public boolean hasFinalResponse() { + return responseCase_ == 2; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return The finalResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + getFinalResponse() { + if (responseCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder + getFinalResponseOrBuilder() { + if (responseCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (responseCase_ == 1) { + output.writeMessage( + 1, (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_); + } + if (responseCase_ == 2) { + output.writeMessage( + 2, (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) response_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (responseCase_ == 1) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 1, (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_); + } + if (responseCase_ == 2) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 2, + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) response_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginResponse)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse other = + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) obj; + + if (!getResponseCase().equals(other.getResponseCase())) return false; + switch (responseCase_) { + case 1: + if (!getInitialResponse().equals(other.getInitialResponse())) return false; + break; + case 2: + if (!getFinalResponse().equals(other.getFinalResponse())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + switch (responseCase_) { + case 1: + hash = (37 * hash) + INITIAL_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getInitialResponse().hashCode(); + break; + case 2: + hash = (37 * hash) + FINAL_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getFinalResponse().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.OpaqueLoginResponse} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.OpaqueLoginResponse) + com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.class, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (initialResponseBuilder_ != null) { + initialResponseBuilder_.clear(); + } + if (finalResponseBuilder_ != null) { + finalResponseBuilder_.clear(); + } + responseCase_ = 0; + response_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse build() { + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse buildPartial() { + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse result = + new com.google.cloud.spanner.omni.Login.OpaqueLoginResponse(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + buildPartialOneofs(result); + onBuilt(); + return result; + } + + private void buildPartial0(com.google.cloud.spanner.omni.Login.OpaqueLoginResponse result) { + int from_bitField0_ = bitField0_; + } + + private void buildPartialOneofs( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse result) { + result.responseCase_ = responseCase_; + result.response_ = this.response_; + if (responseCase_ == 1 && initialResponseBuilder_ != null) { + result.response_ = initialResponseBuilder_.build(); + } + if (responseCase_ == 2 && finalResponseBuilder_ != null) { + result.response_ = finalResponseBuilder_.build(); + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) { + return mergeFrom((com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.OpaqueLoginResponse other) { + if (other == com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance()) + return this; + switch (other.getResponseCase()) { + case INITIAL_RESPONSE: + { + mergeInitialResponse(other.getInitialResponse()); + break; + } + case FINAL_RESPONSE: + { + mergeFinalResponse(other.getFinalResponse()); + break; + } + case RESPONSE_NOT_SET: + { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage( + getInitialResponseFieldBuilder().getBuilder(), extensionRegistry); + responseCase_ = 1; + break; + } // case 10 + case 18: + { + input.readMessage(getFinalResponseFieldBuilder().getBuilder(), extensionRegistry); + responseCase_ = 2; + break; + } // case 18 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int responseCase_ = 0; + private java.lang.Object response_; + + public ResponseCase getResponseCase() { + return ResponseCase.forNumber(responseCase_); + } + + public Builder clearResponse() { + responseCase_ = 0; + response_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder> + initialResponseBuilder_; + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return Whether the initialResponse field is set. + */ + @java.lang.Override + public boolean hasInitialResponse() { + return responseCase_ == 1; + } + + /** + * .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; + * + * @return The initialResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse getInitialResponse() { + if (initialResponseBuilder_ == null) { + if (responseCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + .getDefaultInstance(); + } else { + if (responseCase_ == 1) { + return initialResponseBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + .getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + public Builder setInitialResponse( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse value) { + if (initialResponseBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + response_ = value; + onChanged(); + } else { + initialResponseBuilder_.setMessage(value); + } + responseCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + public Builder setInitialResponse( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder builderForValue) { + if (initialResponseBuilder_ == null) { + response_ = builderForValue.build(); + onChanged(); + } else { + initialResponseBuilder_.setMessage(builderForValue.build()); + } + responseCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + public Builder mergeInitialResponse( + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse value) { + if (initialResponseBuilder_ == null) { + if (responseCase_ == 1 + && response_ + != com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + .getDefaultInstance()) { + response_ = + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.newBuilder( + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_) + .mergeFrom(value) + .buildPartial(); + } else { + response_ = value; + } + onChanged(); + } else { + if (responseCase_ == 1) { + initialResponseBuilder_.mergeFrom(value); + } else { + initialResponseBuilder_.setMessage(value); + } + } + responseCase_ = 1; + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + public Builder clearInitialResponse() { + if (initialResponseBuilder_ == null) { + if (responseCase_ == 1) { + responseCase_ = 0; + response_ = null; + onChanged(); + } + } else { + if (responseCase_ == 1) { + responseCase_ = 0; + response_ = null; + } + initialResponseBuilder_.clear(); + } + return this; + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder + getInitialResponseBuilder() { + return getInitialResponseFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder + getInitialResponseOrBuilder() { + if ((responseCase_ == 1) && (initialResponseBuilder_ != null)) { + return initialResponseBuilder_.getMessageOrBuilder(); + } else { + if (responseCase_ == 1) { + return (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse + .getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.InitialOpaqueLoginResponse initial_response = 1; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder> + getInitialResponseFieldBuilder() { + if (initialResponseBuilder_ == null) { + if (!(responseCase_ == 1)) { + response_ = + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.getDefaultInstance(); + } + initialResponseBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponseOrBuilder>( + (com.google.cloud.spanner.omni.Login.InitialOpaqueLoginResponse) response_, + getParentForChildren(), + isClean()); + response_ = null; + } + responseCase_ = 1; + onChanged(); + return initialResponseBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder> + finalResponseBuilder_; + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return Whether the finalResponse field is set. + */ + @java.lang.Override + public boolean hasFinalResponse() { + return responseCase_ == 2; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + * + * @return The finalResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + getFinalResponse() { + if (finalResponseBuilder_ == null) { + if (responseCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) + response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } else { + if (responseCase_ == 2) { + return finalResponseBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + public Builder setFinalResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse value) { + if (finalResponseBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + response_ = value; + onChanged(); + } else { + finalResponseBuilder_.setMessage(value); + } + responseCase_ = 2; + return this; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + public Builder setFinalResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder + builderForValue) { + if (finalResponseBuilder_ == null) { + response_ = builderForValue.build(); + onChanged(); + } else { + finalResponseBuilder_.setMessage(builderForValue.build()); + } + responseCase_ = 2; + return this; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + public Builder mergeFinalResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse value) { + if (finalResponseBuilder_ == null) { + if (responseCase_ == 2 + && response_ + != com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance()) { + response_ = + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.newBuilder( + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) + response_) + .mergeFrom(value) + .buildPartial(); + } else { + response_ = value; + } + onChanged(); + } else { + if (responseCase_ == 2) { + finalResponseBuilder_.mergeFrom(value); + } else { + finalResponseBuilder_.setMessage(value); + } + } + responseCase_ = 2; + return this; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + public Builder clearFinalResponse() { + if (finalResponseBuilder_ == null) { + if (responseCase_ == 2) { + responseCase_ = 0; + response_ = null; + onChanged(); + } + } else { + if (responseCase_ == 2) { + responseCase_ = 0; + response_ = null; + } + finalResponseBuilder_.clear(); + } + return this; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder + getFinalResponseBuilder() { + return getFinalResponseFieldBuilder().getBuilder(); + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder + getFinalResponseOrBuilder() { + if ((responseCase_ == 2) && (finalResponseBuilder_ != null)) { + return finalResponseBuilder_.getMessageOrBuilder(); + } else { + if (responseCase_ == 2) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) + response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse.FinalResponse final_response = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder> + getFinalResponseFieldBuilder() { + if (finalResponseBuilder_ == null) { + if (!(responseCase_ == 2)) { + response_ = + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse + .getDefaultInstance(); + } + finalResponseBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponseOrBuilder>( + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.FinalResponse) response_, + getParentForChildren(), + isClean()); + response_ = null; + } + responseCase_ = 2; + onChanged(); + return finalResponseBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.OpaqueLoginResponse) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.OpaqueLoginResponse) + private static final com.google.cloud.spanner.omni.Login.OpaqueLoginResponse DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.OpaqueLoginResponse(); + } + + public static com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public OpaqueLoginResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface LoginRequestOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.LoginRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * string username = 1; + * + * @return The username. + */ + java.lang.String getUsername(); + + /** + * string username = 1; + * + * @return The bytes for username. + */ + com.google.protobuf.ByteString getUsernameBytes(); + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return Whether the opaqueRequest field is set. + */ + boolean hasOpaqueRequest(); + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return The opaqueRequest. + */ + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getOpaqueRequest(); + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder getOpaqueRequestOrBuilder(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return Whether the handshakeRequest field is set. + */ + boolean hasHandshakeRequest(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return The handshakeRequest. + */ + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + getHandshakeRequest(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequestOrBuilder + getHandshakeRequestOrBuilder(); + + public com.google.cloud.spanner.omni.Login.LoginRequest.RequestCase getRequestCase(); + } + + /** Protobuf type {@code google.spanner.auth.v1.LoginRequest} */ + public static final class LoginRequest extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.LoginRequest) + LoginRequestOrBuilder { + private static final long serialVersionUID = 0L; + + // Use LoginRequest.newBuilder() to construct. + private LoginRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private LoginRequest() { + username_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new LoginRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.LoginRequest.class, + com.google.cloud.spanner.omni.Login.LoginRequest.Builder.class); + } + + private int requestCase_ = 0; + private java.lang.Object request_; + + public enum RequestCase + implements + com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + OPAQUE_REQUEST(4), + HANDSHAKE_REQUEST(5), + REQUEST_NOT_SET(0); + private final int value; + + private RequestCase(int value) { + this.value = value; + } + + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static RequestCase valueOf(int value) { + return forNumber(value); + } + + public static RequestCase forNumber(int value) { + switch (value) { + case 4: + return OPAQUE_REQUEST; + case 5: + return HANDSHAKE_REQUEST; + case 0: + return REQUEST_NOT_SET; + default: + return null; + } + } + + public int getNumber() { + return this.value; + } + }; + + public RequestCase getRequestCase() { + return RequestCase.forNumber(requestCase_); + } + + public static final int USERNAME_FIELD_NUMBER = 1; + + @SuppressWarnings("serial") + private volatile java.lang.Object username_ = ""; + + /** + * string username = 1; + * + * @return The username. + */ + @java.lang.Override + public java.lang.String getUsername() { + java.lang.Object ref = username_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + username_ = s; + return s; + } + } + + /** + * string username = 1; + * + * @return The bytes for username. + */ + @java.lang.Override + public com.google.protobuf.ByteString getUsernameBytes() { + java.lang.Object ref = username_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + username_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int OPAQUE_REQUEST_FIELD_NUMBER = 4; + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return Whether the opaqueRequest field is set. + */ + @java.lang.Override + public boolean hasOpaqueRequest() { + return requestCase_ == 4; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return The opaqueRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getOpaqueRequest() { + if (requestCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder + getOpaqueRequestOrBuilder() { + if (requestCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + + public static final int HANDSHAKE_REQUEST_FIELD_NUMBER = 5; + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return Whether the handshakeRequest field is set. + */ + @java.lang.Override + public boolean hasHandshakeRequest() { + return requestCase_ == 5; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return The handshakeRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + getHandshakeRequest() { + if (requestCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) + request_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder + getHandshakeRequestOrBuilder() { + if (requestCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) + request_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(username_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, username_); + } + if (requestCase_ == 4) { + output.writeMessage(4, (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_); + } + if (requestCase_ == 5) { + output.writeMessage( + 5, + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest) + request_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(username_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, username_); + } + if (requestCase_ == 4) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 4, (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_); + } + if (requestCase_ == 5) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 5, + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest) + request_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.LoginRequest)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.LoginRequest other = + (com.google.cloud.spanner.omni.Login.LoginRequest) obj; + + if (!getUsername().equals(other.getUsername())) return false; + if (!getRequestCase().equals(other.getRequestCase())) return false; + switch (requestCase_) { + case 4: + if (!getOpaqueRequest().equals(other.getOpaqueRequest())) return false; + break; + case 5: + if (!getHandshakeRequest().equals(other.getHandshakeRequest())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + USERNAME_FIELD_NUMBER; + hash = (53 * hash) + getUsername().hashCode(); + switch (requestCase_) { + case 4: + hash = (37 * hash) + OPAQUE_REQUEST_FIELD_NUMBER; + hash = (53 * hash) + getOpaqueRequest().hashCode(); + break; + case 5: + hash = (37 * hash) + HANDSHAKE_REQUEST_FIELD_NUMBER; + hash = (53 * hash) + getHandshakeRequest().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.cloud.spanner.omni.Login.LoginRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.LoginRequest} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.LoginRequest) + com.google.cloud.spanner.omni.Login.LoginRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.LoginRequest.class, + com.google.cloud.spanner.omni.Login.LoginRequest.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.LoginRequest.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + username_ = ""; + if (opaqueRequestBuilder_ != null) { + opaqueRequestBuilder_.clear(); + } + if (handshakeRequestBuilder_ != null) { + handshakeRequestBuilder_.clear(); + } + requestCase_ = 0; + request_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginRequest_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginRequest getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.LoginRequest.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginRequest build() { + com.google.cloud.spanner.omni.Login.LoginRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginRequest buildPartial() { + com.google.cloud.spanner.omni.Login.LoginRequest result = + new com.google.cloud.spanner.omni.Login.LoginRequest(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + buildPartialOneofs(result); + onBuilt(); + return result; + } + + private void buildPartial0(com.google.cloud.spanner.omni.Login.LoginRequest result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.username_ = username_; + } + } + + private void buildPartialOneofs(com.google.cloud.spanner.omni.Login.LoginRequest result) { + result.requestCase_ = requestCase_; + result.request_ = this.request_; + if (requestCase_ == 4 && opaqueRequestBuilder_ != null) { + result.request_ = opaqueRequestBuilder_.build(); + } + if (requestCase_ == 5 && handshakeRequestBuilder_ != null) { + result.request_ = handshakeRequestBuilder_.build(); + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.LoginRequest) { + return mergeFrom((com.google.cloud.spanner.omni.Login.LoginRequest) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.LoginRequest other) { + if (other == com.google.cloud.spanner.omni.Login.LoginRequest.getDefaultInstance()) + return this; + if (!other.getUsername().isEmpty()) { + username_ = other.username_; + bitField0_ |= 0x00000001; + onChanged(); + } + switch (other.getRequestCase()) { + case OPAQUE_REQUEST: + { + mergeOpaqueRequest(other.getOpaqueRequest()); + break; + } + case HANDSHAKE_REQUEST: + { + mergeHandshakeRequest(other.getHandshakeRequest()); + break; + } + case REQUEST_NOT_SET: + { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + username_ = input.readStringRequireUtf8(); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 34: + { + input.readMessage(getOpaqueRequestFieldBuilder().getBuilder(), extensionRegistry); + requestCase_ = 4; + break; + } // case 34 + case 42: + { + input.readMessage( + getHandshakeRequestFieldBuilder().getBuilder(), extensionRegistry); + requestCase_ = 5; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int requestCase_ = 0; + private java.lang.Object request_; + + public RequestCase getRequestCase() { + return RequestCase.forNumber(requestCase_); + } + + public Builder clearRequest() { + requestCase_ = 0; + request_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + private java.lang.Object username_ = ""; + + /** + * string username = 1; + * + * @return The username. + */ + public java.lang.String getUsername() { + java.lang.Object ref = username_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + username_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + + /** + * string username = 1; + * + * @return The bytes for username. + */ + public com.google.protobuf.ByteString getUsernameBytes() { + java.lang.Object ref = username_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8((java.lang.String) ref); + username_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + /** + * string username = 1; + * + * @param value The username to set. + * @return This builder for chaining. + */ + public Builder setUsername(java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + username_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * string username = 1; + * + * @return This builder for chaining. + */ + public Builder clearUsername() { + username_ = getDefaultInstance().getUsername(); + bitField0_ = (bitField0_ & ~0x00000001); + onChanged(); + return this; + } + + /** + * string username = 1; + * + * @param value The bytes for username to set. + * @return This builder for chaining. + */ + public Builder setUsernameBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + username_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder> + opaqueRequestBuilder_; + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return Whether the opaqueRequest field is set. + */ + @java.lang.Override + public boolean hasOpaqueRequest() { + return requestCase_ == 4; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; + * + * @return The opaqueRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest getOpaqueRequest() { + if (opaqueRequestBuilder_ == null) { + if (requestCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } else { + if (requestCase_ == 4) { + return opaqueRequestBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + public Builder setOpaqueRequest( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest value) { + if (opaqueRequestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + opaqueRequestBuilder_.setMessage(value); + } + requestCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + public Builder setOpaqueRequest( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder builderForValue) { + if (opaqueRequestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + opaqueRequestBuilder_.setMessage(builderForValue.build()); + } + requestCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + public Builder mergeOpaqueRequest( + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest value) { + if (opaqueRequestBuilder_ == null) { + if (requestCase_ == 4 + && request_ + != com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance()) { + request_ = + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.newBuilder( + (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_) + .mergeFrom(value) + .buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + if (requestCase_ == 4) { + opaqueRequestBuilder_.mergeFrom(value); + } else { + opaqueRequestBuilder_.setMessage(value); + } + } + requestCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + public Builder clearOpaqueRequest() { + if (opaqueRequestBuilder_ == null) { + if (requestCase_ == 4) { + requestCase_ = 0; + request_ = null; + onChanged(); + } + } else { + if (requestCase_ == 4) { + requestCase_ = 0; + request_ = null; + } + opaqueRequestBuilder_.clear(); + } + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder + getOpaqueRequestBuilder() { + return getOpaqueRequestFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder + getOpaqueRequestOrBuilder() { + if ((requestCase_ == 4) && (opaqueRequestBuilder_ != null)) { + return opaqueRequestBuilder_.getMessageOrBuilder(); + } else { + if (requestCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.OpaqueLoginRequest opaque_request = 4; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder> + getOpaqueRequestFieldBuilder() { + if (opaqueRequestBuilder_ == null) { + if (!(requestCase_ == 4)) { + request_ = com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.getDefaultInstance(); + } + opaqueRequestBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequest.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginRequestOrBuilder>( + (com.google.cloud.spanner.omni.Login.OpaqueLoginRequest) request_, + getParentForChildren(), + isClean()); + request_ = null; + } + requestCase_ = 4; + onChanged(); + return opaqueRequestBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder> + handshakeRequestBuilder_; + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return Whether the handshakeRequest field is set. + */ + @java.lang.Override + public boolean hasHandshakeRequest() { + return requestCase_ == 5; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + * + * @return The handshakeRequest. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + getHandshakeRequest() { + if (handshakeRequestBuilder_ == null) { + if (requestCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest) + request_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } else { + if (requestCase_ == 5) { + return handshakeRequestBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + public Builder setHandshakeRequest( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + value) { + if (handshakeRequestBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + request_ = value; + onChanged(); + } else { + handshakeRequestBuilder_.setMessage(value); + } + requestCase_ = 5; + return this; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + public Builder setHandshakeRequest( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder + builderForValue) { + if (handshakeRequestBuilder_ == null) { + request_ = builderForValue.build(); + onChanged(); + } else { + handshakeRequestBuilder_.setMessage(builderForValue.build()); + } + requestCase_ = 5; + return this; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + public Builder mergeHandshakeRequest( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + value) { + if (handshakeRequestBuilder_ == null) { + if (requestCase_ == 5 + && request_ + != com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest.getDefaultInstance()) { + request_ = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .newBuilder( + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest) + request_) + .mergeFrom(value) + .buildPartial(); + } else { + request_ = value; + } + onChanged(); + } else { + if (requestCase_ == 5) { + handshakeRequestBuilder_.mergeFrom(value); + } else { + handshakeRequestBuilder_.setMessage(value); + } + } + requestCase_ = 5; + return this; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + public Builder clearHandshakeRequest() { + if (handshakeRequestBuilder_ == null) { + if (requestCase_ == 5) { + requestCase_ = 0; + request_ = null; + onChanged(); + } + } else { + if (requestCase_ == 5) { + requestCase_ = 0; + request_ = null; + } + handshakeRequestBuilder_.clear(); + } + return this; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder + getHandshakeRequestBuilder() { + return getHandshakeRequestFieldBuilder().getBuilder(); + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder + getHandshakeRequestOrBuilder() { + if ((requestCase_ == 5) && (handshakeRequestBuilder_ != null)) { + return handshakeRequestBuilder_.getMessageOrBuilder(); + } else { + if (requestCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest) + request_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeRequest handshake_request = 5; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder> + getHandshakeRequestFieldBuilder() { + if (handshakeRequestBuilder_ == null) { + if (!(requestCase_ == 5)) { + request_ = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest + .getDefaultInstance(); + } + handshakeRequestBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest.Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequestOrBuilder>( + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeRequest) + request_, + getParentForChildren(), + isClean()); + request_ = null; + } + requestCase_ = 5; + onChanged(); + return handshakeRequestBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.LoginRequest) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.LoginRequest) + private static final com.google.cloud.spanner.omni.Login.LoginRequest DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.LoginRequest(); + } + + public static com.google.cloud.spanner.omni.Login.LoginRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public LoginRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + public interface LoginResponseOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.LoginResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return Whether the accessToken field is set. + */ + boolean hasAccessToken(); + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return The accessToken. + */ + com.google.cloud.spanner.omni.Login.AccessToken getAccessToken(); + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder getAccessTokenOrBuilder(); + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return Whether the opaqueResponse field is set. + */ + boolean hasOpaqueResponse(); + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return The opaqueResponse. + */ + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getOpaqueResponse(); + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder getOpaqueResponseOrBuilder(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return Whether the handshakeResponse field is set. + */ + boolean hasHandshakeResponse(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return The handshakeResponse. + */ + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + getHandshakeResponse(); + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponseOrBuilder + getHandshakeResponseOrBuilder(); + + public com.google.cloud.spanner.omni.Login.LoginResponse.ResponseCase getResponseCase(); + } + + /** Protobuf type {@code google.spanner.auth.v1.LoginResponse} */ + public static final class LoginResponse extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.LoginResponse) + LoginResponseOrBuilder { + private static final long serialVersionUID = 0L; + + // Use LoginResponse.newBuilder() to construct. + private LoginResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private LoginResponse() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new LoginResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet getUnknownFields() { + return this.unknownFields; + } + + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.LoginResponse.class, + com.google.cloud.spanner.omni.Login.LoginResponse.Builder.class); + } + + private int responseCase_ = 0; + private java.lang.Object response_; + + public enum ResponseCase + implements + com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + OPAQUE_RESPONSE(4), + HANDSHAKE_RESPONSE(5), + RESPONSE_NOT_SET(0); + private final int value; + + private ResponseCase(int value) { + this.value = value; + } + + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static ResponseCase valueOf(int value) { + return forNumber(value); + } + + public static ResponseCase forNumber(int value) { + switch (value) { + case 4: + return OPAQUE_RESPONSE; + case 5: + return HANDSHAKE_RESPONSE; + case 0: + return RESPONSE_NOT_SET; + default: + return null; + } + } + + public int getNumber() { + return this.value; + } + }; + + public ResponseCase getResponseCase() { + return ResponseCase.forNumber(responseCase_); + } + + public static final int ACCESS_TOKEN_FIELD_NUMBER = 1; + private com.google.cloud.spanner.omni.Login.AccessToken accessToken_; + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return Whether the accessToken field is set. + */ + @java.lang.Override + public boolean hasAccessToken() { + return accessToken_ != null; + } + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return The accessToken. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken getAccessToken() { + return accessToken_ == null + ? com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance() + : accessToken_; + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder getAccessTokenOrBuilder() { + return accessToken_ == null + ? com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance() + : accessToken_; + } + + public static final int OPAQUE_RESPONSE_FIELD_NUMBER = 4; + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return Whether the opaqueResponse field is set. + */ + @java.lang.Override + public boolean hasOpaqueResponse() { + return responseCase_ == 4; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return The opaqueResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getOpaqueResponse() { + if (responseCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder + getOpaqueResponseOrBuilder() { + if (responseCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + + public static final int HANDSHAKE_RESPONSE_FIELD_NUMBER = 5; + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return Whether the handshakeResponse field is set. + */ + @java.lang.Override + public boolean hasHandshakeResponse() { + return responseCase_ == 5; + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return The handshakeResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + getHandshakeResponse() { + if (responseCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .getDefaultInstance(); + } + + /** + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder + getHandshakeResponseOrBuilder() { + if (responseCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_; + } + return com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io.IOException { + if (accessToken_ != null) { + output.writeMessage(1, getAccessToken()); + } + if (responseCase_ == 4) { + output.writeMessage(4, (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_); + } + if (responseCase_ == 5) { + output.writeMessage( + 5, + (com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse) + response_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (accessToken_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(1, getAccessToken()); + } + if (responseCase_ == 4) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 4, (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_); + } + if (responseCase_ == 5) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 5, + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof com.google.cloud.spanner.omni.Login.LoginResponse)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Login.LoginResponse other = + (com.google.cloud.spanner.omni.Login.LoginResponse) obj; + + if (hasAccessToken() != other.hasAccessToken()) return false; + if (hasAccessToken()) { + if (!getAccessToken().equals(other.getAccessToken())) return false; + } + if (!getResponseCase().equals(other.getResponseCase())) return false; + switch (responseCase_) { + case 4: + if (!getOpaqueResponse().equals(other.getOpaqueResponse())) return false; + break; + case 5: + if (!getHandshakeResponse().equals(other.getHandshakeResponse())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasAccessToken()) { + hash = (37 * hash) + ACCESS_TOKEN_FIELD_NUMBER; + hash = (53 * hash) + getAccessToken().hashCode(); + } + switch (responseCase_) { + case 4: + hash = (37 * hash) + OPAQUE_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getOpaqueResponse().hashCode(); + break; + case 5: + hash = (37 * hash) + HANDSHAKE_RESPONSE_FIELD_NUMBER; + hash = (53 * hash) + getHandshakeResponse().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + java.nio.ByteBuffer data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + byte[] data, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseDelimitedFrom( + java.io.InputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseDelimitedFrom( + java.io.InputStream input, com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseDelimitedWithIOException( + PARSER, input, extensionRegistry); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + com.google.protobuf.CodedInputStream input) throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException(PARSER, input); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3.parseWithIOException( + PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { + return newBuilder(); + } + + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + + public static Builder newBuilder(com.google.cloud.spanner.omni.Login.LoginResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + + /** Protobuf type {@code google.spanner.auth.v1.LoginResponse} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.LoginResponse) + com.google.cloud.spanner.omni.Login.LoginResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Login.LoginResponse.class, + com.google.cloud.spanner.omni.Login.LoginResponse.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Login.LoginResponse.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + accessToken_ = null; + if (accessTokenBuilder_ != null) { + accessTokenBuilder_.dispose(); + accessTokenBuilder_ = null; + } + if (opaqueResponseBuilder_ != null) { + opaqueResponseBuilder_.clear(); + } + if (handshakeResponseBuilder_ != null) { + handshakeResponseBuilder_.clear(); + } + responseCase_ = 0; + response_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor getDescriptorForType() { + return com.google.cloud.spanner.omni.Login + .internal_static_google_spanner_auth_v1_LoginResponse_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginResponse getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Login.LoginResponse.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginResponse build() { + com.google.cloud.spanner.omni.Login.LoginResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginResponse buildPartial() { + com.google.cloud.spanner.omni.Login.LoginResponse result = + new com.google.cloud.spanner.omni.Login.LoginResponse(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + buildPartialOneofs(result); + onBuilt(); + return result; + } + + private void buildPartial0(com.google.cloud.spanner.omni.Login.LoginResponse result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.accessToken_ = + accessTokenBuilder_ == null ? accessToken_ : accessTokenBuilder_.build(); + } + } + + private void buildPartialOneofs(com.google.cloud.spanner.omni.Login.LoginResponse result) { + result.responseCase_ = responseCase_; + result.response_ = this.response_; + if (responseCase_ == 4 && opaqueResponseBuilder_ != null) { + result.response_ = opaqueResponseBuilder_.build(); + } + if (responseCase_ == 5 && handshakeResponseBuilder_ != null) { + result.response_ = handshakeResponseBuilder_.build(); + } + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.setField(field, value); + } + + @java.lang.Override + public Builder clearField(com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + + @java.lang.Override + public Builder clearOneof(com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, + java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, java.lang.Object value) { + return super.addRepeatedField(field, value); + } + + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof com.google.cloud.spanner.omni.Login.LoginResponse) { + return mergeFrom((com.google.cloud.spanner.omni.Login.LoginResponse) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Login.LoginResponse other) { + if (other == com.google.cloud.spanner.omni.Login.LoginResponse.getDefaultInstance()) + return this; + if (other.hasAccessToken()) { + mergeAccessToken(other.getAccessToken()); + } + switch (other.getResponseCase()) { + case OPAQUE_RESPONSE: + { + mergeOpaqueResponse(other.getOpaqueResponse()); + break; + } + case HANDSHAKE_RESPONSE: + { + mergeHandshakeResponse(other.getHandshakeResponse()); + break; + } + case RESPONSE_NOT_SET: + { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: + { + input.readMessage(getAccessTokenFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000001; + break; + } // case 10 + case 34: + { + input.readMessage( + getOpaqueResponseFieldBuilder().getBuilder(), extensionRegistry); + responseCase_ = 4; + break; + } // case 34 + case 42: + { + input.readMessage( + getHandshakeResponseFieldBuilder().getBuilder(), extensionRegistry); + responseCase_ = 5; + break; + } // case 42 + default: + { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int responseCase_ = 0; + private java.lang.Object response_; + + public ResponseCase getResponseCase() { + return ResponseCase.forNumber(responseCase_); + } + + public Builder clearResponse() { + responseCase_ = 0; + response_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + private com.google.cloud.spanner.omni.Login.AccessToken accessToken_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.AccessToken, + com.google.cloud.spanner.omni.Login.AccessToken.Builder, + com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder> + accessTokenBuilder_; + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return Whether the accessToken field is set. + */ + public boolean hasAccessToken() { + return ((bitField0_ & 0x00000001) != 0); + } + + /** + * .google.spanner.auth.v1.AccessToken access_token = 1; + * + * @return The accessToken. + */ + public com.google.cloud.spanner.omni.Login.AccessToken getAccessToken() { + if (accessTokenBuilder_ == null) { + return accessToken_ == null + ? com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance() + : accessToken_; + } else { + return accessTokenBuilder_.getMessage(); + } + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public Builder setAccessToken(com.google.cloud.spanner.omni.Login.AccessToken value) { + if (accessTokenBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + accessToken_ = value; + } else { + accessTokenBuilder_.setMessage(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public Builder setAccessToken( + com.google.cloud.spanner.omni.Login.AccessToken.Builder builderForValue) { + if (accessTokenBuilder_ == null) { + accessToken_ = builderForValue.build(); + } else { + accessTokenBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public Builder mergeAccessToken(com.google.cloud.spanner.omni.Login.AccessToken value) { + if (accessTokenBuilder_ == null) { + if (((bitField0_ & 0x00000001) != 0) + && accessToken_ != null + && accessToken_ + != com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance()) { + getAccessTokenBuilder().mergeFrom(value); + } else { + accessToken_ = value; + } + } else { + accessTokenBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public Builder clearAccessToken() { + bitField0_ = (bitField0_ & ~0x00000001); + accessToken_ = null; + if (accessTokenBuilder_ != null) { + accessTokenBuilder_.dispose(); + accessTokenBuilder_ = null; + } + onChanged(); + return this; + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public com.google.cloud.spanner.omni.Login.AccessToken.Builder getAccessTokenBuilder() { + bitField0_ |= 0x00000001; + onChanged(); + return getAccessTokenFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + public com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder getAccessTokenOrBuilder() { + if (accessTokenBuilder_ != null) { + return accessTokenBuilder_.getMessageOrBuilder(); + } else { + return accessToken_ == null + ? com.google.cloud.spanner.omni.Login.AccessToken.getDefaultInstance() + : accessToken_; + } + } + + /** .google.spanner.auth.v1.AccessToken access_token = 1; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.AccessToken, + com.google.cloud.spanner.omni.Login.AccessToken.Builder, + com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder> + getAccessTokenFieldBuilder() { + if (accessTokenBuilder_ == null) { + accessTokenBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.AccessToken, + com.google.cloud.spanner.omni.Login.AccessToken.Builder, + com.google.cloud.spanner.omni.Login.AccessTokenOrBuilder>( + getAccessToken(), getParentForChildren(), isClean()); + accessToken_ = null; + } + return accessTokenBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder> + opaqueResponseBuilder_; + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return Whether the opaqueResponse field is set. + */ + @java.lang.Override + public boolean hasOpaqueResponse() { + return responseCase_ == 4; + } + + /** + * .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; + * + * @return The opaqueResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse getOpaqueResponse() { + if (opaqueResponseBuilder_ == null) { + if (responseCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } else { + if (responseCase_ == 4) { + return opaqueResponseBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + public Builder setOpaqueResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse value) { + if (opaqueResponseBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + response_ = value; + onChanged(); + } else { + opaqueResponseBuilder_.setMessage(value); + } + responseCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + public Builder setOpaqueResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder builderForValue) { + if (opaqueResponseBuilder_ == null) { + response_ = builderForValue.build(); + onChanged(); + } else { + opaqueResponseBuilder_.setMessage(builderForValue.build()); + } + responseCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + public Builder mergeOpaqueResponse( + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse value) { + if (opaqueResponseBuilder_ == null) { + if (responseCase_ == 4 + && response_ + != com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance()) { + response_ = + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.newBuilder( + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_) + .mergeFrom(value) + .buildPartial(); + } else { + response_ = value; + } + onChanged(); + } else { + if (responseCase_ == 4) { + opaqueResponseBuilder_.mergeFrom(value); + } else { + opaqueResponseBuilder_.setMessage(value); + } + } + responseCase_ = 4; + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + public Builder clearOpaqueResponse() { + if (opaqueResponseBuilder_ == null) { + if (responseCase_ == 4) { + responseCase_ = 0; + response_ = null; + onChanged(); + } + } else { + if (responseCase_ == 4) { + responseCase_ = 0; + response_ = null; + } + opaqueResponseBuilder_.clear(); + } + return this; + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder + getOpaqueResponseBuilder() { + return getOpaqueResponseFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder + getOpaqueResponseOrBuilder() { + if ((responseCase_ == 4) && (opaqueResponseBuilder_ != null)) { + return opaqueResponseBuilder_.getMessageOrBuilder(); + } else { + if (responseCase_ == 4) { + return (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_; + } + return com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + } + + /** .google.spanner.auth.v1.OpaqueLoginResponse opaque_response = 4; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder> + getOpaqueResponseFieldBuilder() { + if (opaqueResponseBuilder_ == null) { + if (!(responseCase_ == 4)) { + response_ = + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.getDefaultInstance(); + } + opaqueResponseBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponse.Builder, + com.google.cloud.spanner.omni.Login.OpaqueLoginResponseOrBuilder>( + (com.google.cloud.spanner.omni.Login.OpaqueLoginResponse) response_, + getParentForChildren(), + isClean()); + response_ = null; + } + responseCase_ = 4; + onChanged(); + return opaqueResponseBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder> + handshakeResponseBuilder_; + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return Whether the handshakeResponse field is set. + */ + @java.lang.Override + public boolean hasHandshakeResponse() { + return responseCase_ == 5; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + * + * @return The handshakeResponse. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + getHandshakeResponse() { + if (handshakeResponseBuilder_ == null) { + if (responseCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_; + } + return com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse.getDefaultInstance(); + } else { + if (responseCase_ == 5) { + return handshakeResponseBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse.getDefaultInstance(); + } + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + public Builder setHandshakeResponse( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + value) { + if (handshakeResponseBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + response_ = value; + onChanged(); + } else { + handshakeResponseBuilder_.setMessage(value); + } + responseCase_ = 5; + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + public Builder setHandshakeResponse( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder + builderForValue) { + if (handshakeResponseBuilder_ == null) { + response_ = builderForValue.build(); + onChanged(); + } else { + handshakeResponseBuilder_.setMessage(builderForValue.build()); + } + responseCase_ = 5; + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + public Builder mergeHandshakeResponse( + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + value) { + if (handshakeResponseBuilder_ == null) { + if (responseCase_ == 5 + && response_ + != com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse.getDefaultInstance()) { + response_ = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .newBuilder( + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_) + .mergeFrom(value) + .buildPartial(); + } else { + response_ = value; + } + onChanged(); + } else { + if (responseCase_ == 5) { + handshakeResponseBuilder_.mergeFrom(value); + } else { + handshakeResponseBuilder_.setMessage(value); + } + } + responseCase_ = 5; + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + public Builder clearHandshakeResponse() { + if (handshakeResponseBuilder_ == null) { + if (responseCase_ == 5) { + responseCase_ = 0; + response_ = null; + onChanged(); + } + } else { + if (responseCase_ == 5) { + responseCase_ = 0; + response_ = null; + } + handshakeResponseBuilder_.clear(); + } + return this; + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + public com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder + getHandshakeResponseBuilder() { + return getHandshakeResponseFieldBuilder().getBuilder(); + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder + getHandshakeResponseOrBuilder() { + if ((responseCase_ == 5) && (handshakeResponseBuilder_ != null)) { + return handshakeResponseBuilder_.getMessageOrBuilder(); + } else { + if (responseCase_ == 5) { + return (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_; + } + return com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse.getDefaultInstance(); + } + } + + /** + * + * .google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse handshake_response = 5; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse, + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder> + getHandshakeResponseFieldBuilder() { + if (handshakeResponseBuilder_ == null) { + if (!(responseCase_ == 5)) { + response_ = + com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeResponse + .getDefaultInstance(); + } + handshakeResponseBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse.Builder, + com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponseOrBuilder>( + (com.google.cloud.spanner.omni.Authentication + .PasswordAuthenticationHandshakeResponse) + response_, + getParentForChildren(), + isClean()); + response_ = null; + } + responseCase_ = 5; + onChanged(); + return handshakeResponseBuilder_; + } + + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.LoginResponse) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.LoginResponse) + private static final com.google.cloud.spanner.omni.Login.LoginResponse DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Login.LoginResponse(); + } + + public static com.google.cloud.spanner.omni.Login.LoginResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public LoginResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException() + .setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Login.LoginResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_AccessToken_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_AccessToken_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_OpaqueLoginRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_LoginRequest_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_LoginRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_LoginResponse_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_LoginResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { + return descriptor; + } + + private static com.google.protobuf.Descriptors.FileDescriptor descriptor; + + static { + java.lang.String[] descriptorData = { + "\n\013login.proto\022\026google.spanner.auth.v1\032\037g" + + "oogle/protobuf/timestamp.proto\032\024authenti" + + "cation.proto\"Q\n\013AccessToken\022\r\n\005token\030\001 \001" + + "(\t\0223\n\017expiration_time\030\003 \001(\0132\032.google.pro" + + "tobuf.Timestamp\"j\n\031InitialOpaqueLoginReq" + + "uest\022\027\n\017blinded_message\030\001 \001(\014\022\024\n\014client_" + + "nonce\030\002 \001(\014\022\036\n\026client_public_keyshare\030\003 " + + "\001(\014\"-\n\027FinalOpaqueLoginRequest\022\022\n\nclient" + + "_mac\030\001 \001(\014\"\261\001\n\032InitialOpaqueLoginRespons" + + "e\022\024\n\014server_nonce\030\001 \001(\014\022\036\n\026server_public" + + "_keyshare\030\002 \001(\014\022\022\n\nserver_mac\030\003 \001(\014\022\031\n\021e" + + "valuated_message\030\004 \001(\014\022\025\n\rmasking_nonce\030" + + "\005 \001(\014\022\027\n\017masked_response\030\006 \001(\014\"\267\001\n\022Opaqu" + + "eLoginRequest\022L\n\017initial_request\030\001 \001(\01321" + + ".google.spanner.auth.v1.InitialOpaqueLog" + + "inRequestH\000\022H\n\rfinal_request\030\002 \001(\0132/.goo" + + "gle.spanner.auth.v1.FinalOpaqueLoginRequ" + + "estH\000B\t\n\007request\"\327\001\n\023OpaqueLoginResponse" + + "\022N\n\020initial_response\030\001 \001(\01322.google.span" + + "ner.auth.v1.InitialOpaqueLoginResponseH\000" + + "\022S\n\016final_response\030\002 \001(\01329.google.spanne" + + "r.auth.v1.OpaqueLoginResponse.FinalRespo" + + "nseH\000\032\017\n\rFinalResponseB\n\n\010response\"\316\001\n\014L" + + "oginRequest\022\020\n\010username\030\001 \001(\t\022D\n\016opaque_" + + "request\030\004 \001(\0132*.google.spanner.auth.v1.O" + + "paqueLoginRequestH\000\022[\n\021handshake_request" + + "\030\005 \001(\0132>.google.spanner.auth.v1.Password" + + "AuthenticationHandshakeRequestH\000B\t\n\007requ" + + "est\"\375\001\n\rLoginResponse\0229\n\014access_token\030\001 " + + "\001(\0132#.google.spanner.auth.v1.AccessToken" + + "\022F\n\017opaque_response\030\004 \001(\0132+.google.spann" + + "er.auth.v1.OpaqueLoginResponseH\000\022]\n\022hand" + + "shake_response\030\005 \001(\0132?.google.spanner.au" + + "th.v1.PasswordAuthenticationHandshakeRes" + + "ponseH\000B\n\n\010response2j\n\014LoginService\022Z\n\005L" + + "ogin\022$.google.spanner.auth.v1.LoginReque" + + "st\032%.google.spanner.auth.v1.LoginRespons" + + "e\"\000(\0010\001B(\n\035com.google.cloud.spanner.omni" + + "B\005LoginP\000b\006proto3" + }; + descriptor = + com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( + descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + com.google.protobuf.TimestampProto.getDescriptor(), + com.google.cloud.spanner.omni.Authentication.getDescriptor(), + }); + internal_static_google_spanner_auth_v1_AccessToken_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_google_spanner_auth_v1_AccessToken_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_AccessToken_descriptor, + new java.lang.String[] { + "Token", "ExpirationTime", + }); + internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor, + new java.lang.String[] { + "BlindedMessage", "ClientNonce", "ClientPublicKeyshare", + }); + internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_FinalOpaqueLoginRequest_descriptor, + new java.lang.String[] { + "ClientMac", + }); + internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_InitialOpaqueLoginResponse_descriptor, + new java.lang.String[] { + "ServerNonce", + "ServerPublicKeyshare", + "ServerMac", + "EvaluatedMessage", + "MaskingNonce", + "MaskedResponse", + }); + internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_google_spanner_auth_v1_OpaqueLoginRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_OpaqueLoginRequest_descriptor, + new java.lang.String[] { + "InitialRequest", "FinalRequest", "Request", + }); + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor, + new java.lang.String[] { + "InitialResponse", "FinalResponse", "Response", + }); + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor = + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_descriptor + .getNestedTypes() + .get(0); + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_OpaqueLoginResponse_FinalResponse_descriptor, + new java.lang.String[] {}); + internal_static_google_spanner_auth_v1_LoginRequest_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_google_spanner_auth_v1_LoginRequest_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_LoginRequest_descriptor, + new java.lang.String[] { + "Username", "OpaqueRequest", "HandshakeRequest", "Request", + }); + internal_static_google_spanner_auth_v1_LoginResponse_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_google_spanner_auth_v1_LoginResponse_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_LoginResponse_descriptor, + new java.lang.String[] { + "AccessToken", "OpaqueResponse", "HandshakeResponse", "Response", + }); + com.google.protobuf.TimestampProto.getDescriptor(); + com.google.cloud.spanner.omni.Authentication.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginClient.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginClient.java new file mode 100644 index 000000000000..14d2cb0f98d1 --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginClient.java @@ -0,0 +1,405 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni; + +import com.google.cloud.spanner.SpannerException; +import com.google.cloud.spanner.SpannerExceptionFactory; +import com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationHandshakeRequest; +import com.google.cloud.spanner.omni.Authentication.PasswordAuthenticationProtocol; +import com.google.cloud.spanner.omni.Login.*; +import com.google.cloud.spanner.omni.opaque.OpaqueUtil; +import com.google.common.base.Preconditions; +import com.google.crypto.tink.InsecureSecretKeyAccess; +import com.google.crypto.tink.util.SecretBytes; +import com.google.protobuf.ByteString; +import io.grpc.ManagedChannel; +import io.grpc.stub.StreamObserver; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * Client for {@link google.spanner.omni.v1.LoginServiceGrpc}. This class is used to authenticate to + * Spanner Omni using username/password. + */ +public class LoginClient { + private static final SecureRandom SECURE_RANDOM = new SecureRandom(); + + private final LoginServiceGrpc.LoginServiceStub stub; + + public LoginClient(ManagedChannel channel) { + this.stub = LoginServiceGrpc.newStub(channel); + } + + /** + * Logs in to Spanner Omni using OPAQUE protocol. + * + * @param username The username to login with. + * @param password The password to login with. + * @return The access token. + * @throws SpannerException if login fails. + */ + public AccessToken login(String username, SecretBytes password) throws SpannerException { + Preconditions.checkNotNull(username); + Preconditions.checkNotNull(password); + byte[] passwordBytes = null; + byte[] clientPrivateKeyshare = null; + byte[] blind = null; + byte[] blindedMessage = null; + try { + passwordBytes = password.toByteArray(InsecureSecretKeyAccess.get()); + byte[] randomNonce = OpaqueUtil.nonce(); + byte[][] keyPair = + OpaqueUtil.generateKeyPair( + OpaqueUtil.concat( + randomNonce, + OpaqueUtil.DIFFIE_HELLMAN_KEY_INFO.getBytes(StandardCharsets.UTF_8))); + clientPrivateKeyshare = keyPair[0]; + byte[] clientPublicKeyshare = keyPair[1]; + byte[] clientNonce = OpaqueUtil.nonce(); + blind = new byte[32]; + SECURE_RANDOM.nextBytes(blind); + + blindedMessage = OpaqueUtil.blind(passwordBytes, blind); + + try (LoginStreamIOCall call = + new LoginStreamIOCall(stub.withDeadlineAfter(60, TimeUnit.SECONDS))) { + + // 1. Send Handshake Request + LoginRequest handshakeRequest = + LoginRequest.newBuilder() + .setUsername(username) + .setHandshakeRequest(PasswordAuthenticationHandshakeRequest.newBuilder()) + .build(); + call.send(handshakeRequest); + LoginResponse handshakeResponse = call.getResponse(); + + if (handshakeResponse == null || !handshakeResponse.hasHandshakeResponse()) { + throw SpannerExceptionFactory.newSpannerException( + com.google.cloud.spanner.ErrorCode.UNAUTHENTICATED, + "Failed to receive handshake response from server."); + } + + PasswordAuthenticationProtocol method = + handshakeResponse.getHandshakeResponse().getPasswordAuthenticationProtocol(); + if (method != PasswordAuthenticationProtocol.PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE) { + throw SpannerExceptionFactory.newSpannerException( + com.google.cloud.spanner.ErrorCode.UNAUTHENTICATED, + "Unsupported authentication method: " + method); + } + + // 2. Send Initial OPAQUE Request + LoginRequest initialRequest = + LoginRequest.newBuilder() + .setUsername(username) + .setOpaqueRequest( + OpaqueLoginRequest.newBuilder() + .setInitialRequest( + InitialOpaqueLoginRequest.newBuilder() + .setBlindedMessage(ByteString.copyFrom(blindedMessage)) + .setClientNonce(ByteString.copyFrom(clientNonce)) + .setClientPublicKeyshare( + ByteString.copyFrom(clientPublicKeyshare)))) + .build(); + + call.send(initialRequest); + LoginResponse initialResponse = call.getResponse(); + + InitialOpaqueLoginResponse initialOpaqueResponse = + initialResponse.getOpaqueResponse().getInitialResponse(); + + ByteString envelope = initialOpaqueResponse.getMaskedResponse(); + if (envelope.size() != 65) { + throw new GeneralSecurityException("Invalid envelope size: " + envelope.size()); + } + + byte[] clientMac = + generateClientMac( + username, + blind, + clientNonce, + clientPublicKeyshare, + clientPrivateKeyshare, + initialOpaqueResponse); + + LoginRequest finalRequest = + LoginRequest.newBuilder() + .setUsername(username) + .setOpaqueRequest( + OpaqueLoginRequest.newBuilder() + .setFinalRequest( + FinalOpaqueLoginRequest.newBuilder() + .setClientMac(ByteString.copyFrom(clientMac)))) + .build(); + + call.send(finalRequest); + call.halfClose(); + LoginResponse finalResponse = call.getResponse(); + if (!finalResponse.hasAccessToken()) { + throw SpannerExceptionFactory.newSpannerException( + com.google.cloud.spanner.ErrorCode.UNAUTHENTICATED, + "Server failed to return an access token."); + } + return finalResponse.getAccessToken(); + } + } catch (Exception e) { + if (e instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + throw SpannerExceptionFactory.newSpannerException(e); + } finally { + // Securely zero out all intermediate sensitive buffers to prevent them + // from persisting in heap dumps or lingering in memory (memory scraping attacks). + if (passwordBytes != null) { + Arrays.fill(passwordBytes, (byte) 0); + } + if (clientPrivateKeyshare != null) { + Arrays.fill(clientPrivateKeyshare, (byte) 0); + } + if (blind != null) { + Arrays.fill(blind, (byte) 0); + } + if (blindedMessage != null) { + Arrays.fill(blindedMessage, (byte) 0); + } + } + } + + private byte[] generateClientMac( + String username, + byte[] blind, + byte[] clientNonce, + byte[] clientPublicKeyshare, + byte[] clientPrivateKeyshare, + InitialOpaqueLoginResponse initialOpaqueResponse) + throws GeneralSecurityException, IOException { + byte[] oprf = null; + byte[] stretchedOprf = null; + byte[] randomizedPassword = null; + byte[] maskingKey = null; + byte[] credentialResponsePad = null; + byte[] authKey = null; + byte[] seed = null; + byte[] dh1 = null; + byte[] dh2 = null; + byte[] dh3 = null; + byte[] inputKeyMaterial = null; + byte[] handshakeSecret = null; + byte[] km2 = null; + byte[] km3 = null; + byte[] clientPrivateKey = null; + byte[] prk = null; + + try { + oprf = OpaqueUtil.finalize(blind, initialOpaqueResponse.getEvaluatedMessage().toByteArray()); + stretchedOprf = OpaqueUtil.stretch(oprf); + byte[] oprfConcat = OpaqueUtil.concat(oprf, stretchedOprf); + try { + randomizedPassword = OpaqueUtil.extract(oprfConcat); + } finally { + Arrays.fill(oprfConcat, (byte) 0); + } + maskingKey = + OpaqueUtil.expand( + randomizedPassword, OpaqueUtil.MASKING_KEY_INFO.getBytes(StandardCharsets.UTF_8), 32); + credentialResponsePad = + OpaqueUtil.expand( + maskingKey, + OpaqueUtil.concat( + initialOpaqueResponse.getMaskingNonce().toByteArray(), + "CredentialResponsePad".getBytes(java.nio.charset.StandardCharsets.UTF_8)), + 16 + 33 + 16); + byte[] serializedEnvelope = + OpaqueUtil.xorBytes( + initialOpaqueResponse.getMaskedResponse().toByteArray(), credentialResponsePad); + ByteString envelope = ByteString.copyFrom(serializedEnvelope); + if (envelope.size() != 65) { + throw new GeneralSecurityException("Invalid envelope size: " + envelope.size()); + } + ByteString serverPublicKey = envelope.substring(0, 33); + ByteString envelopeNonce = envelope.substring(33, 33 + 16); + ByteString authTag = envelope.substring(33 + 16, 33 + 16 + 16); + + authKey = + OpaqueUtil.expand( + randomizedPassword, + OpaqueUtil.concat( + envelopeNonce.toByteArray(), + OpaqueUtil.AUTH_KEY_INFO.getBytes(StandardCharsets.UTF_8)), + 32); + seed = + OpaqueUtil.expand( + randomizedPassword, + OpaqueUtil.concat( + envelopeNonce.toByteArray(), + OpaqueUtil.PRIVATE_KEY_INFO.getBytes(StandardCharsets.UTF_8)), + 32); + byte[] seedConcat = + OpaqueUtil.concat( + seed, OpaqueUtil.DIFFIE_HELLMAN_KEY_INFO.getBytes(StandardCharsets.UTF_8)); + byte[][] clientKeyPair; + try { + clientKeyPair = OpaqueUtil.generateKeyPair(seedConcat); + } finally { + Arrays.fill(seedConcat, (byte) 0); + } + clientPrivateKey = clientKeyPair[0]; + byte[] clientPublicKey = clientKeyPair[1]; + + byte[] expectedTag = + OpaqueUtil.mac( + authKey, + OpaqueUtil.concat( + envelopeNonce.toByteArray(), + serverPublicKey.toByteArray(), + username.getBytes(StandardCharsets.UTF_8))); + // Use MessageDigest.isEqual for constant-time comparison to prevent timing attacks. + // A standard Arrays.equals or ByteString.equals fails fast and can reveal byte matches. + if (!MessageDigest.isEqual(expectedTag, authTag.toByteArray())) { + throw new GeneralSecurityException("Auth tag mismatch"); + } + + dh1 = + OpaqueUtil.diffieHellman( + clientPrivateKeyshare, initialOpaqueResponse.getServerPublicKeyshare().toByteArray()); + dh2 = OpaqueUtil.diffieHellman(clientPrivateKeyshare, serverPublicKey.toByteArray()); + dh3 = + OpaqueUtil.diffieHellman( + clientPrivateKey, initialOpaqueResponse.getServerPublicKeyshare().toByteArray()); + + inputKeyMaterial = OpaqueUtil.concat(dh1, dh2, dh3); + + byte[] preamble = + OpaqueUtil.concat( + "OPAQUEv1-".getBytes(StandardCharsets.UTF_8), + username.getBytes(StandardCharsets.UTF_8), + clientNonce, + clientPublicKeyshare, + serverPublicKey.toByteArray(), + initialOpaqueResponse.getEvaluatedMessage().toByteArray(), + initialOpaqueResponse.getServerNonce().toByteArray(), + initialOpaqueResponse.getServerPublicKeyshare().toByteArray()); + prk = OpaqueUtil.extract(inputKeyMaterial); + byte[] preambleHash = OpaqueUtil.sha256(preamble); + handshakeSecret = + OpaqueUtil.expand( + prk, + OpaqueUtil.concat( + "OPAQUE-HandshakeSecret".getBytes(StandardCharsets.UTF_8), preambleHash), + 32); + km2 = + OpaqueUtil.expand( + handshakeSecret, "OPAQUE-ServerMAC".getBytes(StandardCharsets.UTF_8), 32); + km3 = + OpaqueUtil.expand( + handshakeSecret, "OPAQUE-ClientMAC".getBytes(StandardCharsets.UTF_8), 32); + + byte[] expectedServerMac = OpaqueUtil.mac(km2, OpaqueUtil.sha256(preamble)); + if (!MessageDigest.isEqual( + expectedServerMac, initialOpaqueResponse.getServerMac().toByteArray())) { + throw new GeneralSecurityException("Server MAC mismatch"); + } + return OpaqueUtil.mac(km3, OpaqueUtil.sha256(OpaqueUtil.concat(preamble, expectedServerMac))); + } finally { + // Zero out derived keys and diffie-hellman secrets to prevent credential scraping. + if (oprf != null) Arrays.fill(oprf, (byte) 0); + if (stretchedOprf != null) Arrays.fill(stretchedOprf, (byte) 0); + if (randomizedPassword != null) Arrays.fill(randomizedPassword, (byte) 0); + if (maskingKey != null) Arrays.fill(maskingKey, (byte) 0); + if (credentialResponsePad != null) Arrays.fill(credentialResponsePad, (byte) 0); + if (authKey != null) Arrays.fill(authKey, (byte) 0); + if (seed != null) Arrays.fill(seed, (byte) 0); + if (dh1 != null) Arrays.fill(dh1, (byte) 0); + if (dh2 != null) Arrays.fill(dh2, (byte) 0); + if (dh3 != null) Arrays.fill(dh3, (byte) 0); + if (inputKeyMaterial != null) Arrays.fill(inputKeyMaterial, (byte) 0); + if (handshakeSecret != null) Arrays.fill(handshakeSecret, (byte) 0); + if (km2 != null) Arrays.fill(km2, (byte) 0); + if (km3 != null) Arrays.fill(km3, (byte) 0); + if (clientPrivateKey != null) Arrays.fill(clientPrivateKey, (byte) 0); + if (prk != null) Arrays.fill(prk, (byte) 0); + } + } + + static class LoginStreamIOCall implements AutoCloseable { + private static final Object COMPLETED_SENTINEL = new Object(); + private final LoginServiceGrpc.LoginServiceStub stub; + private final BlockingQueue responseQueue = new LinkedBlockingQueue<>(); + private final StreamObserver requestObserver; + private boolean closed = false; + + LoginStreamIOCall(LoginServiceGrpc.LoginServiceStub stub) { + this.stub = stub; + this.requestObserver = + stub.login( + new StreamObserver() { + @Override + public void onNext(LoginResponse value) { + responseQueue.add(value); + } + + @Override + public void onError(Throwable t) { + responseQueue.add(t); + } + + @Override + public void onCompleted() { + responseQueue.add(COMPLETED_SENTINEL); + } + }); + } + + void send(LoginRequest request) { + requestObserver.onNext(request); + } + + LoginResponse getResponse() throws InterruptedException { + Object response = responseQueue.take(); + if (response instanceof Throwable) { + throw SpannerExceptionFactory.newSpannerException((Throwable) response); + } + if (response == COMPLETED_SENTINEL) { + return null; + } + return (LoginResponse) response; + } + + void halfClose() { + requestObserver.onCompleted(); + closed = true; + } + + @Override + public void close() { + if (!closed) { + closed = true; + try { + requestObserver.onError(new RuntimeException("Client cancelled the login stream")); + } catch (Exception e) { + // Ignore + } + } + } + } +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginServiceGrpc.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginServiceGrpc.java new file mode 100644 index 000000000000..ebb98a283cff --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginServiceGrpc.java @@ -0,0 +1,348 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: login.proto + +package com.google.cloud.spanner.omni; + +import static io.grpc.MethodDescriptor.generateFullMethodName; + +/** + * + * + *
+ * The LoginService is used to authenticate users.
+ * 
+ */ +@javax.annotation.Generated( + value = "by gRPC proto compiler (version 1.64.0)", + comments = "Source: login.proto") +@io.grpc.stub.annotations.GrpcGenerated +final class LoginServiceGrpc { + + private LoginServiceGrpc() {} + + public static final java.lang.String SERVICE_NAME = "google.spanner.auth.v1.LoginService"; + + // Static method descriptors that strictly reflect the proto. + private static volatile io.grpc.MethodDescriptor< + com.google.cloud.spanner.omni.Login.LoginRequest, + com.google.cloud.spanner.omni.Login.LoginResponse> + getLoginMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "Login", + requestType = com.google.cloud.spanner.omni.Login.LoginRequest.class, + responseType = com.google.cloud.spanner.omni.Login.LoginResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + public static io.grpc.MethodDescriptor< + com.google.cloud.spanner.omni.Login.LoginRequest, + com.google.cloud.spanner.omni.Login.LoginResponse> + getLoginMethod() { + io.grpc.MethodDescriptor< + com.google.cloud.spanner.omni.Login.LoginRequest, + com.google.cloud.spanner.omni.Login.LoginResponse> + getLoginMethod; + if ((getLoginMethod = LoginServiceGrpc.getLoginMethod) == null) { + synchronized (LoginServiceGrpc.class) { + if ((getLoginMethod = LoginServiceGrpc.getLoginMethod) == null) { + LoginServiceGrpc.getLoginMethod = + getLoginMethod = + io.grpc.MethodDescriptor + . + newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "Login")) + .setSampledToLocalTracing(true) + .setRequestMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.cloud.spanner.omni.Login.LoginRequest + .getDefaultInstance())) + .setResponseMarshaller( + io.grpc.protobuf.ProtoUtils.marshaller( + com.google.cloud.spanner.omni.Login.LoginResponse + .getDefaultInstance())) + .setSchemaDescriptor(new LoginServiceMethodDescriptorSupplier("Login")) + .build(); + } + } + } + return getLoginMethod; + } + + /** Creates a new async stub that supports all call types for the service */ + public static LoginServiceStub newStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public LoginServiceStub newStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceStub(channel, callOptions); + } + }; + return LoginServiceStub.newStub(factory, channel); + } + + /** + * Creates a new blocking-style stub that supports unary and streaming output calls on the service + */ + public static LoginServiceBlockingStub newBlockingStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public LoginServiceBlockingStub newStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceBlockingStub(channel, callOptions); + } + }; + return LoginServiceBlockingStub.newStub(factory, channel); + } + + /** Creates a new ListenableFuture-style stub that supports unary calls on the service */ + public static LoginServiceFutureStub newFutureStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public LoginServiceFutureStub newStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceFutureStub(channel, callOptions); + } + }; + return LoginServiceFutureStub.newStub(factory, channel); + } + + /** + * + * + *
+   * The LoginService is used to authenticate users.
+   * 
+ */ + public interface AsyncService { + + /** + * + * + *
+     * Performs the login for Spanner Omni.
+     * 
+ */ + default io.grpc.stub.StreamObserver login( + io.grpc.stub.StreamObserver + responseObserver) { + return io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall( + getLoginMethod(), responseObserver); + } + } + + /** + * Base class for the server implementation of the service LoginService. + * + *
+   * The LoginService is used to authenticate users.
+   * 
+ */ + public abstract static class LoginServiceImplBase + implements io.grpc.BindableService, AsyncService { + + @java.lang.Override + public final io.grpc.ServerServiceDefinition bindService() { + return LoginServiceGrpc.bindService(this); + } + } + + /** + * A stub to allow clients to do asynchronous rpc calls to service LoginService. + * + *
+   * The LoginService is used to authenticate users.
+   * 
+ */ + public static final class LoginServiceStub + extends io.grpc.stub.AbstractAsyncStub { + private LoginServiceStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected LoginServiceStub build(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceStub(channel, callOptions); + } + + /** + * + * + *
+     * Performs the login for Spanner Omni.
+     * 
+ */ + public io.grpc.stub.StreamObserver login( + io.grpc.stub.StreamObserver + responseObserver) { + return io.grpc.stub.ClientCalls.asyncBidiStreamingCall( + getChannel().newCall(getLoginMethod(), getCallOptions()), responseObserver); + } + } + + /** + * A stub to allow clients to do synchronous rpc calls to service LoginService. + * + *
+   * The LoginService is used to authenticate users.
+   * 
+ */ + public static final class LoginServiceBlockingStub + extends io.grpc.stub.AbstractBlockingStub { + private LoginServiceBlockingStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected LoginServiceBlockingStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceBlockingStub(channel, callOptions); + } + } + + /** + * A stub to allow clients to do ListenableFuture-style rpc calls to service LoginService. + * + *
+   * The LoginService is used to authenticate users.
+   * 
+ */ + public static final class LoginServiceFutureStub + extends io.grpc.stub.AbstractFutureStub { + private LoginServiceFutureStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected LoginServiceFutureStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new LoginServiceFutureStub(channel, callOptions); + } + } + + private static final int METHODID_LOGIN = 0; + + private static final class MethodHandlers + implements io.grpc.stub.ServerCalls.UnaryMethod, + io.grpc.stub.ServerCalls.ServerStreamingMethod, + io.grpc.stub.ServerCalls.ClientStreamingMethod, + io.grpc.stub.ServerCalls.BidiStreamingMethod { + private final AsyncService serviceImpl; + private final int methodId; + + MethodHandlers(AsyncService serviceImpl, int methodId) { + this.serviceImpl = serviceImpl; + this.methodId = methodId; + } + + @java.lang.Override + @java.lang.SuppressWarnings("unchecked") + public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + default: + throw new AssertionError(); + } + } + + @java.lang.Override + @java.lang.SuppressWarnings("unchecked") + public io.grpc.stub.StreamObserver invoke( + io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + case METHODID_LOGIN: + return (io.grpc.stub.StreamObserver) + serviceImpl.login( + (io.grpc.stub.StreamObserver) + responseObserver); + default: + throw new AssertionError(); + } + } + } + + public static final io.grpc.ServerServiceDefinition bindService(AsyncService service) { + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) + .addMethod( + getLoginMethod(), + io.grpc.stub.ServerCalls.asyncBidiStreamingCall( + new MethodHandlers< + com.google.cloud.spanner.omni.Login.LoginRequest, + com.google.cloud.spanner.omni.Login.LoginResponse>(service, METHODID_LOGIN))) + .build(); + } + + private abstract static class LoginServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoFileDescriptorSupplier, + io.grpc.protobuf.ProtoServiceDescriptorSupplier { + LoginServiceBaseDescriptorSupplier() {} + + @java.lang.Override + public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() { + return com.google.cloud.spanner.omni.Login.getDescriptor(); + } + + @java.lang.Override + public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() { + return getFileDescriptor().findServiceByName("LoginService"); + } + } + + private static final class LoginServiceFileDescriptorSupplier + extends LoginServiceBaseDescriptorSupplier { + LoginServiceFileDescriptorSupplier() {} + } + + private static final class LoginServiceMethodDescriptorSupplier + extends LoginServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoMethodDescriptorSupplier { + private final java.lang.String methodName; + + LoginServiceMethodDescriptorSupplier(java.lang.String methodName) { + this.methodName = methodName; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() { + return getServiceDescriptor().findMethodByName(methodName); + } + } + + private static volatile io.grpc.ServiceDescriptor serviceDescriptor; + + public static io.grpc.ServiceDescriptor getServiceDescriptor() { + io.grpc.ServiceDescriptor result = serviceDescriptor; + if (result == null) { + synchronized (LoginServiceGrpc.class) { + result = serviceDescriptor; + if (result == null) { + serviceDescriptor = + result = + io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME) + .setSchemaDescriptor(new LoginServiceFileDescriptorSupplier()) + .addMethod(getLoginMethod()) + .build(); + } + } + } + return result; + } +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/OpaqueUtil.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/OpaqueUtil.java new file mode 100644 index 000000000000..c68d4d3ebdad --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/OpaqueUtil.java @@ -0,0 +1,413 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni.opaque; + +import static java.nio.charset.StandardCharsets.UTF_8; + +import com.google.crypto.tink.subtle.Hkdf; +import java.math.BigInteger; +import java.security.GeneralSecurityException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Arrays; +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.ec.CustomNamedCurves; +import org.bouncycastle.crypto.generators.Argon2BytesGenerator; +import org.bouncycastle.crypto.params.Argon2Parameters; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.math.ec.ECPoint; + +public class OpaqueUtil { + + public static final String LOGIN_DOMAIN_SEPARATION_TAG = "Spanner-Omni-Login"; + public static final String CURVE_NAME = "secp256r1"; + public static final String AUTH_KEY_INFO = "AuthKey"; + public static final String EXPORT_KEY_INFO = "ExportKey"; + public static final String PRIVATE_KEY_INFO = "PrivateKey"; + public static final String MASKING_KEY_INFO = "MaskingKey"; + public static final String DIFFIE_HELLMAN_KEY_INFO = "OPAQUE-DeriveDiffieHellmanKeyPair"; + public static final String HMAC_SHA256 = "HmacSHA256"; + + private static final int NONCE_LENGTH = 16; + private static final int MAC_TAG_LENGTH = 16; + private static final int EXTRACT_OUTPUT_LENGTH = 32; + private static final int STRETCH_OUTPUT_LENGTH = 32; + + // Argon2ID parameters. + private static final int ARGON2_ITERATION_COUNT = 3; + private static final int ARGON2_MEMORY_LIMIT = 64 * 1024; + private static final int ARGON2_THREADS = 4; + private static final int ARGON2_SALT_LENGTH = 32; + + private static final SecureRandom random = new SecureRandom(); + + public static byte[] nonce() { + byte[] nonce = new byte[NONCE_LENGTH]; + random.nextBytes(nonce); + return nonce; + } + + public static byte[] hmacSha256(byte[] key, byte[] message) throws GeneralSecurityException { + Mac mac = Mac.getInstance(HMAC_SHA256); + mac.init(new SecretKeySpec(key, HMAC_SHA256)); + return mac.doFinal(message); + } + + public static byte[] sha256(byte[] message) throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + return digest.digest(message); + } + + private static final BigInteger p = + new BigInteger( + "115792089210356248762697446949407573530086143415290314195533631308867097853951"); + private static final BigInteger A = p.subtract(new BigInteger("3")); + private static final BigInteger B = + new BigInteger("5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b", 16); + private static final BigInteger Z = p.subtract(BigInteger.valueOf(10)); + + private static byte[] expandMessageXmd(byte[] msg, byte[] DST, int lenInBytes) + throws GeneralSecurityException { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + int bInBytes = 32; + int ell = (lenInBytes + bInBytes - 1) / bInBytes; + + byte[] dstPrime = new byte[DST.length + 1]; + System.arraycopy(DST, 0, dstPrime, 0, DST.length); + dstPrime[DST.length] = (byte) DST.length; + + byte[] zPad = new byte[64]; + byte[] libStr = new byte[] {(byte) (lenInBytes >> 8), (byte) (lenInBytes & 0xFF)}; + + byte[] b0 = null; + byte[] bOut = null; + byte[] b1 = null; + + try { + md.update(zPad); + md.update(msg); + md.update(libStr); + md.update((byte) 0); + md.update(dstPrime); + b0 = md.digest(); + + bOut = new byte[ell * bInBytes]; + + md.update(b0); + md.update((byte) 1); + md.update(dstPrime); + b1 = md.digest(); + System.arraycopy(b1, 0, bOut, 0, bInBytes); + + byte[] bi = b1; + for (int i = 2; i <= ell; i++) { + byte[] bXor = new byte[bInBytes]; + for (int j = 0; j < bInBytes; j++) { + bXor[j] = (byte) (b0[j] ^ bi[j]); + } + md.update(bXor); + md.update((byte) i); + md.update(dstPrime); + bi = md.digest(); + System.arraycopy(bi, 0, bOut, (i - 1) * bInBytes, bInBytes); + } + + byte[] res = new byte[lenInBytes]; + System.arraycopy(bOut, 0, res, 0, lenInBytes); + return res; + } finally { + if (b0 != null) Arrays.fill(b0, (byte) 0); + if (bOut != null) Arrays.fill(bOut, (byte) 0); + if (b1 != null) Arrays.fill(b1, (byte) 0); + } + } catch (Exception e) { + throw new GeneralSecurityException("Failed to expand message", e); + } + } + + private static int sgn0(BigInteger x) { + return x.testBit(0) ? 1 : 0; + } + + private static ECPoint mapToCurveSSWU(BigInteger u, ECCurve curve) { + BigInteger u2 = u.multiply(u).mod(p); + BigInteger z_u2 = Z.multiply(u2).mod(p); + BigInteger z2_u4 = z_u2.multiply(z_u2).mod(p); + BigInteger den = z2_u4.add(z_u2).mod(p); + + BigInteger tv1; + if (den.equals(BigInteger.ZERO)) { + tv1 = BigInteger.ZERO; + } else { + tv1 = den.modInverse(p); + } + + BigInteger x1; + if (tv1.equals(BigInteger.ZERO)) { + BigInteger za = Z.multiply(A).mod(p); + x1 = B.multiply(za.modInverse(p)).mod(p); + } else { + BigInteger negB_div_A = B.negate().multiply(A.modInverse(p)).mod(p); + BigInteger one_plus_tv1 = BigInteger.ONE.add(tv1).mod(p); + x1 = negB_div_A.multiply(one_plus_tv1).mod(p); + } + + BigInteger gx1 = x1.pow(3).add(A.multiply(x1)).add(B).mod(p); + BigInteger x2 = z_u2.multiply(x1).mod(p); + BigInteger gx2 = x2.pow(3).add(A.multiply(x2)).add(B).mod(p); + + BigInteger c1 = p.add(BigInteger.ONE).divide(BigInteger.valueOf(4)); + BigInteger root1 = gx1.modPow(c1, p); + boolean isSquare = root1.multiply(root1).mod(p).equals(gx1); + + BigInteger x, y; + if (isSquare) { + x = x1; + y = root1; + } else { + x = x2; + y = gx2.modPow(c1, p); + } + + if (sgn0(u) != sgn0(y)) { + y = y.negate().mod(p); + } + + return curve.createPoint(x, y); + } + + public static byte[] getHashToCurve(byte[] message, byte[] domain) + throws GeneralSecurityException { + // Implements hash-to-curve using the Simplified SWU (SSWU) mapping. + // This securely and uniformly maps an arbitrary string (the password) onto the elliptic curve. + byte[] uniformBytes = null; + byte[] u0Bytes = null; + byte[] u1Bytes = null; + try { + uniformBytes = expandMessageXmd(message, domain, 96); + u0Bytes = new byte[48]; + u1Bytes = new byte[48]; + System.arraycopy(uniformBytes, 0, u0Bytes, 0, 48); + System.arraycopy(uniformBytes, 48, u1Bytes, 0, 48); + + BigInteger u0 = new BigInteger(1, u0Bytes).mod(p); + BigInteger u1 = new BigInteger(1, u1Bytes).mod(p); + + X9ECParameters params = CustomNamedCurves.getByName(CURVE_NAME); + ECCurve curve = params.getCurve(); + + ECPoint q0 = mapToCurveSSWU(u0, curve); + ECPoint q1 = mapToCurveSSWU(u1, curve); + + ECPoint r = q0.add(q1).normalize(); + return r.getEncoded(true); + } finally { + if (uniformBytes != null) { + Arrays.fill(uniformBytes, (byte) 0); + } + if (u0Bytes != null) { + Arrays.fill(u0Bytes, (byte) 0); + } + if (u1Bytes != null) { + Arrays.fill(u1Bytes, (byte) 0); + } + } + } + + public static byte[] blind(byte[] password, byte[] blindScalar) throws GeneralSecurityException { + byte[] hashedPoint = getHashToCurve(password, LOGIN_DOMAIN_SEPARATION_TAG.getBytes(UTF_8)); + + X9ECParameters params = CustomNamedCurves.getByName(CURVE_NAME); + ECCurve curve = params.getCurve(); + + ECPoint point = curve.decodePoint(hashedPoint); + BigInteger scalar = new BigInteger(1, blindScalar); + + return point.multiply(scalar).getEncoded(true); + } + + public static byte[] expand(byte[] keyMaterial, byte[] info, int size) + throws GeneralSecurityException { + return Hkdf.computeHkdf(HMAC_SHA256, keyMaterial, new byte[0], info, size); + } + + public static byte[] stretch(byte[] input) throws GeneralSecurityException { + // Stretches the OPRF evaluation using Argon2 (a memory-hard KDF). + // This is computationally expensive by design to protect against offline dictionary attacks. + byte[] salt = null; + try { + salt = expand(input, "Stretch".getBytes(UTF_8), ARGON2_SALT_LENGTH); + Argon2Parameters params = + new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id) + .withSalt(salt) + .withParallelism(ARGON2_THREADS) + .withMemoryAsKB(ARGON2_MEMORY_LIMIT) + .withIterations(ARGON2_ITERATION_COUNT) + .build(); + Argon2BytesGenerator generator = new Argon2BytesGenerator(); + generator.init(params); + byte[] result = new byte[STRETCH_OUTPUT_LENGTH]; + generator.generateBytes(input, result); + return result; + } finally { + if (salt != null) { + Arrays.fill(salt, (byte) 0); + } + } + } + + public static byte[] extract(byte[] inputKeyMaterial) throws GeneralSecurityException { + return expand(inputKeyMaterial, "Extract".getBytes(UTF_8), EXTRACT_OUTPUT_LENGTH); + } + + public static byte[] xorBytes(byte[] a, byte[] b) { + if (a.length != b.length) { + throw new IllegalArgumentException("Byte arrays must have same length"); + } + byte[] result = new byte[a.length]; + for (int i = 0; i < a.length; i++) { + result[i] = (byte) (a[i] ^ b[i]); + } + return result; + } + + public static byte[] concat(byte[]... arrays) { + int totalLength = 0; + for (byte[] array : arrays) { + totalLength += array.length; + } + byte[] result = new byte[totalLength]; + int currentIndex = 0; + for (byte[] array : arrays) { + System.arraycopy(array, 0, result, currentIndex, array.length); + currentIndex += array.length; + } + return result; + } + + public static byte[] mac(byte[] key, byte[] data) throws GeneralSecurityException { + byte[] result = hmacSha256(key, data); + byte[] truncated = new byte[MAC_TAG_LENGTH]; + System.arraycopy(result, 0, truncated, 0, MAC_TAG_LENGTH); + return truncated; + } + + public static byte[] finalize(byte[] blind, byte[] evaluatedMessage) + throws GeneralSecurityException { + BigInteger blindBigInt = new BigInteger(1, blind); + X9ECParameters params = CustomNamedCurves.getByName(CURVE_NAME); + BigInteger order = params.getN(); + BigInteger inverseBlind = blindBigInt.modInverse(order); + + ECCurve curve = params.getCurve(); + ECPoint evaluatedPoint = curve.decodePoint(evaluatedMessage); + + return evaluatedPoint.multiply(inverseBlind).getEncoded(true); + } + + public static byte[] diffieHellman(byte[] privateKey, byte[] peerPublicKey) + throws GeneralSecurityException { + X9ECParameters params = CustomNamedCurves.getByName(CURVE_NAME); + ECCurve curve = params.getCurve(); + ECPoint peerPublicPoint = curve.decodePoint(peerPublicKey); + BigInteger priv = new BigInteger(1, privateKey); + return peerPublicPoint.multiply(priv).getEncoded(true); + } + + public static byte[] randomOracleSha256(byte[] x, BigInteger max) + throws GeneralSecurityException { + // Implements a random oracle mapping using iterated SHA-256 blocks. + // Iteratively hashes the input and a block counter to generate a large uniformly distributed + // integer, + // which is then reduced modulo 'max'. + int hashOutputLength = 256; + int outputBitLength = max.bitLength() + hashOutputLength; + int iterCount = (int) Math.ceil((double) outputBitLength / hashOutputLength); + if (iterCount * hashOutputLength > 130048) { + throw new GeneralSecurityException("the domain bit length must not be greater than 130048"); + } + int excessBitCount = (iterCount * hashOutputLength) - outputBitLength; + BigInteger hashOutput = BigInteger.ZERO; + + for (int i = 1; i <= iterCount; i++) { + hashOutput = hashOutput.shiftLeft(hashOutputLength); + byte[] iBytes = new byte[] {(byte) i}; + + byte[] bignumBytes = concat(iBytes, x); + byte[] hashedString; + try { + hashedString = sha256(bignumBytes); + } finally { + Arrays.fill(bignumBytes, (byte) 0); + } + + // Ensure hashedString is treated as a positive integer + BigInteger newBigNum = new BigInteger(1, hashedString); + Arrays.fill(hashedString, (byte) 0); + + hashOutput = hashOutput.add(newBigNum); + } + + hashOutput = hashOutput.shiftRight(excessBitCount); + hashOutput = hashOutput.mod(max); + + byte[] scalarBytes = new byte[hashOutputLength / 8]; + byte[] hashOutputBytes = hashOutput.toByteArray(); + + try { + // Copy into 32 byte array + if (hashOutputBytes.length <= scalarBytes.length) { + System.arraycopy( + hashOutputBytes, + 0, + scalarBytes, + scalarBytes.length - hashOutputBytes.length, + hashOutputBytes.length); + } else { + // If hashOutputBytes is 33 bytes due to sign bit + System.arraycopy( + hashOutputBytes, + hashOutputBytes.length - scalarBytes.length, + scalarBytes, + 0, + scalarBytes.length); + } + return scalarBytes; + } finally { + Arrays.fill(hashOutputBytes, (byte) 0); + } + } + + public static byte[][] generateKeyPair(byte[] deriveInput) throws GeneralSecurityException { + X9ECParameters params = CustomNamedCurves.getByName(CURVE_NAME); + BigInteger order = params.getN(); + byte[] privateKeyBytes = randomOracleSha256(deriveInput, order); + BigInteger privateKey = new BigInteger(1, privateKeyBytes); + + if (privateKey.equals(BigInteger.ZERO)) { + privateKey = BigInteger.ONE; + privateKeyBytes = new byte[32]; + privateKeyBytes[31] = 1; + } + ECPoint publicKey = params.getG().multiply(privateKey); + return new byte[][] {privateKeyBytes, publicKey.getEncoded(true)}; + } +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/SpannerOmniCredentials.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/SpannerOmniCredentials.java new file mode 100644 index 000000000000..cc819b084e27 --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/SpannerOmniCredentials.java @@ -0,0 +1,156 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni; + +import com.google.api.core.InternalApi; +import com.google.auth.oauth2.AccessToken; +import com.google.auth.oauth2.GoogleCredentials; +import com.google.common.base.Preconditions; +import com.google.crypto.tink.util.SecretBytes; +import io.grpc.ManagedChannel; +import io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder; +import io.grpc.netty.shaded.io.netty.handler.ssl.SslContext; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.CharBuffer; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Base64; +import java.util.Date; +import java.util.concurrent.TimeUnit; +import java.util.logging.Logger; + +/** + * Credentials implementation for Spanner Omni. Uses the OPAQUE protocol to authenticate and fetches + * short-lived access tokens. + */ +public class SpannerOmniCredentials extends GoogleCredentials { + private static final Logger logger = Logger.getLogger(SpannerOmniCredentials.class.getName()); + + private final String username; + private final SecretBytes password; + private String target; + private boolean usePlainText = false; + private SslContext sslContext = null; + + public static SecretBytes convertToSecretBytes(char[] passwordChars) { + byte[] passwordBytes = null; + ByteBuffer byteBuffer = null; + try { + CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder(); + CharBuffer charBuffer = CharBuffer.wrap(passwordChars); + byteBuffer = ByteBuffer.allocate((int) (encoder.maxBytesPerChar() * charBuffer.remaining())); + encoder.encode(charBuffer, byteBuffer, true); + encoder.flush(byteBuffer); + byteBuffer.flip(); + passwordBytes = new byte[byteBuffer.remaining()]; + byteBuffer.get(passwordBytes); + return SecretBytes.copyFrom( + passwordBytes, com.google.crypto.tink.InsecureSecretKeyAccess.get()); + } finally { + if (byteBuffer != null) { + Arrays.fill(byteBuffer.array(), (byte) 0); + } + if (passwordBytes != null) { + Arrays.fill(passwordBytes, (byte) 0); + } + Arrays.fill(passwordChars, '\0'); + } + } + + public SpannerOmniCredentials(String username, SecretBytes password, String target) { + this.username = Preconditions.checkNotNull(username); + this.password = Preconditions.checkNotNull(password); + Preconditions.checkNotNull(target); + + // Parse target and initialize settings. If target starts with http://, use plaintext. + if (target.startsWith("http://")) { + this.target = target.substring(7); + this.usePlainText = true; + } else if (target.startsWith("https://")) { + this.target = target.substring(8); + } else { + this.target = target; + } + } + + @InternalApi + public void initChannel(boolean usePlainText, SslContext sslContext) { + logger.info( + "initChannel called: usePlainText=" + + usePlainText + + ", sslContext=" + + (sslContext != null ? "non-null" : "null") + + ", target=" + + target); + this.usePlainText = usePlainText; + this.sslContext = sslContext; + } + + @Override + public AccessToken refreshAccessToken() throws IOException { + // Create a new gRPC channel for every token refresh. We don't reuse a persistent channel + // because token refresh happens infrequently (e.g. once an hour) and keeping a long-lived + // connection open can lead to resource leaks (threads, TCP connections) if the credentials + // object is discarded without explicit shutdown. + ManagedChannel loginChannel = null; + try { + NettyChannelBuilder builder = NettyChannelBuilder.forTarget(this.target); + if (this.usePlainText) { + builder.usePlaintext(); + } else if (this.sslContext != null) { + builder.sslContext(this.sslContext); + } + loginChannel = builder.build(); + + LoginClient loginClient = new LoginClient(loginChannel); + Login.AccessToken protoToken = loginClient.login(username, password); + String tokenValue = Base64.getEncoder().encodeToString(protoToken.toByteArray()); + + long expireTimeMillis; + if (protoToken.hasExpirationTime()) { + expireTimeMillis = + protoToken.getExpirationTime().getSeconds() * 1000 + + protoToken.getExpirationTime().getNanos() / 1000000; + } else { + expireTimeMillis = System.currentTimeMillis() + TimeUnit.MINUTES.toMillis(60); + } + + return new AccessToken(tokenValue, new Date(expireTimeMillis)); + } catch (Exception e) { + if (e instanceof InterruptedException || e.getCause() instanceof InterruptedException) { + Thread.currentThread().interrupt(); + } + throw new IOException("Failed to login to Spanner Omni", e); + } finally { + // Ensure the channel is shut down immediately after the token is fetched + // to avoid leaking any Netty threads or HTTP/2 connections. + if (loginChannel != null) { + loginChannel.shutdown(); + try { + if (!loginChannel.awaitTermination(5, TimeUnit.SECONDS)) { + loginChannel.shutdownNow(); + } + } catch (InterruptedException e) { + loginChannel.shutdownNow(); + Thread.currentThread().interrupt(); + } + } + } + } +} diff --git a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/testing/SpannerOmniHelper.java b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/testing/SpannerOmniHelper.java index 875c5f38daaa..463c485ca737 100644 --- a/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/testing/SpannerOmniHelper.java +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/testing/SpannerOmniHelper.java @@ -26,6 +26,8 @@ public class SpannerOmniHelper { private static final String USE_MTLS = "spanner.mtls"; private static final String CLIENT_CERT_PATH = "spanner.client_cert_path"; private static final String CLIENT_CERT_KEY_PATH = "spanner.client_cert_key_path"; + private static final String USERNAME = "spanner.username"; + private static final String PASSWORD = "spanner.password"; /** * Checks whether the Spanner Omni host is being used. This is done by checking if the @@ -40,6 +42,14 @@ public static boolean isSpannerOmni() { public static void appendSpannerOmniProperties(StringBuilder uri) { uri.append(";type=omni"); + String username = System.getProperty(USERNAME, ""); + String password = System.getProperty(PASSWORD, ""); + if (!Strings.isNullOrEmpty(username)) { + uri.append(";username=").append(username); + } + if (!Strings.isNullOrEmpty(password)) { + uri.append(";password=").append(password); + } if (isMtlsSetup()) { String clientCertificate = System.getProperty(CLIENT_CERT_PATH, ""); String clientKey = System.getProperty(CLIENT_CERT_KEY_PATH, ""); @@ -61,6 +71,11 @@ public static void setSpannerOmniOptions(SpannerOptions.Builder builder) { boolean usePlainText = Boolean.getBoolean(USE_PLAIN_TEXT); builder.setHost(omniEndpoint); builder.setType(SpannerOptions.InstanceType.OMNI); + String username = System.getProperty(USERNAME, ""); + String password = System.getProperty(PASSWORD, ""); + if (!Strings.isNullOrEmpty(username) && !Strings.isNullOrEmpty(password)) { + builder.login(username, password.toCharArray()); + } if (usePlainText) { builder.usePlainText(); } diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerOptionsTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerOptionsTest.java index e789b0136310..04080438960d 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerOptionsTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/SpannerOptionsTest.java @@ -19,6 +19,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -43,6 +44,7 @@ import com.google.cloud.spanner.SpannerOptions.SpannerCallContextTimeoutConfigurator; import com.google.cloud.spanner.admin.database.v1.stub.DatabaseAdminStubSettings; import com.google.cloud.spanner.admin.instance.v1.stub.InstanceAdminStubSettings; +import com.google.cloud.spanner.omni.SpannerOmniCredentials; import com.google.cloud.spanner.v1.stub.SpannerStubSettings; import com.google.common.base.Strings; import com.google.spanner.v1.BatchCreateSessionsRequest; @@ -1434,4 +1436,20 @@ public void testOmniEnforcedInConstructor() { assertEquals( Duration.ofSeconds(42), options.getSessionPoolOptions().getAcquireSessionTimeout()); } + + @Test + public void testLogin() { + SpannerOptions.Builder builder = + SpannerOptions.newBuilder() + .setHost("http://localhost:15000") + .setType(SpannerOptions.InstanceType.OMNI); + char[] password = new char[] {'p', 'a', 's', 's', 'w', 'o', 'r', 'd'}; + builder.login("user", password); + + // Password array should be cleared + assertArrayEquals(new char[] {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'}, password); + + SpannerOptions options = builder.build(); + assertTrue(options.getCredentials() instanceof SpannerOmniCredentials); + } } diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java index e45e2869e4d5..df2050084c9f 100644 --- a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/connection/ConnectionOptionsTest.java @@ -40,6 +40,7 @@ import com.google.cloud.spanner.Spanner; import com.google.cloud.spanner.SpannerException; import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.omni.SpannerOmniCredentials; import com.google.common.collect.ImmutableMap; import com.google.common.io.BaseEncoding; import com.google.common.io.Files; @@ -1345,6 +1346,29 @@ public void testInstanceType() { optionsWithOmniType.getSessionPoolOptions().getUseMultiplexedSessionPartitionedOps()); } + @Test + public void testBuildWithOmniCredentialsProperties() { + ConnectionOptions options = + ConnectionOptions.newBuilder() + .setUri( + "spanner://localhost:15000/projects/default/instances/default/databases/singers-db;usePlainText=true;type=omni;username=test_user;password=test_pass") + .build(); + assertEquals(SpannerOptions.InstanceType.OMNI, options.getInstanceType()); + assertTrue(options.isSpannerOmni()); + assertTrue(options.getCredentials() instanceof SpannerOmniCredentials); + } + + @Test + public void testBuildWithOmniCredentialsPropertiesMissingPassword() { + ConnectionOptions options = + ConnectionOptions.newBuilder() + .setUri( + "spanner://localhost:15000/projects/default/instances/default/databases/singers-db;usePlainText=true;type=omni;username=test_user") + .build(); + assertEquals(SpannerOptions.InstanceType.OMNI, options.getInstanceType()); + assertTrue(options.isSpannerOmni()); + } + @Test public void testInvalidInstanceType() { assertThrows( diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/LoginClientTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/LoginClientTest.java new file mode 100644 index 000000000000..c413979768d8 --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/LoginClientTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni; + +import static org.junit.Assert.assertNotNull; + +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class LoginClientTest { + + @Test + public void testConstructor() { + ManagedChannel channel = + ManagedChannelBuilder.forTarget("localhost:15000").usePlaintext().build(); + LoginClient client = new LoginClient(channel); + assertNotNull(client); + } +} diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/OpaqueUtilTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/OpaqueUtilTest.java new file mode 100644 index 000000000000..50f53001638b --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/OpaqueUtilTest.java @@ -0,0 +1,581 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import com.google.cloud.spanner.omni.opaque.OpaqueUtil; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.util.Arrays; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.ec.CustomNamedCurves; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.math.ec.ECPoint; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class OpaqueUtilTest { + + @Test + public void testNonce() { + byte[] nonce1 = OpaqueUtil.nonce(); + byte[] nonce2 = OpaqueUtil.nonce(); + assertEquals(16, nonce1.length); + assertEquals(16, nonce2.length); + assertTrue(!Arrays.equals(nonce1, nonce2)); + } + + @Test + public void testConcat() { + byte[] a = new byte[] {1, 2}; + byte[] b = new byte[] {3, 4, 5}; + byte[] result = OpaqueUtil.concat(a, b); + assertArrayEquals(new byte[] {1, 2, 3, 4, 5}, result); + } + + @Test + public void testRandomOracleSha256() throws Exception { + BigInteger max = new BigInteger(String.valueOf(Long.MAX_VALUE)); + byte[][] inputs = + new byte[][] { + "key".getBytes(StandardCharsets.UTF_8), + "key2".getBytes(StandardCharsets.UTF_8), + new byte[] {97, 97, 98, 99, 100, 101} + }; + for (byte[] input : inputs) { + byte[] expectedOutput = OpaqueUtil.randomOracleSha256(input, max); + for (int i = 0; i < 1000; i++) { + byte[] output = OpaqueUtil.randomOracleSha256(input, max); + assertArrayEquals(expectedOutput, output); + assertEquals(32, output.length); + } + } + } + + @Test + public void testMac() throws Exception { + byte[][] keys = + new byte[][] { + "key".getBytes(StandardCharsets.UTF_8), + "key".getBytes(StandardCharsets.UTF_8), + new byte[] {97, 97, 98, 99, 100, 101} + }; + byte[][] data = + new byte[][] { + "data".getBytes(StandardCharsets.UTF_8), + "data2".getBytes(StandardCharsets.UTF_8), + new byte[] {102, 103, 104, 105, 106, 107} + }; + for (int i = 0; i < keys.length; i++) { + byte[] mac1 = OpaqueUtil.mac(keys[i], data[i]); + byte[] mac2 = OpaqueUtil.mac(keys[i], data[i]); + assertArrayEquals(mac1, mac2); + assertEquals(16, mac1.length); + } + } + + @Test + public void testXorBytes() { + byte[][] inputs = + new byte[][] { + "abc".getBytes(StandardCharsets.UTF_8), + new byte[] {97, 97, 98, 99, 100, 101}, + new byte[] {97, 97, 98, 99, 100, 101}, + new byte[0] + }; + byte[][] masks = + new byte[][] { + "def".getBytes(StandardCharsets.UTF_8), + new byte[] {102, 103, 104, 105, 106, 107}, + new byte[] {0, 0, 0, 0, 0, 0}, + new byte[0] + }; + for (int i = 0; i < inputs.length; i++) { + byte[] xored = OpaqueUtil.xorBytes(inputs[i], masks[i]); + assertEquals(inputs[i].length, xored.length); + byte[] original = OpaqueUtil.xorBytes(xored, masks[i]); + assertArrayEquals(inputs[i], original); + } + + try { + OpaqueUtil.xorBytes( + "abc".getBytes(StandardCharsets.UTF_8), "defghi".getBytes(StandardCharsets.UTF_8)); + fail("Expected IllegalArgumentException"); + } catch (IllegalArgumentException e) { + // Expected + } + } + + @Test + public void testDeriveKeyPair() throws Exception { + byte[][] seeds = + new byte[][] { + "seed".getBytes(StandardCharsets.UTF_8), + "seed2".getBytes(StandardCharsets.UTF_8), + "seed".getBytes(StandardCharsets.UTF_8), + "seed".getBytes(StandardCharsets.UTF_8), + "seed".getBytes(StandardCharsets.UTF_8) + }; + byte[][] infos = + new byte[][] { + "info".getBytes(StandardCharsets.UTF_8), + "info".getBytes(StandardCharsets.UTF_8), + "info2".getBytes(StandardCharsets.UTF_8), + "info2".getBytes(StandardCharsets.UTF_8), + "info2".getBytes(StandardCharsets.UTF_8) + }; + byte[][] seeds2 = + new byte[][] { + "seed".getBytes(StandardCharsets.UTF_8), + "seed2".getBytes(StandardCharsets.UTF_8), + "seed".getBytes(StandardCharsets.UTF_8), + "different".getBytes(StandardCharsets.UTF_8), + "seed".getBytes(StandardCharsets.UTF_8) + }; + byte[][] infos2 = + new byte[][] { + "info".getBytes(StandardCharsets.UTF_8), + "info".getBytes(StandardCharsets.UTF_8), + "info2".getBytes(StandardCharsets.UTF_8), + "info2".getBytes(StandardCharsets.UTF_8), + "info1".getBytes(StandardCharsets.UTF_8) + }; + boolean[] wantDifferent = new boolean[] {false, false, false, true, true}; + + for (int i = 0; i < seeds.length; i++) { + byte[] deriveInput1 = OpaqueUtil.expand(seeds[i], infos[i], 32); + byte[][] keyPair1 = OpaqueUtil.generateKeyPair(deriveInput1); + + byte[] deriveInput2 = OpaqueUtil.expand(seeds2[i], infos2[i], 32); + byte[][] keyPair2 = OpaqueUtil.generateKeyPair(deriveInput2); + + if (wantDifferent[i]) { + assertTrue(!Arrays.equals(keyPair1[0], keyPair2[0])); + assertTrue(!Arrays.equals(keyPair1[1], keyPair2[1])); + } else { + assertArrayEquals(keyPair1[0], keyPair2[0]); + assertArrayEquals(keyPair1[1], keyPair2[1]); + } + } + } + + @Test + public void testStretch() throws Exception { + byte[] longInput = new byte[1024]; + for (int i = 0; i < longInput.length; i++) { + longInput[i] = (byte) i; + } + + byte[][] inputs = + new byte[][] { + new byte[0], + "input".getBytes(StandardCharsets.UTF_8), + new byte[] {97, 97, 98, 99, 100, 101}, + longInput + }; + + byte[][] expectedOutputs = + new byte[][] { + new byte[] { + 58, + 79, + 24, + (byte) 130, + 103, + (byte) 150, + 112, + 31, + (byte) 225, + 5, + 114, + 28, + (byte) 242, + (byte) 137, + 98, + 117, + (byte) 167, + 104, + (byte) 218, + (byte) 239, + 25, + (byte) 212, + 74, + (byte) 212, + 113, + (byte) 147, + (byte) 148, + 46, + 59, + (byte) 221, + (byte) 252, + (byte) 143 + }, + new byte[] { + (byte) 206, + (byte) 152, + (byte) 222, + (byte) 237, + 64, + 101, + (byte) 230, + (byte) 180, + (byte) 153, + 2, + (byte) 150, + (byte) 231, + (byte) 211, + 0, + 4, + (byte) 139, + (byte) 220, + (byte) 255, + 41, + (byte) 134, + (byte) 215, + (byte) 211, + 28, + 84, + 55, + (byte) 192, + (byte) 152, + (byte) 188, + 125, + (byte) 204, + (byte) 217, + 33 + }, + new byte[] { + (byte) 218, + (byte) 137, + (byte) 175, + 71, + 100, + (byte) 236, + (byte) 151, + (byte) 150, + 23, + 63, + 116, + 6, + (byte) 250, + 111, + (byte) 152, + 19, + 101, + 6, + 8, + 87, + 98, + (byte) 215, + 110, + 90, + 46, + 106, + 79, + (byte) 225, + 89, + (byte) 247, + 115, + 104 + }, + new byte[] { + 40, + (byte) 142, + (byte) 197, + (byte) 252, + 20, + 122, + 126, + 93, + (byte) 205, + 3, + 122, + (byte) 181, + (byte) 159, + (byte) 241, + 108, + (byte) 153, + (byte) 139, + (byte) 172, + 35, + (byte) 182, + 9, + 59, + (byte) 165, + 48, + 48, + 29, + 9, + (byte) 169, + 99, + (byte) 186, + (byte) 242, + 97 + } + }; + + for (int i = 0; i < inputs.length; i++) { + byte[] stretched = OpaqueUtil.stretch(inputs[i]); + assertEquals(32, stretched.length); + assertArrayEquals("Failed on index " + i, expectedOutputs[i], stretched); + } + } + + @Test + public void testDiffieHellman() throws Exception { + byte[][] serverSeeds = + new byte[][] { + new byte[0], + "server-seed".getBytes(StandardCharsets.UTF_8), + "server-seed2".getBytes(StandardCharsets.UTF_8), + "no-need-to-be-the-same-length".getBytes(StandardCharsets.UTF_8) + }; + byte[][] clientSeeds = + new byte[][] { + new byte[0], + "client-seed".getBytes(StandardCharsets.UTF_8), + "client-seed2".getBytes(StandardCharsets.UTF_8), + "im-a-shorter-seed".getBytes(StandardCharsets.UTF_8) + }; + + for (int i = 0; i < serverSeeds.length; i++) { + byte[] serverDeriveInput = + OpaqueUtil.expand( + serverSeeds[i], + "OPAQUE-DeriveDiffieHellmanKeyPair".getBytes(StandardCharsets.UTF_8), + 32); + byte[][] serverKeyPair = OpaqueUtil.generateKeyPair(serverDeriveInput); + + byte[] clientDeriveInput = + OpaqueUtil.expand( + clientSeeds[i], + "OPAQUE-DeriveDiffieHellmanKeyPair".getBytes(StandardCharsets.UTF_8), + 32); + byte[][] clientKeyPair = OpaqueUtil.generateKeyPair(clientDeriveInput); + + byte[] serverSharedSecret = OpaqueUtil.diffieHellman(serverKeyPair[0], clientKeyPair[1]); + byte[] clientSharedSecret = OpaqueUtil.diffieHellman(clientKeyPair[0], serverKeyPair[1]); + + assertArrayEquals(serverSharedSecret, clientSharedSecret); + } + } + + @Test + public void testExtract() throws Exception { + byte[] longInput = new byte[1024]; + for (int i = 0; i < longInput.length; i++) { + longInput[i] = (byte) i; + } + + byte[][] inputs = + new byte[][] { + new byte[0], + "input".getBytes(StandardCharsets.UTF_8), + new byte[] {97, 97, 98, 99, 100, 101}, + longInput + }; + + byte[][] expectedOutputs = + new byte[][] { + new byte[] { + 99, + (byte) 252, + (byte) 241, + 111, + 84, + (byte) 209, + (byte) 178, + (byte) 181, + 88, + 96, + 91, + (byte) 194, + (byte) 149, + 79, + (byte) 240, + (byte) 143, + (byte) 252, + 68, + (byte) 135, + (byte) 177, + 69, + (byte) 144, + 33, + 115, + (byte) 195, + (byte) 224, + 100, + 31, + 46, + (byte) 160, + (byte) 150, + 41 + }, + new byte[] { + 94, + 113, + 123, + 114, + (byte) 170, + (byte) 250, + (byte) 213, + (byte) 241, + (byte) 247, + (byte) 203, + (byte) 160, + (byte) 141, + 111, + (byte) 233, + 68, + (byte) 240, + 123, + 33, + (byte) 207, + (byte) 139, + 115, + 44, + (byte) 249, + (byte) 217, + 77, + 34, + 6, + (byte) 254, + 77, + 75, + 20, + 99 + }, + new byte[] { + 48, + 112, + (byte) 244, + 9, + 53, + 2, + 10, + (byte) 147, + (byte) 218, + (byte) 132, + 43, + (byte) 198, + (byte) 200, + 101, + 20, + 3, + 71, + (byte) 158, + (byte) 227, + 3, + (byte) 161, + 15, + (byte) 215, + 112, + (byte) 251, + (byte) 195, + (byte) 187, + 96, + 11, + (byte) 203, + (byte) 226, + (byte) 210 + }, + new byte[] { + (byte) 246, + (byte) 148, + (byte) 220, + 16, + 96, + 62, + 53, + (byte) 189, + 96, + 83, + (byte) 146, + 84, + (byte) 233, + (byte) 183, + 89, + 12, + (byte) 235, + 31, + 24, + 113, + (byte) 148, + 25, + (byte) 213, + 33, + (byte) 167, + 78, + (byte) 147, + (byte) 162, + (byte) 223, + 115, + 38, + 117 + } + }; + + for (int i = 0; i < inputs.length; i++) { + byte[] extracted = OpaqueUtil.extract(inputs[i]); + assertEquals(32, extracted.length); + assertArrayEquals(expectedOutputs[i], extracted); + } + } + + @Test + public void testOpfrEvaluate() throws Exception { + String username = "username"; + byte[] password = "password1234".getBytes(StandardCharsets.UTF_8); + byte[] oprfSeed = OpaqueUtil.nonce(); + byte[] seed = + OpaqueUtil.expand(oprfSeed, (username + "OprfKey").getBytes(StandardCharsets.UTF_8), 32); + + byte[] deriveInput = + OpaqueUtil.expand(seed, "OPAQUE-DeriveKeyPair".getBytes(StandardCharsets.UTF_8), 32); + byte[][] keyPair = OpaqueUtil.generateKeyPair(deriveInput); + byte[] serverPrivateKey = keyPair[0]; + + byte[] blind = new byte[32]; + new SecureRandom().nextBytes(blind); + byte[] blindedElement = OpaqueUtil.blind(password, blind); + + // Server blindEvaluate + X9ECParameters params = CustomNamedCurves.getByName(OpaqueUtil.CURVE_NAME); + ECCurve curve = params.getCurve(); + ECPoint blindElement = curve.decodePoint(blindedElement); + BigInteger scalar = new BigInteger(1, serverPrivateKey); + byte[] evaluatedElement = blindElement.multiply(scalar).getEncoded(true); + + byte[] oprf = OpaqueUtil.finalize(blind, evaluatedElement); + + // Evaluate non-obliviously + byte[] inputElement = + OpaqueUtil.getHashToCurve( + password, OpaqueUtil.LOGIN_DOMAIN_SEPARATION_TAG.getBytes(StandardCharsets.UTF_8)); + ECPoint point = curve.decodePoint(inputElement); + byte[] prf = point.multiply(scalar).getEncoded(true); + + assertArrayEquals(oprf, prf); + } +} diff --git a/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/SpannerOmniCredentialsTest.java b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/SpannerOmniCredentialsTest.java new file mode 100644 index 000000000000..69219f2f3c28 --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/SpannerOmniCredentialsTest.java @@ -0,0 +1,59 @@ +/* + * Copyright 2026 Google LLC + * + * 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. + */ + +package com.google.cloud.spanner.omni; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertNotNull; + +import com.google.crypto.tink.util.SecretBytes; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +@RunWith(JUnit4.class) +public class SpannerOmniCredentialsTest { + + @Test + public void testConvertToSecretBytesClearsPassword() { + char[] password = new char[] {'h', 'e', 'l', 'l', 'o'}; + SecretBytes secretBytes = SpannerOmniCredentials.convertToSecretBytes(password); + + assertNotNull(secretBytes); + // Password array should be cleared to null characters + assertArrayEquals(new char[] {'\0', '\0', '\0', '\0', '\0'}, password); + } + + @Test + public void testConstructorParsesTarget() { + char[] password = new char[] {'p', 'a', 's', 's'}; + SecretBytes secretBytes = SpannerOmniCredentials.convertToSecretBytes(password); + + SpannerOmniCredentials creds1 = + new SpannerOmniCredentials("user1", secretBytes, "http://localhost:15000"); + // Verify target parsed (we can't easily verify private fields but this validates it doesn't + // crash) + assertNotNull(creds1); + + SpannerOmniCredentials creds2 = + new SpannerOmniCredentials("user1", secretBytes, "https://localhost:15000"); + assertNotNull(creds2); + + SpannerOmniCredentials creds3 = + new SpannerOmniCredentials("user1", secretBytes, "localhost:15000"); + assertNotNull(creds3); + } +}