From d415ce10c6678e9a71a49fdc1056793a292d5c9d Mon Sep 17 00:00:00 2001 From: sagnghos Date: Mon, 15 Jun 2026 10:52:41 +0000 Subject: [PATCH 1/9] feat(spanner): auth login support for Spanner Omni endpoints --- java-spanner/google-cloud-spanner/pom.xml | 10 + .../google/cloud/spanner/SpannerOptions.java | 39 +- .../spanner/connection/ConnectionOptions.java | 18 + .../connection/ConnectionProperties.java | 14 + .../cloud/spanner/omni/Authentication.java | 1448 +++ .../com/google/cloud/spanner/omni/Login.java | 8119 +++++++++++++++++ .../cloud/spanner/omni/LoginClient.java | 405 + .../cloud/spanner/omni/LoginServiceGrpc.java | 348 + .../google/cloud/spanner/omni/OpaqueUtil.java | 413 + .../spanner/omni/SpannerOmniCredentials.java | 154 + .../spanner/testing/SpannerOmniHelper.java | 15 + .../cloud/spanner/SpannerOptionsTest.java | 18 + .../connection/ConnectionOptionsTest.java | 24 + .../cloud/spanner/omni/LoginClientTest.java | 37 + .../cloud/spanner/omni/OpaqueUtilTest.java | 581 ++ .../omni/SpannerOmniCredentialsTest.java | 59 + 16 files changed, 11701 insertions(+), 1 deletion(-) create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Authentication.java create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/Login.java create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginClient.java create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/LoginServiceGrpc.java create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/OpaqueUtil.java create mode 100644 java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/SpannerOmniCredentials.java create mode 100644 java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/LoginClientTest.java create mode 100644 java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/OpaqueUtilTest.java create mode 100644 java-spanner/google-cloud-spanner/src/test/java/com/google/cloud/spanner/omni/SpannerOmniCredentialsTest.java 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..ba3a1f73c89d --- /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..dc67e7dbd39b --- /dev/null +++ b/java-spanner/google-cloud-spanner/src/main/java/com/google/cloud/spanner/omni/SpannerOmniCredentials.java @@ -0,0 +1,154 @@ +/* + * 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; + try { + CharsetEncoder encoder = StandardCharsets.UTF_8.newEncoder(); + CharBuffer charBuffer = CharBuffer.wrap(passwordChars); + ByteBuffer 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); + Arrays.fill(byteBuffer.array(), (byte) 0); + return SecretBytes.copyFrom( + passwordBytes, com.google.crypto.tink.InsecureSecretKeyAccess.get()); + } finally { + 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..8030c9f73f8b 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)) { + 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); + } +} From 3e5d983e987982c49ee078786aa8871690a7d5a8 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Mon, 15 Jun 2026 12:09:40 +0000 Subject: [PATCH 2/9] added missing zeroed out logic --- .../java/com/google/cloud/spanner/omni/LoginClient.java | 4 ++-- .../google/cloud/spanner/omni/SpannerOmniCredentials.java | 8 +++++--- .../google/cloud/spanner/testing/SpannerOmniHelper.java | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) 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 index ba3a1f73c89d..14d2cb0f98d1 100644 --- 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 @@ -129,7 +129,7 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx initialResponse.getOpaqueResponse().getInitialResponse(); ByteString envelope = initialOpaqueResponse.getMaskedResponse(); - if (envelope.size() < 65) { + if (envelope.size() != 65) { throw new GeneralSecurityException("Invalid envelope size: " + envelope.size()); } @@ -233,7 +233,7 @@ private byte[] generateClientMac( OpaqueUtil.xorBytes( initialOpaqueResponse.getMaskedResponse().toByteArray(), credentialResponsePad); ByteString envelope = ByteString.copyFrom(serializedEnvelope); - if (envelope.size() < 65) { + if (envelope.size() != 65) { throw new GeneralSecurityException("Invalid envelope size: " + envelope.size()); } ByteString serverPublicKey = envelope.substring(0, 33); 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 index dc67e7dbd39b..cc819b084e27 100644 --- 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 @@ -50,20 +50,22 @@ public class SpannerOmniCredentials extends GoogleCredentials { 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 = - ByteBuffer.allocate((int) (encoder.maxBytesPerChar() * charBuffer.remaining())); + 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); - Arrays.fill(byteBuffer.array(), (byte) 0); 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); } 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 8030c9f73f8b..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 @@ -73,7 +73,7 @@ public static void setSpannerOmniOptions(SpannerOptions.Builder builder) { builder.setType(SpannerOptions.InstanceType.OMNI); String username = System.getProperty(USERNAME, ""); String password = System.getProperty(PASSWORD, ""); - if (!Strings.isNullOrEmpty(username)) { + if (!Strings.isNullOrEmpty(username) && !Strings.isNullOrEmpty(password)) { builder.login(username, password.toCharArray()); } if (usePlainText) { From 5acd8ad182b99a42588e7335fd819c8674334b73 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Thu, 18 Jun 2026 10:26:16 +0000 Subject: [PATCH 3/9] Spanner Omni Default Credentials shouldn't take from GOOGLE_APPLICATION_CREDENTIALS env var --- .../spanner/connection/ConnectionOptions.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) 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 cccb80c63c00..cbdcf62f14eb 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 @@ -802,13 +802,16 @@ && 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 (isSpannerOmniPattern || isSpannerOmni()) { + if (!Strings.isNullOrEmpty(username) && !Strings.isNullOrEmpty(password)) { + SecretBytes secretBytes = + SpannerOmniCredentials.convertToSecretBytes(password.toCharArray()); + this.credentials = new SpannerOmniCredentials(username, secretBytes, this.host); + } else if (defaultSpannerOmniCredentials != null) { + this.credentials = defaultSpannerOmniCredentials; + } else { + this.credentials = NoCredentials.getInstance(); + } } else if (getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER) != null) { try { this.credentials = getInitialConnectionPropertyValue(CREDENTIALS_PROVIDER).getCredentials(); From 56f84eb6c03569fad4695ba3cd77e986d47f5d6d Mon Sep 17 00:00:00 2001 From: sagnghos Date: Sat, 20 Jun 2026 16:38:22 +0000 Subject: [PATCH 4/9] feat(spanner): implement OPAQUE auth protocol logic in LoginClient --- .../cloud/spanner/omni/Authentication.java | 2082 +++++++++++++++-- .../com/google/cloud/spanner/omni/Login.java | 823 ++++++- .../cloud/spanner/omni/LoginClient.java | 12 +- .../cloud/spanner/omni/LoginServiceGrpc.java | 68 +- .../google/cloud/spanner/omni/OpaqueUtil.java | 22 +- .../cloud/spanner/omni/OpaqueUtilTest.java | 15 +- 6 files changed, 2652 insertions(+), 370 deletions(-) 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 index c8245d6e3d14..0c1c3620d747 100644 --- 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 @@ -13,7 +13,6 @@ * 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 @@ -22,109 +21,1717 @@ final class Authentication { private Authentication() {} - public static void registerAllExtensions(com.google.protobuf.ExtensionRegistryLite registry) {} + 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_SCRAM = 1; */ + PASSWORD_AUTHENTICATION_PROTOCOL_SCRAM(1), + /** 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_SCRAM = 1; */ + public static final int PASSWORD_AUTHENTICATION_PROTOCOL_SCRAM_VALUE = 1; + + /** 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 1: + return PASSWORD_AUTHENTICATION_PROTOCOL_SCRAM; + 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 HashParametersOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.HashParameters) + com.google.protobuf.MessageOrBuilder { + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return Whether the argon2IdParameters field is set. + */ + boolean hasArgon2IdParameters(); + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return The argon2IdParameters. + */ + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + getArgon2IdParameters(); + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParametersOrBuilder + getArgon2IdParametersOrBuilder(); + + public com.google.cloud.spanner.omni.Authentication.HashParameters.ParametersCase + getParametersCase(); + } + + /** Protobuf type {@code google.spanner.auth.v1.HashParameters} */ + public static final class HashParameters extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.HashParameters) + HashParametersOrBuilder { + private static final long serialVersionUID = 0L; + + // Use HashParameters.newBuilder() to construct. + private HashParameters(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private HashParameters() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new HashParameters(); + } + + @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_HashParameters_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.HashParameters.class, + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder.class); + } + + public interface Argon2IdParametersOrBuilder + extends + // @@protoc_insertion_point(interface_extends:google.spanner.auth.v1.HashParameters.Argon2IdParameters) + com.google.protobuf.MessageOrBuilder { + + /** + * uint32 iteration_count = 1; + * + * @return The iterationCount. + */ + int getIterationCount(); + + /** + * uint32 memory_usage = 2; + * + * @return The memoryUsage. + */ + int getMemoryUsage(); + + /** + * uint32 parallelism = 3; + * + * @return The parallelism. + */ + int getParallelism(); + + /** + * uint32 hash_size = 4; + * + * @return The hashSize. + */ + int getHashSize(); + } + + /** Protobuf type {@code google.spanner.auth.v1.HashParameters.Argon2IdParameters} */ + public static final class Argon2IdParameters extends com.google.protobuf.GeneratedMessageV3 + implements + // @@protoc_insertion_point(message_implements:google.spanner.auth.v1.HashParameters.Argon2IdParameters) + Argon2IdParametersOrBuilder { + private static final long serialVersionUID = 0L; + + // Use Argon2IdParameters.newBuilder() to construct. + private Argon2IdParameters(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + + private Argon2IdParameters() {} + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance(UnusedPrivateParameter unused) { + return new Argon2IdParameters(); + } + + @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_HashParameters_Argon2IdParameters_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .class, + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .Builder.class); + } + + public static final int ITERATION_COUNT_FIELD_NUMBER = 1; + private int iterationCount_ = 0; + + /** + * uint32 iteration_count = 1; + * + * @return The iterationCount. + */ + @java.lang.Override + public int getIterationCount() { + return iterationCount_; + } + + public static final int MEMORY_USAGE_FIELD_NUMBER = 2; + private int memoryUsage_ = 0; + + /** + * uint32 memory_usage = 2; + * + * @return The memoryUsage. + */ + @java.lang.Override + public int getMemoryUsage() { + return memoryUsage_; + } + + public static final int PARALLELISM_FIELD_NUMBER = 3; + private int parallelism_ = 0; + + /** + * uint32 parallelism = 3; + * + * @return The parallelism. + */ + @java.lang.Override + public int getParallelism() { + return parallelism_; + } + + public static final int HASH_SIZE_FIELD_NUMBER = 4; + private int hashSize_ = 0; + + /** + * uint32 hash_size = 4; + * + * @return The hashSize. + */ + @java.lang.Override + public int getHashSize() { + return hashSize_; + } + + 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 (iterationCount_ != 0) { + output.writeUInt32(1, iterationCount_); + } + if (memoryUsage_ != 0) { + output.writeUInt32(2, memoryUsage_); + } + if (parallelism_ != 0) { + output.writeUInt32(3, parallelism_); + } + if (hashSize_ != 0) { + output.writeUInt32(4, hashSize_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (iterationCount_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeUInt32Size(1, iterationCount_); + } + if (memoryUsage_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeUInt32Size(2, memoryUsage_); + } + if (parallelism_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeUInt32Size(3, parallelism_); + } + if (hashSize_ != 0) { + size += com.google.protobuf.CodedOutputStream.computeUInt32Size(4, hashSize_); + } + 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.HashParameters.Argon2IdParameters)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters other = + (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) obj; + + if (getIterationCount() != other.getIterationCount()) return false; + if (getMemoryUsage() != other.getMemoryUsage()) return false; + if (getParallelism() != other.getParallelism()) return false; + if (getHashSize() != other.getHashSize()) 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) + ITERATION_COUNT_FIELD_NUMBER; + hash = (53 * hash) + getIterationCount(); + hash = (37 * hash) + MEMORY_USAGE_FIELD_NUMBER; + hash = (53 * hash) + getMemoryUsage(); + hash = (37 * hash) + PARALLELISM_FIELD_NUMBER; + hash = (53 * hash) + getParallelism(); + hash = (37 * hash) + HASH_SIZE_FIELD_NUMBER; + hash = (53 * hash) + getHashSize(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + parseFrom(java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + parseFrom(com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + parseFrom(byte[] data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters + 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.HashParameters.Argon2IdParameters} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.HashParameters.Argon2IdParameters) + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParametersOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .class, + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .Builder.class); + } + + // Construct using + // com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + iterationCount_ = 0; + memoryUsage_ = 0; + parallelism_ = 0; + hashSize_ = 0; + 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_HashParameters_Argon2IdParameters_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + build() { + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters result = + buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + buildPartial() { + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters result = + new com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters( + this); + if (bitField0_ != 0) { + buildPartial0(result); + } + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters result) { + int from_bitField0_ = bitField0_; + if (((from_bitField0_ & 0x00000001) != 0)) { + result.iterationCount_ = iterationCount_; + } + if (((from_bitField0_ & 0x00000002) != 0)) { + result.memoryUsage_ = memoryUsage_; + } + if (((from_bitField0_ & 0x00000004) != 0)) { + result.parallelism_ = parallelism_; + } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.hashSize_ = hashSize_; + } + } + + @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.HashParameters.Argon2IdParameters) { + return mergeFrom( + (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters other) { + if (other + == com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance()) return this; + if (other.getIterationCount() != 0) { + setIterationCount(other.getIterationCount()); + } + if (other.getMemoryUsage() != 0) { + setMemoryUsage(other.getMemoryUsage()); + } + if (other.getParallelism() != 0) { + setParallelism(other.getParallelism()); + } + if (other.getHashSize() != 0) { + setHashSize(other.getHashSize()); + } + 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: + { + iterationCount_ = input.readUInt32(); + bitField0_ |= 0x00000001; + break; + } // case 8 + case 16: + { + memoryUsage_ = input.readUInt32(); + bitField0_ |= 0x00000002; + break; + } // case 16 + case 24: + { + parallelism_ = input.readUInt32(); + bitField0_ |= 0x00000004; + break; + } // case 24 + case 32: + { + hashSize_ = input.readUInt32(); + bitField0_ |= 0x00000008; + break; + } // case 32 + 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 iterationCount_; + + /** + * uint32 iteration_count = 1; + * + * @return The iterationCount. + */ + @java.lang.Override + public int getIterationCount() { + return iterationCount_; + } + + /** + * uint32 iteration_count = 1; + * + * @param value The iterationCount to set. + * @return This builder for chaining. + */ + public Builder setIterationCount(int value) { + + iterationCount_ = value; + bitField0_ |= 0x00000001; + onChanged(); + return this; + } + + /** + * uint32 iteration_count = 1; + * + * @return This builder for chaining. + */ + public Builder clearIterationCount() { + bitField0_ = (bitField0_ & ~0x00000001); + iterationCount_ = 0; + onChanged(); + return this; + } + + private int memoryUsage_; + + /** + * uint32 memory_usage = 2; + * + * @return The memoryUsage. + */ + @java.lang.Override + public int getMemoryUsage() { + return memoryUsage_; + } + + /** + * uint32 memory_usage = 2; + * + * @param value The memoryUsage to set. + * @return This builder for chaining. + */ + public Builder setMemoryUsage(int value) { + + memoryUsage_ = value; + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** + * uint32 memory_usage = 2; + * + * @return This builder for chaining. + */ + public Builder clearMemoryUsage() { + bitField0_ = (bitField0_ & ~0x00000002); + memoryUsage_ = 0; + onChanged(); + return this; + } + + private int parallelism_; + + /** + * uint32 parallelism = 3; + * + * @return The parallelism. + */ + @java.lang.Override + public int getParallelism() { + return parallelism_; + } + + /** + * uint32 parallelism = 3; + * + * @param value The parallelism to set. + * @return This builder for chaining. + */ + public Builder setParallelism(int value) { + + parallelism_ = value; + bitField0_ |= 0x00000004; + onChanged(); + return this; + } + + /** + * uint32 parallelism = 3; + * + * @return This builder for chaining. + */ + public Builder clearParallelism() { + bitField0_ = (bitField0_ & ~0x00000004); + parallelism_ = 0; + onChanged(); + return this; + } + + private int hashSize_; + + /** + * uint32 hash_size = 4; + * + * @return The hashSize. + */ + @java.lang.Override + public int getHashSize() { + return hashSize_; + } + + /** + * uint32 hash_size = 4; + * + * @param value The hashSize to set. + * @return This builder for chaining. + */ + public Builder setHashSize(int value) { + + hashSize_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + /** + * uint32 hash_size = 4; + * + * @return This builder for chaining. + */ + public Builder clearHashSize() { + bitField0_ = (bitField0_ & ~0x00000008); + hashSize_ = 0; + 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.HashParameters.Argon2IdParameters) + } + + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.HashParameters.Argon2IdParameters) + private static final com.google.cloud.spanner.omni.Authentication.HashParameters + .Argon2IdParameters + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = + new com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters(); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public Argon2IdParameters 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.HashParameters.Argon2IdParameters + getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + } + + private int parametersCase_ = 0; + private java.lang.Object parameters_; + + public enum ParametersCase + implements + com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + ARGON2_ID_PARAMETERS(1), + PARAMETERS_NOT_SET(0); + private final int value; + + private ParametersCase(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 ParametersCase valueOf(int value) { + return forNumber(value); + } + + public static ParametersCase forNumber(int value) { + switch (value) { + case 1: + return ARGON2_ID_PARAMETERS; + case 0: + return PARAMETERS_NOT_SET; + default: + return null; + } + } + + public int getNumber() { + return this.value; + } + }; + + public ParametersCase getParametersCase() { + return ParametersCase.forNumber(parametersCase_); + } + + public static final int ARGON2_ID_PARAMETERS_FIELD_NUMBER = 1; + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return Whether the argon2IdParameters field is set. + */ + @java.lang.Override + public boolean hasArgon2IdParameters() { + return parametersCase_ == 1; + } + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return The argon2IdParameters. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + getArgon2IdParameters() { + if (parametersCase_ == 1) { + return (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_; + } + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParametersOrBuilder + getArgon2IdParametersOrBuilder() { + if (parametersCase_ == 1) { + return (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_; + } + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .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 (parametersCase_ == 1) { + output.writeMessage( + 1, + (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (parametersCase_ == 1) { + size += + com.google.protobuf.CodedOutputStream.computeMessageSize( + 1, + (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_); + } + 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.HashParameters)) { + return super.equals(obj); + } + com.google.cloud.spanner.omni.Authentication.HashParameters other = + (com.google.cloud.spanner.omni.Authentication.HashParameters) obj; + + if (!getParametersCase().equals(other.getParametersCase())) return false; + switch (parametersCase_) { + case 1: + if (!getArgon2IdParameters().equals(other.getArgon2IdParameters())) 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 (parametersCase_) { + case 1: + hash = (37 * hash) + ARGON2_ID_PARAMETERS_FIELD_NUMBER; + hash = (53 * hash) + getArgon2IdParameters().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters parseFrom( + java.nio.ByteBuffer data) throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters 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.HashParameters parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters 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.HashParameters parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + + public static com.google.cloud.spanner.omni.Authentication.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters 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.HashParameters} */ + public static final class Builder + extends com.google.protobuf.GeneratedMessageV3.Builder + implements + // @@protoc_insertion_point(builder_implements:google.spanner.auth.v1.HashParameters) + com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return com.google.cloud.spanner.omni.Authentication + .internal_static_google_spanner_auth_v1_HashParameters_fieldAccessorTable + .ensureFieldAccessorsInitialized( + com.google.cloud.spanner.omni.Authentication.HashParameters.class, + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder.class); + } + + // Construct using com.google.cloud.spanner.omni.Authentication.HashParameters.newBuilder() + private Builder() {} + + private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + } + + @java.lang.Override + public Builder clear() { + super.clear(); + bitField0_ = 0; + if (argon2IdParametersBuilder_ != null) { + argon2IdParametersBuilder_.clear(); + } + parametersCase_ = 0; + parameters_ = null; + 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_HashParameters_descriptor; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters + getDefaultInstanceForType() { + return com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance(); + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters build() { + com.google.cloud.spanner.omni.Authentication.HashParameters result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters buildPartial() { + com.google.cloud.spanner.omni.Authentication.HashParameters result = + new com.google.cloud.spanner.omni.Authentication.HashParameters(this); + if (bitField0_ != 0) { + buildPartial0(result); + } + buildPartialOneofs(result); + onBuilt(); + return result; + } + + private void buildPartial0( + com.google.cloud.spanner.omni.Authentication.HashParameters result) { + int from_bitField0_ = bitField0_; + } + + private void buildPartialOneofs( + com.google.cloud.spanner.omni.Authentication.HashParameters result) { + result.parametersCase_ = parametersCase_; + result.parameters_ = this.parameters_; + if (parametersCase_ == 1 && argon2IdParametersBuilder_ != null) { + result.parameters_ = argon2IdParametersBuilder_.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.Authentication.HashParameters) { + return mergeFrom((com.google.cloud.spanner.omni.Authentication.HashParameters) other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(com.google.cloud.spanner.omni.Authentication.HashParameters other) { + if (other + == com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance()) + return this; + switch (other.getParametersCase()) { + case ARGON2_ID_PARAMETERS: + { + mergeArgon2IdParameters(other.getArgon2IdParameters()); + break; + } + case PARAMETERS_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( + getArgon2IdParametersFieldBuilder().getBuilder(), extensionRegistry); + parametersCase_ = 1; + 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 parametersCase_ = 0; + private java.lang.Object parameters_; + + public ParametersCase getParametersCase() { + return ParametersCase.forNumber(parametersCase_); + } + + public Builder clearParameters() { + parametersCase_ = 0; + parameters_ = null; + onChanged(); + return this; + } + + private int bitField0_; + + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .Builder, + com.google.cloud.spanner.omni.Authentication.HashParameters + .Argon2IdParametersOrBuilder> + argon2IdParametersBuilder_; + + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return Whether the argon2IdParameters field is set. + */ + @java.lang.Override + public boolean hasArgon2IdParameters() { + return parametersCase_ == 1; + } - public static void registerAllExtensions(com.google.protobuf.ExtensionRegistry registry) { - registerAllExtensions((com.google.protobuf.ExtensionRegistryLite) registry); - } + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + * + * @return The argon2IdParameters. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + getArgon2IdParameters() { + if (argon2IdParametersBuilder_ == null) { + if (parametersCase_ == 1) { + return (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_; + } + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } else { + if (parametersCase_ == 1) { + return argon2IdParametersBuilder_.getMessage(); + } + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } + } - /** 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), - ; + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + public Builder setArgon2IdParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters value) { + if (argon2IdParametersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + parameters_ = value; + onChanged(); + } else { + argon2IdParametersBuilder_.setMessage(value); + } + parametersCase_ = 1; + return this; + } - /** PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED = 0; */ - public static final int PASSWORD_AUTHENTICATION_PROTOCOL_UNSPECIFIED_VALUE = 0; + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + public Builder setArgon2IdParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters.Builder + builderForValue) { + if (argon2IdParametersBuilder_ == null) { + parameters_ = builderForValue.build(); + onChanged(); + } else { + argon2IdParametersBuilder_.setMessage(builderForValue.build()); + } + parametersCase_ = 1; + return this; + } - /** PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE = 2; */ - public static final int PASSWORD_AUTHENTICATION_PROTOCOL_OPAQUE_VALUE = 2; + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + public Builder mergeArgon2IdParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters value) { + if (argon2IdParametersBuilder_ == null) { + if (parametersCase_ == 1 + && parameters_ + != com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance()) { + parameters_ = + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .newBuilder( + (com.google.cloud.spanner.omni.Authentication.HashParameters + .Argon2IdParameters) + parameters_) + .mergeFrom(value) + .buildPartial(); + } else { + parameters_ = value; + } + onChanged(); + } else { + if (parametersCase_ == 1) { + argon2IdParametersBuilder_.mergeFrom(value); + } else { + argon2IdParametersBuilder_.setMessage(value); + } + } + parametersCase_ = 1; + return this; + } - public final int getNumber() { - if (this == UNRECOGNIZED) { - throw new java.lang.IllegalArgumentException( - "Can't get the number of an unknown enum value."); + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + public Builder clearArgon2IdParameters() { + if (argon2IdParametersBuilder_ == null) { + if (parametersCase_ == 1) { + parametersCase_ = 0; + parameters_ = null; + onChanged(); + } + } else { + if (parametersCase_ == 1) { + parametersCase_ = 0; + parameters_ = null; + } + argon2IdParametersBuilder_.clear(); + } + return this; } - 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); - } + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters.Builder + getArgon2IdParametersBuilder() { + return getArgon2IdParametersFieldBuilder().getBuilder(); + } - /** - * @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; + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParametersOrBuilder + getArgon2IdParametersOrBuilder() { + if ((parametersCase_ == 1) && (argon2IdParametersBuilder_ != null)) { + return argon2IdParametersBuilder_.getMessageOrBuilder(); + } else { + if (parametersCase_ == 1) { + return (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_; + } + return com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } } - } - public static com.google.protobuf.Internal.EnumLiteMap - internalGetValueMap() { - return internalValueMap; - } + /** + * .google.spanner.auth.v1.HashParameters.Argon2IdParameters argon2_id_parameters = 1; + * + */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .Builder, + com.google.cloud.spanner.omni.Authentication.HashParameters + .Argon2IdParametersOrBuilder> + getArgon2IdParametersFieldBuilder() { + if (argon2IdParametersBuilder_ == null) { + if (!(parametersCase_ == 1)) { + parameters_ = + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .getDefaultInstance(); + } + argon2IdParametersBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .Builder, + com.google.cloud.spanner.omni.Authentication.HashParameters + .Argon2IdParametersOrBuilder>( + (com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters) + parameters_, + getParentForChildren(), + isClean()); + parameters_ = null; + } + parametersCase_ = 1; + onChanged(); + return argon2IdParametersBuilder_; + } - private static final com.google.protobuf.Internal.EnumLiteMap - internalValueMap = - new com.google.protobuf.Internal.EnumLiteMap() { - public PasswordAuthenticationProtocol findValueByNumber(int number) { - return PasswordAuthenticationProtocol.forNumber(number); - } - }; + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } - 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."); + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); } - return getDescriptor().getValues().get(ordinal()); + + // @@protoc_insertion_point(builder_scope:google.spanner.auth.v1.HashParameters) } - public final com.google.protobuf.Descriptors.EnumDescriptor getDescriptorForType() { - return getDescriptor(); + // @@protoc_insertion_point(class_scope:google.spanner.auth.v1.HashParameters) + private static final com.google.cloud.spanner.omni.Authentication.HashParameters + DEFAULT_INSTANCE; + + static { + DEFAULT_INSTANCE = new com.google.cloud.spanner.omni.Authentication.HashParameters(); } - public static final com.google.protobuf.Descriptors.EnumDescriptor getDescriptor() { - return com.google.cloud.spanner.omni.Authentication.getDescriptor().getEnumTypes().get(0); + public static com.google.cloud.spanner.omni.Authentication.HashParameters getDefaultInstance() { + return DEFAULT_INSTANCE; } - private static final PasswordAuthenticationProtocol[] VALUES = values(); + private static final com.google.protobuf.Parser PARSER = + new com.google.protobuf.AbstractParser() { + @java.lang.Override + public HashParameters 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 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()]; + public static com.google.protobuf.Parser parser() { + return PARSER; } - private final int value; - - private PasswordAuthenticationProtocol(int value) { - this.value = value; + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; } - // @@protoc_insertion_point(enum_scope:google.spanner.auth.v1.PasswordAuthenticationProtocol) + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParameters getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } } public interface PasswordAuthenticationHandshakeRequestOrBuilder @@ -615,18 +2222,22 @@ public interface PasswordAuthenticationHandshakeResponseOrBuilder getPasswordAuthenticationProtocol(); /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The userId. + * @return Whether the hashParameters field is set. */ - java.lang.String getUserId(); + boolean hasHashParameters(); /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The bytes for userId. + * @return The hashParameters. */ - com.google.protobuf.ByteString getUserIdBytes(); + com.google.cloud.spanner.omni.Authentication.HashParameters getHashParameters(); + + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder + getHashParametersOrBuilder(); } /** Protobuf type {@code google.spanner.auth.v1.PasswordAuthenticationHandshakeResponse} */ @@ -645,7 +2256,6 @@ private PasswordAuthenticationHandshakeResponse( private PasswordAuthenticationHandshakeResponse() { passwordAuthenticationProtocol_ = 0; - userId_ = ""; } @java.lang.Override @@ -709,45 +2319,38 @@ public int getPasswordAuthenticationProtocolValue() { : result; } - public static final int USER_ID_FIELD_NUMBER = 2; - - @SuppressWarnings("serial") - private volatile java.lang.Object userId_ = ""; + public static final int HASH_PARAMETERS_FIELD_NUMBER = 2; + private com.google.cloud.spanner.omni.Authentication.HashParameters hashParameters_; /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The userId. + * @return Whether the hashParameters field is set. */ @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; - } + public boolean hasHashParameters() { + return hashParameters_ != null; } /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The bytes for userId. + * @return The hashParameters. */ @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; - } + public com.google.cloud.spanner.omni.Authentication.HashParameters getHashParameters() { + return hashParameters_ == null + ? com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance() + : hashParameters_; + } + + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + @java.lang.Override + public com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder + getHashParametersOrBuilder() { + return hashParameters_ == null + ? com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance() + : hashParameters_; } private byte memoizedIsInitialized = -1; @@ -770,8 +2373,8 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) throws java.io .getNumber()) { output.writeEnum(1, passwordAuthenticationProtocol_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { - com.google.protobuf.GeneratedMessageV3.writeString(output, 2, userId_); + if (hashParameters_ != null) { + output.writeMessage(2, getHashParameters()); } getUnknownFields().writeTo(output); } @@ -790,8 +2393,8 @@ public int getSerializedSize() { com.google.protobuf.CodedOutputStream.computeEnumSize( 1, passwordAuthenticationProtocol_); } - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(userId_)) { - size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, userId_); + if (hashParameters_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getHashParameters()); } size += getUnknownFields().getSerializedSize(); memoizedSize = size; @@ -813,7 +2416,10 @@ public boolean equals(final java.lang.Object obj) { obj; if (passwordAuthenticationProtocol_ != other.passwordAuthenticationProtocol_) return false; - if (!getUserId().equals(other.getUserId())) return false; + if (hasHashParameters() != other.hasHashParameters()) return false; + if (hasHashParameters()) { + if (!getHashParameters().equals(other.getHashParameters())) return false; + } if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -827,8 +2433,10 @@ public int hashCode() { 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(); + if (hasHashParameters()) { + hash = (37 * hash) + HASH_PARAMETERS_FIELD_NUMBER; + hash = (53 * hash) + getHashParameters().hashCode(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -988,7 +2596,11 @@ public Builder clear() { super.clear(); bitField0_ = 0; passwordAuthenticationProtocol_ = 0; - userId_ = ""; + hashParameters_ = null; + if (hashParametersBuilder_ != null) { + hashParametersBuilder_.dispose(); + hashParametersBuilder_ = null; + } return this; } @@ -1038,7 +2650,8 @@ private void buildPartial0( result.passwordAuthenticationProtocol_ = passwordAuthenticationProtocol_; } if (((from_bitField0_ & 0x00000002) != 0)) { - result.userId_ = userId_; + result.hashParameters_ = + hashParametersBuilder_ == null ? hashParameters_ : hashParametersBuilder_.build(); } } @@ -1100,10 +2713,8 @@ public Builder mergeFrom( if (other.passwordAuthenticationProtocol_ != 0) { setPasswordAuthenticationProtocolValue(other.getPasswordAuthenticationProtocolValue()); } - if (!other.getUserId().isEmpty()) { - userId_ = other.userId_; - bitField0_ |= 0x00000002; - onChanged(); + if (other.hasHashParameters()) { + mergeHashParameters(other.getHashParameters()); } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); @@ -1139,7 +2750,8 @@ public Builder mergeFrom( } // case 8 case 18: { - userId_ = input.readStringRequireUtf8(); + input.readMessage( + getHashParametersFieldBuilder().getBuilder(), extensionRegistry); bitField0_ |= 0x00000002; break; } // case 18 @@ -1243,87 +2855,137 @@ public Builder clearPasswordAuthenticationProtocol() { return this; } - private java.lang.Object userId_ = ""; + private com.google.cloud.spanner.omni.Authentication.HashParameters hashParameters_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder, + com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder> + hashParametersBuilder_; /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The userId. + * @return Whether the hashParameters field is set. */ - 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; - } + public boolean hasHashParameters() { + return ((bitField0_ & 0x00000002) != 0); } /** - * string user_id = 2; + * .google.spanner.auth.v1.HashParameters hash_parameters = 2; * - * @return The bytes for userId. + * @return The hashParameters. */ - 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; + public com.google.cloud.spanner.omni.Authentication.HashParameters getHashParameters() { + if (hashParametersBuilder_ == null) { + return hashParameters_ == null + ? com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance() + : hashParameters_; } else { - return (com.google.protobuf.ByteString) ref; + return hashParametersBuilder_.getMessage(); } } - /** - * 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(); + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public Builder setHashParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters value) { + if (hashParametersBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + hashParameters_ = value; + } else { + hashParametersBuilder_.setMessage(value); } - 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); + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public Builder setHashParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder builderForValue) { + if (hashParametersBuilder_ == null) { + hashParameters_ = builderForValue.build(); + } else { + hashParametersBuilder_.setMessage(builderForValue.build()); + } + 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(); + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public Builder mergeHashParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters value) { + if (hashParametersBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) + && hashParameters_ != null + && hashParameters_ + != com.google.cloud.spanner.omni.Authentication.HashParameters + .getDefaultInstance()) { + getHashParametersBuilder().mergeFrom(value); + } else { + hashParameters_ = value; + } + } else { + hashParametersBuilder_.mergeFrom(value); } - checkByteStringIsUtf8(value); - userId_ = value; bitField0_ |= 0x00000002; onChanged(); return this; } + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public Builder clearHashParameters() { + bitField0_ = (bitField0_ & ~0x00000002); + hashParameters_ = null; + if (hashParametersBuilder_ != null) { + hashParametersBuilder_.dispose(); + hashParametersBuilder_ = null; + } + onChanged(); + return this; + } + + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public com.google.cloud.spanner.omni.Authentication.HashParameters.Builder + getHashParametersBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getHashParametersFieldBuilder().getBuilder(); + } + + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + public com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder + getHashParametersOrBuilder() { + if (hashParametersBuilder_ != null) { + return hashParametersBuilder_.getMessageOrBuilder(); + } else { + return hashParameters_ == null + ? com.google.cloud.spanner.omni.Authentication.HashParameters.getDefaultInstance() + : hashParameters_; + } + } + + /** .google.spanner.auth.v1.HashParameters hash_parameters = 2; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder, + com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder> + getHashParametersFieldBuilder() { + if (hashParametersBuilder_ == null) { + hashParametersBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.cloud.spanner.omni.Authentication.HashParameters, + com.google.cloud.spanner.omni.Authentication.HashParameters.Builder, + com.google.cloud.spanner.omni.Authentication.HashParametersOrBuilder>( + getHashParameters(), getParentForChildren(), isClean()); + hashParameters_ = null; + } + return hashParametersBuilder_; + } + @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -1396,6 +3058,14 @@ public com.google.protobuf.Parser getPa } } + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_HashParameters_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_HashParameters_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_descriptor; + private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_fieldAccessorTable; private static final com.google.protobuf.Descriptors.Descriptor internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor; private static final com.google.protobuf.GeneratedMessageV3.FieldAccessorTable @@ -1414,33 +3084,57 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { 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" + + "uth.v1\"\346\001\n\016HashParameters\022Y\n\024argon2_id_p" + + "arameters\030\001 \001(\01329.google.spanner.auth.v1" + + ".HashParameters.Argon2IdParametersH\000\032k\n\022" + + "Argon2IdParameters\022\027\n\017iteration_count\030\001 " + + "\001(\r\022\024\n\014memory_usage\030\002 \001(\r\022\023\n\013parallelism" + + "\030\003 \001(\r\022\021\n\thash_size\030\004 \001(\rB\014\n\nparameters\"" + + "(\n&PasswordAuthenticationHandshakeReques" + + "t\"\314\001\n\'PasswordAuthenticationHandshakeRes" + + "ponse\022`\n password_authentication_protoco" + + "l\030\001 \001(\01626.google.spanner.auth.v1.Passwor" + + "dAuthenticationProtocol\022?\n\017hash_paramete" + + "rs\030\002 \001(\0132&.google.spanner.auth.v1.HashPa" + + "rameters*\253\001\n\036PasswordAuthenticationProto" + + "col\0220\n,PASSWORD_AUTHENTICATION_PROTOCOL_" + + "UNSPECIFIED\020\000\022*\n&PASSWORD_AUTHENTICATION" + + "_PROTOCOL_SCRAM\020\001\022+\n\'PASSWORD_AUTHENTICA" + + "TION_PROTOCOL_OPAQUE\020\002B\037\n\035com.google.clo" + + "ud.spanner.omnib\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( descriptorData, new com.google.protobuf.Descriptors.FileDescriptor[] {}); - internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor = + internal_static_google_spanner_auth_v1_HashParameters_descriptor = getDescriptor().getMessageTypes().get(0); + internal_static_google_spanner_auth_v1_HashParameters_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_HashParameters_descriptor, + new java.lang.String[] { + "Argon2IdParameters", "Parameters", + }); + internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_descriptor = + internal_static_google_spanner_auth_v1_HashParameters_descriptor.getNestedTypes().get(0); + internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_fieldAccessorTable = + new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_google_spanner_auth_v1_HashParameters_Argon2IdParameters_descriptor, + new java.lang.String[] { + "IterationCount", "MemoryUsage", "Parallelism", "HashSize", + }); + internal_static_google_spanner_auth_v1_PasswordAuthenticationHandshakeRequest_descriptor = + getDescriptor().getMessageTypes().get(1); 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); + getDescriptor().getMessageTypes().get(2); 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", + "PasswordAuthenticationProtocol", "HashParameters", }); } 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 index b8d72b9ae03a..69afd273168f 100644 --- 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 @@ -13,7 +13,6 @@ * 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 @@ -34,18 +33,35 @@ public interface AccessTokenOrBuilder com.google.protobuf.MessageOrBuilder { /** - * string token = 1; + * string username = 1; * - * @return The token. + * @return The username. */ - java.lang.String getToken(); + java.lang.String getUsername(); /** - * string token = 1; + * string username = 1; * - * @return The bytes for token. + * @return The bytes for username. */ - com.google.protobuf.ByteString getTokenBytes(); + com.google.protobuf.ByteString getUsernameBytes(); + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return Whether the creationTime field is set. + */ + boolean hasCreationTime(); + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return The creationTime. + */ + com.google.protobuf.Timestamp getCreationTime(); + + /** .google.protobuf.Timestamp creation_time = 2; */ + com.google.protobuf.TimestampOrBuilder getCreationTimeOrBuilder(); /** * .google.protobuf.Timestamp expiration_time = 3; @@ -63,6 +79,34 @@ public interface AccessTokenOrBuilder /** .google.protobuf.Timestamp expiration_time = 3; */ com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder(); + + /** + * bytes signature = 4; + * + * @return The signature. + */ + com.google.protobuf.ByteString getSignature(); + + /** + * int64 key_id = 5; + * + * @return The keyId. + */ + long getKeyId(); + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The enum numeric value on the wire for accessTokenType. + */ + int getAccessTokenTypeValue(); + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The accessTokenType. + */ + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType getAccessTokenType(); } /** Protobuf type {@code google.spanner.auth.v1.AccessToken} */ @@ -78,7 +122,9 @@ private AccessToken(com.google.protobuf.GeneratedMessageV3.Builder builder) { } private AccessToken() { - token_ = ""; + username_ = ""; + signature_ = com.google.protobuf.ByteString.EMPTY; + accessTokenType_ = 0; } @java.lang.Override @@ -107,47 +153,188 @@ public static final com.google.protobuf.Descriptors.Descriptor getDescriptor() { com.google.cloud.spanner.omni.Login.AccessToken.Builder.class); } - public static final int TOKEN_FIELD_NUMBER = 1; + /** Protobuf enum {@code google.spanner.auth.v1.AccessToken.AccessTokenType} */ + public enum AccessTokenType implements com.google.protobuf.ProtocolMessageEnum { + /** ACCESS_TOKEN_TYPE_UNSPECIFIED = 0; */ + ACCESS_TOKEN_TYPE_UNSPECIFIED(0), + /** ACCESS_TOKEN_TYPE_API = 1; */ + ACCESS_TOKEN_TYPE_API(1), + /** ACCESS_TOKEN_TYPE_UI = 2; */ + ACCESS_TOKEN_TYPE_UI(2), + UNRECOGNIZED(-1), + ; + + /** ACCESS_TOKEN_TYPE_UNSPECIFIED = 0; */ + public static final int ACCESS_TOKEN_TYPE_UNSPECIFIED_VALUE = 0; + + /** ACCESS_TOKEN_TYPE_API = 1; */ + public static final int ACCESS_TOKEN_TYPE_API_VALUE = 1; + + /** ACCESS_TOKEN_TYPE_UI = 2; */ + public static final int ACCESS_TOKEN_TYPE_UI_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 AccessTokenType 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 AccessTokenType forNumber(int value) { + switch (value) { + case 0: + return ACCESS_TOKEN_TYPE_UNSPECIFIED; + case 1: + return ACCESS_TOKEN_TYPE_API; + case 2: + return ACCESS_TOKEN_TYPE_UI; + 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 AccessTokenType findValueByNumber(int number) { + return AccessTokenType.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.Login.AccessToken.getDescriptor() + .getEnumTypes() + .get(0); + } + + private static final AccessTokenType[] VALUES = values(); + + public static AccessTokenType 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 AccessTokenType(int value) { + this.value = value; + } + + // @@protoc_insertion_point(enum_scope:google.spanner.auth.v1.AccessToken.AccessTokenType) + } + + public static final int USERNAME_FIELD_NUMBER = 1; @SuppressWarnings("serial") - private volatile java.lang.Object token_ = ""; + private volatile java.lang.Object username_ = ""; /** - * string token = 1; + * string username = 1; * - * @return The token. + * @return The username. */ @java.lang.Override - public java.lang.String getToken() { - java.lang.Object ref = token_; + 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(); - token_ = s; + username_ = s; return s; } } /** - * string token = 1; + * string username = 1; * - * @return The bytes for token. + * @return The bytes for username. */ @java.lang.Override - public com.google.protobuf.ByteString getTokenBytes() { - java.lang.Object ref = token_; + 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); - token_ = b; + username_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; } } + public static final int CREATION_TIME_FIELD_NUMBER = 2; + private com.google.protobuf.Timestamp creationTime_; + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return Whether the creationTime field is set. + */ + @java.lang.Override + public boolean hasCreationTime() { + return creationTime_ != null; + } + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return The creationTime. + */ + @java.lang.Override + public com.google.protobuf.Timestamp getCreationTime() { + return creationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : creationTime_; + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + @java.lang.Override + public com.google.protobuf.TimestampOrBuilder getCreationTimeOrBuilder() { + return creationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : creationTime_; + } + public static final int EXPIRATION_TIME_FIELD_NUMBER = 3; private com.google.protobuf.Timestamp expirationTime_; @@ -181,6 +368,60 @@ public com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder() { : expirationTime_; } + public static final int SIGNATURE_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes signature = 4; + * + * @return The signature. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + public static final int KEY_ID_FIELD_NUMBER = 5; + private long keyId_ = 0L; + + /** + * int64 key_id = 5; + * + * @return The keyId. + */ + @java.lang.Override + public long getKeyId() { + return keyId_; + } + + public static final int ACCESS_TOKEN_TYPE_FIELD_NUMBER = 6; + private int accessTokenType_ = 0; + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The enum numeric value on the wire for accessTokenType. + */ + @java.lang.Override + public int getAccessTokenTypeValue() { + return accessTokenType_; + } + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The accessTokenType. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType getAccessTokenType() { + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType result = + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType.forNumber( + accessTokenType_); + return result == null + ? com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType.UNRECOGNIZED + : result; + } + private byte memoizedIsInitialized = -1; @java.lang.Override @@ -195,12 +436,27 @@ public final boolean isInitialized() { @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 (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(username_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, username_); + } + if (creationTime_ != null) { + output.writeMessage(2, getCreationTime()); } if (expirationTime_ != null) { output.writeMessage(3, getExpirationTime()); } + if (!signature_.isEmpty()) { + output.writeBytes(4, signature_); + } + if (keyId_ != 0L) { + output.writeInt64(5, keyId_); + } + if (accessTokenType_ + != com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType + .ACCESS_TOKEN_TYPE_UNSPECIFIED + .getNumber()) { + output.writeEnum(6, accessTokenType_); + } getUnknownFields().writeTo(output); } @@ -210,12 +466,27 @@ public int getSerializedSize() { if (size != -1) return size; size = 0; - if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(token_)) { - size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, token_); + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(username_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, username_); + } + if (creationTime_ != null) { + size += com.google.protobuf.CodedOutputStream.computeMessageSize(2, getCreationTime()); } if (expirationTime_ != null) { size += com.google.protobuf.CodedOutputStream.computeMessageSize(3, getExpirationTime()); } + if (!signature_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream.computeBytesSize(4, signature_); + } + if (keyId_ != 0L) { + size += com.google.protobuf.CodedOutputStream.computeInt64Size(5, keyId_); + } + if (accessTokenType_ + != com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType + .ACCESS_TOKEN_TYPE_UNSPECIFIED + .getNumber()) { + size += com.google.protobuf.CodedOutputStream.computeEnumSize(6, accessTokenType_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -232,11 +503,18 @@ public boolean equals(final java.lang.Object 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 (!getUsername().equals(other.getUsername())) return false; + if (hasCreationTime() != other.hasCreationTime()) return false; + if (hasCreationTime()) { + if (!getCreationTime().equals(other.getCreationTime())) return false; + } if (hasExpirationTime() != other.hasExpirationTime()) return false; if (hasExpirationTime()) { if (!getExpirationTime().equals(other.getExpirationTime())) return false; } + if (!getSignature().equals(other.getSignature())) return false; + if (getKeyId() != other.getKeyId()) return false; + if (accessTokenType_ != other.accessTokenType_) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -248,12 +526,22 @@ public int hashCode() { } int hash = 41; hash = (19 * hash) + getDescriptor().hashCode(); - hash = (37 * hash) + TOKEN_FIELD_NUMBER; - hash = (53 * hash) + getToken().hashCode(); + hash = (37 * hash) + USERNAME_FIELD_NUMBER; + hash = (53 * hash) + getUsername().hashCode(); + if (hasCreationTime()) { + hash = (37 * hash) + CREATION_TIME_FIELD_NUMBER; + hash = (53 * hash) + getCreationTime().hashCode(); + } if (hasExpirationTime()) { hash = (37 * hash) + EXPIRATION_TIME_FIELD_NUMBER; hash = (53 * hash) + getExpirationTime().hashCode(); } + hash = (37 * hash) + SIGNATURE_FIELD_NUMBER; + hash = (53 * hash) + getSignature().hashCode(); + hash = (37 * hash) + KEY_ID_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong(getKeyId()); + hash = (37 * hash) + ACCESS_TOKEN_TYPE_FIELD_NUMBER; + hash = (53 * hash) + accessTokenType_; hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -388,12 +676,20 @@ private Builder(com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { public Builder clear() { super.clear(); bitField0_ = 0; - token_ = ""; + username_ = ""; + creationTime_ = null; + if (creationTimeBuilder_ != null) { + creationTimeBuilder_.dispose(); + creationTimeBuilder_ = null; + } expirationTime_ = null; if (expirationTimeBuilder_ != null) { expirationTimeBuilder_.dispose(); expirationTimeBuilder_ = null; } + signature_ = com.google.protobuf.ByteString.EMPTY; + keyId_ = 0L; + accessTokenType_ = 0; return this; } @@ -431,12 +727,25 @@ public com.google.cloud.spanner.omni.Login.AccessToken buildPartial() { private void buildPartial0(com.google.cloud.spanner.omni.Login.AccessToken result) { int from_bitField0_ = bitField0_; if (((from_bitField0_ & 0x00000001) != 0)) { - result.token_ = token_; + result.username_ = username_; } if (((from_bitField0_ & 0x00000002) != 0)) { + result.creationTime_ = + creationTimeBuilder_ == null ? creationTime_ : creationTimeBuilder_.build(); + } + if (((from_bitField0_ & 0x00000004) != 0)) { result.expirationTime_ = expirationTimeBuilder_ == null ? expirationTime_ : expirationTimeBuilder_.build(); } + if (((from_bitField0_ & 0x00000008) != 0)) { + result.signature_ = signature_; + } + if (((from_bitField0_ & 0x00000010) != 0)) { + result.keyId_ = keyId_; + } + if (((from_bitField0_ & 0x00000020) != 0)) { + result.accessTokenType_ = accessTokenType_; + } } @java.lang.Override @@ -487,14 +796,26 @@ public Builder mergeFrom(com.google.protobuf.Message other) { 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_; + if (!other.getUsername().isEmpty()) { + username_ = other.username_; bitField0_ |= 0x00000001; onChanged(); } + if (other.hasCreationTime()) { + mergeCreationTime(other.getCreationTime()); + } if (other.hasExpirationTime()) { mergeExpirationTime(other.getExpirationTime()); } + if (other.getSignature() != com.google.protobuf.ByteString.EMPTY) { + setSignature(other.getSignature()); + } + if (other.getKeyId() != 0L) { + setKeyId(other.getKeyId()); + } + if (other.accessTokenType_ != 0) { + setAccessTokenTypeValue(other.getAccessTokenTypeValue()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -523,17 +844,41 @@ public Builder mergeFrom( break; case 10: { - token_ = input.readStringRequireUtf8(); + username_ = input.readStringRequireUtf8(); bitField0_ |= 0x00000001; break; } // case 10 + case 18: + { + input.readMessage(getCreationTimeFieldBuilder().getBuilder(), extensionRegistry); + bitField0_ |= 0x00000002; + break; + } // case 18 case 26: { input.readMessage( getExpirationTimeFieldBuilder().getBuilder(), extensionRegistry); - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; break; } // case 26 + case 34: + { + signature_ = input.readBytes(); + bitField0_ |= 0x00000008; + break; + } // case 34 + case 40: + { + keyId_ = input.readInt64(); + bitField0_ |= 0x00000010; + break; + } // case 40 + case 48: + { + accessTokenType_ = input.readEnum(); + bitField0_ |= 0x00000020; + break; + } // case 48 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { @@ -553,19 +898,19 @@ public Builder mergeFrom( private int bitField0_; - private java.lang.Object token_ = ""; + private java.lang.Object username_ = ""; /** - * string token = 1; + * string username = 1; * - * @return The token. + * @return The username. */ - public java.lang.String getToken() { - java.lang.Object ref = token_; + 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(); - token_ = s; + username_ = s; return s; } else { return (java.lang.String) ref; @@ -573,16 +918,16 @@ public java.lang.String getToken() { } /** - * string token = 1; + * string username = 1; * - * @return The bytes for token. + * @return The bytes for username. */ - public com.google.protobuf.ByteString getTokenBytes() { - java.lang.Object ref = token_; + 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); - token_ = b; + username_ = b; return b; } else { return (com.google.protobuf.ByteString) ref; @@ -590,50 +935,174 @@ public com.google.protobuf.ByteString getTokenBytes() { } /** - * string token = 1; + * string username = 1; * - * @param value The token to set. + * @param value The username to set. * @return This builder for chaining. */ - public Builder setToken(java.lang.String value) { + public Builder setUsername(java.lang.String value) { if (value == null) { throw new NullPointerException(); } - token_ = value; + username_ = value; bitField0_ |= 0x00000001; onChanged(); return this; } /** - * string token = 1; + * string username = 1; * * @return This builder for chaining. */ - public Builder clearToken() { - token_ = getDefaultInstance().getToken(); + public Builder clearUsername() { + username_ = getDefaultInstance().getUsername(); bitField0_ = (bitField0_ & ~0x00000001); onChanged(); return this; } /** - * string token = 1; + * string username = 1; * - * @param value The bytes for token to set. + * @param value The bytes for username to set. * @return This builder for chaining. */ - public Builder setTokenBytes(com.google.protobuf.ByteString value) { + public Builder setUsernameBytes(com.google.protobuf.ByteString value) { if (value == null) { throw new NullPointerException(); } checkByteStringIsUtf8(value); - token_ = value; + username_ = value; bitField0_ |= 0x00000001; onChanged(); return this; } + private com.google.protobuf.Timestamp creationTime_; + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + creationTimeBuilder_; + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return Whether the creationTime field is set. + */ + public boolean hasCreationTime() { + return ((bitField0_ & 0x00000002) != 0); + } + + /** + * .google.protobuf.Timestamp creation_time = 2; + * + * @return The creationTime. + */ + public com.google.protobuf.Timestamp getCreationTime() { + if (creationTimeBuilder_ == null) { + return creationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : creationTime_; + } else { + return creationTimeBuilder_.getMessage(); + } + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public Builder setCreationTime(com.google.protobuf.Timestamp value) { + if (creationTimeBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + creationTime_ = value; + } else { + creationTimeBuilder_.setMessage(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public Builder setCreationTime(com.google.protobuf.Timestamp.Builder builderForValue) { + if (creationTimeBuilder_ == null) { + creationTime_ = builderForValue.build(); + } else { + creationTimeBuilder_.setMessage(builderForValue.build()); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public Builder mergeCreationTime(com.google.protobuf.Timestamp value) { + if (creationTimeBuilder_ == null) { + if (((bitField0_ & 0x00000002) != 0) + && creationTime_ != null + && creationTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { + getCreationTimeBuilder().mergeFrom(value); + } else { + creationTime_ = value; + } + } else { + creationTimeBuilder_.mergeFrom(value); + } + bitField0_ |= 0x00000002; + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public Builder clearCreationTime() { + bitField0_ = (bitField0_ & ~0x00000002); + creationTime_ = null; + if (creationTimeBuilder_ != null) { + creationTimeBuilder_.dispose(); + creationTimeBuilder_ = null; + } + onChanged(); + return this; + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public com.google.protobuf.Timestamp.Builder getCreationTimeBuilder() { + bitField0_ |= 0x00000002; + onChanged(); + return getCreationTimeFieldBuilder().getBuilder(); + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + public com.google.protobuf.TimestampOrBuilder getCreationTimeOrBuilder() { + if (creationTimeBuilder_ != null) { + return creationTimeBuilder_.getMessageOrBuilder(); + } else { + return creationTime_ == null + ? com.google.protobuf.Timestamp.getDefaultInstance() + : creationTime_; + } + } + + /** .google.protobuf.Timestamp creation_time = 2; */ + private com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder> + getCreationTimeFieldBuilder() { + if (creationTimeBuilder_ == null) { + creationTimeBuilder_ = + new com.google.protobuf.SingleFieldBuilderV3< + com.google.protobuf.Timestamp, + com.google.protobuf.Timestamp.Builder, + com.google.protobuf.TimestampOrBuilder>( + getCreationTime(), getParentForChildren(), isClean()); + creationTime_ = null; + } + return creationTimeBuilder_; + } + private com.google.protobuf.Timestamp expirationTime_; private com.google.protobuf.SingleFieldBuilderV3< com.google.protobuf.Timestamp, @@ -647,7 +1116,7 @@ public Builder setTokenBytes(com.google.protobuf.ByteString value) { * @return Whether the expirationTime field is set. */ public boolean hasExpirationTime() { - return ((bitField0_ & 0x00000002) != 0); + return ((bitField0_ & 0x00000004) != 0); } /** @@ -675,7 +1144,7 @@ public Builder setExpirationTime(com.google.protobuf.Timestamp value) { } else { expirationTimeBuilder_.setMessage(value); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; onChanged(); return this; } @@ -687,7 +1156,7 @@ public Builder setExpirationTime(com.google.protobuf.Timestamp.Builder builderFo } else { expirationTimeBuilder_.setMessage(builderForValue.build()); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; onChanged(); return this; } @@ -695,7 +1164,7 @@ public Builder setExpirationTime(com.google.protobuf.Timestamp.Builder builderFo /** .google.protobuf.Timestamp expiration_time = 3; */ public Builder mergeExpirationTime(com.google.protobuf.Timestamp value) { if (expirationTimeBuilder_ == null) { - if (((bitField0_ & 0x00000002) != 0) + if (((bitField0_ & 0x00000004) != 0) && expirationTime_ != null && expirationTime_ != com.google.protobuf.Timestamp.getDefaultInstance()) { getExpirationTimeBuilder().mergeFrom(value); @@ -705,14 +1174,14 @@ public Builder mergeExpirationTime(com.google.protobuf.Timestamp value) { } else { expirationTimeBuilder_.mergeFrom(value); } - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; onChanged(); return this; } /** .google.protobuf.Timestamp expiration_time = 3; */ public Builder clearExpirationTime() { - bitField0_ = (bitField0_ & ~0x00000002); + bitField0_ = (bitField0_ & ~0x00000004); expirationTime_ = null; if (expirationTimeBuilder_ != null) { expirationTimeBuilder_.dispose(); @@ -724,7 +1193,7 @@ public Builder clearExpirationTime() { /** .google.protobuf.Timestamp expiration_time = 3; */ public com.google.protobuf.Timestamp.Builder getExpirationTimeBuilder() { - bitField0_ |= 0x00000002; + bitField0_ |= 0x00000004; onChanged(); return getExpirationTimeFieldBuilder().getBuilder(); } @@ -758,6 +1227,153 @@ public com.google.protobuf.TimestampOrBuilder getExpirationTimeOrBuilder() { return expirationTimeBuilder_; } + private com.google.protobuf.ByteString signature_ = com.google.protobuf.ByteString.EMPTY; + + /** + * bytes signature = 4; + * + * @return The signature. + */ + @java.lang.Override + public com.google.protobuf.ByteString getSignature() { + return signature_; + } + + /** + * bytes signature = 4; + * + * @param value The signature to set. + * @return This builder for chaining. + */ + public Builder setSignature(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + signature_ = value; + bitField0_ |= 0x00000008; + onChanged(); + return this; + } + + /** + * bytes signature = 4; + * + * @return This builder for chaining. + */ + public Builder clearSignature() { + bitField0_ = (bitField0_ & ~0x00000008); + signature_ = getDefaultInstance().getSignature(); + onChanged(); + return this; + } + + private long keyId_; + + /** + * int64 key_id = 5; + * + * @return The keyId. + */ + @java.lang.Override + public long getKeyId() { + return keyId_; + } + + /** + * int64 key_id = 5; + * + * @param value The keyId to set. + * @return This builder for chaining. + */ + public Builder setKeyId(long value) { + + keyId_ = value; + bitField0_ |= 0x00000010; + onChanged(); + return this; + } + + /** + * int64 key_id = 5; + * + * @return This builder for chaining. + */ + public Builder clearKeyId() { + bitField0_ = (bitField0_ & ~0x00000010); + keyId_ = 0L; + onChanged(); + return this; + } + + private int accessTokenType_ = 0; + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The enum numeric value on the wire for accessTokenType. + */ + @java.lang.Override + public int getAccessTokenTypeValue() { + return accessTokenType_; + } + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @param value The enum numeric value on the wire for accessTokenType to set. + * @return This builder for chaining. + */ + public Builder setAccessTokenTypeValue(int value) { + accessTokenType_ = value; + bitField0_ |= 0x00000020; + onChanged(); + return this; + } + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return The accessTokenType. + */ + @java.lang.Override + public com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType getAccessTokenType() { + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType result = + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType.forNumber( + accessTokenType_); + return result == null + ? com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType.UNRECOGNIZED + : result; + } + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @param value The accessTokenType to set. + * @return This builder for chaining. + */ + public Builder setAccessTokenType( + com.google.cloud.spanner.omni.Login.AccessToken.AccessTokenType value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00000020; + accessTokenType_ = value.getNumber(); + onChanged(); + return this; + } + + /** + * .google.spanner.auth.v1.AccessToken.AccessTokenType access_token_type = 6; + * + * @return This builder for chaining. + */ + public Builder clearAccessTokenType() { + bitField0_ = (bitField0_ & ~0x00000020); + accessTokenType_ = 0; + onChanged(); + return this; + } + @java.lang.Override public final Builder setUnknownFields( final com.google.protobuf.UnknownFieldSet unknownFields) { @@ -7989,43 +8605,50 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { 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" + + "cation.proto\"\345\002\n\013AccessToken\022\020\n\010username" + + "\030\001 \001(\t\0221\n\rcreation_time\030\002 \001(\0132\032.google.p" + + "rotobuf.Timestamp\0223\n\017expiration_time\030\003 \001" + + "(\0132\032.google.protobuf.Timestamp\022\021\n\tsignat" + + "ure\030\004 \001(\014\022\016\n\006key_id\030\005 \001(\003\022N\n\021access_toke" + + "n_type\030\006 \001(\01623.google.spanner.auth.v1.Ac" + + "cessToken.AccessTokenType\"i\n\017AccessToken" + + "Type\022!\n\035ACCESS_TOKEN_TYPE_UNSPECIFIED\020\000\022" + + "\031\n\025ACCESS_TOKEN_TYPE_API\020\001\022\030\n\024ACCESS_TOK" + + "EN_TYPE_UI\020\002\"j\n\031InitialOpaqueLoginReques" + + "t\022\027\n\017blinded_message\030\001 \001(\014\022\024\n\014client_non" + + "ce\030\002 \001(\014\022\036\n\026client_public_keyshare\030\003 \001(\014" + + "\"-\n\027FinalOpaqueLoginRequest\022\022\n\nclient_ma" + + "c\030\001 \001(\014\"\261\001\n\032InitialOpaqueLoginResponse\022\024" + + "\n\014server_nonce\030\001 \001(\014\022\036\n\026server_public_ke" + + "yshare\030\002 \001(\014\022\022\n\nserver_mac\030\003 \001(\014\022\031\n\021eval" + + "uated_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\022OpaqueLo" + + "ginRequest\022L\n\017initial_request\030\001 \001(\01321.go" + + "ogle.spanner.auth.v1.InitialOpaqueLoginR" + + "equestH\000\022H\n\rfinal_request\030\002 \001(\0132/.google" + + ".spanner.auth.v1.FinalOpaqueLoginRequest" + + "H\000B\t\n\007request\"\327\001\n\023OpaqueLoginResponse\022N\n" + + "\020initial_response\030\001 \001(\01322.google.spanner" + + ".auth.v1.InitialOpaqueLoginResponseH\000\022S\n" + + "\016final_response\030\002 \001(\01329.google.spanner.a" + + "uth.v1.OpaqueLoginResponse.FinalResponse" + + "H\000\032\017\n\rFinalResponseB\n\n\010response\"\316\001\n\014Logi" + + "nRequest\022\020\n\010username\030\001 \001(\t\022D\n\016opaque_req" + + "uest\030\004 \001(\0132*.google.spanner.auth.v1.Opaq" + + "ueLoginRequestH\000\022[\n\021handshake_request\030\005 " + + "\001(\0132>.google.spanner.auth.v1.PasswordAut" + + "henticationHandshakeRequestH\000B\t\n\007request" + + "\"\375\001\n\rLoginResponse\0229\n\014access_token\030\001 \001(\013" + + "2#.google.spanner.auth.v1.AccessToken\022F\n" + + "\017opaque_response\030\004 \001(\0132+.google.spanner." + + "auth.v1.OpaqueLoginResponseH\000\022]\n\022handsha" + + "ke_response\030\005 \001(\0132?.google.spanner.auth." + + "v1.PasswordAuthenticationHandshakeRespon" + + "seH\000B\n\n\010response2j\n\014LoginService\022Z\n\005Logi" + + "n\022$.google.spanner.auth.v1.LoginRequest\032" + + "%.google.spanner.auth.v1.LoginResponse\"\000" + + "(\0010\001B\037\n\035com.google.cloud.spanner.omnib\006p" + + "roto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor.internalBuildGeneratedFileFrom( @@ -8040,7 +8663,7 @@ public static com.google.protobuf.Descriptors.FileDescriptor getDescriptor() { new com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( internal_static_google_spanner_auth_v1_AccessToken_descriptor, new java.lang.String[] { - "Token", "ExpirationTime", + "Username", "CreationTime", "ExpirationTime", "Signature", "KeyId", "AccessTokenType", }); internal_static_google_spanner_auth_v1_InitialOpaqueLoginRequest_descriptor = getDescriptor().getMessageTypes().get(1); 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 index 14d2cb0f98d1..f721e42bcb7d 100644 --- 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 @@ -21,7 +21,6 @@ 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; @@ -108,6 +107,9 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx "Unsupported authentication method: " + method); } + com.google.cloud.spanner.omni.Authentication.HashParameters hashParameters = + handshakeResponse.getHandshakeResponse().getHashParameters(); + // 2. Send Initial OPAQUE Request LoginRequest initialRequest = LoginRequest.newBuilder() @@ -140,7 +142,8 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx clientNonce, clientPublicKeyshare, clientPrivateKeyshare, - initialOpaqueResponse); + initialOpaqueResponse, + hashParameters); LoginRequest finalRequest = LoginRequest.newBuilder() @@ -191,7 +194,8 @@ private byte[] generateClientMac( byte[] clientNonce, byte[] clientPublicKeyshare, byte[] clientPrivateKeyshare, - InitialOpaqueLoginResponse initialOpaqueResponse) + InitialOpaqueLoginResponse initialOpaqueResponse, + com.google.cloud.spanner.omni.Authentication.HashParameters hashParameters) throws GeneralSecurityException, IOException { byte[] oprf = null; byte[] stretchedOprf = null; @@ -212,7 +216,7 @@ private byte[] generateClientMac( try { oprf = OpaqueUtil.finalize(blind, initialOpaqueResponse.getEvaluatedMessage().toByteArray()); - stretchedOprf = OpaqueUtil.stretch(oprf); + stretchedOprf = OpaqueUtil.stretch(oprf, hashParameters); byte[] oprfConcat = OpaqueUtil.concat(oprf, stretchedOprf); try { randomizedPassword = OpaqueUtil.extract(oprfConcat); 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 index ebb98a283cff..dca2390953ed 100644 --- 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 @@ -13,21 +13,11 @@ * 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") @@ -126,22 +116,10 @@ public LoginServiceFutureStub newStub( 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) { @@ -150,13 +128,7 @@ default io.grpc.stub.StreamObserver - * The LoginService is used to authenticate users. - * - */ + /** Base class for the server implementation of the service LoginService. */ public abstract static class LoginServiceImplBase implements io.grpc.BindableService, AsyncService { @@ -166,13 +138,7 @@ public final io.grpc.ServerServiceDefinition bindService() { } } - /** - * A stub to allow clients to do asynchronous rpc calls to service LoginService. - * - *
-   * The LoginService is used to authenticate users.
-   * 
- */ + /** A stub to allow clients to do asynchronous rpc calls to service LoginService. */ public static final class LoginServiceStub extends io.grpc.stub.AbstractAsyncStub { private LoginServiceStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { @@ -184,13 +150,7 @@ protected LoginServiceStub build(io.grpc.Channel channel, io.grpc.CallOptions ca return new LoginServiceStub(channel, callOptions); } - /** - * - * - *
-     * Performs the login for Spanner Omni.
-     * 
- */ + /** */ public io.grpc.stub.StreamObserver login( io.grpc.stub.StreamObserver responseObserver) { @@ -199,13 +159,7 @@ public io.grpc.stub.StreamObserver - * The LoginService is used to authenticate users. - * - */ + /** A stub to allow clients to do synchronous rpc calls to service LoginService. */ public static final class LoginServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { private LoginServiceBlockingStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { @@ -219,13 +173,7 @@ protected LoginServiceBlockingStub build( } } - /** - * A stub to allow clients to do ListenableFuture-style rpc calls to service LoginService. - * - *
-   * The LoginService is used to authenticate users.
-   * 
- */ + /** A stub to allow clients to do ListenableFuture-style rpc calls to service LoginService. */ public static final class LoginServiceFutureStub extends io.grpc.stub.AbstractFutureStub { private LoginServiceFutureStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { 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 index c68d4d3ebdad..b73c35d3b1e7 100644 --- 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 @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.google.cloud.spanner.omni.opaque; +package com.google.cloud.spanner.omni; import static java.nio.charset.StandardCharsets.UTF_8; @@ -48,12 +48,8 @@ public class OpaqueUtil { 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(); @@ -249,22 +245,28 @@ public static byte[] expand(byte[] keyMaterial, byte[] info, int size) return Hkdf.computeHkdf(HMAC_SHA256, keyMaterial, new byte[0], info, size); } - public static byte[] stretch(byte[] input) throws GeneralSecurityException { + public static byte[] stretch( + byte[] input, com.google.cloud.spanner.omni.Authentication.HashParameters hashParameters) + 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); + + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters argon2Params = + hashParameters.getArgon2IdParameters(); + Argon2Parameters params = new Argon2Parameters.Builder(Argon2Parameters.ARGON2_id) .withSalt(salt) - .withParallelism(ARGON2_THREADS) - .withMemoryAsKB(ARGON2_MEMORY_LIMIT) - .withIterations(ARGON2_ITERATION_COUNT) + .withParallelism(argon2Params.getParallelism()) + .withMemoryAsKB(argon2Params.getMemoryUsage()) + .withIterations(argon2Params.getIterationCount()) .build(); Argon2BytesGenerator generator = new Argon2BytesGenerator(); generator.init(params); - byte[] result = new byte[STRETCH_OUTPUT_LENGTH]; + byte[] result = new byte[argon2Params.getHashSize()]; generator.generateBytes(input, result); return result; } finally { 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 index 50f53001638b..699cd9e8fbaf 100644 --- 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 @@ -21,7 +21,6 @@ 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; @@ -335,8 +334,20 @@ public void testStretch() throws Exception { } }; + com.google.cloud.spanner.omni.Authentication.HashParameters hashParams = + com.google.cloud.spanner.omni.Authentication.HashParameters.newBuilder() + .setArgon2IdParameters( + com.google.cloud.spanner.omni.Authentication.HashParameters.Argon2IdParameters + .newBuilder() + .setIterationCount(3) + .setMemoryUsage(65536) + .setParallelism(4) + .setHashSize(32) + .build()) + .build(); + for (int i = 0; i < inputs.length; i++) { - byte[] stretched = OpaqueUtil.stretch(inputs[i]); + byte[] stretched = OpaqueUtil.stretch(inputs[i], hashParams); assertEquals(32, stretched.length); assertArrayEquals("Failed on index " + i, expectedOutputs[i], stretched); } From c423a2e39648f3342e3e275059d88c541b1c3b87 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Mon, 29 Jun 2026 10:05:19 +0000 Subject: [PATCH 5/9] chore: remove bouncycastle version from pom.xml --- java-spanner/google-cloud-spanner/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/java-spanner/google-cloud-spanner/pom.xml b/java-spanner/google-cloud-spanner/pom.xml index 6e069b339706..80015240f767 100644 --- a/java-spanner/google-cloud-spanner/pom.xml +++ b/java-spanner/google-cloud-spanner/pom.xml @@ -535,7 +535,6 @@ org.bouncycastle bcprov-jdk18on - 1.78 com.google.crypto.tink From e7a3a707e5e8ce9b847a8102547e31e1f4a4c218 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Mon, 29 Jun 2026 13:35:28 +0000 Subject: [PATCH 6/9] fix(spanner): zero out cryptographic arrays in OpaqueUtil --- .../com/google/cloud/spanner/omni/OpaqueUtil.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) 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 index b73c35d3b1e7..01488304198a 100644 --- 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 @@ -122,8 +122,16 @@ private static byte[] expandMessageXmd(byte[] msg, byte[] DST, int lenInBytes) md.update(bXor); md.update((byte) i); md.update(dstPrime); - bi = md.digest(); - System.arraycopy(bi, 0, bOut, (i - 1) * bInBytes, bInBytes); + byte[] nextBi = md.digest(); + System.arraycopy(nextBi, 0, bOut, (i - 1) * bInBytes, bInBytes); + Arrays.fill(bXor, (byte) 0); + if (bi != b1) { + Arrays.fill(bi, (byte) 0); + } + bi = nextBi; + } + if (bi != b1) { + Arrays.fill(bi, (byte) 0); } byte[] res = new byte[lenInBytes]; From 051b7ffe3190e8e497b96847156959fda817944b Mon Sep 17 00:00:00 2001 From: sagnghos Date: Mon, 29 Jun 2026 20:47:14 +0000 Subject: [PATCH 7/9] fix(spanner): address code review comments for Omni authentication --- .../google/cloud/spanner/connection/ConnectionOptions.java | 6 ++++++ .../java/com/google/cloud/spanner/omni/LoginClient.java | 6 +++++- .../google/cloud/spanner/omni/SpannerOmniCredentials.java | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) 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 cbdcf62f14eb..08818a1fb5c6 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 @@ -807,6 +807,12 @@ && getInitialConnectionPropertyValue(OAUTH_TOKEN) == null SecretBytes secretBytes = SpannerOmniCredentials.convertToSecretBytes(password.toCharArray()); this.credentials = new SpannerOmniCredentials(username, secretBytes, this.host); + // Clear the password from the initial connection state to allow it to be GC'd. + this.initialConnectionState.setValue( + ConnectionProperties.PASSWORD, + DEFAULT_PASSWORD, + ConnectionProperty.Context.STARTUP, + /* inTransaction= */ false); } else if (defaultSpannerOmniCredentials != null) { this.credentials = defaultSpannerOmniCredentials; } else { 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 index f721e42bcb7d..0cd7574679a6 100644 --- 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 @@ -65,6 +65,7 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx byte[] clientPrivateKeyshare = null; byte[] blind = null; byte[] blindedMessage = null; + byte[] clientNonce = null; try { passwordBytes = password.toByteArray(InsecureSecretKeyAccess.get()); byte[] randomNonce = OpaqueUtil.nonce(); @@ -75,7 +76,7 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx OpaqueUtil.DIFFIE_HELLMAN_KEY_INFO.getBytes(StandardCharsets.UTF_8))); clientPrivateKeyshare = keyPair[0]; byte[] clientPublicKeyshare = keyPair[1]; - byte[] clientNonce = OpaqueUtil.nonce(); + clientNonce = OpaqueUtil.nonce(); blind = new byte[32]; SECURE_RANDOM.nextBytes(blind); @@ -185,6 +186,9 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx if (blindedMessage != null) { Arrays.fill(blindedMessage, (byte) 0); } + if (clientNonce != null) { + Arrays.fill(clientNonce, (byte) 0); + } } } 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 index cc819b084e27..d6b054f9de11 100644 --- 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 @@ -82,6 +82,7 @@ public SpannerOmniCredentials(String username, SecretBytes password, String targ if (target.startsWith("http://")) { this.target = target.substring(7); this.usePlainText = true; + logger.warning("Using plaintext connection for Spanner Omni credentials."); } else if (target.startsWith("https://")) { this.target = target.substring(8); } else { @@ -99,6 +100,9 @@ public void initChannel(boolean usePlainText, SslContext sslContext) { + ", target=" + target); this.usePlainText = usePlainText; + if (this.usePlainText) { + logger.warning("Using plaintext connection for Spanner Omni credentials."); + } this.sslContext = sslContext; } From e15ec8cfe1bd6be12aa4bed4121fcaf266c233c6 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Tue, 30 Jun 2026 03:37:45 +0000 Subject: [PATCH 8/9] fix(spanner): update Omni login client and tests for 32-byte cryptographic constants --- .../cloud/spanner/omni/LoginClient.java | 19 +++++++++++++------ .../google/cloud/spanner/omni/OpaqueUtil.java | 5 +++-- .../cloud/spanner/omni/LoginClientTest.java | 8 ++++++++ .../cloud/spanner/omni/OpaqueUtilTest.java | 6 +++--- 4 files changed, 27 insertions(+), 11 deletions(-) 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 index 0cd7574679a6..026efda5a72b 100644 --- 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 @@ -44,6 +44,9 @@ public class LoginClient { private static final SecureRandom SECURE_RANDOM = new SecureRandom(); + static final int EXPECTED_ENVELOPE_SIZE = + OpaqueUtil.PUBLIC_KEY_LENGTH + OpaqueUtil.NONCE_LENGTH + OpaqueUtil.MAC_TAG_LENGTH; + private final LoginServiceGrpc.LoginServiceStub stub; public LoginClient(ManagedChannel channel) { @@ -132,7 +135,7 @@ public AccessToken login(String username, SecretBytes password) throws SpannerEx initialResponse.getOpaqueResponse().getInitialResponse(); ByteString envelope = initialOpaqueResponse.getMaskedResponse(); - if (envelope.size() != 65) { + if (envelope.size() != EXPECTED_ENVELOPE_SIZE) { throw new GeneralSecurityException("Invalid envelope size: " + envelope.size()); } @@ -236,17 +239,21 @@ private byte[] generateClientMac( OpaqueUtil.concat( initialOpaqueResponse.getMaskingNonce().toByteArray(), "CredentialResponsePad".getBytes(java.nio.charset.StandardCharsets.UTF_8)), - 16 + 33 + 16); + OpaqueUtil.NONCE_LENGTH + OpaqueUtil.PUBLIC_KEY_LENGTH + OpaqueUtil.MAC_TAG_LENGTH); byte[] serializedEnvelope = OpaqueUtil.xorBytes( initialOpaqueResponse.getMaskedResponse().toByteArray(), credentialResponsePad); ByteString envelope = ByteString.copyFrom(serializedEnvelope); - if (envelope.size() != 65) { + if (envelope.size() != EXPECTED_ENVELOPE_SIZE) { 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); + ByteString serverPublicKey = envelope.substring(0, OpaqueUtil.PUBLIC_KEY_LENGTH); + ByteString envelopeNonce = + envelope.substring( + OpaqueUtil.PUBLIC_KEY_LENGTH, OpaqueUtil.PUBLIC_KEY_LENGTH + OpaqueUtil.NONCE_LENGTH); + ByteString authTag = + envelope.substring( + OpaqueUtil.PUBLIC_KEY_LENGTH + OpaqueUtil.NONCE_LENGTH, EXPECTED_ENVELOPE_SIZE); authKey = OpaqueUtil.expand( 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 index 01488304198a..e7dd92824c25 100644 --- 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 @@ -45,8 +45,9 @@ public class OpaqueUtil { 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; + static final int NONCE_LENGTH = 32; + static final int MAC_TAG_LENGTH = 32; + static final int PUBLIC_KEY_LENGTH = 33; private static final int EXTRACT_OUTPUT_LENGTH = 32; // Argon2ID parameters. 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 index c413979768d8..dcfa9b5be1aa 100644 --- 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 @@ -34,4 +34,12 @@ public void testConstructor() { LoginClient client = new LoginClient(channel); assertNotNull(client); } + + @Test + public void testExpectedEnvelopeSize() { + // The envelope size must match the sum of the public key, nonce, and auth tag lengths. + // If the server changes the lengths in cl/940065095, this test will catch any mismatch. + org.junit.Assert.assertEquals( + "Envelope size should be 97 bytes (33 + 32 + 32)", 97, LoginClient.EXPECTED_ENVELOPE_SIZE); + } } 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 index 699cd9e8fbaf..d411af2704fe 100644 --- 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 @@ -40,8 +40,8 @@ public class OpaqueUtilTest { public void testNonce() { byte[] nonce1 = OpaqueUtil.nonce(); byte[] nonce2 = OpaqueUtil.nonce(); - assertEquals(16, nonce1.length); - assertEquals(16, nonce2.length); + assertEquals(32, nonce1.length); + assertEquals(32, nonce2.length); assertTrue(!Arrays.equals(nonce1, nonce2)); } @@ -90,7 +90,7 @@ public void testMac() throws Exception { byte[] mac1 = OpaqueUtil.mac(keys[i], data[i]); byte[] mac2 = OpaqueUtil.mac(keys[i], data[i]); assertArrayEquals(mac1, mac2); - assertEquals(16, mac1.length); + assertEquals(32, mac1.length); } } From a4874412b45548869bce931f2839f7028cc305e7 Mon Sep 17 00:00:00 2001 From: sagnghos Date: Tue, 30 Jun 2026 08:48:38 +0000 Subject: [PATCH 9/9] fix(omni): safely fallback to default credentials for Omni --- .../main/java/com/google/cloud/spanner/SpannerOptions.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 40cd4a56f73a..12c78c42c138 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 @@ -1245,7 +1245,10 @@ private static Builder prepareBuilder(Builder builder) { builder.setCredentials( new SpannerOmniCredentials(builder.username, builder.secretBytes, builder.host)); } else if (builder.credentials == null) { - builder.setCredentials(environment.getDefaultSpannerOmniCredentials()); + GoogleCredentials defaultCreds = environment.getDefaultSpannerOmniCredentials(); + if (defaultCreds != null) { + builder.setCredentials(defaultCreds); + } } if (builder.credentials instanceof SpannerOmniCredentials) { ((SpannerOmniCredentials) builder.credentials)