Migrated tsi/alts from nanopb to upb
diff --git a/BUILD b/BUILD
index 7b7b449..1835a90 100644
--- a/BUILD
+++ b/BUILD
@@ -1862,24 +1862,6 @@
 )
 
 grpc_cc_library(
-    name = "alts_proto",
-    srcs = [
-        "src/core/tsi/alts/handshaker/altscontext.pb.c",
-        "src/core/tsi/alts/handshaker/handshaker.pb.c",
-        "src/core/tsi/alts/handshaker/transport_security_common.pb.c",
-    ],
-    hdrs = [
-        "src/core/tsi/alts/handshaker/altscontext.pb.h",
-        "src/core/tsi/alts/handshaker/handshaker.pb.h",
-        "src/core/tsi/alts/handshaker/transport_security_common.pb.h",
-    ],
-    external_deps = [
-        "nanopb",
-    ],
-    language = "c++",
-)
-
-grpc_cc_library(
     name = "alts_util",
     srcs = [
         "src/core/lib/security/credentials/alts/check_gcp_environment.cc",
@@ -1889,24 +1871,17 @@
         "src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc",
         "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc",
         "src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc",
         "src/core/tsi/alts/handshaker/transport_security_common_api.cc",
     ],
     hdrs = [
         "src/core/lib/security/credentials/alts/check_gcp_environment.h",
         "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h",
         "src/core/tsi/alts/handshaker/transport_security_common_api.h",
     ],
-    external_deps = [
-        "nanopb",
-    ],
     language = "c++",
     public_hdrs = GRPC_SECURE_PUBLIC_HDRS,
     deps = [
-        "alts_proto",
+        "alts_upb",
         "gpr",
         "grpc_base",
     ],
diff --git a/BUILD.gn b/BUILD.gn
index e63f7d2..18204a1 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -462,6 +462,12 @@
         "src/core/ext/upb-generated/google/protobuf/wrappers.upb.h",
         "src/core/ext/upb-generated/google/rpc/status.upb.c",
         "src/core/ext/upb-generated/google/rpc/status.upb.h",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c",
+        "src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h",
         "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c",
         "src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h",
         "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c",
@@ -865,10 +871,6 @@
         "src/core/tsi/alts/frame_protector/frame_handler.h",
         "src/core/tsi/alts/handshaker/alts_handshaker_client.cc",
         "src/core/tsi/alts/handshaker/alts_handshaker_client.h",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc",
-        "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h",
         "src/core/tsi/alts/handshaker/alts_shared_resource.cc",
         "src/core/tsi/alts/handshaker/alts_shared_resource.h",
         "src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc",
@@ -876,12 +878,6 @@
         "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h",
         "src/core/tsi/alts/handshaker/alts_tsi_utils.cc",
         "src/core/tsi/alts/handshaker/alts_tsi_utils.h",
-        "src/core/tsi/alts/handshaker/altscontext.pb.c",
-        "src/core/tsi/alts/handshaker/altscontext.pb.h",
-        "src/core/tsi/alts/handshaker/handshaker.pb.c",
-        "src/core/tsi/alts/handshaker/handshaker.pb.h",
-        "src/core/tsi/alts/handshaker/transport_security_common.pb.c",
-        "src/core/tsi/alts/handshaker/transport_security_common.pb.h",
         "src/core/tsi/alts/handshaker/transport_security_common_api.cc",
         "src/core/tsi/alts/handshaker/transport_security_common_api.h",
         "src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc",
@@ -934,7 +930,6 @@
         ":gpr",
         "//third_party/cares",
         ":address_sorting",
-        ":nanopb",
     ]
     
     public_configs = [
diff --git a/CMakeLists.txt b/CMakeLists.txt
index b1c70db..70aaedd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -528,7 +528,6 @@
 add_dependencies(buildtests_cxx alts_frame_protector_test)
 add_dependencies(buildtests_cxx alts_grpc_record_protocol_test)
 add_dependencies(buildtests_cxx alts_handshaker_client_test)
-add_dependencies(buildtests_cxx alts_handshaker_service_api_test)
 add_dependencies(buildtests_cxx alts_iovec_record_protocol_test)
 add_dependencies(buildtests_cxx alts_security_connector_test)
 add_dependencies(buildtests_cxx alts_tsi_handshaker_test)
@@ -1255,23 +1254,18 @@
   src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc
   src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc
   src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
-  src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc
-  src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc
   src/core/tsi/alts/handshaker/alts_tsi_utils.cc
   src/core/tsi/alts/handshaker/transport_security_common_api.cc
-  src/core/tsi/alts/handshaker/altscontext.pb.c
-  src/core/tsi/alts/handshaker/handshaker.pb.c
-  src/core/tsi/alts/handshaker/transport_security_common.pb.c
-  third_party/nanopb/pb_common.c
-  third_party/nanopb/pb_decode.c
-  third_party/nanopb/pb_encode.c
-  src/core/tsi/transport_security.cc
+  src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c
+  src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c
+  src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c
   third_party/upb/upb/decode.c
   third_party/upb/upb/encode.c
   third_party/upb/upb/msg.c
   third_party/upb/upb/port.c
   third_party/upb/upb/table.c
   third_party/upb/upb/upb.c
+  src/core/tsi/transport_security.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
   src/core/ext/transport/chttp2/client/authority.cc
@@ -1771,16 +1765,11 @@
   src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc
   src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc
   src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
-  src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc
-  src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc
   src/core/tsi/alts/handshaker/alts_tsi_utils.cc
   src/core/tsi/alts/handshaker/transport_security_common_api.cc
-  src/core/tsi/alts/handshaker/altscontext.pb.c
-  src/core/tsi/alts/handshaker/handshaker.pb.c
-  src/core/tsi/alts/handshaker/transport_security_common.pb.c
-  third_party/nanopb/pb_common.c
-  third_party/nanopb/pb_decode.c
-  third_party/nanopb/pb_encode.c
+  src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c
+  src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c
+  src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c
   src/core/tsi/transport_security.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create.cc
   src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc
@@ -11272,47 +11261,6 @@
 endif (gRPC_BUILD_TESTS)
 if (gRPC_BUILD_TESTS)
 
-add_executable(alts_handshaker_service_api_test
-  test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc
-  third_party/googletest/googletest/src/gtest-all.cc
-  third_party/googletest/googlemock/src/gmock-all.cc
-)
-
-
-target_include_directories(alts_handshaker_service_api_test
-  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}
-  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
-  PRIVATE ${_gRPC_ADDRESS_SORTING_INCLUDE_DIR}
-  PRIVATE ${_gRPC_BENCHMARK_INCLUDE_DIR}
-  PRIVATE ${_gRPC_CARES_INCLUDE_DIR}
-  PRIVATE ${_gRPC_GFLAGS_INCLUDE_DIR}
-  PRIVATE ${_gRPC_NANOPB_INCLUDE_DIR}
-  PRIVATE ${_gRPC_PROTOBUF_INCLUDE_DIR}
-  PRIVATE ${_gRPC_SSL_INCLUDE_DIR}
-  PRIVATE ${_gRPC_UPB_GENERATED_DIR}
-  PRIVATE ${_gRPC_UPB_GRPC_GENERATED_DIR}
-  PRIVATE ${_gRPC_UPB_INCLUDE_DIR}
-  PRIVATE ${_gRPC_ZLIB_INCLUDE_DIR}
-  PRIVATE third_party/googletest/googletest/include
-  PRIVATE third_party/googletest/googletest
-  PRIVATE third_party/googletest/googlemock/include
-  PRIVATE third_party/googletest/googlemock
-  PRIVATE ${_gRPC_PROTO_GENS_DIR}
-)
-
-target_link_libraries(alts_handshaker_service_api_test
-  ${_gRPC_PROTOBUF_LIBRARIES}
-  ${_gRPC_ALLTARGETS_LIBRARIES}
-  alts_test_util
-  gpr
-  grpc
-  ${_gRPC_GFLAGS_LIBRARIES}
-)
-
-
-endif (gRPC_BUILD_TESTS)
-if (gRPC_BUILD_TESTS)
-
 add_executable(alts_iovec_record_protocol_test
   test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc
   third_party/googletest/googletest/src/gtest-all.cc
diff --git a/Makefile b/Makefile
index 5189510..ef5963d 100644
--- a/Makefile
+++ b/Makefile
@@ -1146,7 +1146,6 @@
 alts_frame_protector_test: $(BINDIR)/$(CONFIG)/alts_frame_protector_test
 alts_grpc_record_protocol_test: $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test
 alts_handshaker_client_test: $(BINDIR)/$(CONFIG)/alts_handshaker_client_test
-alts_handshaker_service_api_test: $(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test
 alts_iovec_record_protocol_test: $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test
 alts_security_connector_test: $(BINDIR)/$(CONFIG)/alts_security_connector_test
 alts_tsi_handshaker_test: $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test
@@ -1627,7 +1626,6 @@
   $(BINDIR)/$(CONFIG)/alts_frame_protector_test \
   $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test \
   $(BINDIR)/$(CONFIG)/alts_handshaker_client_test \
-  $(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test \
   $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test \
   $(BINDIR)/$(CONFIG)/alts_security_connector_test \
   $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test \
@@ -1795,7 +1793,6 @@
   $(BINDIR)/$(CONFIG)/alts_frame_protector_test \
   $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test \
   $(BINDIR)/$(CONFIG)/alts_handshaker_client_test \
-  $(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test \
   $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test \
   $(BINDIR)/$(CONFIG)/alts_security_connector_test \
   $(BINDIR)/$(CONFIG)/alts_tsi_handshaker_test \
@@ -2241,8 +2238,6 @@
 	$(Q) $(BINDIR)/$(CONFIG)/alts_grpc_record_protocol_test || ( echo test alts_grpc_record_protocol_test failed ; exit 1 )
 	$(E) "[RUN]     Testing alts_handshaker_client_test"
 	$(Q) $(BINDIR)/$(CONFIG)/alts_handshaker_client_test || ( echo test alts_handshaker_client_test failed ; exit 1 )
-	$(E) "[RUN]     Testing alts_handshaker_service_api_test"
-	$(Q) $(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test || ( echo test alts_handshaker_service_api_test failed ; exit 1 )
 	$(E) "[RUN]     Testing alts_iovec_record_protocol_test"
 	$(Q) $(BINDIR)/$(CONFIG)/alts_iovec_record_protocol_test || ( echo test alts_iovec_record_protocol_test failed ; exit 1 )
 	$(E) "[RUN]     Testing alts_security_connector_test"
@@ -3762,23 +3757,18 @@
     src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc \
     src/core/tsi/alts/handshaker/alts_tsi_utils.cc \
     src/core/tsi/alts/handshaker/transport_security_common_api.cc \
-    src/core/tsi/alts/handshaker/altscontext.pb.c \
-    src/core/tsi/alts/handshaker/handshaker.pb.c \
-    src/core/tsi/alts/handshaker/transport_security_common.pb.c \
-    third_party/nanopb/pb_common.c \
-    third_party/nanopb/pb_decode.c \
-    third_party/nanopb/pb_encode.c \
-    src/core/tsi/transport_security.cc \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \
     third_party/upb/upb/decode.c \
     third_party/upb/upb/encode.c \
     third_party/upb/upb/msg.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
+    src/core/tsi/transport_security.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
@@ -4266,16 +4256,11 @@
     src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc \
     src/core/tsi/alts/handshaker/alts_tsi_utils.cc \
     src/core/tsi/alts/handshaker/transport_security_common_api.cc \
-    src/core/tsi/alts/handshaker/altscontext.pb.c \
-    src/core/tsi/alts/handshaker/handshaker.pb.c \
-    src/core/tsi/alts/handshaker/transport_security_common.pb.c \
-    third_party/nanopb/pb_common.c \
-    third_party/nanopb/pb_decode.c \
-    third_party/nanopb/pb_encode.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \
     src/core/tsi/transport_security.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
@@ -13657,49 +13642,6 @@
 endif
 
 
-ALTS_HANDSHAKER_SERVICE_API_TEST_SRC = \
-    test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc \
-
-ALTS_HANDSHAKER_SERVICE_API_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(ALTS_HANDSHAKER_SERVICE_API_TEST_SRC))))
-ifeq ($(NO_SECURE),true)
-
-# You can't build secure targets if you don't have OpenSSL.
-
-$(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test: openssl_dep_error
-
-else
-
-
-
-
-ifeq ($(NO_PROTOBUF),true)
-
-# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.5.0+.
-
-$(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test: protobuf_dep_error
-
-else
-
-$(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test: $(PROTOBUF_DEP) $(ALTS_HANDSHAKER_SERVICE_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libalts_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
-	$(E) "[LD]      Linking $@"
-	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS) $(ALTS_HANDSHAKER_SERVICE_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libalts_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/alts_handshaker_service_api_test
-
-endif
-
-endif
-
-$(OBJDIR)/$(CONFIG)/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.o:  $(LIBDIR)/$(CONFIG)/libalts_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LIBDIR)/$(CONFIG)/libgrpc.a
-
-deps_alts_handshaker_service_api_test: $(ALTS_HANDSHAKER_SERVICE_API_TEST_OBJS:.o=.dep)
-
-ifneq ($(NO_SECURE),true)
-ifneq ($(NO_DEPS),true)
--include $(ALTS_HANDSHAKER_SERVICE_API_TEST_OBJS:.o=.dep)
-endif
-endif
-
-
 ALTS_IOVEC_RECORD_PROTOCOL_TEST_SRC = \
     test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc \
 
@@ -22480,6 +22422,9 @@
 src/core/ext/transport/cronet/plugin_registry/grpc_cronet_plugin_registry.cc: $(OPENSSL_DEP)
 src/core/ext/transport/cronet/transport/cronet_api_dummy.cc: $(OPENSSL_DEP)
 src/core/ext/transport/cronet/transport/cronet_transport.cc: $(OPENSSL_DEP)
+src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c: $(OPENSSL_DEP)
+src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c: $(OPENSSL_DEP)
 src/core/lib/http/httpcli_security_connector.cc: $(OPENSSL_DEP)
 src/core/lib/security/context/security_context.cc: $(OPENSSL_DEP)
 src/core/lib/security/credentials/alts/alts_credentials.cc: $(OPENSSL_DEP)
@@ -22534,14 +22479,9 @@
 src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/frame_protector/frame_handler.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/handshaker/alts_handshaker_client.cc: $(OPENSSL_DEP)
-src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc: $(OPENSSL_DEP)
-src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/handshaker/alts_shared_resource.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/handshaker/alts_tsi_utils.cc: $(OPENSSL_DEP)
-src/core/tsi/alts/handshaker/altscontext.pb.c: $(OPENSSL_DEP)
-src/core/tsi/alts/handshaker/handshaker.pb.c: $(OPENSSL_DEP)
-src/core/tsi/alts/handshaker/transport_security_common.pb.c: $(OPENSSL_DEP)
 src/core/tsi/alts/handshaker/transport_security_common_api.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc: $(OPENSSL_DEP)
 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc: $(OPENSSL_DEP)
@@ -22620,9 +22560,6 @@
 test/cpp/util/subprocess.cc: $(OPENSSL_DEP)
 test/cpp/util/test_config_cc.cc: $(OPENSSL_DEP)
 test/cpp/util/test_credentials_provider.cc: $(OPENSSL_DEP)
-third_party/nanopb/pb_common.c: $(OPENSSL_DEP)
-third_party/nanopb/pb_decode.c: $(OPENSSL_DEP)
-third_party/nanopb/pb_encode.c: $(OPENSSL_DEP)
 endif
 
 .PHONY: all strip tools dep_error openssl_dep_error openssl_dep_message git_update stop buildtests buildtests_c buildtests_cxx test test_c test_cxx install install_c install_cxx install-headers install-headers_c install-headers_cxx install-shared install-shared_c install-shared_cxx install-static install-static_c install-static_cxx strip strip-shared strip-static strip_c strip-shared_c strip-static_c strip_cxx strip-shared_cxx strip-static_cxx dep_c dep_cxx bins_dep_c bins_dep_cxx clean
diff --git a/build.yaml b/build.yaml
index a18b916..0b8c195 100644
--- a/build.yaml
+++ b/build.yaml
@@ -17,17 +17,6 @@
   g_stands_for: ganges
   version: 1.24.0-dev
 filegroups:
-- name: alts_proto
-  headers:
-  - src/core/tsi/alts/handshaker/altscontext.pb.h
-  - src/core/tsi/alts/handshaker/handshaker.pb.h
-  - src/core/tsi/alts/handshaker/transport_security_common.pb.h
-  src:
-  - src/core/tsi/alts/handshaker/altscontext.pb.c
-  - src/core/tsi/alts/handshaker/handshaker.pb.c
-  - src/core/tsi/alts/handshaker/transport_security_common.pb.c
-  uses:
-  - nanopb
 - name: alts_tsi
   headers:
   - src/core/tsi/alts/crypt/gsec.h
@@ -80,14 +69,14 @@
   - src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c
   - src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c
   - src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c
+  uses:
+  - upb
 - name: alts_util
   public_headers:
   - include/grpc/grpc_security.h
   headers:
   - src/core/lib/security/credentials/alts/check_gcp_environment.h
   - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h
-  - src/core/tsi/alts/handshaker/alts_handshaker_service_api.h
-  - src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h
   - src/core/tsi/alts/handshaker/alts_tsi_utils.h
   - src/core/tsi/alts/handshaker/transport_security_common_api.h
   src:
@@ -98,14 +87,11 @@
   - src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc
   - src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc
   - src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc
-  - src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc
-  - src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc
   - src/core/tsi/alts/handshaker/alts_tsi_utils.cc
   - src/core/tsi/alts/handshaker/transport_security_common_api.cc
   uses:
-  - alts_proto
+  - alts_upb
   - grpc_base
-  - nanopb
   - tsi_interface
   - upb
 - name: census
@@ -202,6 +188,8 @@
   - src/core/ext/upb-generated/google/protobuf/timestamp.upb.c
   - src/core/ext/upb-generated/google/protobuf/wrappers.upb.c
   - src/core/ext/upb-generated/google/rpc/status.upb.c
+  uses:
+  - upb
 - name: gpr_base
   src:
   - src/core/lib/gpr/alloc.cc
@@ -878,6 +866,7 @@
   - src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c
   uses:
   - google_api_upb
+  - upb
 - name: grpc_max_age_filter
   headers:
   - src/core/ext/filters/max_age/max_age_filter.h
@@ -4027,15 +4016,6 @@
   - alts_test_util
   - gpr
   - grpc
-- name: alts_handshaker_service_api_test
-  build: test
-  language: c++
-  src:
-  - test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc
-  deps:
-  - alts_test_util
-  - gpr
-  - grpc
 - name: alts_iovec_record_protocol_test
   build: test
   language: c++
diff --git a/config.m4 b/config.m4
index 1bc581e..72fd381 100644
--- a/config.m4
+++ b/config.m4
@@ -334,23 +334,18 @@
     src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc \
     src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc \
-    src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc \
     src/core/tsi/alts/handshaker/alts_tsi_utils.cc \
     src/core/tsi/alts/handshaker/transport_security_common_api.cc \
-    src/core/tsi/alts/handshaker/altscontext.pb.c \
-    src/core/tsi/alts/handshaker/handshaker.pb.c \
-    src/core/tsi/alts/handshaker/transport_security_common.pb.c \
-    third_party/nanopb/pb_common.c \
-    third_party/nanopb/pb_decode.c \
-    third_party/nanopb/pb_encode.c \
-    src/core/tsi/transport_security.cc \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \
+    src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \
     third_party/upb/upb/decode.c \
     third_party/upb/upb/encode.c \
     third_party/upb/upb/msg.c \
     third_party/upb/upb/port.c \
     third_party/upb/upb/table.c \
     third_party/upb/upb/upb.c \
+    src/core/tsi/transport_security.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create.cc \
     src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc \
     src/core/ext/transport/chttp2/client/authority.cc \
@@ -767,6 +762,7 @@
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/api)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/protobuf)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/google/rpc)
+  PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/gcp)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/health/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/src/proto/grpc/lb/v1)
   PHP_ADD_BUILD_DIR($ext_builddir/src/core/ext/upb-generated/validate)
@@ -853,6 +849,5 @@
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/crypto/x509v3)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/ssl)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl/third_party/fiat)
-  PHP_ADD_BUILD_DIR($ext_builddir/third_party/nanopb)
   PHP_ADD_BUILD_DIR($ext_builddir/third_party/upb/upb)
 fi
diff --git a/config.w32 b/config.w32
index 52553fe..a2d0d0f 100644
--- a/config.w32
+++ b/config.w32
@@ -307,23 +307,18 @@
     "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_client_options.cc " +
     "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_options.cc " +
     "src\\core\\lib\\security\\credentials\\alts\\grpc_alts_credentials_server_options.cc " +
-    "src\\core\\tsi\\alts\\handshaker\\alts_handshaker_service_api.cc " +
-    "src\\core\\tsi\\alts\\handshaker\\alts_handshaker_service_api_util.cc " +
     "src\\core\\tsi\\alts\\handshaker\\alts_tsi_utils.cc " +
     "src\\core\\tsi\\alts\\handshaker\\transport_security_common_api.cc " +
-    "src\\core\\tsi\\alts\\handshaker\\altscontext.pb.c " +
-    "src\\core\\tsi\\alts\\handshaker\\handshaker.pb.c " +
-    "src\\core\\tsi\\alts\\handshaker\\transport_security_common.pb.c " +
-    "third_party\\nanopb\\pb_common.c " +
-    "third_party\\nanopb\\pb_decode.c " +
-    "third_party\\nanopb\\pb_encode.c " +
-    "src\\core\\tsi\\transport_security.cc " +
+    "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\altscontext.upb.c " +
+    "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\handshaker.upb.c " +
+    "src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp\\transport_security_common.upb.c " +
     "third_party\\upb\\upb\\decode.c " +
     "third_party\\upb\\upb\\encode.c " +
     "third_party\\upb\\upb\\msg.c " +
     "third_party\\upb\\upb\\port.c " +
     "third_party\\upb\\upb\\table.c " +
     "third_party\\upb\\upb\\upb.c " +
+    "src\\core\\tsi\\transport_security.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\insecure\\channel_create_posix.cc " +
     "src\\core\\ext\\transport\\chttp2\\client\\authority.cc " +
@@ -785,6 +780,7 @@
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc");
+  FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\gcp");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\health\\v1");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\src\\core\\ext\\upb-generated\\src\\proto\\grpc\\lb");
@@ -883,7 +879,6 @@
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl\\ssl");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl\\third_party");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl\\third_party\\fiat");
-  FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\nanopb");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\upb\\upb");
   FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\zlib");
diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec
index e0c8a57..5f0b312 100644
--- a/gRPC-C++.podspec
+++ b/gRPC-C++.podspec
@@ -228,6 +228,10 @@
                       'src/cpp/server/health/default_health_check_service.h',
                       'src/cpp/server/thread_pool_interface.h',
                       'src/cpp/thread_manager/thread_manager.h',
+                      'third_party/nanopb/pb.h',
+                      'third_party/nanopb/pb_common.h',
+                      'third_party/nanopb/pb_decode.h',
+                      'third_party/nanopb/pb_encode.h',
                       'src/cpp/client/insecure_credentials.cc',
                       'src/cpp/client/secure_credentials.cc',
                       'src/cpp/common/auth_property_iterator.cc',
@@ -380,15 +384,11 @@
                       'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h',
                       'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api.h',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h',
                       'src/core/tsi/alts/handshaker/alts_tsi_utils.h',
                       'src/core/tsi/alts/handshaker/transport_security_common_api.h',
-                      'src/core/tsi/alts/handshaker/altscontext.pb.h',
-                      'src/core/tsi/alts/handshaker/handshaker.pb.h',
-                      'src/core/tsi/alts/handshaker/transport_security_common.pb.h',
-                      'src/core/tsi/transport_security.h',
-                      'src/core/tsi/transport_security_interface.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h',
                       'third_party/upb/upb/decode.h',
                       'third_party/upb/upb/encode.h',
                       'third_party/upb/upb/generated_util.h',
@@ -397,6 +397,8 @@
                       'third_party/upb/upb/port_undef.inc',
                       'third_party/upb/upb/table.int.h',
                       'third_party/upb/upb/upb.h',
+                      'src/core/tsi/transport_security.h',
+                      'src/core/tsi/transport_security_interface.h',
                       'src/core/ext/transport/chttp2/client/authority.h',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.h',
                       'src/core/ext/filters/client_channel/backup_poller.h',
diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec
index 0d6a282..2a35ca3 100644
--- a/gRPC-Core.podspec
+++ b/gRPC-Core.podspec
@@ -336,15 +336,11 @@
                       'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h',
                       'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api.h',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h',
                       'src/core/tsi/alts/handshaker/alts_tsi_utils.h',
                       'src/core/tsi/alts/handshaker/transport_security_common_api.h',
-                      'src/core/tsi/alts/handshaker/altscontext.pb.h',
-                      'src/core/tsi/alts/handshaker/handshaker.pb.h',
-                      'src/core/tsi/alts/handshaker/transport_security_common.pb.h',
-                      'src/core/tsi/transport_security.h',
-                      'src/core/tsi/transport_security_interface.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h',
                       'third_party/upb/upb/decode.h',
                       'third_party/upb/upb/encode.h',
                       'third_party/upb/upb/generated_util.h',
@@ -353,6 +349,8 @@
                       'third_party/upb/upb/port_undef.inc',
                       'third_party/upb/upb/table.int.h',
                       'third_party/upb/upb/upb.h',
+                      'src/core/tsi/transport_security.h',
+                      'src/core/tsi/transport_security_interface.h',
                       'src/core/ext/transport/chttp2/client/authority.h',
                       'src/core/ext/transport/chttp2/client/chttp2_connector.h',
                       'src/core/ext/filters/client_channel/backup_poller.h',
@@ -834,20 +832,18 @@
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc',
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc',
                       'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc',
-                      'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc',
                       'src/core/tsi/alts/handshaker/alts_tsi_utils.cc',
                       'src/core/tsi/alts/handshaker/transport_security_common_api.cc',
-                      'src/core/tsi/alts/handshaker/altscontext.pb.c',
-                      'src/core/tsi/alts/handshaker/handshaker.pb.c',
-                      'src/core/tsi/alts/handshaker/transport_security_common.pb.c',
-                      'src/core/tsi/transport_security.cc',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c',
+                      'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c',
                       'third_party/upb/upb/decode.c',
                       'third_party/upb/upb/encode.c',
                       'third_party/upb/upb/msg.c',
                       'third_party/upb/upb/port.c',
                       'third_party/upb/upb/table.c',
                       'third_party/upb/upb/upb.c',
+                      'src/core/tsi/transport_security.cc',
                       'src/core/ext/transport/chttp2/client/insecure/channel_create.cc',
                       'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
                       'src/core/ext/transport/chttp2/client/authority.cc',
@@ -1065,15 +1061,11 @@
                               'src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h',
                               'src/core/lib/security/credentials/alts/check_gcp_environment.h',
                               'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h',
-                              'src/core/tsi/alts/handshaker/alts_handshaker_service_api.h',
-                              'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h',
                               'src/core/tsi/alts/handshaker/alts_tsi_utils.h',
                               'src/core/tsi/alts/handshaker/transport_security_common_api.h',
-                              'src/core/tsi/alts/handshaker/altscontext.pb.h',
-                              'src/core/tsi/alts/handshaker/handshaker.pb.h',
-                              'src/core/tsi/alts/handshaker/transport_security_common.pb.h',
-                              'src/core/tsi/transport_security.h',
-                              'src/core/tsi/transport_security_interface.h',
+                              'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h',
+                              'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h',
+                              'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h',
                               'third_party/upb/upb/decode.h',
                               'third_party/upb/upb/encode.h',
                               'third_party/upb/upb/generated_util.h',
@@ -1082,6 +1074,8 @@
                               'third_party/upb/upb/port_undef.inc',
                               'third_party/upb/upb/table.int.h',
                               'third_party/upb/upb/upb.h',
+                              'src/core/tsi/transport_security.h',
+                              'src/core/tsi/transport_security_interface.h',
                               'src/core/ext/transport/chttp2/client/authority.h',
                               'src/core/ext/transport/chttp2/client/chttp2_connector.h',
                               'src/core/ext/filters/client_channel/backup_poller.h',
@@ -1336,16 +1330,9 @@
 
     ss.source_files = 'src/core/ext/transport/cronet/client/secure/cronet_channel_create.cc',
                       'src/core/ext/transport/cronet/transport/cronet_transport.cc',
-                      'third_party/nanopb/pb_common.c',
-                      'third_party/nanopb/pb_decode.c',
-                      'third_party/nanopb/pb_encode.c',
                       'src/core/ext/transport/cronet/client/secure/cronet_channel_create.h',
                       'src/core/ext/transport/cronet/transport/cronet_transport.h',
-                      'third_party/objective_c/Cronet/bidirectional_stream_c.h',
-                      'third_party/nanopb/pb.h',
-                      'third_party/nanopb/pb_common.h',
-                      'third_party/nanopb/pb_decode.h',
-                      'third_party/nanopb/pb_encode.h'
+                      'third_party/objective_c/Cronet/bidirectional_stream_c.h'
   end
 
   s.subspec 'Tests' do |ss|
diff --git a/grpc.gemspec b/grpc.gemspec
index 2c658f4..c817006 100644
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -265,19 +265,11 @@
   s.files += %w( src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h )
   s.files += %w( src/core/lib/security/credentials/alts/check_gcp_environment.h )
   s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h )
-  s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_service_api.h )
-  s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h )
   s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.h )
   s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.h )
-  s.files += %w( src/core/tsi/alts/handshaker/altscontext.pb.h )
-  s.files += %w( src/core/tsi/alts/handshaker/handshaker.pb.h )
-  s.files += %w( src/core/tsi/alts/handshaker/transport_security_common.pb.h )
-  s.files += %w( third_party/nanopb/pb.h )
-  s.files += %w( third_party/nanopb/pb_common.h )
-  s.files += %w( third_party/nanopb/pb_decode.h )
-  s.files += %w( third_party/nanopb/pb_encode.h )
-  s.files += %w( src/core/tsi/transport_security.h )
-  s.files += %w( src/core/tsi/transport_security_interface.h )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h )
   s.files += %w( third_party/upb/upb/decode.h )
   s.files += %w( third_party/upb/upb/encode.h )
   s.files += %w( third_party/upb/upb/generated_util.h )
@@ -286,6 +278,8 @@
   s.files += %w( third_party/upb/upb/port_undef.inc )
   s.files += %w( third_party/upb/upb/table.int.h )
   s.files += %w( third_party/upb/upb/upb.h )
+  s.files += %w( src/core/tsi/transport_security.h )
+  s.files += %w( src/core/tsi/transport_security_interface.h )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.h )
   s.files += %w( src/core/ext/transport/chttp2/client/chttp2_connector.h )
   s.files += %w( src/core/ext/filters/client_channel/backup_poller.h )
@@ -767,23 +761,18 @@
   s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc )
   s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc )
   s.files += %w( src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc )
-  s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc )
-  s.files += %w( src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc )
   s.files += %w( src/core/tsi/alts/handshaker/alts_tsi_utils.cc )
   s.files += %w( src/core/tsi/alts/handshaker/transport_security_common_api.cc )
-  s.files += %w( src/core/tsi/alts/handshaker/altscontext.pb.c )
-  s.files += %w( src/core/tsi/alts/handshaker/handshaker.pb.c )
-  s.files += %w( src/core/tsi/alts/handshaker/transport_security_common.pb.c )
-  s.files += %w( third_party/nanopb/pb_common.c )
-  s.files += %w( third_party/nanopb/pb_decode.c )
-  s.files += %w( third_party/nanopb/pb_encode.c )
-  s.files += %w( src/core/tsi/transport_security.cc )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c )
+  s.files += %w( src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c )
   s.files += %w( third_party/upb/upb/decode.c )
   s.files += %w( third_party/upb/upb/encode.c )
   s.files += %w( third_party/upb/upb/msg.c )
   s.files += %w( third_party/upb/upb/port.c )
   s.files += %w( third_party/upb/upb/table.c )
   s.files += %w( third_party/upb/upb/upb.c )
+  s.files += %w( src/core/tsi/transport_security.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc )
   s.files += %w( src/core/ext/transport/chttp2/client/authority.cc )
diff --git a/grpc.gyp b/grpc.gyp
index 5241a57..173aef5 100644
--- a/grpc.gyp
+++ b/grpc.gyp
@@ -544,23 +544,18 @@
         'src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc',
         'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc',
         'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc',
-        'src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc',
-        'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc',
         'src/core/tsi/alts/handshaker/alts_tsi_utils.cc',
         'src/core/tsi/alts/handshaker/transport_security_common_api.cc',
-        'src/core/tsi/alts/handshaker/altscontext.pb.c',
-        'src/core/tsi/alts/handshaker/handshaker.pb.c',
-        'src/core/tsi/alts/handshaker/transport_security_common.pb.c',
-        'third_party/nanopb/pb_common.c',
-        'third_party/nanopb/pb_decode.c',
-        'third_party/nanopb/pb_encode.c',
-        'src/core/tsi/transport_security.cc',
+        'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c',
+        'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c',
+        'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c',
         'third_party/upb/upb/decode.c',
         'third_party/upb/upb/encode.c',
         'third_party/upb/upb/msg.c',
         'third_party/upb/upb/port.c',
         'third_party/upb/upb/table.c',
         'third_party/upb/upb/upb.c',
+        'src/core/tsi/transport_security.cc',
         'src/core/ext/transport/chttp2/client/insecure/channel_create.cc',
         'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
         'src/core/ext/transport/chttp2/client/authority.cc',
diff --git a/package.xml b/package.xml
index 1e1bc3d..979bc46 100644
--- a/package.xml
+++ b/package.xml
@@ -270,19 +270,11 @@
     <file baseinstalldir="/" name="src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/check_gcp_environment.h" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_handshaker_service_api.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_tsi_utils.h" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/transport_security_common_api.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/altscontext.pb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/handshaker.pb.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/transport_security_common.pb.h" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb.h" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_common.h" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_decode.h" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_encode.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/transport_security.h" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/decode.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/encode.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/generated_util.h" role="src" />
@@ -291,6 +283,8 @@
     <file baseinstalldir="/" name="third_party/upb/upb/port_undef.inc" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/table.int.h" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/upb.h" role="src" />
+    <file baseinstalldir="/" name="src/core/tsi/transport_security.h" role="src" />
+    <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/chttp2_connector.h" role="src" />
     <file baseinstalldir="/" name="src/core/ext/filters/client_channel/backup_poller.h" role="src" />
@@ -772,23 +766,18 @@
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc" role="src" />
     <file baseinstalldir="/" name="src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/alts_tsi_utils.cc" role="src" />
     <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/transport_security_common_api.cc" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/altscontext.pb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/handshaker.pb.c" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/alts/handshaker/transport_security_common.pb.c" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_common.c" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_decode.c" role="src" />
-    <file baseinstalldir="/" name="third_party/nanopb/pb_encode.c" role="src" />
-    <file baseinstalldir="/" name="src/core/tsi/transport_security.cc" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/decode.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/encode.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/msg.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/port.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/table.c" role="src" />
     <file baseinstalldir="/" name="third_party/upb/upb/upb.c" role="src" />
+    <file baseinstalldir="/" name="src/core/tsi/transport_security.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/insecure/channel_create.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc" role="src" />
     <file baseinstalldir="/" name="src/core/ext/transport/chttp2/client/authority.cc" role="src" />
diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc
index 464de9e..55fd066 100644
--- a/src/core/tsi/alts/handshaker/alts_handshaker_client.cc
+++ b/src/core/tsi/alts/handshaker/alts_handshaker_client.cc
@@ -27,7 +27,6 @@
 #include "src/core/lib/slice/slice_internal.h"
 #include "src/core/lib/surface/call.h"
 #include "src/core/lib/surface/channel.h"
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h"
 #include "src/core/tsi/alts/handshaker/alts_shared_resource.h"
 #include "src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h"
 #include "src/core/tsi/alts/handshaker/alts_tsi_utils.h"
@@ -91,9 +90,9 @@
   client->send_buffer = nullptr;
 }
 
-static bool is_handshake_finished_properly(grpc_gcp_handshaker_resp* resp) {
+static bool is_handshake_finished_properly(grpc_gcp_HandshakerResp* resp) {
   GPR_ASSERT(resp != nullptr);
-  if (resp->has_result) {
+  if (grpc_gcp_HandshakerResp_result(resp)) {
     return true;
   }
   return false;
@@ -140,8 +139,9 @@
     cb(TSI_INTERNAL_ERROR, user_data, nullptr, 0, nullptr);
     return;
   }
-  grpc_gcp_handshaker_resp* resp =
-      alts_tsi_utils_deserialize_response(recv_buffer);
+  upb::Arena arena;
+  grpc_gcp_HandshakerResp* resp =
+      alts_tsi_utils_deserialize_response(recv_buffer, arena.ptr());
   grpc_byte_buffer_destroy(client->recv_buffer);
   client->recv_buffer = nullptr;
   /* Invalid handshaker response check. */
@@ -150,35 +150,44 @@
     cb(TSI_DATA_CORRUPTED, user_data, nullptr, 0, nullptr);
     return;
   }
-  grpc_slice* slice = static_cast<grpc_slice*>(resp->out_frames.arg);
+  const grpc_gcp_HandshakerStatus* resp_status =
+      grpc_gcp_HandshakerResp_status(resp);
+  if (resp_status == nullptr) {
+    gpr_log(GPR_ERROR, "No status in HandshakerResp");
+    cb(TSI_DATA_CORRUPTED, user_data, nullptr, 0, nullptr);
+    return;
+  }
+  upb_strview out_frames = grpc_gcp_HandshakerResp_out_frames(resp);
   unsigned char* bytes_to_send = nullptr;
   size_t bytes_to_send_size = 0;
-  if (slice != nullptr) {
-    bytes_to_send_size = GRPC_SLICE_LENGTH(*slice);
+  if (out_frames.size > 0) {
+    bytes_to_send_size = out_frames.size;
     while (bytes_to_send_size > client->buffer_size) {
       client->buffer_size *= 2;
       client->buffer = static_cast<unsigned char*>(
           gpr_realloc(client->buffer, client->buffer_size));
     }
-    memcpy(client->buffer, GRPC_SLICE_START_PTR(*slice), bytes_to_send_size);
+    memcpy(client->buffer, out_frames.data, bytes_to_send_size);
     bytes_to_send = client->buffer;
   }
   tsi_handshaker_result* result = nullptr;
   if (is_handshake_finished_properly(resp)) {
     alts_tsi_handshaker_result_create(resp, client->is_client, &result);
-    alts_tsi_handshaker_result_set_unused_bytes(result, &client->recv_bytes,
-                                                resp->bytes_consumed);
+    alts_tsi_handshaker_result_set_unused_bytes(
+        result, &client->recv_bytes,
+        grpc_gcp_HandshakerResp_bytes_consumed(resp));
   }
-  grpc_status_code code = static_cast<grpc_status_code>(resp->status.code);
+  grpc_status_code code = static_cast<grpc_status_code>(
+      grpc_gcp_HandshakerStatus_code(resp_status));
   if (code != GRPC_STATUS_OK) {
-    grpc_slice* details = static_cast<grpc_slice*>(resp->status.details.arg);
-    if (details != nullptr) {
-      char* error_details = grpc_slice_to_c_string(*details);
+    upb_strview details = grpc_gcp_HandshakerStatus_details(resp_status);
+    if (details.size > 0) {
+      char* error_details = (char*)gpr_zalloc(details.size + 1);
+      memcpy(error_details, details.data, details.size);
       gpr_log(GPR_ERROR, "Error from handshaker service:%s", error_details);
       gpr_free(error_details);
     }
   }
-  grpc_gcp_handshaker_resp_destroy(resp);
   cb(alts_tsi_utils_convert_to_tsi_result(code), user_data, bytes_to_send,
      bytes_to_send_size, result);
 }
@@ -223,43 +232,59 @@
   return TSI_OK;
 }
 
+/* Serializes a grpc_gcp_HandshakerReq message into a buffer and returns newly
+ * grpc_byte_buffer holding it. */
+static grpc_byte_buffer* get_serialized_handshaker_req(
+    grpc_gcp_HandshakerReq* req, upb_arena* arena) {
+  size_t buf_length;
+  char* buf = grpc_gcp_HandshakerReq_serialize(req, arena, &buf_length);
+  if (buf == nullptr) {
+    return nullptr;
+  }
+  grpc_slice slice = grpc_slice_from_copied_buffer(buf, buf_length);
+  grpc_byte_buffer* byte_buffer = grpc_raw_byte_buffer_create(&slice, 1);
+  grpc_slice_unref_internal(slice);
+  return byte_buffer;
+}
+
 /* Create and populate a client_start handshaker request, then serialize it. */
 static grpc_byte_buffer* get_serialized_start_client(
     alts_handshaker_client* c) {
   GPR_ASSERT(c != nullptr);
   alts_grpc_handshaker_client* client =
       reinterpret_cast<alts_grpc_handshaker_client*>(c);
-  bool ok = true;
-  grpc_gcp_handshaker_req* req =
-      grpc_gcp_handshaker_req_create(CLIENT_START_REQ);
-  ok &= grpc_gcp_handshaker_req_set_handshake_protocol(
-      req, grpc_gcp_HandshakeProtocol_ALTS);
-  ok &= grpc_gcp_handshaker_req_add_application_protocol(
-      req, ALTS_APPLICATION_PROTOCOL);
-  ok &= grpc_gcp_handshaker_req_add_record_protocol(req, ALTS_RECORD_PROTOCOL);
-  grpc_gcp_rpc_protocol_versions* versions = &client->options->rpc_versions;
-  ok &= grpc_gcp_handshaker_req_set_rpc_versions(
-      req, versions->max_rpc_version.major, versions->max_rpc_version.minor,
-      versions->min_rpc_version.major, versions->min_rpc_version.minor);
-  char* target_name = grpc_slice_to_c_string(client->target_name);
-  ok &= grpc_gcp_handshaker_req_set_target_name(req, target_name);
+  upb::Arena arena;
+  grpc_gcp_HandshakerReq* req = grpc_gcp_HandshakerReq_new(arena.ptr());
+  grpc_gcp_StartClientHandshakeReq* start_client =
+      grpc_gcp_HandshakerReq_mutable_client_start(req, arena.ptr());
+  grpc_gcp_StartClientHandshakeReq_set_handshake_security_protocol(
+      start_client, grpc_gcp_ALTS);
+  grpc_gcp_StartClientHandshakeReq_add_application_protocols(
+      start_client, upb_strview_makez(ALTS_APPLICATION_PROTOCOL), arena.ptr());
+  grpc_gcp_StartClientHandshakeReq_add_record_protocols(
+      start_client, upb_strview_makez(ALTS_RECORD_PROTOCOL), arena.ptr());
+  grpc_gcp_RpcProtocolVersions* client_version =
+      grpc_gcp_StartClientHandshakeReq_mutable_rpc_versions(start_client,
+                                                            arena.ptr());
+  grpc_gcp_RpcProtocolVersions_assign_from_struct(
+      client_version, arena.ptr(), &client->options->rpc_versions);
+  grpc_gcp_StartClientHandshakeReq_set_target_name(
+      start_client,
+      upb_strview_make(reinterpret_cast<const char*>(
+                           GRPC_SLICE_START_PTR(client->target_name)),
+                       GRPC_SLICE_LENGTH(client->target_name)));
   target_service_account* ptr =
       (reinterpret_cast<grpc_alts_credentials_client_options*>(client->options))
           ->target_account_list_head;
   while (ptr != nullptr) {
-    grpc_gcp_handshaker_req_add_target_identity_service_account(req, ptr->data);
+    grpc_gcp_Identity* target_identity =
+        grpc_gcp_StartClientHandshakeReq_add_target_identities(start_client,
+                                                               arena.ptr());
+    grpc_gcp_Identity_set_service_account(target_identity,
+                                          upb_strview_makez(ptr->data));
     ptr = ptr->next;
   }
-  grpc_slice slice;
-  ok &= grpc_gcp_handshaker_req_encode(req, &slice);
-  grpc_byte_buffer* buffer = nullptr;
-  if (ok) {
-    buffer = grpc_raw_byte_buffer_create(&slice, 1 /* number of slices */);
-  }
-  grpc_slice_unref_internal(slice);
-  gpr_free(target_name);
-  grpc_gcp_handshaker_req_destroy(req);
-  return buffer;
+  return get_serialized_handshaker_req(req, arena.ptr());
 }
 
 static tsi_result handshaker_client_start_client(alts_handshaker_client* c) {
@@ -290,28 +315,35 @@
   GPR_ASSERT(bytes_received != nullptr);
   alts_grpc_handshaker_client* client =
       reinterpret_cast<alts_grpc_handshaker_client*>(c);
-  grpc_gcp_handshaker_req* req =
-      grpc_gcp_handshaker_req_create(SERVER_START_REQ);
-  bool ok = grpc_gcp_handshaker_req_add_application_protocol(
-      req, ALTS_APPLICATION_PROTOCOL);
-  ok &= grpc_gcp_handshaker_req_param_add_record_protocol(
-      req, grpc_gcp_HandshakeProtocol_ALTS, ALTS_RECORD_PROTOCOL);
-  ok &= grpc_gcp_handshaker_req_set_in_bytes(
-      req, reinterpret_cast<const char*> GRPC_SLICE_START_PTR(*bytes_received),
-      GRPC_SLICE_LENGTH(*bytes_received));
-  grpc_gcp_rpc_protocol_versions* versions = &client->options->rpc_versions;
-  ok &= grpc_gcp_handshaker_req_set_rpc_versions(
-      req, versions->max_rpc_version.major, versions->max_rpc_version.minor,
-      versions->min_rpc_version.major, versions->min_rpc_version.minor);
-  grpc_slice req_slice;
-  ok &= grpc_gcp_handshaker_req_encode(req, &req_slice);
-  grpc_byte_buffer* buffer = nullptr;
-  if (ok) {
-    buffer = grpc_raw_byte_buffer_create(&req_slice, 1 /* number of slices */);
-  }
-  grpc_slice_unref_internal(req_slice);
-  grpc_gcp_handshaker_req_destroy(req);
-  return buffer;
+
+  upb::Arena arena;
+  grpc_gcp_HandshakerReq* req = grpc_gcp_HandshakerReq_new(arena.ptr());
+
+  grpc_gcp_StartServerHandshakeReq* start_server =
+      grpc_gcp_HandshakerReq_mutable_server_start(req, arena.ptr());
+  grpc_gcp_StartServerHandshakeReq_add_application_protocols(
+      start_server, upb_strview_makez(ALTS_APPLICATION_PROTOCOL), arena.ptr());
+  grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry* param =
+      grpc_gcp_StartServerHandshakeReq_add_handshake_parameters(start_server,
+                                                                arena.ptr());
+  grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_set_key(
+      param, grpc_gcp_ALTS);
+  grpc_gcp_ServerHandshakeParameters* value =
+      grpc_gcp_ServerHandshakeParameters_new(arena.ptr());
+  grpc_gcp_ServerHandshakeParameters_add_record_protocols(
+      value, upb_strview_makez(ALTS_RECORD_PROTOCOL), arena.ptr());
+  grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_set_value(param,
+                                                                      value);
+  grpc_gcp_StartServerHandshakeReq_set_in_bytes(
+      start_server, upb_strview_make(reinterpret_cast<const char*>(
+                                         GRPC_SLICE_START_PTR(*bytes_received)),
+                                     GRPC_SLICE_LENGTH(*bytes_received)));
+  grpc_gcp_RpcProtocolVersions* server_version =
+      grpc_gcp_StartServerHandshakeReq_mutable_rpc_versions(start_server,
+                                                            arena.ptr());
+  grpc_gcp_RpcProtocolVersions_assign_from_struct(
+      server_version, arena.ptr(), &client->options->rpc_versions);
+  return get_serialized_handshaker_req(req, arena.ptr());
 }
 
 static tsi_result handshaker_client_start_server(alts_handshaker_client* c,
@@ -339,19 +371,15 @@
 /* Create and populate a next handshaker request, then serialize it. */
 static grpc_byte_buffer* get_serialized_next(grpc_slice* bytes_received) {
   GPR_ASSERT(bytes_received != nullptr);
-  grpc_gcp_handshaker_req* req = grpc_gcp_handshaker_req_create(NEXT_REQ);
-  bool ok = grpc_gcp_handshaker_req_set_in_bytes(
-      req, reinterpret_cast<const char*> GRPC_SLICE_START_PTR(*bytes_received),
-      GRPC_SLICE_LENGTH(*bytes_received));
-  grpc_slice req_slice;
-  ok &= grpc_gcp_handshaker_req_encode(req, &req_slice);
-  grpc_byte_buffer* buffer = nullptr;
-  if (ok) {
-    buffer = grpc_raw_byte_buffer_create(&req_slice, 1 /* number of slices */);
-  }
-  grpc_slice_unref_internal(req_slice);
-  grpc_gcp_handshaker_req_destroy(req);
-  return buffer;
+  upb::Arena arena;
+  grpc_gcp_HandshakerReq* req = grpc_gcp_HandshakerReq_new(arena.ptr());
+  grpc_gcp_NextHandshakeMessageReq* next =
+      grpc_gcp_HandshakerReq_mutable_next(req, arena.ptr());
+  grpc_gcp_NextHandshakeMessageReq_set_in_bytes(
+      next, upb_strview_make(reinterpret_cast<const char*> GRPC_SLICE_START_PTR(
+                                 *bytes_received),
+                             GRPC_SLICE_LENGTH(*bytes_received)));
+  return get_serialized_handshaker_req(req, arena.ptr());
 }
 
 static tsi_result handshaker_client_next(alts_handshaker_client* c,
diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc b/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc
deleted file mode 100644
index 256e414..0000000
--- a/src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc
+++ /dev/null
@@ -1,520 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * 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.
- *
- */
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "src/core/tsi/alts/handshaker/transport_security_common_api.h"
-
-/* HandshakerReq */
-grpc_gcp_handshaker_req* grpc_gcp_handshaker_req_create(
-    grpc_gcp_handshaker_req_type type) {
-  grpc_gcp_handshaker_req* req =
-      static_cast<grpc_gcp_handshaker_req*>(gpr_zalloc(sizeof(*req)));
-  switch (type) {
-    case CLIENT_START_REQ:
-      req->has_client_start = true;
-      break;
-    case SERVER_START_REQ:
-      req->has_server_start = true;
-      break;
-    case NEXT_REQ:
-      req->has_next = true;
-      break;
-  }
-  return req;
-}
-
-void grpc_gcp_handshaker_req_destroy(grpc_gcp_handshaker_req* req) {
-  if (req == nullptr) {
-    return;
-  }
-  if (req->has_client_start) {
-    /* Destroy client_start request. */
-    destroy_repeated_field_list_identity(
-        static_cast<repeated_field*>(req->client_start.target_identities.arg));
-    destroy_repeated_field_list_string(static_cast<repeated_field*>(
-        req->client_start.application_protocols.arg));
-    destroy_repeated_field_list_string(
-        static_cast<repeated_field*>(req->client_start.record_protocols.arg));
-    if (req->client_start.has_local_identity) {
-      destroy_slice(static_cast<grpc_slice*>(
-          req->client_start.local_identity.hostname.arg));
-      destroy_slice(static_cast<grpc_slice*>(
-          req->client_start.local_identity.service_account.arg));
-    }
-    if (req->client_start.has_local_endpoint) {
-      destroy_slice(static_cast<grpc_slice*>(
-          req->client_start.local_endpoint.ip_address.arg));
-    }
-    if (req->client_start.has_remote_endpoint) {
-      destroy_slice(static_cast<grpc_slice*>(
-          req->client_start.remote_endpoint.ip_address.arg));
-    }
-    destroy_slice(static_cast<grpc_slice*>(req->client_start.target_name.arg));
-  } else if (req->has_server_start) {
-    /* Destroy server_start request. */
-    size_t i = 0;
-    for (i = 0; i < req->server_start.handshake_parameters_count; i++) {
-      destroy_repeated_field_list_identity(
-          static_cast<repeated_field*>(req->server_start.handshake_parameters[i]
-                                           .value.local_identities.arg));
-      destroy_repeated_field_list_string(
-          static_cast<repeated_field*>(req->server_start.handshake_parameters[i]
-                                           .value.record_protocols.arg));
-    }
-    destroy_repeated_field_list_string(static_cast<repeated_field*>(
-        req->server_start.application_protocols.arg));
-    if (req->server_start.has_local_endpoint) {
-      destroy_slice(static_cast<grpc_slice*>(
-          req->server_start.local_endpoint.ip_address.arg));
-    }
-    if (req->server_start.has_remote_endpoint) {
-      destroy_slice(static_cast<grpc_slice*>(
-          req->server_start.remote_endpoint.ip_address.arg));
-    }
-    destroy_slice(static_cast<grpc_slice*>(req->server_start.in_bytes.arg));
-  } else {
-    /* Destroy next request. */
-    destroy_slice(static_cast<grpc_slice*>(req->next.in_bytes.arg));
-  }
-  gpr_free(req);
-}
-
-bool grpc_gcp_handshaker_req_set_handshake_protocol(
-    grpc_gcp_handshaker_req* req,
-    grpc_gcp_handshake_protocol handshake_protocol) {
-  if (req == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_handshake_protocol().");
-    return false;
-  }
-  req->client_start.has_handshake_security_protocol = true;
-  req->client_start.handshake_security_protocol = handshake_protocol;
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_target_name(grpc_gcp_handshaker_req* req,
-                                             const char* target_name) {
-  if (req == nullptr || target_name == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_target_name().");
-    return false;
-  }
-  grpc_slice* slice = create_slice(target_name, strlen(target_name));
-  req->client_start.target_name.arg = slice;
-  req->client_start.target_name.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_add_application_protocol(
-    grpc_gcp_handshaker_req* req, const char* application_protocol) {
-  if (req == nullptr || application_protocol == nullptr || req->has_next) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_add_application_protocol().");
-    return false;
-  }
-  grpc_slice* slice =
-      create_slice(application_protocol, strlen(application_protocol));
-  if (req->has_client_start) {
-    add_repeated_field(reinterpret_cast<repeated_field**>(
-                           &req->client_start.application_protocols.arg),
-                       slice);
-    req->client_start.application_protocols.funcs.encode =
-        encode_repeated_string_cb;
-  } else {
-    add_repeated_field(reinterpret_cast<repeated_field**>(
-                           &req->server_start.application_protocols.arg),
-                       slice);
-    req->server_start.application_protocols.funcs.encode =
-        encode_repeated_string_cb;
-  }
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_add_record_protocol(grpc_gcp_handshaker_req* req,
-                                                 const char* record_protocol) {
-  if (req == nullptr || record_protocol == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_add_record_protocol().");
-    return false;
-  }
-  grpc_slice* slice = create_slice(record_protocol, strlen(record_protocol));
-  add_repeated_field(reinterpret_cast<repeated_field**>(
-                         &req->client_start.record_protocols.arg),
-                     slice);
-  req->client_start.record_protocols.funcs.encode = encode_repeated_string_cb;
-  return true;
-}
-
-static void set_identity_hostname(grpc_gcp_identity* identity,
-                                  const char* hostname) {
-  grpc_slice* slice = create_slice(hostname, strlen(hostname));
-  identity->hostname.arg = slice;
-  identity->hostname.funcs.encode = encode_string_or_bytes_cb;
-}
-
-static void set_identity_service_account(grpc_gcp_identity* identity,
-                                         const char* service_account) {
-  grpc_slice* slice = create_slice(service_account, strlen(service_account));
-  identity->service_account.arg = slice;
-  identity->service_account.funcs.encode = encode_string_or_bytes_cb;
-}
-
-bool grpc_gcp_handshaker_req_add_target_identity_hostname(
-    grpc_gcp_handshaker_req* req, const char* hostname) {
-  if (req == nullptr || hostname == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_req_add_target_identity_hostname().");
-    return false;
-  }
-  grpc_gcp_identity* target_identity =
-      static_cast<grpc_gcp_identity*>(gpr_zalloc(sizeof(*target_identity)));
-  set_identity_hostname(target_identity, hostname);
-  req->client_start.target_identities.funcs.encode =
-      encode_repeated_identity_cb;
-  add_repeated_field(reinterpret_cast<repeated_field**>(
-                         &req->client_start.target_identities.arg),
-                     target_identity);
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_add_target_identity_service_account(
-    grpc_gcp_handshaker_req* req, const char* service_account) {
-  if (req == nullptr || service_account == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_req_add_target_identity_service_account().");
-    return false;
-  }
-  grpc_gcp_identity* target_identity =
-      static_cast<grpc_gcp_identity*>(gpr_zalloc(sizeof(*target_identity)));
-  set_identity_service_account(target_identity, service_account);
-  req->client_start.target_identities.funcs.encode =
-      encode_repeated_identity_cb;
-  add_repeated_field(reinterpret_cast<repeated_field**>(
-                         &req->client_start.target_identities.arg),
-                     target_identity);
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_local_identity_hostname(
-    grpc_gcp_handshaker_req* req, const char* hostname) {
-  if (req == nullptr || hostname == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_req_set_local_identity_hostname().");
-    return false;
-  }
-  req->client_start.has_local_identity = true;
-  set_identity_hostname(&req->client_start.local_identity, hostname);
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_local_identity_service_account(
-    grpc_gcp_handshaker_req* req, const char* service_account) {
-  if (req == nullptr || service_account == nullptr || !req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_req_set_local_identity_service_account().");
-    return false;
-  }
-  req->client_start.has_local_identity = true;
-  set_identity_service_account(&req->client_start.local_identity,
-                               service_account);
-  return true;
-}
-
-static void set_endpoint(grpc_gcp_endpoint* endpoint, const char* ip_address,
-                         size_t port, grpc_gcp_network_protocol protocol) {
-  grpc_slice* slice = create_slice(ip_address, strlen(ip_address));
-  endpoint->ip_address.arg = slice;
-  endpoint->ip_address.funcs.encode = encode_string_or_bytes_cb;
-  endpoint->has_port = true;
-  endpoint->port = static_cast<int32_t>(port);
-  endpoint->has_protocol = true;
-  endpoint->protocol = protocol;
-}
-
-bool grpc_gcp_handshaker_req_set_rpc_versions(grpc_gcp_handshaker_req* req,
-                                              uint32_t max_major,
-                                              uint32_t max_minor,
-                                              uint32_t min_major,
-                                              uint32_t min_minor) {
-  if (req == nullptr || req->has_next) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_rpc_versions().");
-    return false;
-  }
-  if (req->has_client_start) {
-    req->client_start.has_rpc_versions = true;
-    grpc_gcp_rpc_protocol_versions_set_max(&req->client_start.rpc_versions,
-                                           max_major, max_minor);
-    grpc_gcp_rpc_protocol_versions_set_min(&req->client_start.rpc_versions,
-                                           min_major, min_minor);
-  } else {
-    req->server_start.has_rpc_versions = true;
-    grpc_gcp_rpc_protocol_versions_set_max(&req->server_start.rpc_versions,
-                                           max_major, max_minor);
-    grpc_gcp_rpc_protocol_versions_set_min(&req->server_start.rpc_versions,
-                                           min_major, min_minor);
-  }
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_local_endpoint(
-    grpc_gcp_handshaker_req* req, const char* ip_address, size_t port,
-    grpc_gcp_network_protocol protocol) {
-  if (req == nullptr || ip_address == nullptr || port > 65535 ||
-      req->has_next) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_local_endpoint().");
-    return false;
-  }
-  if (req->has_client_start) {
-    req->client_start.has_local_endpoint = true;
-    set_endpoint(&req->client_start.local_endpoint, ip_address, port, protocol);
-  } else {
-    req->server_start.has_local_endpoint = true;
-    set_endpoint(&req->server_start.local_endpoint, ip_address, port, protocol);
-  }
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_remote_endpoint(
-    grpc_gcp_handshaker_req* req, const char* ip_address, size_t port,
-    grpc_gcp_network_protocol protocol) {
-  if (req == nullptr || ip_address == nullptr || port > 65535 ||
-      req->has_next) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_remote_endpoint().");
-    return false;
-  }
-  if (req->has_client_start) {
-    req->client_start.has_remote_endpoint = true;
-    set_endpoint(&req->client_start.remote_endpoint, ip_address, port,
-                 protocol);
-  } else {
-    req->server_start.has_remote_endpoint = true;
-    set_endpoint(&req->server_start.remote_endpoint, ip_address, port,
-                 protocol);
-  }
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_set_in_bytes(grpc_gcp_handshaker_req* req,
-                                          const char* in_bytes, size_t size) {
-  if (req == nullptr || in_bytes == nullptr || req->has_client_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_set_in_bytes().");
-    return false;
-  }
-  grpc_slice* slice = create_slice(in_bytes, size);
-  if (req->has_next) {
-    req->next.in_bytes.arg = slice;
-    req->next.in_bytes.funcs.encode = &encode_string_or_bytes_cb;
-  } else {
-    req->server_start.in_bytes.arg = slice;
-    req->server_start.in_bytes.funcs.encode = &encode_string_or_bytes_cb;
-  }
-  return true;
-}
-
-static grpc_gcp_server_handshake_parameters* server_start_find_param(
-    grpc_gcp_handshaker_req* req, int32_t key) {
-  size_t i = 0;
-  for (i = 0; i < req->server_start.handshake_parameters_count; i++) {
-    if (req->server_start.handshake_parameters[i].key == key) {
-      return &req->server_start.handshake_parameters[i].value;
-    }
-  }
-  req->server_start
-      .handshake_parameters[req->server_start.handshake_parameters_count]
-      .has_key = true;
-  req->server_start
-      .handshake_parameters[req->server_start.handshake_parameters_count]
-      .has_value = true;
-  req->server_start
-      .handshake_parameters[req->server_start.handshake_parameters_count++]
-      .key = key;
-  return &req->server_start
-              .handshake_parameters
-                  [req->server_start.handshake_parameters_count - 1]
-              .value;
-}
-
-bool grpc_gcp_handshaker_req_param_add_record_protocol(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* record_protocol) {
-  if (req == nullptr || record_protocol == nullptr || !req->has_server_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_param_add_record_protocol().");
-    return false;
-  }
-  grpc_gcp_server_handshake_parameters* param =
-      server_start_find_param(req, key);
-  grpc_slice* slice = create_slice(record_protocol, strlen(record_protocol));
-  add_repeated_field(
-      reinterpret_cast<repeated_field**>(&param->record_protocols.arg), slice);
-  param->record_protocols.funcs.encode = &encode_repeated_string_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_param_add_local_identity_hostname(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* hostname) {
-  if (req == nullptr || hostname == nullptr || !req->has_server_start) {
-    gpr_log(GPR_ERROR,
-            "Invalid arguments to "
-            "grpc_gcp_handshaker_req_param_add_local_identity_hostname().");
-    return false;
-  }
-  grpc_gcp_server_handshake_parameters* param =
-      server_start_find_param(req, key);
-  grpc_gcp_identity* local_identity =
-      static_cast<grpc_gcp_identity*>(gpr_zalloc(sizeof(*local_identity)));
-  set_identity_hostname(local_identity, hostname);
-  add_repeated_field(
-      reinterpret_cast<repeated_field**>(&param->local_identities.arg),
-      local_identity);
-  param->local_identities.funcs.encode = &encode_repeated_identity_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_param_add_local_identity_service_account(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* service_account) {
-  if (req == nullptr || service_account == nullptr || !req->has_server_start) {
-    gpr_log(
-        GPR_ERROR,
-        "Invalid arguments to "
-        "grpc_gcp_handshaker_req_param_add_local_identity_service_account().");
-    return false;
-  }
-  grpc_gcp_server_handshake_parameters* param =
-      server_start_find_param(req, key);
-  grpc_gcp_identity* local_identity =
-      static_cast<grpc_gcp_identity*>(gpr_zalloc(sizeof(*local_identity)));
-  set_identity_service_account(local_identity, service_account);
-  add_repeated_field(
-      reinterpret_cast<repeated_field**>(&param->local_identities.arg),
-      local_identity);
-  param->local_identities.funcs.encode = &encode_repeated_identity_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_encode(grpc_gcp_handshaker_req* req,
-                                    grpc_slice* slice) {
-  if (req == nullptr || slice == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to grpc_gcp_handshaker_req_encode().");
-    return false;
-  }
-  pb_ostream_t size_stream;
-  memset(&size_stream, 0, sizeof(pb_ostream_t));
-  if (!pb_encode(&size_stream, grpc_gcp_HandshakerReq_fields, req)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&size_stream));
-    return false;
-  }
-  size_t encoded_length = size_stream.bytes_written;
-  *slice = grpc_slice_malloc(encoded_length);
-  pb_ostream_t output_stream =
-      pb_ostream_from_buffer(GRPC_SLICE_START_PTR(*slice), encoded_length);
-  if (!pb_encode(&output_stream, grpc_gcp_HandshakerReq_fields, req) != 0) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&output_stream));
-    return false;
-  }
-  return true;
-}
-
-/* HandshakerResp. */
-grpc_gcp_handshaker_resp* grpc_gcp_handshaker_resp_create(void) {
-  grpc_gcp_handshaker_resp* resp =
-      static_cast<grpc_gcp_handshaker_resp*>(gpr_zalloc(sizeof(*resp)));
-  return resp;
-}
-
-void grpc_gcp_handshaker_resp_destroy(grpc_gcp_handshaker_resp* resp) {
-  if (resp != nullptr) {
-    destroy_slice(static_cast<grpc_slice*>(resp->out_frames.arg));
-    if (resp->has_status) {
-      destroy_slice(static_cast<grpc_slice*>(resp->status.details.arg));
-    }
-    if (resp->has_result) {
-      destroy_slice(
-          static_cast<grpc_slice*>(resp->result.application_protocol.arg));
-      destroy_slice(static_cast<grpc_slice*>(resp->result.record_protocol.arg));
-      destroy_slice(static_cast<grpc_slice*>(resp->result.key_data.arg));
-      if (resp->result.has_local_identity) {
-        destroy_slice(
-            static_cast<grpc_slice*>(resp->result.local_identity.hostname.arg));
-        destroy_slice(static_cast<grpc_slice*>(
-            resp->result.local_identity.service_account.arg));
-      }
-      if (resp->result.has_peer_identity) {
-        destroy_slice(
-            static_cast<grpc_slice*>(resp->result.peer_identity.hostname.arg));
-        destroy_slice(static_cast<grpc_slice*>(
-            resp->result.peer_identity.service_account.arg));
-      }
-    }
-    gpr_free(resp);
-  }
-}
-
-bool grpc_gcp_handshaker_resp_decode(grpc_slice encoded_handshaker_resp,
-                                     grpc_gcp_handshaker_resp* resp) {
-  if (resp == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr argument to grpc_gcp_handshaker_resp_decode().");
-    return false;
-  }
-  pb_istream_t stream =
-      pb_istream_from_buffer(GRPC_SLICE_START_PTR(encoded_handshaker_resp),
-                             GRPC_SLICE_LENGTH(encoded_handshaker_resp));
-  resp->out_frames.funcs.decode = decode_string_or_bytes_cb;
-  resp->status.details.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.application_protocol.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.record_protocol.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.key_data.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.peer_identity.hostname.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.peer_identity.service_account.funcs.decode =
-      decode_string_or_bytes_cb;
-  resp->result.local_identity.hostname.funcs.decode = decode_string_or_bytes_cb;
-  resp->result.local_identity.service_account.funcs.decode =
-      decode_string_or_bytes_cb;
-  if (!pb_decode(&stream, grpc_gcp_HandshakerResp_fields, resp)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
-    return false;
-  }
-  return true;
-}
diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h b/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h
deleted file mode 100644
index 5df56a8..0000000
--- a/src/core/tsi/alts/handshaker/alts_handshaker_service_api.h
+++ /dev/null
@@ -1,323 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * 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.
- *
- */
-
-#ifndef GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_H
-#define GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_H
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h"
-
-/**
- * An implementation of nanopb thin wrapper used to set/get and
- * serialize/de-serialize of ALTS handshake requests and responses.
- *
- * All APIs in the header are thread-compatible. A typical usage of this API at
- * the client side is as follows:
- *
- * -----------------------------------------------------------------------------
- * // Create, populate, and serialize an ALTS client_start handshake request to
- * // send to the server.
- * grpc_gcp_handshaker_req* req =
- *     grpc_gcp_handshaker_req_create(CLIENT_START_REQ);
- * grpc_gcp_handshaker_req_set_handshake_protocol(
-       req, grpc_gcp_HandshakeProtocol_ALTS);
- * grpc_gcp_handshaker_req_add_application_protocol(req, "grpc");
- * grpc_gcp_handshaker_req_add_record_protocol(req, "ALTSRP_GCM_AES128");
- * grpc_slice client_slice;
- * if (!grpc_gcp_handshaker_req_encode(req, &client_slice)) {
- *   fprintf(stderr, "ALTS handshake request encoding failed.";
- * }
- *
- * // De-serialize a data stream received from the server, and store the result
- * // at ALTS handshake response.
- * grpc_gcp_handshaker_resp* resp = grpc_gcp_handshaker_resp_create();
- * if (!grpc_gcp_handshaker_resp_decode(server_slice, resp)) {
- *    fprintf(stderr, "ALTS handshake response decoding failed.");
- * }
- * // To access a variable-length datatype field (i.e., pb_callback_t),
- * // access its "arg" subfield (if it has been set).
- * if (resp->out_frames.arg != nullptr) {
- *   grpc_slice* slice = resp->out_frames.arg;
- * }
- * // To access a fixed-length datatype field (i.e., not pb_calback_t),
- * // access the field directly (if it has been set).
- * if (resp->has_status && resp->status->has_code) {
- *   uint32_t code = resp->status->code;
- * }
- *------------------------------------------------------------------------------
- */
-
-/**
- * This method creates an ALTS handshake request.
- *
- * - type: an enum type value that can be either CLIENT_START_REQ,
- *   SERVER_START_REQ, or NEXT_REQ to indicate the created instance will be
- *   client_start, server_start, and next handshake request message
- * respectively.
- *
- * The method returns a pointer to the created instance.
- */
-grpc_gcp_handshaker_req* grpc_gcp_handshaker_req_create(
-    grpc_gcp_handshaker_req_type type);
-
-/**
- * This method sets the value for handshake_security_protocol field of ALTS
- * client_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - handshake_protocol: a enum type value representing the handshake security
- *   protocol.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_handshake_protocol(
-    grpc_gcp_handshaker_req* req,
-    grpc_gcp_handshake_protocol handshake_protocol);
-
-/**
- * This method sets the value for target_name field of ALTS client_start
- * handshake request.
- *
- * - req: an ALTS handshake request.
- * - target_name: a target name to be set.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_target_name(grpc_gcp_handshaker_req* req,
-                                             const char* target_name);
-
-/**
- * This method adds an application protocol supported by the server (or
- * client) to ALTS server_start (or client_start) handshake request.
- *
- * - req: an ALTS handshake request.
- * - application_protocol: an application protocol (e.g., grpc) to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_add_application_protocol(
-    grpc_gcp_handshaker_req* req, const char* application_protocol);
-
-/**
- * This method adds a record protocol supported by the client to ALTS
- * client_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - record_protocol: a record protocol (e.g., ALTSRP_GCM_AES128) to be
- *   added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_add_record_protocol(grpc_gcp_handshaker_req* req,
-                                                 const char* record_protocol);
-
-/**
- * This method adds a target server identity represented as hostname and
- * acceptable by a client to ALTS client_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - hostname: a string representation of hostname at the connection
- *   endpoint to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_add_target_identity_hostname(
-    grpc_gcp_handshaker_req* req, const char* hostname);
-
-/**
- * This method adds a target server identity represented as service account and
- * acceptable by a client to ALTS client_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - service_account: a string representation of service account at the
- *   connection endpoint to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_add_target_identity_service_account(
-    grpc_gcp_handshaker_req* req, const char* service_account);
-
-/**
- * This method sets the hostname for local_identity field of ALTS client_start
- * handshake request.
- *
- * - req: an ALTS handshake request.
- * - hostname: a string representation of hostname.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_local_identity_hostname(
-    grpc_gcp_handshaker_req* req, const char* hostname);
-
-/**
- * This method sets the service account for local_identity field of ALTS
- * client_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - service_account: a string representation of service account.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_local_identity_service_account(
-    grpc_gcp_handshaker_req* req, const char* service_account);
-
-/**
- * This method sets the value for local_endpoint field of either ALTS
- * client_start or server_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - ip_address: a string representation of ip address associated with the
- *   local endpoint, that could be either IPv4 or IPv6.
- * - port: a port number associated with the local endpoint.
- * - protocol: a network protocol (e.g., TCP or UDP) associated with the
- *   local endpoint.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_local_endpoint(
-    grpc_gcp_handshaker_req* req, const char* ip_address, size_t port,
-    grpc_gcp_network_protocol protocol);
-
-/**
- * This method sets the value for remote_endpoint field of either ALTS
- * client_start or server_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - ip_address: a string representation of ip address associated with the
- *   remote endpoint, that could be either IPv4 or IPv6.
- * - port: a port number associated with the remote endpoint.
- * - protocol: a network protocol (e.g., TCP or UDP) associated with the
- *   remote endpoint.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_remote_endpoint(
-    grpc_gcp_handshaker_req* req, const char* ip_address, size_t port,
-    grpc_gcp_network_protocol protocol);
-
-/**
- * This method sets the value for in_bytes field of either ALTS server_start or
- * next handshake request.
- *
- * - req: an ALTS handshake request.
- * - in_bytes: a buffer containing bytes taken from out_frames of the peer's
- *   ALTS handshake response. It is possible that the peer's out_frames are
- * split into multiple handshake request messages.
- * - size: size of in_bytes buffer.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_in_bytes(grpc_gcp_handshaker_req* req,
-                                          const char* in_bytes, size_t size);
-
-/**
- * This method adds a record protocol to handshake parameters mapped by the
- * handshake protocol for ALTS server_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - key: an enum type value representing a handshake security protocol.
- * - record_protocol: a record protocol to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_param_add_record_protocol(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* record_protocol);
-
-/**
- * This method adds a local identity represented as hostname to handshake
- * parameters mapped by the handshake protocol for ALTS server_start handshake
- * request.
- *
- * - req: an ALTS handshake request.
- * - key: an enum type value representing a handshake security protocol.
- * - hostname: a string representation of hostname to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_param_add_local_identity_hostname(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* hostname);
-
-/**
- * This method adds a local identity represented as service account to handshake
- * parameters mapped by the handshake protocol for ALTS server_start handshake
- * request.
- *
- * - req: an ALTS handshake request.
- * - key: an enum type value representing a handshake security protocol.
- * - service_account: a string representation of service account to be added.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_param_add_local_identity_service_account(
-    grpc_gcp_handshaker_req* req, grpc_gcp_handshake_protocol key,
-    const char* service_account);
-
-/**
- * This method sets the value for rpc_versions field of either ALTS
- * client_start or server_start handshake request.
- *
- * - req: an ALTS handshake request.
- * - max_major: a major version of maximum supported RPC version.
- * - max_minor: a minor version of maximum supported RPC version.
- * - min_major: a major version of minimum supported RPC version.
- * - min_minor: a minor version of minimum supported RPC version.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_set_rpc_versions(grpc_gcp_handshaker_req* req,
-                                              uint32_t max_major,
-                                              uint32_t max_minor,
-                                              uint32_t min_major,
-                                              uint32_t min_minor);
-
-/**
- * This method serializes an ALTS handshake request and returns a data stream.
- *
- * - req: an ALTS handshake request.
- * - slice: a data stream where the serialized result will be written.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_req_encode(grpc_gcp_handshaker_req* req,
-                                    grpc_slice* slice);
-
-/* This method destroys an ALTS handshake request. */
-void grpc_gcp_handshaker_req_destroy(grpc_gcp_handshaker_req* req);
-
-/* This method creates an ALTS handshake response. */
-grpc_gcp_handshaker_resp* grpc_gcp_handshaker_resp_create(void);
-
-/**
- * This method de-serializes a data stream and stores the result
- * in an ALTS handshake response.
- *
- * - slice: a data stream containing a serialized ALTS handshake response.
- * - resp: an ALTS handshake response used to hold de-serialized result.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_handshaker_resp_decode(grpc_slice slice,
-                                     grpc_gcp_handshaker_resp* resp);
-
-/* This method destroys an ALTS handshake response. */
-void grpc_gcp_handshaker_resp_destroy(grpc_gcp_handshaker_resp* resp);
-
-#endif /* GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_H */
diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc b/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc
deleted file mode 100644
index d63d353..0000000
--- a/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc
+++ /dev/null
@@ -1,145 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * 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.
- *
- */
-
-#include <grpc/support/port_platform.h>
-
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h"
-
-#include "src/core/lib/slice/slice_internal.h"
-
-void add_repeated_field(repeated_field** head, const void* data) {
-  repeated_field* field =
-      static_cast<repeated_field*>(gpr_zalloc(sizeof(*field)));
-  field->data = data;
-  if (*head == nullptr) {
-    *head = field;
-    (*head)->next = nullptr;
-  } else {
-    field->next = *head;
-    *head = field;
-  }
-}
-
-void destroy_repeated_field_list_identity(repeated_field* head) {
-  repeated_field* field = head;
-  while (field != nullptr) {
-    repeated_field* next_field = field->next;
-    const grpc_gcp_identity* identity =
-        static_cast<const grpc_gcp_identity*>(field->data);
-    destroy_slice(static_cast<grpc_slice*>(identity->hostname.arg));
-    destroy_slice(static_cast<grpc_slice*>(identity->service_account.arg));
-    gpr_free((void*)identity);
-    gpr_free(field);
-    field = next_field;
-  }
-}
-
-void destroy_repeated_field_list_string(repeated_field* head) {
-  repeated_field* field = head;
-  while (field != nullptr) {
-    repeated_field* next_field = field->next;
-    destroy_slice((grpc_slice*)field->data);
-    gpr_free(field);
-    field = next_field;
-  }
-}
-
-grpc_slice* create_slice(const char* data, size_t size) {
-  grpc_slice slice = grpc_slice_from_copied_buffer(data, size);
-  grpc_slice* cb_slice =
-      static_cast<grpc_slice*>(gpr_zalloc(sizeof(*cb_slice)));
-  memcpy(cb_slice, &slice, sizeof(*cb_slice));
-  return cb_slice;
-}
-
-void destroy_slice(grpc_slice* slice) {
-  if (slice != nullptr) {
-    grpc_slice_unref_internal(*slice);
-    gpr_free(slice);
-  }
-}
-
-bool encode_string_or_bytes_cb(pb_ostream_t* stream, const pb_field_t* field,
-                               void* const* arg) {
-  grpc_slice* slice = static_cast<grpc_slice*>(*arg);
-  if (!pb_encode_tag_for_field(stream, field)) return false;
-  return pb_encode_string(stream, GRPC_SLICE_START_PTR(*slice),
-                          GRPC_SLICE_LENGTH(*slice));
-}
-
-bool encode_repeated_identity_cb(pb_ostream_t* stream, const pb_field_t* field,
-                                 void* const* arg) {
-  repeated_field* var = static_cast<repeated_field*>(*arg);
-  while (var != nullptr) {
-    if (!pb_encode_tag_for_field(stream, field)) return false;
-    if (!pb_encode_submessage(stream, grpc_gcp_Identity_fields,
-                              (grpc_gcp_identity*)var->data))
-      return false;
-    var = var->next;
-  }
-  return true;
-}
-
-bool encode_repeated_string_cb(pb_ostream_t* stream, const pb_field_t* field,
-                               void* const* arg) {
-  repeated_field* var = static_cast<repeated_field*>(*arg);
-  while (var != nullptr) {
-    if (!pb_encode_tag_for_field(stream, field)) return false;
-    const grpc_slice* slice = static_cast<const grpc_slice*>(var->data);
-    if (!pb_encode_string(stream, GRPC_SLICE_START_PTR(*slice),
-                          GRPC_SLICE_LENGTH(*slice)))
-      return false;
-    var = var->next;
-  }
-  return true;
-}
-
-bool decode_string_or_bytes_cb(pb_istream_t* stream, const pb_field_t* field,
-                               void** arg) {
-  grpc_slice slice = grpc_slice_malloc(stream->bytes_left);
-  grpc_slice* cb_slice =
-      static_cast<grpc_slice*>(gpr_zalloc(sizeof(*cb_slice)));
-  memcpy(cb_slice, &slice, sizeof(*cb_slice));
-  if (!pb_read(stream, GRPC_SLICE_START_PTR(*cb_slice), stream->bytes_left))
-    return false;
-  *arg = cb_slice;
-  return true;
-}
-
-bool decode_repeated_identity_cb(pb_istream_t* stream, const pb_field_t* field,
-                                 void** arg) {
-  grpc_gcp_identity* identity =
-      static_cast<grpc_gcp_identity*>(gpr_zalloc(sizeof(*identity)));
-  identity->hostname.funcs.decode = decode_string_or_bytes_cb;
-  identity->service_account.funcs.decode = decode_string_or_bytes_cb;
-  add_repeated_field(reinterpret_cast<repeated_field**>(arg), identity);
-  if (!pb_decode(stream, grpc_gcp_Identity_fields, identity)) return false;
-  return true;
-}
-
-bool decode_repeated_string_cb(pb_istream_t* stream, const pb_field_t* field,
-                               void** arg) {
-  grpc_slice slice = grpc_slice_malloc(stream->bytes_left);
-  grpc_slice* cb_slice =
-      static_cast<grpc_slice*>(gpr_zalloc(sizeof(*cb_slice)));
-  memcpy(cb_slice, &slice, sizeof(grpc_slice));
-  if (!pb_read(stream, GRPC_SLICE_START_PTR(*cb_slice), stream->bytes_left))
-    return false;
-  add_repeated_field(reinterpret_cast<repeated_field**>(arg), cb_slice);
-  return true;
-}
diff --git a/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h b/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h
deleted file mode 100644
index 966ea45..0000000
--- a/src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * 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.
- *
- */
-
-#ifndef GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H
-#define GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H
-
-#include <grpc/support/port_platform.h>
-
-#include "pb_decode.h"
-#include "pb_encode.h"
-
-#include <grpc/slice.h>
-#include <grpc/slice_buffer.h>
-#include <grpc/support/alloc.h>
-#include <grpc/support/log.h>
-
-#include "src/core/tsi/alts/handshaker/handshaker.pb.h"
-
-/**
- * An implementation of utility functions used to serialize/
- * de-serialize ALTS handshake requests/responses. All APIs in the header
- * are thread-compatible.
- */
-
-/* Renaming of message/field structs generated by nanopb compiler. */
-typedef grpc_gcp_HandshakeProtocol grpc_gcp_handshake_protocol;
-typedef grpc_gcp_NetworkProtocol grpc_gcp_network_protocol;
-typedef grpc_gcp_Identity grpc_gcp_identity;
-typedef grpc_gcp_NextHandshakeMessageReq grpc_gcp_next_handshake_message_req;
-typedef grpc_gcp_ServerHandshakeParameters grpc_gcp_server_handshake_parameters;
-typedef grpc_gcp_Endpoint grpc_gcp_endpoint;
-typedef grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry
-    grpc_gcp_handshake_parameters_entry;
-typedef grpc_gcp_StartClientHandshakeReq grpc_gcp_start_client_handshake_req;
-typedef grpc_gcp_StartServerHandshakeReq grpc_gcp_start_server_handshake_req;
-typedef grpc_gcp_HandshakerReq grpc_gcp_handshaker_req;
-typedef grpc_gcp_HandshakerResult grpc_gcp_handshaker_result;
-typedef grpc_gcp_HandshakerStatus grpc_gcp_handshaker_status;
-typedef grpc_gcp_HandshakerResp grpc_gcp_handshaker_resp;
-
-typedef enum {
-  CLIENT_START_REQ = 0, /* StartClientHandshakeReq. */
-  SERVER_START_REQ = 1, /* StartServerHandshakeReq. */
-  NEXT_REQ = 2,         /* NextHandshakeMessageReq. */
-} grpc_gcp_handshaker_req_type;
-
-/**
- *  A struct representing a repeated field. The struct is used to organize all
- *  instances of a specific repeated field into a linked list, which then will
- *  be used at encode/decode phase. For instance at the encode phase, the encode
- *  function will iterate through the list, encode each field, and then output
- *  the result to the stream.
- */
-typedef struct repeated_field_ {
-  struct repeated_field_* next;
-  const void* data;
-} repeated_field;
-
-/**
- * This method adds a repeated field to the head of repeated field list.
- *
- * - head: a head of repeated field list.
- * - field: a repeated field to be added to the list.
- */
-void add_repeated_field(repeated_field** head, const void* field);
-
-/**
- * This method destroys a repeated field list that consists of string type
- * fields.
- *
- * - head: a head of repeated field list.
- */
-void destroy_repeated_field_list_string(repeated_field* head);
-
-/**
- * This method destroys a repeated field list that consists of
- * grpc_gcp_identity type fields.
- *
- * - head: a head of repeated field list.
- */
-void destroy_repeated_field_list_identity(repeated_field* head);
-
-/**
- * This method creates a grpc_slice instance by copying a data buffer. It is
- * similar to grpc_slice_from_copied_buffer() except that it returns an instance
- * allocated from the heap.
- *
- * - data: a data buffer to be copied to grpc_slice instance.
- * - size: size of data buffer.
- */
-grpc_slice* create_slice(const char* data, size_t size);
-
-/* This method destroys a grpc_slice instance. */
-void destroy_slice(grpc_slice* slice);
-
-/**
- * The following encode/decode functions will be assigned to encode/decode
- * function pointers of pb_callback_t struct (defined in
- * //third_party/nanopb/pb.h), that represent a repeated field with a dynamic
- * length (e.g., a string type or repeated field).
- */
-
-/* This method is an encode callback function for a string or byte array. */
-bool encode_string_or_bytes_cb(pb_ostream_t* stream, const pb_field_t* field,
-                               void* const* arg);
-
-/**
- * This method is an encode callback function for a repeated grpc_gcp_identity
- * field.
- */
-bool encode_repeated_identity_cb(pb_ostream_t* stream, const pb_field_t* field,
-                                 void* const* arg);
-
-/* This method is an encode callback function for a repeated string field. */
-bool encode_repeated_string_cb(pb_ostream_t* stream, const pb_field_t* field,
-                               void* const* arg);
-
-/**
- * This method is a decode callback function for a string or byte array field.
- */
-bool decode_string_or_bytes_cb(pb_istream_t* stream, const pb_field_t* field,
-                               void** arg);
-/**
- * This method is a decode callback function for a repeated grpc_gcp_identity
- * field.
- */
-bool decode_repeated_identity_cb(pb_istream_t* stream, const pb_field_t* field,
-                                 void** arg);
-
-/* This method is a decode callback function for a repeated string field. */
-bool decode_repeated_string_cb(pb_istream_t* stream, const pb_field_t* field,
-                               void** arg);
-
-#endif /* GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_UTIL_H */
diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc
index 0d28303..917d375 100644
--- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc
+++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc
@@ -192,38 +192,49 @@
     handshaker_result_create_frame_protector,
     handshaker_result_get_unused_bytes, handshaker_result_destroy};
 
-tsi_result alts_tsi_handshaker_result_create(grpc_gcp_handshaker_resp* resp,
+tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp,
                                              bool is_client,
                                              tsi_handshaker_result** self) {
   if (self == nullptr || resp == nullptr) {
     gpr_log(GPR_ERROR, "Invalid arguments to create_handshaker_result()");
     return TSI_INVALID_ARGUMENT;
   }
-  grpc_slice* key = static_cast<grpc_slice*>(resp->result.key_data.arg);
-  GPR_ASSERT(key != nullptr);
-  grpc_slice* identity =
-      static_cast<grpc_slice*>(resp->result.peer_identity.service_account.arg);
+  const grpc_gcp_HandshakerResult* hresult =
+      grpc_gcp_HandshakerResp_result(resp);
+  const grpc_gcp_Identity* identity =
+      grpc_gcp_HandshakerResult_peer_identity(hresult);
   if (identity == nullptr) {
+    gpr_log(GPR_ERROR, "Invalid identity");
+    return TSI_FAILED_PRECONDITION;
+  }
+  upb_strview service_account = grpc_gcp_Identity_service_account(identity);
+  if (service_account.size == 0) {
     gpr_log(GPR_ERROR, "Invalid service account");
     return TSI_FAILED_PRECONDITION;
   }
-  if (GRPC_SLICE_LENGTH(*key) < kAltsAes128GcmRekeyKeyLength) {
+  upb_strview key_data = grpc_gcp_HandshakerResult_key_data(hresult);
+  if (key_data.size < kAltsAes128GcmRekeyKeyLength) {
     gpr_log(GPR_ERROR, "Bad key length");
     return TSI_FAILED_PRECONDITION;
   }
+  const grpc_gcp_RpcProtocolVersions* peer_rpc_version =
+      grpc_gcp_HandshakerResult_peer_rpc_versions(hresult);
+  if (peer_rpc_version == nullptr) {
+    gpr_log(GPR_ERROR, "Peer does not set RPC protocol versions.");
+    return TSI_FAILED_PRECONDITION;
+  }
   alts_tsi_handshaker_result* result =
       static_cast<alts_tsi_handshaker_result*>(gpr_zalloc(sizeof(*result)));
   result->key_data =
       static_cast<char*>(gpr_zalloc(kAltsAes128GcmRekeyKeyLength));
-  memcpy(result->key_data, GRPC_SLICE_START_PTR(*key),
-         kAltsAes128GcmRekeyKeyLength);
-  result->peer_identity = grpc_slice_to_c_string(*identity);
-  if (!resp->result.has_peer_rpc_versions) {
-    gpr_log(GPR_ERROR, "Peer does not set RPC protocol versions.");
-    return TSI_FAILED_PRECONDITION;
-  }
-  if (!grpc_gcp_rpc_protocol_versions_encode(&resp->result.peer_rpc_versions,
-                                             &result->rpc_versions)) {
+  memcpy(result->key_data, key_data.data, kAltsAes128GcmRekeyKeyLength);
+  result->peer_identity =
+      static_cast<char*>(gpr_zalloc(service_account.size + 1));
+  memcpy(result->peer_identity, service_account.data, service_account.size);
+  upb::Arena arena;
+  bool serialized = grpc_gcp_rpc_protocol_versions_encode(
+      peer_rpc_version, arena.ptr(), &result->rpc_versions);
+  if (!serialized) {
     gpr_log(GPR_ERROR, "Failed to serialize peer's RPC protocol versions.");
     return TSI_FAILED_PRECONDITION;
   }
diff --git a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h
index 32f94bc..6be45d7 100644
--- a/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h
+++ b/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h
@@ -26,9 +26,9 @@
 #include "src/core/lib/iomgr/pollset_set.h"
 #include "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h"
 #include "src/core/tsi/alts/handshaker/alts_handshaker_client.h"
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h"
 #include "src/core/tsi/transport_security.h"
 #include "src/core/tsi/transport_security_interface.h"
+#include "src/proto/grpc/gcp/handshaker.upb.h"
 
 #define TSI_ALTS_SERVICE_ACCOUNT_PEER_PROPERTY "service_accont"
 #define TSI_ALTS_CERTIFICATE_TYPE "ALTS"
@@ -70,7 +70,7 @@
  *   client or not.
  * - result: address of ALTS TSI handshaker result instance.
  */
-tsi_result alts_tsi_handshaker_result_create(grpc_gcp_handshaker_resp* resp,
+tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp,
                                              bool is_client,
                                              tsi_handshaker_result** result);
 
diff --git a/src/core/tsi/alts/handshaker/alts_tsi_utils.cc b/src/core/tsi/alts/handshaker/alts_tsi_utils.cc
index 1747f1a..f80498d 100644
--- a/src/core/tsi/alts/handshaker/alts_tsi_utils.cc
+++ b/src/core/tsi/alts/handshaker/alts_tsi_utils.cc
@@ -41,18 +41,22 @@
   }
 }
 
-grpc_gcp_handshaker_resp* alts_tsi_utils_deserialize_response(
-    grpc_byte_buffer* resp_buffer) {
+grpc_gcp_HandshakerResp* alts_tsi_utils_deserialize_response(
+    grpc_byte_buffer* resp_buffer, upb_arena* arena) {
   GPR_ASSERT(resp_buffer != nullptr);
+  GPR_ASSERT(arena != nullptr);
   grpc_byte_buffer_reader bbr;
   grpc_byte_buffer_reader_init(&bbr, resp_buffer);
   grpc_slice slice = grpc_byte_buffer_reader_readall(&bbr);
-  grpc_gcp_handshaker_resp* resp = grpc_gcp_handshaker_resp_create();
-  bool ok = grpc_gcp_handshaker_resp_decode(slice, resp);
+  size_t buf_size = GPR_SLICE_LENGTH(slice);
+  void* buf = upb_arena_malloc(arena, buf_size);
+  memcpy(buf, reinterpret_cast<const char*>(GPR_SLICE_START_PTR(slice)),
+         buf_size);
+  grpc_gcp_HandshakerResp* resp = grpc_gcp_HandshakerResp_parse(
+      reinterpret_cast<char*>(buf), buf_size, arena);
   grpc_slice_unref_internal(slice);
   grpc_byte_buffer_reader_destroy(&bbr);
-  if (!ok) {
-    grpc_gcp_handshaker_resp_destroy(resp);
+  if (resp == nullptr) {
     gpr_log(GPR_ERROR, "grpc_gcp_handshaker_resp_decode() failed");
     return nullptr;
   }
diff --git a/src/core/tsi/alts/handshaker/alts_tsi_utils.h b/src/core/tsi/alts/handshaker/alts_tsi_utils.h
index 9ef649d..a20e5e9 100644
--- a/src/core/tsi/alts/handshaker/alts_tsi_utils.h
+++ b/src/core/tsi/alts/handshaker/alts_tsi_utils.h
@@ -24,8 +24,8 @@
 #include <grpc/byte_buffer.h>
 #include <grpc/grpc.h>
 
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h"
 #include "src/core/tsi/transport_security_interface.h"
+#include "src/proto/grpc/gcp/handshaker.upb.h"
 
 /**
  * This method converts grpc_status_code code to the corresponding tsi_result
@@ -42,11 +42,12 @@
  * service.
  *
  * - bytes_received: data returned from ALTS handshaker service.
+ * - arena: upb arena.
  *
  * It returns a deserialized handshaker response on success and nullptr on
  * failure.
  */
-grpc_gcp_handshaker_resp* alts_tsi_utils_deserialize_response(
-    grpc_byte_buffer* resp_buffer);
+grpc_gcp_HandshakerResp* alts_tsi_utils_deserialize_response(
+    grpc_byte_buffer* resp_buffer, upb_arena* arena);
 
 #endif /* GRPC_CORE_TSI_ALTS_HANDSHAKER_ALTS_TSI_UTILS_H */
diff --git a/src/core/tsi/alts/handshaker/altscontext.pb.c b/src/core/tsi/alts/handshaker/altscontext.pb.c
deleted file mode 100644
index 5fb152a..0000000
--- a/src/core/tsi/alts/handshaker/altscontext.pb.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.3.7-dev */
-
-#include "src/core/tsi/alts/handshaker/altscontext.pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-
-
-const pb_field_t grpc_gcp_AltsContext_fields[7] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, CALLBACK, FIRST, grpc_gcp_AltsContext, application_protocol, application_protocol, 0),
-    PB_FIELD(  2, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_AltsContext, record_protocol, application_protocol, 0),
-    PB_FIELD(  3, UENUM   , OPTIONAL, STATIC  , OTHER, grpc_gcp_AltsContext, security_level, record_protocol, 0),
-    PB_FIELD(  4, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_AltsContext, peer_service_account, security_level, 0),
-    PB_FIELD(  5, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_AltsContext, local_service_account, peer_service_account, 0),
-    PB_FIELD(  6, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_AltsContext, peer_rpc_versions, local_service_account, &grpc_gcp_RpcProtocolVersions_fields),
-    PB_LAST_FIELD
-};
-
-
-/* Check that field information fits in pb_field_t */
-#if !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_32BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in 8 or 16 bit
- * field descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_AltsContext, peer_rpc_versions) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_gcp_AltsContext)
-#endif
-
-#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_16BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in the default
- * 8 bit descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_AltsContext, peer_rpc_versions) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_gcp_AltsContext)
-#endif
-
-
-/* @@protoc_insertion_point(eof) */
diff --git a/src/core/tsi/alts/handshaker/altscontext.pb.h b/src/core/tsi/alts/handshaker/altscontext.pb.h
deleted file mode 100644
index 632b20c..0000000
--- a/src/core/tsi/alts/handshaker/altscontext.pb.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.3.7-dev */
-
-#ifndef PB_GRPC_GCP_ALTSCONTEXT_PB_H_INCLUDED
-#define PB_GRPC_GCP_ALTSCONTEXT_PB_H_INCLUDED
-#include "pb.h"
-#include "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Struct definitions */
-typedef struct _grpc_gcp_AltsContext {
-    pb_callback_t application_protocol;
-    pb_callback_t record_protocol;
-    bool has_security_level;
-    grpc_gcp_SecurityLevel security_level;
-    pb_callback_t peer_service_account;
-    pb_callback_t local_service_account;
-    bool has_peer_rpc_versions;
-    grpc_gcp_RpcProtocolVersions peer_rpc_versions;
-/* @@protoc_insertion_point(struct:grpc_gcp_AltsContext) */
-} grpc_gcp_AltsContext;
-
-/* Default values for struct fields */
-
-/* Initializer values for message structs */
-#define grpc_gcp_AltsContext_init_default        {{{NULL}, NULL}, {{NULL}, NULL}, false, (grpc_gcp_SecurityLevel)0, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_RpcProtocolVersions_init_default}
-#define grpc_gcp_AltsContext_init_zero           {{{NULL}, NULL}, {{NULL}, NULL}, false, (grpc_gcp_SecurityLevel)0, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_RpcProtocolVersions_init_zero}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define grpc_gcp_AltsContext_application_protocol_tag 1
-#define grpc_gcp_AltsContext_record_protocol_tag 2
-#define grpc_gcp_AltsContext_security_level_tag  3
-#define grpc_gcp_AltsContext_peer_service_account_tag 4
-#define grpc_gcp_AltsContext_local_service_account_tag 5
-#define grpc_gcp_AltsContext_peer_rpc_versions_tag 6
-
-/* Struct field encoding specification for nanopb */
-extern const pb_field_t grpc_gcp_AltsContext_fields[7];
-
-/* Maximum encoded size of messages (where known) */
-/* grpc_gcp_AltsContext_size depends on runtime parameters */
-
-/* Message IDs (where set with "msgid" option) */
-#ifdef PB_MSGID
-
-#define ALTSCONTEXT_MESSAGES \
-
-
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-/* @@protoc_insertion_point(eof) */
-
-#endif
diff --git a/src/core/tsi/alts/handshaker/handshaker.pb.c b/src/core/tsi/alts/handshaker/handshaker.pb.c
deleted file mode 100644
index 5450b16..0000000
--- a/src/core/tsi/alts/handshaker/handshaker.pb.c
+++ /dev/null
@@ -1,122 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.3.7-dev */
-
-#include "src/core/tsi/alts/handshaker/handshaker.pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-
-
-const pb_field_t grpc_gcp_Endpoint_fields[4] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, CALLBACK, FIRST, grpc_gcp_Endpoint, ip_address, ip_address, 0),
-    PB_FIELD(  2, INT32   , OPTIONAL, STATIC  , OTHER, grpc_gcp_Endpoint, port, ip_address, 0),
-    PB_FIELD(  3, UENUM   , OPTIONAL, STATIC  , OTHER, grpc_gcp_Endpoint, protocol, port, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_Identity_fields[3] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, CALLBACK, FIRST, grpc_gcp_Identity, service_account, service_account, 0),
-    PB_FIELD(  2, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_Identity, hostname, service_account, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_StartClientHandshakeReq_fields[10] = {
-    PB_FIELD(  1, UENUM   , OPTIONAL, STATIC  , FIRST, grpc_gcp_StartClientHandshakeReq, handshake_security_protocol, handshake_security_protocol, 0),
-    PB_FIELD(  2, STRING  , REPEATED, CALLBACK, OTHER, grpc_gcp_StartClientHandshakeReq, application_protocols, handshake_security_protocol, 0),
-    PB_FIELD(  3, STRING  , REPEATED, CALLBACK, OTHER, grpc_gcp_StartClientHandshakeReq, record_protocols, application_protocols, 0),
-    PB_FIELD(  4, MESSAGE , REPEATED, CALLBACK, OTHER, grpc_gcp_StartClientHandshakeReq, target_identities, record_protocols, &grpc_gcp_Identity_fields),
-    PB_FIELD(  5, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartClientHandshakeReq, local_identity, target_identities, &grpc_gcp_Identity_fields),
-    PB_FIELD(  6, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartClientHandshakeReq, local_endpoint, local_identity, &grpc_gcp_Endpoint_fields),
-    PB_FIELD(  7, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartClientHandshakeReq, remote_endpoint, local_endpoint, &grpc_gcp_Endpoint_fields),
-    PB_FIELD(  8, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_StartClientHandshakeReq, target_name, remote_endpoint, 0),
-    PB_FIELD(  9, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartClientHandshakeReq, rpc_versions, target_name, &grpc_gcp_RpcProtocolVersions_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_ServerHandshakeParameters_fields[3] = {
-    PB_FIELD(  1, STRING  , REPEATED, CALLBACK, FIRST, grpc_gcp_ServerHandshakeParameters, record_protocols, record_protocols, 0),
-    PB_FIELD(  2, MESSAGE , REPEATED, CALLBACK, OTHER, grpc_gcp_ServerHandshakeParameters, local_identities, record_protocols, &grpc_gcp_Identity_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_StartServerHandshakeReq_fields[7] = {
-    PB_FIELD(  1, STRING  , REPEATED, CALLBACK, FIRST, grpc_gcp_StartServerHandshakeReq, application_protocols, application_protocols, 0),
-    PB_FIELD(  2, MESSAGE , REPEATED, STATIC  , OTHER, grpc_gcp_StartServerHandshakeReq, handshake_parameters, application_protocols, &grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_fields),
-    PB_FIELD(  3, BYTES   , OPTIONAL, CALLBACK, OTHER, grpc_gcp_StartServerHandshakeReq, in_bytes, handshake_parameters, 0),
-    PB_FIELD(  4, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartServerHandshakeReq, local_endpoint, in_bytes, &grpc_gcp_Endpoint_fields),
-    PB_FIELD(  5, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartServerHandshakeReq, remote_endpoint, local_endpoint, &grpc_gcp_Endpoint_fields),
-    PB_FIELD(  6, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartServerHandshakeReq, rpc_versions, remote_endpoint, &grpc_gcp_RpcProtocolVersions_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_fields[3] = {
-    PB_FIELD(  1, INT32   , OPTIONAL, STATIC  , FIRST, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry, key, key, 0),
-    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry, value, key, &grpc_gcp_ServerHandshakeParameters_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_NextHandshakeMessageReq_fields[2] = {
-    PB_FIELD(  1, BYTES   , OPTIONAL, CALLBACK, FIRST, grpc_gcp_NextHandshakeMessageReq, in_bytes, in_bytes, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_HandshakerReq_fields[4] = {
-    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_gcp_HandshakerReq, client_start, client_start, &grpc_gcp_StartClientHandshakeReq_fields),
-    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerReq, server_start, client_start, &grpc_gcp_StartServerHandshakeReq_fields),
-    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerReq, next, server_start, &grpc_gcp_NextHandshakeMessageReq_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_HandshakerResult_fields[8] = {
-    PB_FIELD(  1, STRING  , OPTIONAL, CALLBACK, FIRST, grpc_gcp_HandshakerResult, application_protocol, application_protocol, 0),
-    PB_FIELD(  2, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_HandshakerResult, record_protocol, application_protocol, 0),
-    PB_FIELD(  3, BYTES   , OPTIONAL, CALLBACK, OTHER, grpc_gcp_HandshakerResult, key_data, record_protocol, 0),
-    PB_FIELD(  4, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResult, peer_identity, key_data, &grpc_gcp_Identity_fields),
-    PB_FIELD(  5, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResult, local_identity, peer_identity, &grpc_gcp_Identity_fields),
-    PB_FIELD(  6, BOOL    , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResult, keep_channel_open, local_identity, 0),
-    PB_FIELD(  7, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResult, peer_rpc_versions, keep_channel_open, &grpc_gcp_RpcProtocolVersions_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_HandshakerStatus_fields[3] = {
-    PB_FIELD(  1, UINT32  , OPTIONAL, STATIC  , FIRST, grpc_gcp_HandshakerStatus, code, code, 0),
-    PB_FIELD(  2, STRING  , OPTIONAL, CALLBACK, OTHER, grpc_gcp_HandshakerStatus, details, code, 0),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_HandshakerResp_fields[5] = {
-    PB_FIELD(  1, BYTES   , OPTIONAL, CALLBACK, FIRST, grpc_gcp_HandshakerResp, out_frames, out_frames, 0),
-    PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResp, bytes_consumed, out_frames, 0),
-    PB_FIELD(  3, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResp, result, bytes_consumed, &grpc_gcp_HandshakerResult_fields),
-    PB_FIELD(  4, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_HandshakerResp, status, result, &grpc_gcp_HandshakerStatus_fields),
-    PB_LAST_FIELD
-};
-
-
-/* Check that field information fits in pb_field_t */
-#if !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_32BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in 8 or 16 bit
- * field descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_StartClientHandshakeReq, target_identities) < 65536 && pb_membersize(grpc_gcp_StartClientHandshakeReq, local_identity) < 65536 && pb_membersize(grpc_gcp_StartClientHandshakeReq, local_endpoint) < 65536 && pb_membersize(grpc_gcp_StartClientHandshakeReq, remote_endpoint) < 65536 && pb_membersize(grpc_gcp_StartClientHandshakeReq, rpc_versions) < 65536 && pb_membersize(grpc_gcp_ServerHandshakeParameters, local_identities) < 65536 && pb_membersize(grpc_gcp_StartServerHandshakeReq, handshake_parameters[0]) < 65536 && pb_membersize(grpc_gcp_StartServerHandshakeReq, local_endpoint) < 65536 && pb_membersize(grpc_gcp_StartServerHandshakeReq, remote_endpoint) < 65536 && pb_membersize(grpc_gcp_StartServerHandshakeReq, rpc_versions) < 65536 && pb_membersize(grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry, value) < 65536 && pb_membersize(grpc_gcp_HandshakerReq, client_start) < 65536 && pb_membersize(grpc_gcp_HandshakerReq, server_start) < 65536 && pb_membersize(grpc_gcp_HandshakerReq, next) < 65536 && pb_membersize(grpc_gcp_HandshakerResult, peer_identity) < 65536 && pb_membersize(grpc_gcp_HandshakerResult, local_identity) < 65536 && pb_membersize(grpc_gcp_HandshakerResult, peer_rpc_versions) < 65536 && pb_membersize(grpc_gcp_HandshakerResp, result) < 65536 && pb_membersize(grpc_gcp_HandshakerResp, status) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_gcp_Endpoint_grpc_gcp_Identity_grpc_gcp_StartClientHandshakeReq_grpc_gcp_ServerHandshakeParameters_grpc_gcp_StartServerHandshakeReq_grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_grpc_gcp_NextHandshakeMessageReq_grpc_gcp_HandshakerReq_grpc_gcp_HandshakerResult_grpc_gcp_HandshakerStatus_grpc_gcp_HandshakerResp)
-#endif
-
-#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_16BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in the default
- * 8 bit descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_StartClientHandshakeReq, target_identities) < 256 && pb_membersize(grpc_gcp_StartClientHandshakeReq, local_identity) < 256 && pb_membersize(grpc_gcp_StartClientHandshakeReq, local_endpoint) < 256 && pb_membersize(grpc_gcp_StartClientHandshakeReq, remote_endpoint) < 256 && pb_membersize(grpc_gcp_StartClientHandshakeReq, rpc_versions) < 256 && pb_membersize(grpc_gcp_ServerHandshakeParameters, local_identities) < 256 && pb_membersize(grpc_gcp_StartServerHandshakeReq, handshake_parameters[0]) < 256 && pb_membersize(grpc_gcp_StartServerHandshakeReq, local_endpoint) < 256 && pb_membersize(grpc_gcp_StartServerHandshakeReq, remote_endpoint) < 256 && pb_membersize(grpc_gcp_StartServerHandshakeReq, rpc_versions) < 256 && pb_membersize(grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry, value) < 256 && pb_membersize(grpc_gcp_HandshakerReq, client_start) < 256 && pb_membersize(grpc_gcp_HandshakerReq, server_start) < 256 && pb_membersize(grpc_gcp_HandshakerReq, next) < 256 && pb_membersize(grpc_gcp_HandshakerResult, peer_identity) < 256 && pb_membersize(grpc_gcp_HandshakerResult, local_identity) < 256 && pb_membersize(grpc_gcp_HandshakerResult, peer_rpc_versions) < 256 && pb_membersize(grpc_gcp_HandshakerResp, result) < 256 && pb_membersize(grpc_gcp_HandshakerResp, status) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_gcp_Endpoint_grpc_gcp_Identity_grpc_gcp_StartClientHandshakeReq_grpc_gcp_ServerHandshakeParameters_grpc_gcp_StartServerHandshakeReq_grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_grpc_gcp_NextHandshakeMessageReq_grpc_gcp_HandshakerReq_grpc_gcp_HandshakerResult_grpc_gcp_HandshakerStatus_grpc_gcp_HandshakerResp)
-#endif
-
-
-/* @@protoc_insertion_point(eof) */
diff --git a/src/core/tsi/alts/handshaker/handshaker.pb.h b/src/core/tsi/alts/handshaker/handshaker.pb.h
deleted file mode 100644
index 5ee42a3..0000000
--- a/src/core/tsi/alts/handshaker/handshaker.pb.h
+++ /dev/null
@@ -1,254 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.3.7-dev */
-
-#ifndef PB_GRPC_GCP_HANDSHAKER_PB_H_INCLUDED
-#define PB_GRPC_GCP_HANDSHAKER_PB_H_INCLUDED
-#include "pb.h"
-#include "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Enum definitions */
-typedef enum _grpc_gcp_HandshakeProtocol {
-    grpc_gcp_HandshakeProtocol_HANDSHAKE_PROTOCOL_UNSPECIFIED = 0,
-    grpc_gcp_HandshakeProtocol_TLS = 1,
-    grpc_gcp_HandshakeProtocol_ALTS = 2
-} grpc_gcp_HandshakeProtocol;
-#define _grpc_gcp_HandshakeProtocol_MIN grpc_gcp_HandshakeProtocol_HANDSHAKE_PROTOCOL_UNSPECIFIED
-#define _grpc_gcp_HandshakeProtocol_MAX grpc_gcp_HandshakeProtocol_ALTS
-#define _grpc_gcp_HandshakeProtocol_ARRAYSIZE ((grpc_gcp_HandshakeProtocol)(grpc_gcp_HandshakeProtocol_ALTS+1))
-
-typedef enum _grpc_gcp_NetworkProtocol {
-    grpc_gcp_NetworkProtocol_NETWORK_PROTOCOL_UNSPECIFIED = 0,
-    grpc_gcp_NetworkProtocol_TCP = 1,
-    grpc_gcp_NetworkProtocol_UDP = 2
-} grpc_gcp_NetworkProtocol;
-#define _grpc_gcp_NetworkProtocol_MIN grpc_gcp_NetworkProtocol_NETWORK_PROTOCOL_UNSPECIFIED
-#define _grpc_gcp_NetworkProtocol_MAX grpc_gcp_NetworkProtocol_UDP
-#define _grpc_gcp_NetworkProtocol_ARRAYSIZE ((grpc_gcp_NetworkProtocol)(grpc_gcp_NetworkProtocol_UDP+1))
-
-/* Struct definitions */
-typedef struct _grpc_gcp_Identity {
-    pb_callback_t service_account;
-    pb_callback_t hostname;
-/* @@protoc_insertion_point(struct:grpc_gcp_Identity) */
-} grpc_gcp_Identity;
-
-typedef struct _grpc_gcp_NextHandshakeMessageReq {
-    pb_callback_t in_bytes;
-/* @@protoc_insertion_point(struct:grpc_gcp_NextHandshakeMessageReq) */
-} grpc_gcp_NextHandshakeMessageReq;
-
-typedef struct _grpc_gcp_ServerHandshakeParameters {
-    pb_callback_t record_protocols;
-    pb_callback_t local_identities;
-/* @@protoc_insertion_point(struct:grpc_gcp_ServerHandshakeParameters) */
-} grpc_gcp_ServerHandshakeParameters;
-
-typedef struct _grpc_gcp_Endpoint {
-    pb_callback_t ip_address;
-    bool has_port;
-    int32_t port;
-    bool has_protocol;
-    grpc_gcp_NetworkProtocol protocol;
-/* @@protoc_insertion_point(struct:grpc_gcp_Endpoint) */
-} grpc_gcp_Endpoint;
-
-typedef struct _grpc_gcp_HandshakerResult {
-    pb_callback_t application_protocol;
-    pb_callback_t record_protocol;
-    pb_callback_t key_data;
-    bool has_peer_identity;
-    grpc_gcp_Identity peer_identity;
-    bool has_local_identity;
-    grpc_gcp_Identity local_identity;
-    bool has_keep_channel_open;
-    bool keep_channel_open;
-    bool has_peer_rpc_versions;
-    grpc_gcp_RpcProtocolVersions peer_rpc_versions;
-/* @@protoc_insertion_point(struct:grpc_gcp_HandshakerResult) */
-} grpc_gcp_HandshakerResult;
-
-typedef struct _grpc_gcp_HandshakerStatus {
-    bool has_code;
-    uint32_t code;
-    pb_callback_t details;
-/* @@protoc_insertion_point(struct:grpc_gcp_HandshakerStatus) */
-} grpc_gcp_HandshakerStatus;
-
-typedef struct _grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry {
-    bool has_key;
-    int32_t key;
-    bool has_value;
-    grpc_gcp_ServerHandshakeParameters value;
-/* @@protoc_insertion_point(struct:grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry) */
-} grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry;
-
-typedef struct _grpc_gcp_HandshakerResp {
-    pb_callback_t out_frames;
-    bool has_bytes_consumed;
-    uint32_t bytes_consumed;
-    bool has_result;
-    grpc_gcp_HandshakerResult result;
-    bool has_status;
-    grpc_gcp_HandshakerStatus status;
-/* @@protoc_insertion_point(struct:grpc_gcp_HandshakerResp) */
-} grpc_gcp_HandshakerResp;
-
-typedef struct _grpc_gcp_StartClientHandshakeReq {
-    bool has_handshake_security_protocol;
-    grpc_gcp_HandshakeProtocol handshake_security_protocol;
-    pb_callback_t application_protocols;
-    pb_callback_t record_protocols;
-    pb_callback_t target_identities;
-    bool has_local_identity;
-    grpc_gcp_Identity local_identity;
-    bool has_local_endpoint;
-    grpc_gcp_Endpoint local_endpoint;
-    bool has_remote_endpoint;
-    grpc_gcp_Endpoint remote_endpoint;
-    pb_callback_t target_name;
-    bool has_rpc_versions;
-    grpc_gcp_RpcProtocolVersions rpc_versions;
-/* @@protoc_insertion_point(struct:grpc_gcp_StartClientHandshakeReq) */
-} grpc_gcp_StartClientHandshakeReq;
-
-typedef struct _grpc_gcp_StartServerHandshakeReq {
-    pb_callback_t application_protocols;
-    pb_size_t handshake_parameters_count;
-    grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry handshake_parameters[3];
-    pb_callback_t in_bytes;
-    bool has_local_endpoint;
-    grpc_gcp_Endpoint local_endpoint;
-    bool has_remote_endpoint;
-    grpc_gcp_Endpoint remote_endpoint;
-    bool has_rpc_versions;
-    grpc_gcp_RpcProtocolVersions rpc_versions;
-/* @@protoc_insertion_point(struct:grpc_gcp_StartServerHandshakeReq) */
-} grpc_gcp_StartServerHandshakeReq;
-
-typedef struct _grpc_gcp_HandshakerReq {
-    bool has_client_start;
-    grpc_gcp_StartClientHandshakeReq client_start;
-    bool has_server_start;
-    grpc_gcp_StartServerHandshakeReq server_start;
-    bool has_next;
-    grpc_gcp_NextHandshakeMessageReq next;
-/* @@protoc_insertion_point(struct:grpc_gcp_HandshakerReq) */
-} grpc_gcp_HandshakerReq;
-
-/* Default values for struct fields */
-
-/* Initializer values for message structs */
-#define grpc_gcp_Endpoint_init_default           {{{NULL}, NULL}, false, 0, false, (grpc_gcp_NetworkProtocol)0}
-#define grpc_gcp_Identity_init_default           {{{NULL}, NULL}, {{NULL}, NULL}}
-#define grpc_gcp_StartClientHandshakeReq_init_default {false, (grpc_gcp_HandshakeProtocol)0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_Identity_init_default, false, grpc_gcp_Endpoint_init_default, false, grpc_gcp_Endpoint_init_default, {{NULL}, NULL}, false, grpc_gcp_RpcProtocolVersions_init_default}
-#define grpc_gcp_ServerHandshakeParameters_init_default {{{NULL}, NULL}, {{NULL}, NULL}}
-#define grpc_gcp_StartServerHandshakeReq_init_default {{{NULL}, NULL}, 0, {grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_default, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_default, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_default}, {{NULL}, NULL}, false, grpc_gcp_Endpoint_init_default, false, grpc_gcp_Endpoint_init_default, false, grpc_gcp_RpcProtocolVersions_init_default}
-#define grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_default {false, 0, false, grpc_gcp_ServerHandshakeParameters_init_default}
-#define grpc_gcp_NextHandshakeMessageReq_init_default {{{NULL}, NULL}}
-#define grpc_gcp_HandshakerReq_init_default      {false, grpc_gcp_StartClientHandshakeReq_init_default, false, grpc_gcp_StartServerHandshakeReq_init_default, false, grpc_gcp_NextHandshakeMessageReq_init_default}
-#define grpc_gcp_HandshakerResult_init_default   {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_Identity_init_default, false, grpc_gcp_Identity_init_default, false, 0, false, grpc_gcp_RpcProtocolVersions_init_default}
-#define grpc_gcp_HandshakerStatus_init_default   {false, 0, {{NULL}, NULL}}
-#define grpc_gcp_HandshakerResp_init_default     {{{NULL}, NULL}, false, 0, false, grpc_gcp_HandshakerResult_init_default, false, grpc_gcp_HandshakerStatus_init_default}
-#define grpc_gcp_Endpoint_init_zero              {{{NULL}, NULL}, false, 0, false, (grpc_gcp_NetworkProtocol)0}
-#define grpc_gcp_Identity_init_zero              {{{NULL}, NULL}, {{NULL}, NULL}}
-#define grpc_gcp_StartClientHandshakeReq_init_zero {false, (grpc_gcp_HandshakeProtocol)0, {{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_Identity_init_zero, false, grpc_gcp_Endpoint_init_zero, false, grpc_gcp_Endpoint_init_zero, {{NULL}, NULL}, false, grpc_gcp_RpcProtocolVersions_init_zero}
-#define grpc_gcp_ServerHandshakeParameters_init_zero {{{NULL}, NULL}, {{NULL}, NULL}}
-#define grpc_gcp_StartServerHandshakeReq_init_zero {{{NULL}, NULL}, 0, {grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_zero, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_zero, grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_zero}, {{NULL}, NULL}, false, grpc_gcp_Endpoint_init_zero, false, grpc_gcp_Endpoint_init_zero, false, grpc_gcp_RpcProtocolVersions_init_zero}
-#define grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_init_zero {false, 0, false, grpc_gcp_ServerHandshakeParameters_init_zero}
-#define grpc_gcp_NextHandshakeMessageReq_init_zero {{{NULL}, NULL}}
-#define grpc_gcp_HandshakerReq_init_zero         {false, grpc_gcp_StartClientHandshakeReq_init_zero, false, grpc_gcp_StartServerHandshakeReq_init_zero, false, grpc_gcp_NextHandshakeMessageReq_init_zero}
-#define grpc_gcp_HandshakerResult_init_zero      {{{NULL}, NULL}, {{NULL}, NULL}, {{NULL}, NULL}, false, grpc_gcp_Identity_init_zero, false, grpc_gcp_Identity_init_zero, false, 0, false, grpc_gcp_RpcProtocolVersions_init_zero}
-#define grpc_gcp_HandshakerStatus_init_zero      {false, 0, {{NULL}, NULL}}
-#define grpc_gcp_HandshakerResp_init_zero        {{{NULL}, NULL}, false, 0, false, grpc_gcp_HandshakerResult_init_zero, false, grpc_gcp_HandshakerStatus_init_zero}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define grpc_gcp_Identity_service_account_tag    1
-#define grpc_gcp_Identity_hostname_tag           2
-#define grpc_gcp_NextHandshakeMessageReq_in_bytes_tag 1
-#define grpc_gcp_ServerHandshakeParameters_record_protocols_tag 1
-#define grpc_gcp_ServerHandshakeParameters_local_identities_tag 2
-#define grpc_gcp_Endpoint_ip_address_tag         1
-#define grpc_gcp_Endpoint_port_tag               2
-#define grpc_gcp_Endpoint_protocol_tag           3
-#define grpc_gcp_HandshakerResult_application_protocol_tag 1
-#define grpc_gcp_HandshakerResult_record_protocol_tag 2
-#define grpc_gcp_HandshakerResult_key_data_tag   3
-#define grpc_gcp_HandshakerResult_peer_identity_tag 4
-#define grpc_gcp_HandshakerResult_local_identity_tag 5
-#define grpc_gcp_HandshakerResult_keep_channel_open_tag 6
-#define grpc_gcp_HandshakerResult_peer_rpc_versions_tag 7
-#define grpc_gcp_HandshakerStatus_code_tag       1
-#define grpc_gcp_HandshakerStatus_details_tag    2
-#define grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_key_tag 1
-#define grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_value_tag 2
-#define grpc_gcp_HandshakerResp_out_frames_tag   1
-#define grpc_gcp_HandshakerResp_bytes_consumed_tag 2
-#define grpc_gcp_HandshakerResp_result_tag       3
-#define grpc_gcp_HandshakerResp_status_tag       4
-#define grpc_gcp_StartClientHandshakeReq_handshake_security_protocol_tag 1
-#define grpc_gcp_StartClientHandshakeReq_application_protocols_tag 2
-#define grpc_gcp_StartClientHandshakeReq_record_protocols_tag 3
-#define grpc_gcp_StartClientHandshakeReq_target_identities_tag 4
-#define grpc_gcp_StartClientHandshakeReq_local_identity_tag 5
-#define grpc_gcp_StartClientHandshakeReq_local_endpoint_tag 6
-#define grpc_gcp_StartClientHandshakeReq_remote_endpoint_tag 7
-#define grpc_gcp_StartClientHandshakeReq_target_name_tag 8
-#define grpc_gcp_StartClientHandshakeReq_rpc_versions_tag 9
-#define grpc_gcp_StartServerHandshakeReq_application_protocols_tag 1
-#define grpc_gcp_StartServerHandshakeReq_handshake_parameters_tag 2
-#define grpc_gcp_StartServerHandshakeReq_in_bytes_tag 3
-#define grpc_gcp_StartServerHandshakeReq_local_endpoint_tag 4
-#define grpc_gcp_StartServerHandshakeReq_remote_endpoint_tag 5
-#define grpc_gcp_StartServerHandshakeReq_rpc_versions_tag 6
-#define grpc_gcp_HandshakerReq_client_start_tag  1
-#define grpc_gcp_HandshakerReq_server_start_tag  2
-#define grpc_gcp_HandshakerReq_next_tag          3
-
-/* Struct field encoding specification for nanopb */
-extern const pb_field_t grpc_gcp_Endpoint_fields[4];
-extern const pb_field_t grpc_gcp_Identity_fields[3];
-extern const pb_field_t grpc_gcp_StartClientHandshakeReq_fields[10];
-extern const pb_field_t grpc_gcp_ServerHandshakeParameters_fields[3];
-extern const pb_field_t grpc_gcp_StartServerHandshakeReq_fields[7];
-extern const pb_field_t grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_fields[3];
-extern const pb_field_t grpc_gcp_NextHandshakeMessageReq_fields[2];
-extern const pb_field_t grpc_gcp_HandshakerReq_fields[4];
-extern const pb_field_t grpc_gcp_HandshakerResult_fields[8];
-extern const pb_field_t grpc_gcp_HandshakerStatus_fields[3];
-extern const pb_field_t grpc_gcp_HandshakerResp_fields[5];
-
-/* Maximum encoded size of messages (where known) */
-/* grpc_gcp_Endpoint_size depends on runtime parameters */
-/* grpc_gcp_Identity_size depends on runtime parameters */
-/* grpc_gcp_StartClientHandshakeReq_size depends on runtime parameters */
-/* grpc_gcp_ServerHandshakeParameters_size depends on runtime parameters */
-/* grpc_gcp_StartServerHandshakeReq_size depends on runtime parameters */
-#define grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_size (17 + grpc_gcp_ServerHandshakeParameters_size)
-/* grpc_gcp_NextHandshakeMessageReq_size depends on runtime parameters */
-#define grpc_gcp_HandshakerReq_size              (18 + grpc_gcp_StartClientHandshakeReq_size + grpc_gcp_StartServerHandshakeReq_size + grpc_gcp_NextHandshakeMessageReq_size)
-/* grpc_gcp_HandshakerResult_size depends on runtime parameters */
-/* grpc_gcp_HandshakerStatus_size depends on runtime parameters */
-/* grpc_gcp_HandshakerResp_size depends on runtime parameters */
-
-/* Message IDs (where set with "msgid" option) */
-#ifdef PB_MSGID
-
-#define HANDSHAKER_MESSAGES \
-
-
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-/* @@protoc_insertion_point(eof) */
-
-#endif
diff --git a/src/core/tsi/alts/handshaker/transport_security_common.pb.c b/src/core/tsi/alts/handshaker/transport_security_common.pb.c
deleted file mode 100644
index 326b1b1..0000000
--- a/src/core/tsi/alts/handshaker/transport_security_common.pb.c
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Automatically generated nanopb constant definitions */
-/* Generated by nanopb-0.3.7-dev */
-
-#include "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-
-
-const pb_field_t grpc_gcp_RpcProtocolVersions_fields[3] = {
-    PB_FIELD(  1, MESSAGE , OPTIONAL, STATIC  , FIRST, grpc_gcp_RpcProtocolVersions, max_rpc_version, max_rpc_version, &grpc_gcp_RpcProtocolVersions_Version_fields),
-    PB_FIELD(  2, MESSAGE , OPTIONAL, STATIC  , OTHER, grpc_gcp_RpcProtocolVersions, min_rpc_version, max_rpc_version, &grpc_gcp_RpcProtocolVersions_Version_fields),
-    PB_LAST_FIELD
-};
-
-const pb_field_t grpc_gcp_RpcProtocolVersions_Version_fields[3] = {
-    PB_FIELD(  1, UINT32  , OPTIONAL, STATIC  , FIRST, grpc_gcp_RpcProtocolVersions_Version, major, major, 0),
-    PB_FIELD(  2, UINT32  , OPTIONAL, STATIC  , OTHER, grpc_gcp_RpcProtocolVersions_Version, minor, major, 0),
-    PB_LAST_FIELD
-};
-
-
-/* Check that field information fits in pb_field_t */
-#if !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_32BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in 8 or 16 bit
- * field descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_RpcProtocolVersions, max_rpc_version) < 65536 && pb_membersize(grpc_gcp_RpcProtocolVersions, min_rpc_version) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_gcp_RpcProtocolVersions_grpc_gcp_RpcProtocolVersions_Version)
-#endif
-
-#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
-/* If you get an error here, it means that you need to define PB_FIELD_16BIT
- * compile-time option. You can do that in pb.h or on compiler command line.
- * 
- * The reason you need to do this is that some of your messages contain tag
- * numbers or field sizes that are larger than what can fit in the default
- * 8 bit descriptors.
- */
-PB_STATIC_ASSERT((pb_membersize(grpc_gcp_RpcProtocolVersions, max_rpc_version) < 256 && pb_membersize(grpc_gcp_RpcProtocolVersions, min_rpc_version) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_gcp_RpcProtocolVersions_grpc_gcp_RpcProtocolVersions_Version)
-#endif
-
-
-/* @@protoc_insertion_point(eof) */
diff --git a/src/core/tsi/alts/handshaker/transport_security_common.pb.h b/src/core/tsi/alts/handshaker/transport_security_common.pb.h
deleted file mode 100644
index 87d9abf..0000000
--- a/src/core/tsi/alts/handshaker/transport_security_common.pb.h
+++ /dev/null
@@ -1,78 +0,0 @@
-/* Automatically generated nanopb header */
-/* Generated by nanopb-0.3.7-dev */
-
-#ifndef PB_GRPC_GCP_TRANSPORT_SECURITY_COMMON_PB_H_INCLUDED
-#define PB_GRPC_GCP_TRANSPORT_SECURITY_COMMON_PB_H_INCLUDED
-#include "pb.h"
-/* @@protoc_insertion_point(includes) */
-#if PB_PROTO_HEADER_VERSION != 30
-#error Regenerate this file with the current version of nanopb generator.
-#endif
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Enum definitions */
-typedef enum _grpc_gcp_SecurityLevel {
-    grpc_gcp_SecurityLevel_SECURITY_NONE = 0,
-    grpc_gcp_SecurityLevel_INTEGRITY_ONLY = 1,
-    grpc_gcp_SecurityLevel_INTEGRITY_AND_PRIVACY = 2
-} grpc_gcp_SecurityLevel;
-#define _grpc_gcp_SecurityLevel_MIN grpc_gcp_SecurityLevel_SECURITY_NONE
-#define _grpc_gcp_SecurityLevel_MAX grpc_gcp_SecurityLevel_INTEGRITY_AND_PRIVACY
-#define _grpc_gcp_SecurityLevel_ARRAYSIZE ((grpc_gcp_SecurityLevel)(grpc_gcp_SecurityLevel_INTEGRITY_AND_PRIVACY+1))
-
-/* Struct definitions */
-typedef struct _grpc_gcp_RpcProtocolVersions_Version {
-    bool has_major;
-    uint32_t major;
-    bool has_minor;
-    uint32_t minor;
-/* @@protoc_insertion_point(struct:grpc_gcp_RpcProtocolVersions_Version) */
-} grpc_gcp_RpcProtocolVersions_Version;
-
-typedef struct _grpc_gcp_RpcProtocolVersions {
-    bool has_max_rpc_version;
-    grpc_gcp_RpcProtocolVersions_Version max_rpc_version;
-    bool has_min_rpc_version;
-    grpc_gcp_RpcProtocolVersions_Version min_rpc_version;
-/* @@protoc_insertion_point(struct:grpc_gcp_RpcProtocolVersions) */
-} grpc_gcp_RpcProtocolVersions;
-
-/* Default values for struct fields */
-
-/* Initializer values for message structs */
-#define grpc_gcp_RpcProtocolVersions_init_default {false, grpc_gcp_RpcProtocolVersions_Version_init_default, false, grpc_gcp_RpcProtocolVersions_Version_init_default}
-#define grpc_gcp_RpcProtocolVersions_Version_init_default {false, 0, false, 0}
-#define grpc_gcp_RpcProtocolVersions_init_zero   {false, grpc_gcp_RpcProtocolVersions_Version_init_zero, false, grpc_gcp_RpcProtocolVersions_Version_init_zero}
-#define grpc_gcp_RpcProtocolVersions_Version_init_zero {false, 0, false, 0}
-
-/* Field tags (for use in manual encoding/decoding) */
-#define grpc_gcp_RpcProtocolVersions_Version_major_tag 1
-#define grpc_gcp_RpcProtocolVersions_Version_minor_tag 2
-#define grpc_gcp_RpcProtocolVersions_max_rpc_version_tag 1
-#define grpc_gcp_RpcProtocolVersions_min_rpc_version_tag 2
-
-/* Struct field encoding specification for nanopb */
-extern const pb_field_t grpc_gcp_RpcProtocolVersions_fields[3];
-extern const pb_field_t grpc_gcp_RpcProtocolVersions_Version_fields[3];
-
-/* Maximum encoded size of messages (where known) */
-#define grpc_gcp_RpcProtocolVersions_size        28
-#define grpc_gcp_RpcProtocolVersions_Version_size 12
-
-/* Message IDs (where set with "msgid" option) */
-#ifdef PB_MSGID
-
-#define TRANSPORT_SECURITY_COMMON_MESSAGES \
-
-
-#endif
-
-#ifdef __cplusplus
-} /* extern "C" */
-#endif
-/* @@protoc_insertion_point(eof) */
-
-#endif
diff --git a/src/core/tsi/alts/handshaker/transport_security_common_api.cc b/src/core/tsi/alts/handshaker/transport_security_common_api.cc
index 6c518c1..c7b9faf 100644
--- a/src/core/tsi/alts/handshaker/transport_security_common_api.cc
+++ b/src/core/tsi/alts/handshaker/transport_security_common_api.cc
@@ -29,9 +29,6 @@
             "grpc_gcp_rpc_protocol_versions_set_max().");
     return false;
   }
-  versions->has_max_rpc_version = true;
-  versions->max_rpc_version.has_major = true;
-  versions->max_rpc_version.has_minor = true;
   versions->max_rpc_version.major = max_major;
   versions->max_rpc_version.minor = max_minor;
   return true;
@@ -46,49 +43,11 @@
             "grpc_gcp_rpc_protocol_versions_set_min().");
     return false;
   }
-  versions->has_min_rpc_version = true;
-  versions->min_rpc_version.has_major = true;
-  versions->min_rpc_version.has_minor = true;
   versions->min_rpc_version.major = min_major;
   versions->min_rpc_version.minor = min_minor;
   return true;
 }
 
-size_t grpc_gcp_rpc_protocol_versions_encode_length(
-    const grpc_gcp_rpc_protocol_versions* versions) {
-  if (versions == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_rpc_protocol_versions_encode_length().");
-    return 0;
-  }
-  pb_ostream_t size_stream;
-  memset(&size_stream, 0, sizeof(pb_ostream_t));
-  if (!pb_encode(&size_stream, grpc_gcp_RpcProtocolVersions_fields, versions)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&size_stream));
-    return 0;
-  }
-  return size_stream.bytes_written;
-}
-
-bool grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-    const grpc_gcp_rpc_protocol_versions* versions, uint8_t* bytes,
-    size_t bytes_length) {
-  if (versions == nullptr || bytes == nullptr || bytes_length == 0) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes().");
-    return false;
-  }
-  pb_ostream_t output_stream = pb_ostream_from_buffer(bytes, bytes_length);
-  if (!pb_encode(&output_stream, grpc_gcp_RpcProtocolVersions_fields,
-                 versions)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&output_stream));
-    return false;
-  }
-  return true;
-}
-
 bool grpc_gcp_rpc_protocol_versions_encode(
     const grpc_gcp_rpc_protocol_versions* versions, grpc_slice* slice) {
   if (versions == nullptr || slice == nullptr) {
@@ -97,12 +56,32 @@
             "grpc_gcp_rpc_protocol_versions_encode().");
     return false;
   }
-  size_t encoded_length =
-      grpc_gcp_rpc_protocol_versions_encode_length(versions);
-  if (encoded_length == 0) return false;
-  *slice = grpc_slice_malloc(encoded_length);
-  return grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-      versions, GRPC_SLICE_START_PTR(*slice), encoded_length);
+  upb::Arena arena;
+  grpc_gcp_RpcProtocolVersions* versions_msg =
+      grpc_gcp_RpcProtocolVersions_new(arena.ptr());
+  grpc_gcp_RpcProtocolVersions_assign_from_struct(versions_msg, arena.ptr(),
+                                                  versions);
+  return grpc_gcp_rpc_protocol_versions_encode(versions_msg, arena.ptr(),
+                                               slice);
+}
+
+bool grpc_gcp_rpc_protocol_versions_encode(
+    const grpc_gcp_RpcProtocolVersions* versions, upb_arena* arena,
+    grpc_slice* slice) {
+  if (versions == nullptr || arena == nullptr || slice == nullptr) {
+    gpr_log(GPR_ERROR,
+            "Invalid nullptr arguments to "
+            "grpc_gcp_rpc_protocol_versions_encode().");
+    return false;
+  }
+  size_t buf_length;
+  char* buf =
+      grpc_gcp_RpcProtocolVersions_serialize(versions, arena, &buf_length);
+  if (buf == nullptr) {
+    return false;
+  }
+  *slice = grpc_slice_from_copied_buffer(buf, buf_length);
+  return true;
 }
 
 bool grpc_gcp_rpc_protocol_versions_decode(
@@ -113,16 +92,63 @@
             "grpc_gcp_rpc_protocol_versions_decode().");
     return false;
   }
-  pb_istream_t stream =
-      pb_istream_from_buffer(const_cast<uint8_t*>(GRPC_SLICE_START_PTR(slice)),
-                             GRPC_SLICE_LENGTH(slice));
-  if (!pb_decode(&stream, grpc_gcp_RpcProtocolVersions_fields, versions)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
+  upb::Arena arena;
+  grpc_gcp_RpcProtocolVersions* versions_msg =
+      grpc_gcp_RpcProtocolVersions_parse(
+          reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(slice)),
+          GRPC_SLICE_LENGTH(slice), arena.ptr());
+  if (versions_msg == nullptr) {
+    gpr_log(GPR_ERROR, "cannot deserialize RpcProtocolVersions message");
     return false;
   }
+  grpc_gcp_rpc_protocol_versions_assign_from_upb(versions, versions_msg);
   return true;
 }
 
+void grpc_gcp_rpc_protocol_versions_assign_from_upb(
+    grpc_gcp_rpc_protocol_versions* versions,
+    const grpc_gcp_RpcProtocolVersions* value) {
+  const grpc_gcp_RpcProtocolVersions_Version* max_version_msg =
+      grpc_gcp_RpcProtocolVersions_max_rpc_version(value);
+  if (max_version_msg != nullptr) {
+    versions->max_rpc_version.major =
+        grpc_gcp_RpcProtocolVersions_Version_major(max_version_msg);
+    versions->max_rpc_version.minor =
+        grpc_gcp_RpcProtocolVersions_Version_minor(max_version_msg);
+  } else {
+    versions->max_rpc_version.major = 0;
+    versions->max_rpc_version.minor = 0;
+  }
+  const grpc_gcp_RpcProtocolVersions_Version* min_version_msg =
+      grpc_gcp_RpcProtocolVersions_min_rpc_version(value);
+  if (min_version_msg != nullptr) {
+    versions->min_rpc_version.major =
+        grpc_gcp_RpcProtocolVersions_Version_major(min_version_msg);
+    versions->min_rpc_version.minor =
+        grpc_gcp_RpcProtocolVersions_Version_minor(min_version_msg);
+  } else {
+    versions->min_rpc_version.major = 0;
+    versions->min_rpc_version.minor = 0;
+  }
+}
+
+void grpc_gcp_RpcProtocolVersions_assign_from_struct(
+    grpc_gcp_RpcProtocolVersions* versions, upb_arena* arena,
+    const grpc_gcp_rpc_protocol_versions* value) {
+  grpc_gcp_RpcProtocolVersions_Version* max_version_msg =
+      grpc_gcp_RpcProtocolVersions_mutable_max_rpc_version(versions, arena);
+  grpc_gcp_RpcProtocolVersions_Version_set_major(max_version_msg,
+                                                 value->max_rpc_version.major);
+  grpc_gcp_RpcProtocolVersions_Version_set_minor(max_version_msg,
+                                                 value->max_rpc_version.minor);
+  grpc_gcp_RpcProtocolVersions_Version* min_version_msg =
+      grpc_gcp_RpcProtocolVersions_mutable_min_rpc_version(versions, arena);
+  grpc_gcp_RpcProtocolVersions_Version_set_major(min_version_msg,
+                                                 value->min_rpc_version.major);
+  grpc_gcp_RpcProtocolVersions_Version_set_minor(min_version_msg,
+                                                 value->min_rpc_version.minor);
+}
+
 bool grpc_gcp_rpc_protocol_versions_copy(
     const grpc_gcp_rpc_protocol_versions* src,
     grpc_gcp_rpc_protocol_versions* dst) {
diff --git a/src/core/tsi/alts/handshaker/transport_security_common_api.h b/src/core/tsi/alts/handshaker/transport_security_common_api.h
index 27942c8..75739e4 100644
--- a/src/core/tsi/alts/handshaker/transport_security_common_api.h
+++ b/src/core/tsi/alts/handshaker/transport_security_common_api.h
@@ -21,20 +21,24 @@
 
 #include <grpc/support/port_platform.h>
 
-#include "pb_decode.h"
-#include "pb_encode.h"
-
 #include <grpc/slice.h>
 #include <grpc/slice_buffer.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 
-#include "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
+#include "src/proto/grpc/gcp/transport_security_common.upb.h"
 
-typedef grpc_gcp_RpcProtocolVersions grpc_gcp_rpc_protocol_versions;
+// C struct coresponding to protobuf message RpcProtocolVersions.Version
+typedef struct _grpc_gcp_RpcProtocolVersions_Version {
+  uint32_t major;
+  uint32_t minor;
+} grpc_gcp_rpc_protocol_versions_version;
 
-typedef grpc_gcp_RpcProtocolVersions_Version
-    grpc_gcp_rpc_protocol_versions_version;
+// C struct coresponding to protobuf message RpcProtocolVersions
+typedef struct _grpc_gcp_RpcProtocolVersions {
+  grpc_gcp_rpc_protocol_versions_version max_rpc_version;
+  grpc_gcp_rpc_protocol_versions_version min_rpc_version;
+} grpc_gcp_rpc_protocol_versions;
 
 /**
  * This method sets the value for max_rpc_versions field of rpc protocol
@@ -65,31 +69,6 @@
     uint32_t min_minor);
 
 /**
- * This method computes serialized byte length of rpc protocol versions.
- *
- * - versions: an rpc protocol versions instance.
- *
- * The method returns serialized byte length. It returns 0 on failure.
- */
-size_t grpc_gcp_rpc_protocol_versions_encode_length(
-    const grpc_gcp_rpc_protocol_versions* versions);
-
-/**
- * This method serializes rpc protocol versions and writes the result to
- * the memory buffer provided by the caller. Caller is responsible for
- * allocating sufficient memory to store the serialized data.
- *
- * - versions: an rpc protocol versions instance.
- * - bytes: bytes buffer where the result will be written to.
- * - bytes_length: length of the bytes buffer.
- *
- * The method returns true on success and false otherwise.
- */
-bool grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-    const grpc_gcp_rpc_protocol_versions* versions, uint8_t* bytes,
-    size_t bytes_length);
-
-/**
  * This method serializes an rpc protocol version and returns serialized rpc
  * versions in grpc slice.
  *
@@ -102,6 +81,20 @@
     const grpc_gcp_rpc_protocol_versions* versions, grpc_slice* slice);
 
 /**
+ * This method serializes an rpc protocol version and returns serialized rpc
+ * versions in grpc slice.
+ *
+ * - versions: an rpc protocol versions instance.
+ * - arena: upb arena.
+ * - slice: grpc slice where the serialized result will be written.
+ *
+ * The method returns true on success and false otherwise.
+ */
+bool grpc_gcp_rpc_protocol_versions_encode(
+    const grpc_gcp_RpcProtocolVersions* versions, upb_arena* arena,
+    grpc_slice* slice);
+
+/**
  * This method de-serializes input in grpc slice form and stores the result
  * in rpc protocol versions.
  *
@@ -115,6 +108,21 @@
     const grpc_slice& slice, grpc_gcp_rpc_protocol_versions* versions);
 
 /**
+ * Assigns value of upb RpcProtocolVersions to grpc_gcp_rpc_protocol_versions.
+ */
+void grpc_gcp_rpc_protocol_versions_assign_from_upb(
+    grpc_gcp_rpc_protocol_versions* versions,
+    const grpc_gcp_RpcProtocolVersions* value);
+
+/**
+ * Assigns value of struct grpc_gcp_rpc_protocol_versions to
+ * RpcProtocolVersions.
+ */
+void grpc_gcp_RpcProtocolVersions_assign_from_struct(
+    grpc_gcp_RpcProtocolVersions* versions, upb_arena* arena,
+    const grpc_gcp_rpc_protocol_versions* value);
+
+/**
  * This method performs a deep copy operation on rpc protocol versions
  * instance.
  *
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index f1c1a72..58c1fd3 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -306,23 +306,18 @@
     'src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc',
     'src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc',
     'src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc',
-    'src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc',
-    'src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc',
     'src/core/tsi/alts/handshaker/alts_tsi_utils.cc',
     'src/core/tsi/alts/handshaker/transport_security_common_api.cc',
-    'src/core/tsi/alts/handshaker/altscontext.pb.c',
-    'src/core/tsi/alts/handshaker/handshaker.pb.c',
-    'src/core/tsi/alts/handshaker/transport_security_common.pb.c',
-    'third_party/nanopb/pb_common.c',
-    'third_party/nanopb/pb_decode.c',
-    'third_party/nanopb/pb_encode.c',
-    'src/core/tsi/transport_security.cc',
+    'src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c',
+    'src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c',
+    'src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c',
     'third_party/upb/upb/decode.c',
     'third_party/upb/upb/encode.c',
     'third_party/upb/upb/msg.c',
     'third_party/upb/upb/port.c',
     'third_party/upb/upb/table.c',
     'third_party/upb/upb/upb.c',
+    'src/core/tsi/transport_security.cc',
     'src/core/ext/transport/chttp2/client/insecure/channel_create.cc',
     'src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc',
     'src/core/ext/transport/chttp2/client/authority.cc',
diff --git a/test/core/tsi/alts/handshaker/BUILD b/test/core/tsi/alts/handshaker/BUILD
index 61ba16a..ed97056 100644
--- a/test/core/tsi/alts/handshaker/BUILD
+++ b/test/core/tsi/alts/handshaker/BUILD
@@ -42,17 +42,6 @@
 )
 
 grpc_cc_test(
-    name = "alts_handshaker_service_api_test",
-    srcs = ["alts_handshaker_service_api_test.cc"],
-    language = "C++",
-    deps = [
-        ":alts_handshaker_service_api_test_lib",
-        "//:grpc",
-        "//test/core/util:grpc_test_util",
-    ],
-)
-
-grpc_cc_test(
     name = "alts_tsi_handshaker_test",
     srcs = ["alts_tsi_handshaker_test.cc"],
     language = "C++",
diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc
index 9a4541b..4d36c24 100644
--- a/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc
+++ b/test/core/tsi/alts/handshaker/alts_handshaker_client_test.cc
@@ -54,34 +54,34 @@
 } alts_handshaker_client_test_config;
 
 static void validate_rpc_protocol_versions(
-    grpc_gcp_rpc_protocol_versions* versions) {
+    const grpc_gcp_RpcProtocolVersions* versions) {
   GPR_ASSERT(versions != nullptr);
-  GPR_ASSERT(versions->max_rpc_version.major == kMaxRpcVersionMajor);
-  GPR_ASSERT(versions->max_rpc_version.minor == kMaxRpcVersionMinor);
-  GPR_ASSERT(versions->min_rpc_version.major == kMinRpcVersionMajor);
-  GPR_ASSERT(versions->min_rpc_version.minor == kMinRpcVersionMinor);
+  const grpc_gcp_RpcProtocolVersions_Version* max_version =
+      grpc_gcp_RpcProtocolVersions_max_rpc_version(versions);
+  const grpc_gcp_RpcProtocolVersions_Version* min_version =
+      grpc_gcp_RpcProtocolVersions_min_rpc_version(versions);
+  GPR_ASSERT(grpc_gcp_RpcProtocolVersions_Version_major(max_version) ==
+             kMaxRpcVersionMajor);
+  GPR_ASSERT(grpc_gcp_RpcProtocolVersions_Version_minor(max_version) ==
+             kMaxRpcVersionMinor);
+  GPR_ASSERT(grpc_gcp_RpcProtocolVersions_Version_major(min_version) ==
+             kMinRpcVersionMajor);
+  GPR_ASSERT(grpc_gcp_RpcProtocolVersions_Version_minor(min_version) ==
+             kMinRpcVersionMinor);
 }
 
 static void validate_target_identities(
-    const repeated_field* target_identity_head) {
-  grpc_gcp_identity* target_identity1 = static_cast<grpc_gcp_identity*>(
-      const_cast<void*>(target_identity_head->next->data));
-  grpc_gcp_identity* target_identity2 = static_cast<grpc_gcp_identity*>(
-      const_cast<void*>(target_identity_head->data));
-  grpc_slice* service_account1 =
-      static_cast<grpc_slice*>(target_identity1->service_account.arg);
-  grpc_slice* service_account2 =
-      static_cast<grpc_slice*>(target_identity2->service_account.arg);
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*service_account1),
-                    ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT1,
-                    GRPC_SLICE_LENGTH(*service_account1)) == 0);
-  GPR_ASSERT(strlen(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT1) ==
-             GRPC_SLICE_LENGTH(*service_account1));
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*service_account2),
-                    ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT2,
-                    GRPC_SLICE_LENGTH(*service_account2)) == 0);
-  GPR_ASSERT(strlen(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT2) ==
-             GRPC_SLICE_LENGTH(*service_account2));
+    const grpc_gcp_Identity* const* target_identities,
+    size_t target_identities_count) {
+  GPR_ASSERT(target_identities_count == 2);
+  const grpc_gcp_Identity* identity1 = target_identities[1];
+  const grpc_gcp_Identity* identity2 = target_identities[0];
+  GPR_ASSERT(upb_strview_eql(
+      grpc_gcp_Identity_service_account(identity1),
+      upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT1)));
+  GPR_ASSERT(upb_strview_eql(
+      grpc_gcp_Identity_service_account(identity2),
+      upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_SERVICE_ACCOUNT2)));
 }
 
 /**
@@ -117,14 +117,14 @@
   return ok;
 }
 
-static grpc_gcp_handshaker_req* deserialize_handshaker_req(
-    grpc_gcp_handshaker_req_type type, grpc_byte_buffer* buffer) {
+static grpc_gcp_HandshakerReq* deserialize_handshaker_req(
+    grpc_byte_buffer* buffer, upb_arena* arena) {
   GPR_ASSERT(buffer != nullptr);
-  grpc_gcp_handshaker_req* req = grpc_gcp_handshaker_decoded_req_create(type);
   grpc_byte_buffer_reader bbr;
   GPR_ASSERT(grpc_byte_buffer_reader_init(&bbr, buffer));
   grpc_slice slice = grpc_byte_buffer_reader_readall(&bbr);
-  GPR_ASSERT(grpc_gcp_handshaker_req_decode(slice, req));
+  grpc_gcp_HandshakerReq* req = grpc_gcp_handshaker_req_decode(slice, arena);
+  GPR_ASSERT(req != nullptr);
   grpc_slice_unref(slice);
   grpc_byte_buffer_reader_destroy(&bbr);
   return req;
@@ -150,40 +150,38 @@
                                                   const grpc_op* op,
                                                   size_t nops,
                                                   grpc_closure* closure) {
+  upb::Arena arena;
   alts_handshaker_client* client =
       static_cast<alts_handshaker_client*>(closure->cb_arg);
   GPR_ASSERT(alts_handshaker_client_get_closure_for_testing(client) == closure);
-  grpc_gcp_handshaker_req* req = deserialize_handshaker_req(
-      CLIENT_START_REQ,
-      alts_handshaker_client_get_send_buffer_for_testing(client));
-  GPR_ASSERT(req->client_start.handshake_security_protocol ==
-             grpc_gcp_HandshakeProtocol_ALTS);
-  const void* data = (static_cast<repeated_field*>(
-                          req->client_start.application_protocols.arg))
-                         ->data;
-  GPR_ASSERT(data != nullptr);
-  grpc_slice* application_protocol = (grpc_slice*)data;
-  data = (static_cast<repeated_field*>(req->client_start.record_protocols.arg))
-             ->data;
-  grpc_slice* record_protocol = (grpc_slice*)data;
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*application_protocol),
-                    ALTS_APPLICATION_PROTOCOL,
-                    GRPC_SLICE_LENGTH(*application_protocol)) == 0);
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*record_protocol),
-                    ALTS_RECORD_PROTOCOL,
-                    GRPC_SLICE_LENGTH(*record_protocol)) == 0);
-  validate_rpc_protocol_versions(&req->client_start.rpc_versions);
-  validate_target_identities(
-      static_cast<repeated_field*>(req->client_start.target_identities.arg));
-  grpc_slice* target_name =
-      static_cast<grpc_slice*>(req->client_start.target_name.arg);
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*target_name),
-                    ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME,
-                    GRPC_SLICE_LENGTH(*target_name)) == 0);
-  GPR_ASSERT(GRPC_SLICE_LENGTH(*target_name) ==
-             strlen(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME));
+  grpc_gcp_HandshakerReq* req = deserialize_handshaker_req(
+      alts_handshaker_client_get_send_buffer_for_testing(client), arena.ptr());
+  const grpc_gcp_StartClientHandshakeReq* client_start =
+      grpc_gcp_HandshakerReq_client_start(req);
+  GPR_ASSERT(grpc_gcp_StartClientHandshakeReq_handshake_security_protocol(
+                 client_start) == grpc_gcp_ALTS);
+  upb_strview const* application_protocols =
+      grpc_gcp_StartClientHandshakeReq_application_protocols(client_start,
+                                                             nullptr);
+  GPR_ASSERT(upb_strview_eql(application_protocols[0],
+                             upb_strview_makez(ALTS_APPLICATION_PROTOCOL)));
+  upb_strview const* record_protocols =
+      grpc_gcp_StartClientHandshakeReq_record_protocols(client_start, nullptr);
+  GPR_ASSERT(upb_strview_eql(record_protocols[0],
+                             upb_strview_makez(ALTS_RECORD_PROTOCOL)));
+  const grpc_gcp_RpcProtocolVersions* rpc_protocol_versions =
+      grpc_gcp_StartClientHandshakeReq_rpc_versions(client_start);
+  validate_rpc_protocol_versions(rpc_protocol_versions);
+  size_t target_identities_count;
+  const grpc_gcp_Identity* const* target_identities =
+      grpc_gcp_StartClientHandshakeReq_target_identities(
+          client_start, &target_identities_count);
+  validate_target_identities(target_identities, target_identities_count);
+  GPR_ASSERT(upb_strview_eql(
+      grpc_gcp_StartClientHandshakeReq_target_name(client_start),
+      upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_TARGET_NAME)));
+
   GPR_ASSERT(validate_op(client, op, nops, true /* is_start */));
-  grpc_gcp_handshaker_req_destroy(req);
   return GRPC_CALL_OK;
 }
 
@@ -197,34 +195,37 @@
                                                   const grpc_op* op,
                                                   size_t nops,
                                                   grpc_closure* closure) {
+  upb::Arena arena;
   alts_handshaker_client* client =
       static_cast<alts_handshaker_client*>(closure->cb_arg);
   GPR_ASSERT(alts_handshaker_client_get_closure_for_testing(client) == closure);
-  grpc_gcp_handshaker_req* req = deserialize_handshaker_req(
-      SERVER_START_REQ,
-      alts_handshaker_client_get_send_buffer_for_testing(client));
-  const void* data = (static_cast<repeated_field*>(
-                          req->server_start.application_protocols.arg))
-                         ->data;
-  GPR_ASSERT(data != nullptr);
-  grpc_slice* application_protocol = (grpc_slice*)data;
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*application_protocol),
-                    ALTS_APPLICATION_PROTOCOL,
-                    GRPC_SLICE_LENGTH(*application_protocol)) == 0);
-  GPR_ASSERT(req->server_start.handshake_parameters_count == 1);
-  GPR_ASSERT(req->server_start.handshake_parameters[0].key ==
-             grpc_gcp_HandshakeProtocol_ALTS);
-  data = (static_cast<repeated_field*>(req->server_start.handshake_parameters[0]
-                                           .value.record_protocols.arg))
-             ->data;
-  GPR_ASSERT(data != nullptr);
-  grpc_slice* record_protocol = (grpc_slice*)data;
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*record_protocol),
-                    ALTS_RECORD_PROTOCOL,
-                    GRPC_SLICE_LENGTH(*record_protocol)) == 0);
-  validate_rpc_protocol_versions(&req->server_start.rpc_versions);
+  grpc_gcp_HandshakerReq* req = deserialize_handshaker_req(
+      alts_handshaker_client_get_send_buffer_for_testing(client), arena.ptr());
+  const grpc_gcp_StartServerHandshakeReq* server_start =
+      grpc_gcp_HandshakerReq_server_start(req);
+  upb_strview const* application_protocols =
+      grpc_gcp_StartServerHandshakeReq_application_protocols(server_start,
+                                                             nullptr);
+  GPR_ASSERT(upb_strview_eql(application_protocols[0],
+                             upb_strview_makez(ALTS_APPLICATION_PROTOCOL)));
+  size_t handshake_parameters_count;
+  const grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry* const*
+      handshake_parameters =
+          grpc_gcp_StartServerHandshakeReq_handshake_parameters(
+              server_start, &handshake_parameters_count);
+  GPR_ASSERT(handshake_parameters_count == 1);
+  GPR_ASSERT(grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_key(
+                 handshake_parameters[0]) == grpc_gcp_ALTS);
+  const grpc_gcp_ServerHandshakeParameters* value =
+      grpc_gcp_StartServerHandshakeReq_HandshakeParametersEntry_value(
+          handshake_parameters[0]);
+  upb_strview const* record_protocols =
+      grpc_gcp_ServerHandshakeParameters_record_protocols(value, nullptr);
+  GPR_ASSERT(upb_strview_eql(record_protocols[0],
+                             upb_strview_makez(ALTS_RECORD_PROTOCOL)));
+  validate_rpc_protocol_versions(
+      grpc_gcp_StartServerHandshakeReq_rpc_versions(server_start));
   GPR_ASSERT(validate_op(client, op, nops, true /* is_start */));
-  grpc_gcp_handshaker_req_destroy(req);
   return GRPC_CALL_OK;
 }
 
@@ -235,20 +236,21 @@
  */
 static grpc_call_error check_next_success(grpc_call* call, const grpc_op* op,
                                           size_t nops, grpc_closure* closure) {
+  upb::Arena arena;
   alts_handshaker_client* client =
       static_cast<alts_handshaker_client*>(closure->cb_arg);
   GPR_ASSERT(alts_handshaker_client_get_closure_for_testing(client) == closure);
-  grpc_gcp_handshaker_req* req = deserialize_handshaker_req(
-      NEXT_REQ, alts_handshaker_client_get_send_buffer_for_testing(client));
-  grpc_slice* in_bytes = static_cast<grpc_slice*>(req->next.in_bytes.arg);
-  GPR_ASSERT(in_bytes != nullptr);
-  GPR_ASSERT(memcmp(GRPC_SLICE_START_PTR(*in_bytes),
-                    ALTS_HANDSHAKER_CLIENT_TEST_OUT_FRAME,
-                    GRPC_SLICE_LENGTH(*in_bytes)) == 0);
+  grpc_gcp_HandshakerReq* req = deserialize_handshaker_req(
+      alts_handshaker_client_get_send_buffer_for_testing(client), arena.ptr());
+  const grpc_gcp_NextHandshakeMessageReq* next =
+      grpc_gcp_HandshakerReq_next(req);
+  GPR_ASSERT(upb_strview_eql(
+      grpc_gcp_NextHandshakeMessageReq_in_bytes(next),
+      upb_strview_makez(ALTS_HANDSHAKER_CLIENT_TEST_OUT_FRAME)));
   GPR_ASSERT(validate_op(client, op, nops, false /* is_start */));
-  grpc_gcp_handshaker_req_destroy(req);
   return GRPC_CALL_OK;
 }
+
 /**
  * A mock grpc_caller used to check if client_start, server_start, and next
  * operations correctly handle the situation when the grpc call made to the
diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc b/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc
deleted file mode 100644
index 3506264..0000000
--- a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- *
- * Copyright 2018 gRPC authors.
- *
- * 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.
- *
- */
-
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h"
-
-int main(int argc, char** argv) {
-  const char in_bytes[] = "HELLO GOOGLE!";
-  const char out_frames[] = "HELLO WORLD!";
-  const char key_data[] = "THIS IS KEY DATA.";
-  const char details[] = "DETAILS NEED TO BE POPULATED";
-  const uint32_t max_rpc_version_major = 3;
-  const uint32_t max_rpc_version_minor = 2;
-  const uint32_t min_rpc_version_major = 2;
-  const uint32_t min_rpc_version_minor = 1;
-
-  /* handshaker_req_next. */
-  grpc_gcp_handshaker_req* req = grpc_gcp_handshaker_req_create(NEXT_REQ);
-  grpc_gcp_handshaker_req* decoded_req =
-      grpc_gcp_handshaker_decoded_req_create(NEXT_REQ);
-  GPR_ASSERT(
-      grpc_gcp_handshaker_req_set_in_bytes(req, in_bytes, strlen(in_bytes)));
-  grpc_slice encoded_req;
-  GPR_ASSERT(grpc_gcp_handshaker_req_encode(req, &encoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_decode(encoded_req, decoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_equals(req, decoded_req));
-  grpc_gcp_handshaker_req_destroy(req);
-  grpc_gcp_handshaker_req_destroy(decoded_req);
-  grpc_slice_unref(encoded_req);
-
-  /* handshaker_req_client_start. */
-  req = grpc_gcp_handshaker_req_create(CLIENT_START_REQ);
-  decoded_req = grpc_gcp_handshaker_decoded_req_create(CLIENT_START_REQ);
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_handshake_protocol(
-      req, grpc_gcp_HandshakeProtocol_TLS));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_local_identity_hostname(
-      req, "www.google.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_local_endpoint(
-      req, "2001:db8::8:800:200C:417a", 9876, grpc_gcp_NetworkProtocol_TCP));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_remote_endpoint(
-      req, "2001:db8::bac5::fed0:84a2", 1234, grpc_gcp_NetworkProtocol_TCP));
-  GPR_ASSERT(grpc_gcp_handshaker_req_add_application_protocol(req, "grpc"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_add_application_protocol(req, "http2"));
-  GPR_ASSERT(
-      grpc_gcp_handshaker_req_add_record_protocol(req, "ALTSRP_GCM_AES256"));
-  GPR_ASSERT(
-      grpc_gcp_handshaker_req_add_record_protocol(req, "ALTSRP_GCM_AES384"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_add_target_identity_service_account(
-      req, "foo@google.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_target_name(
-      req, "google.example.library.service"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_rpc_versions(
-      req, max_rpc_version_major, max_rpc_version_minor, min_rpc_version_major,
-      min_rpc_version_minor));
-  GPR_ASSERT(grpc_gcp_handshaker_req_encode(req, &encoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_decode(encoded_req, decoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_equals(req, decoded_req));
-  grpc_gcp_handshaker_req_destroy(req);
-  grpc_gcp_handshaker_req_destroy(decoded_req);
-  grpc_slice_unref(encoded_req);
-
-  /* handshaker_req_server_start. */
-  req = grpc_gcp_handshaker_req_create(SERVER_START_REQ);
-  decoded_req = grpc_gcp_handshaker_decoded_req_create(SERVER_START_REQ);
-  GPR_ASSERT(grpc_gcp_handshaker_req_add_application_protocol(req, "grpc"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_add_application_protocol(req, "http2"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_local_endpoint(
-      req, "2001:db8::8:800:200C:417a", 9876, grpc_gcp_NetworkProtocol_TCP));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_remote_endpoint(
-      req, "2001:db8::bac5::fed0:84a2", 1234, grpc_gcp_NetworkProtocol_UDP));
-  GPR_ASSERT(
-      grpc_gcp_handshaker_req_set_in_bytes(req, in_bytes, strlen(in_bytes)));
-  GPR_ASSERT(grpc_gcp_handshaker_req_param_add_record_protocol(
-      req, grpc_gcp_HandshakeProtocol_TLS, "ALTSRP_GCM_AES128"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_param_add_local_identity_service_account(
-      req, grpc_gcp_HandshakeProtocol_TLS, "foo@google.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_param_add_local_identity_hostname(
-      req, grpc_gcp_HandshakeProtocol_TLS, "yihuaz0.mtv.corp.google.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_param_add_record_protocol(
-      req, grpc_gcp_HandshakeProtocol_ALTS, "ALTSRP_GCM_AES128"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_param_add_local_identity_hostname(
-      req, grpc_gcp_HandshakeProtocol_ALTS, "www.amazon.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_req_set_rpc_versions(
-      req, max_rpc_version_major, max_rpc_version_minor, min_rpc_version_major,
-      min_rpc_version_minor));
-
-  GPR_ASSERT(grpc_gcp_handshaker_req_encode(req, &encoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_decode(encoded_req, decoded_req));
-  GPR_ASSERT(grpc_gcp_handshaker_req_equals(req, decoded_req));
-  grpc_gcp_handshaker_req_destroy(req);
-  grpc_gcp_handshaker_req_destroy(decoded_req);
-  grpc_slice_unref(encoded_req);
-
-  /* handshaker_resp. */
-  grpc_gcp_handshaker_resp* resp = grpc_gcp_handshaker_resp_create();
-  grpc_gcp_handshaker_resp* decoded_resp = grpc_gcp_handshaker_resp_create();
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_out_frames(resp, out_frames,
-                                                     strlen(out_frames)));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_bytes_consumed(resp, 1024));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_application_protocol(resp, "http"));
-  GPR_ASSERT(
-      grpc_gcp_handshaker_resp_set_record_protocol(resp, "ALTSRP_GCM_AES128"));
-  GPR_ASSERT(
-      grpc_gcp_handshaker_resp_set_key_data(resp, key_data, strlen(key_data)));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_local_identity_hostname(
-      resp, "www.faceboook.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_identity_hostname(
-      resp, "www.amazon.com"));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_channel_open(
-      resp, false /* channel_open */));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_code(resp, 1023));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_details(resp, details));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_rpc_versions(
-      resp, max_rpc_version_major, max_rpc_version_minor, min_rpc_version_major,
-      min_rpc_version_minor));
-  grpc_slice encoded_resp;
-  GPR_ASSERT(grpc_gcp_handshaker_resp_encode(resp, &encoded_resp));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_decode(encoded_resp, decoded_resp));
-  GPR_ASSERT(grpc_gcp_handshaker_resp_equals(resp, decoded_resp));
-  grpc_gcp_handshaker_resp_destroy(resp);
-  grpc_gcp_handshaker_resp_destroy(decoded_resp);
-  grpc_slice_unref(encoded_resp);
-  /* Test invalid arguments. */
-  GPR_ASSERT(!grpc_gcp_handshaker_req_set_in_bytes(nullptr, in_bytes,
-                                                   strlen(in_bytes)));
-  GPR_ASSERT(!grpc_gcp_handshaker_req_param_add_record_protocol(
-      req, grpc_gcp_HandshakeProtocol_TLS, nullptr));
-  GPR_ASSERT(!grpc_gcp_handshaker_req_param_add_local_identity_service_account(
-      nullptr, grpc_gcp_HandshakeProtocol_TLS, nullptr));
-  GPR_ASSERT(!grpc_gcp_handshaker_resp_set_record_protocol(nullptr, nullptr));
-}
diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc b/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc
index ecca04d..2ab73a2 100644
--- a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc
+++ b/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.cc
@@ -18,625 +18,146 @@
 
 #include "test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h"
 
-const size_t kHandshakeProtocolNum = 3;
-
-grpc_gcp_handshaker_req* grpc_gcp_handshaker_decoded_req_create(
-    grpc_gcp_handshaker_req_type type) {
-  grpc_gcp_handshaker_req* req =
-      static_cast<grpc_gcp_handshaker_req*>(gpr_zalloc(sizeof(*req)));
-  switch (type) {
-    case CLIENT_START_REQ:
-      req->has_client_start = true;
-      req->client_start.target_identities.funcs.decode =
-          decode_repeated_identity_cb;
-      req->client_start.application_protocols.funcs.decode =
-          decode_repeated_string_cb;
-      req->client_start.record_protocols.funcs.decode =
-          decode_repeated_string_cb;
-      req->client_start.local_identity.hostname.funcs.decode =
-          decode_string_or_bytes_cb;
-      req->client_start.local_identity.service_account.funcs.decode =
-          decode_string_or_bytes_cb;
-      req->client_start.local_endpoint.ip_address.funcs.decode =
-          decode_string_or_bytes_cb;
-      req->client_start.remote_endpoint.ip_address.funcs.decode =
-          decode_string_or_bytes_cb;
-      req->client_start.target_name.funcs.decode = decode_string_or_bytes_cb;
-      break;
-    case SERVER_START_REQ:
-      req->has_server_start = true;
-      req->server_start.application_protocols.funcs.decode =
-          &decode_repeated_string_cb;
-      for (size_t i = 0; i < kHandshakeProtocolNum; i++) {
-        req->server_start.handshake_parameters[i]
-            .value.local_identities.funcs.decode = &decode_repeated_identity_cb;
-        req->server_start.handshake_parameters[i]
-            .value.record_protocols.funcs.decode = &decode_repeated_string_cb;
-      }
-      req->server_start.in_bytes.funcs.decode = decode_string_or_bytes_cb;
-      req->server_start.local_endpoint.ip_address.funcs.decode =
-          decode_string_or_bytes_cb;
-      req->server_start.remote_endpoint.ip_address.funcs.decode =
-          decode_string_or_bytes_cb;
-      break;
-    case NEXT_REQ:
-      req->has_next = true;
-      break;
-  }
-  return req;
-}
-
-bool grpc_gcp_handshaker_resp_set_application_protocol(
-    grpc_gcp_handshaker_resp* resp, const char* application_protocol) {
-  if (resp == nullptr || application_protocol == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "handshaker_resp_set_application_protocol().");
-    return false;
-  }
-  resp->has_result = true;
-  grpc_slice* slice =
-      create_slice(application_protocol, strlen(application_protocol));
-  resp->result.application_protocol.arg = slice;
-  resp->result.application_protocol.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_record_protocol(
-    grpc_gcp_handshaker_resp* resp, const char* record_protocol) {
-  if (resp == nullptr || record_protocol == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "handshaker_resp_set_record_protocol().");
-    return false;
-  }
-  resp->has_result = true;
-  grpc_slice* slice = create_slice(record_protocol, strlen(record_protocol));
-  resp->result.record_protocol.arg = slice;
-  resp->result.record_protocol.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_key_data(grpc_gcp_handshaker_resp* resp,
-                                           const char* key_data, size_t size) {
-  if (resp == nullptr || key_data == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to handshaker_resp_set_key_data().");
-    return false;
-  }
-  resp->has_result = true;
-  grpc_slice* slice = create_slice(key_data, size);
-  resp->result.key_data.arg = slice;
-  resp->result.key_data.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-static void set_identity_hostname(grpc_gcp_identity* identity,
-                                  const char* hostname) {
-  grpc_slice* slice = create_slice(hostname, strlen(hostname));
-  identity->hostname.arg = slice;
-  identity->hostname.funcs.encode = encode_string_or_bytes_cb;
-}
-
-static void set_identity_service_account(grpc_gcp_identity* identity,
-                                         const char* service_account) {
-  grpc_slice* slice = create_slice(service_account, strlen(service_account));
-  identity->service_account.arg = slice;
-  identity->service_account.funcs.encode = encode_string_or_bytes_cb;
-}
-
-bool grpc_gcp_handshaker_resp_set_local_identity_hostname(
-    grpc_gcp_handshaker_resp* resp, const char* hostname) {
-  if (resp == nullptr || hostname == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_resp_set_local_identity_hostname().");
-    return false;
-  }
-  resp->has_result = true;
-  resp->result.has_local_identity = true;
-  set_identity_hostname(&resp->result.local_identity, hostname);
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_local_identity_service_account(
-    grpc_gcp_handshaker_resp* resp, const char* service_account) {
-  if (resp == nullptr || service_account == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_resp_set_local_identity_service_account().");
-    return false;
-  }
-  resp->has_result = true;
-  resp->result.has_local_identity = true;
-  set_identity_service_account(&resp->result.local_identity, service_account);
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_peer_identity_hostname(
-    grpc_gcp_handshaker_resp* resp, const char* hostname) {
-  if (resp == nullptr || hostname == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_resp_set_peer_identity_hostname().");
-    return false;
-  }
-  resp->has_result = true;
-  resp->result.has_peer_identity = true;
-  set_identity_hostname(&resp->result.peer_identity, hostname);
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_peer_identity_service_account(
-    grpc_gcp_handshaker_resp* resp, const char* service_account) {
-  if (resp == nullptr || service_account == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_resp_set_peer_identity_service_account().");
-    return false;
-  }
-  resp->has_result = true;
-  resp->result.has_peer_identity = true;
-  set_identity_service_account(&resp->result.peer_identity, service_account);
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_channel_open(grpc_gcp_handshaker_resp* resp,
-                                               bool keep_channel_open) {
-  if (resp == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr argument to "
-            "grpc_gcp_handshaker_resp_set_channel_open().");
-    return false;
-  }
-  resp->has_result = true;
-  resp->result.has_keep_channel_open = true;
-  resp->result.keep_channel_open = keep_channel_open;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_code(grpc_gcp_handshaker_resp* resp,
-                                       uint32_t code) {
-  if (resp == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr argument to grpc_gcp_handshaker_resp_set_code().");
-    return false;
-  }
-  resp->has_status = true;
-  resp->status.has_code = true;
-  resp->status.code = code;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_details(grpc_gcp_handshaker_resp* resp,
-                                          const char* details) {
-  if (resp == nullptr || details == nullptr) {
-    gpr_log(
-        GPR_ERROR,
-        "Invalid nullptr arguments to grpc_gcp_handshaker_resp_set_details().");
-    return false;
-  }
-  resp->has_status = true;
-  grpc_slice* slice = create_slice(details, strlen(details));
-  resp->status.details.arg = slice;
-  resp->status.details.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_out_frames(grpc_gcp_handshaker_resp* resp,
-                                             const char* out_frames,
-                                             size_t size) {
-  if (resp == nullptr || out_frames == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to "
-            "grpc_gcp_handshaker_resp_set_out_frames().");
-    return false;
-  }
-  grpc_slice* slice = create_slice(out_frames, size);
-  resp->out_frames.arg = slice;
-  resp->out_frames.funcs.encode = encode_string_or_bytes_cb;
-  return true;
-}
-
-bool grpc_gcp_handshaker_resp_set_bytes_consumed(grpc_gcp_handshaker_resp* resp,
-                                                 int32_t bytes_consumed) {
-  if (resp == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr argument to "
-            "grpc_gcp_handshaker_resp_set_bytes_consumed().");
-    return false;
-  }
-  resp->has_bytes_consumed = true;
-  resp->bytes_consumed = bytes_consumed;
-  return true;
-}
-
 bool grpc_gcp_handshaker_resp_set_peer_rpc_versions(
-    grpc_gcp_handshaker_resp* resp, uint32_t max_major, uint32_t max_minor,
-    uint32_t min_major, uint32_t min_minor) {
+    grpc_gcp_HandshakerResp* resp, upb_arena* arena, uint32_t max_major,
+    uint32_t max_minor, uint32_t min_major, uint32_t min_minor) {
   if (resp == nullptr) {
     gpr_log(GPR_ERROR,
             "Invalid nullptr argument to "
             "grpc_gcp_handshaker_resp_set_peer_rpc_versions().");
     return false;
   }
-  resp->has_result = true;
-  resp->result.has_peer_rpc_versions = true;
-  grpc_gcp_rpc_protocol_versions* versions = &resp->result.peer_rpc_versions;
-  versions->has_max_rpc_version = true;
-  versions->has_min_rpc_version = true;
-  versions->max_rpc_version.has_major = true;
-  versions->max_rpc_version.has_minor = true;
-  versions->min_rpc_version.has_major = true;
-  versions->min_rpc_version.has_minor = true;
-  versions->max_rpc_version.major = max_major;
-  versions->max_rpc_version.minor = max_minor;
-  versions->min_rpc_version.major = min_major;
-  versions->min_rpc_version.minor = min_minor;
+  grpc_gcp_rpc_protocol_versions versions;
+  versions.max_rpc_version.major = max_major;
+  versions.max_rpc_version.minor = max_minor;
+  versions.min_rpc_version.major = min_major;
+  versions.min_rpc_version.minor = min_minor;
+  grpc_gcp_HandshakerResult* result =
+      grpc_gcp_HandshakerResp_mutable_result(resp, arena);
+  grpc_gcp_RpcProtocolVersions* upb_versions =
+      grpc_gcp_HandshakerResult_mutable_peer_rpc_versions(result, arena);
+  grpc_gcp_RpcProtocolVersions_assign_from_struct(upb_versions, arena,
+                                                  &versions);
   return true;
 }
 
-bool grpc_gcp_handshaker_resp_encode(grpc_gcp_handshaker_resp* resp,
-                                     grpc_slice* slice) {
-  if (resp == nullptr || slice == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr arguments to grpc_gcp_handshaker_resp_encode().");
-    return false;
+grpc_gcp_HandshakerReq* grpc_gcp_handshaker_req_decode(grpc_slice slice,
+                                                       upb_arena* arena) {
+  size_t buf_size = GPR_SLICE_LENGTH(slice);
+  void* buf = upb_arena_malloc(arena, buf_size);
+  memcpy(buf, reinterpret_cast<const char*>(GPR_SLICE_START_PTR(slice)),
+         buf_size);
+  grpc_gcp_HandshakerReq* resp = grpc_gcp_HandshakerReq_parse(
+      reinterpret_cast<char*>(buf), buf_size, arena);
+  if (!resp) {
+    gpr_log(GPR_ERROR, "grpc_gcp_HandshakerReq decode error");
+    return nullptr;
   }
-  pb_ostream_t size_stream;
-  memset(&size_stream, 0, sizeof(pb_ostream_t));
-  if (!pb_encode(&size_stream, grpc_gcp_HandshakerResp_fields, resp)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&size_stream));
-    return false;
-  }
-  size_t encoded_length = size_stream.bytes_written;
-  *slice = grpc_slice_malloc(encoded_length);
-  pb_ostream_t output_stream =
-      pb_ostream_from_buffer(GRPC_SLICE_START_PTR(*slice), encoded_length);
-  if (!pb_encode(&output_stream, grpc_gcp_HandshakerResp_fields, resp)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&size_stream));
-    return false;
-  }
-  return true;
-}
-
-bool grpc_gcp_handshaker_req_decode(grpc_slice slice,
-                                    grpc_gcp_handshaker_req* req) {
-  if (req == nullptr) {
-    gpr_log(GPR_ERROR,
-            "Invalid nullptr argument to grpc_gcp_handshaker_req_decode().");
-    return false;
-  }
-  pb_istream_t stream = pb_istream_from_buffer(GRPC_SLICE_START_PTR(slice),
-                                               GRPC_SLICE_LENGTH(slice));
-  req->next.in_bytes.funcs.decode = decode_string_or_bytes_cb;
-  if (!pb_decode(&stream, grpc_gcp_HandshakerReq_fields, req)) {
-    gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
-    return false;
-  }
-  return true;
-}
-
-/* Check equality of a pair of grpc_slice fields. */
-static bool slice_equals(grpc_slice* l_slice, grpc_slice* r_slice) {
-  if (l_slice == nullptr && r_slice == nullptr) {
-    return true;
-  }
-  if (l_slice != nullptr && r_slice != nullptr) {
-    return grpc_slice_eq(*l_slice, *r_slice);
-  }
-  return false;
+  return resp;
 }
 
 /* Check equality of a pair of grpc_gcp_identity fields. */
-static bool handshaker_identity_equals(const grpc_gcp_identity* l_id,
-                                       const grpc_gcp_identity* r_id) {
-  if (!((l_id->hostname.arg != nullptr) != (r_id->hostname.arg != nullptr))) {
-    if (l_id->hostname.arg != nullptr) {
-      return slice_equals(static_cast<grpc_slice*>(l_id->hostname.arg),
-                          static_cast<grpc_slice*>(r_id->hostname.arg));
-    }
-  } else {
+static bool handshaker_identity_equals(const grpc_gcp_Identity* l_id,
+                                       const grpc_gcp_Identity* r_id) {
+  if ((grpc_gcp_Identity_has_service_account(l_id) !=
+       grpc_gcp_Identity_has_service_account(r_id)) ||
+      (grpc_gcp_Identity_has_hostname(l_id) !=
+       grpc_gcp_Identity_has_hostname(r_id))) {
     return false;
   }
-  if (!((l_id->service_account.arg != nullptr) !=
-        (r_id->service_account.arg != nullptr))) {
-    if (l_id->service_account.arg != nullptr) {
-      return slice_equals(static_cast<grpc_slice*>(l_id->service_account.arg),
-                          static_cast<grpc_slice*>(r_id->service_account.arg));
+
+  if (grpc_gcp_Identity_has_service_account(l_id)) {
+    if (!upb_strview_eql(grpc_gcp_Identity_service_account(l_id),
+                         grpc_gcp_Identity_service_account(r_id))) {
+      return false;
     }
-  } else {
-    return false;
+  } else if (grpc_gcp_Identity_has_hostname(l_id)) {
+    if (!upb_strview_eql(grpc_gcp_Identity_hostname(l_id),
+                         grpc_gcp_Identity_hostname(r_id))) {
+      return false;
+    }
   }
   return true;
 }
 
 static bool handshaker_rpc_versions_equals(
-    const grpc_gcp_rpc_protocol_versions* l_version,
-    const grpc_gcp_rpc_protocol_versions* r_version) {
-  bool result = true;
-  result &=
-      (l_version->max_rpc_version.major == r_version->max_rpc_version.major);
-  result &=
-      (l_version->max_rpc_version.minor == r_version->max_rpc_version.minor);
-  result &=
-      (l_version->min_rpc_version.major == r_version->min_rpc_version.major);
-  result &=
-      (l_version->min_rpc_version.minor == r_version->min_rpc_version.minor);
-  return result;
-}
-
-/* Check equality of a pair of grpc_gcp_endpoint fields. */
-static bool handshaker_endpoint_equals(const grpc_gcp_endpoint* l_end,
-                                       const grpc_gcp_endpoint* r_end) {
-  bool result = true;
-  result &= (l_end->port == r_end->port);
-  result &= (l_end->protocol == r_end->protocol);
-  if (!((l_end->ip_address.arg != nullptr) !=
-        (r_end->ip_address.arg != nullptr))) {
-    if (l_end->ip_address.arg != nullptr) {
-      result &= slice_equals(static_cast<grpc_slice*>(l_end->ip_address.arg),
-                             static_cast<grpc_slice*>(r_end->ip_address.arg));
-    }
-  } else {
-    return false;
-  }
-  return result;
-}
-/**
- * Check if a specific repeated field (i.e., target) is contained in a repeated
- * field list (i.e., head).
- */
-static bool repeated_field_list_contains_identity(
-    const repeated_field* head, const repeated_field* target) {
-  repeated_field* field = const_cast<repeated_field*>(head);
-  while (field != nullptr) {
-    if (handshaker_identity_equals(
-            static_cast<const grpc_gcp_identity*>(field->data),
-            static_cast<const grpc_gcp_identity*>(target->data))) {
-      return true;
-    }
-    field = field->next;
-  }
-  return false;
-}
-
-static bool repeated_field_list_contains_string(const repeated_field* head,
-                                                const repeated_field* target) {
-  repeated_field* field = const_cast<repeated_field*>(head);
-  while (field != nullptr) {
-    if (slice_equals((grpc_slice*)field->data, (grpc_slice*)target->data)) {
-      return true;
-    }
-    field = field->next;
-  }
-  return false;
-}
-
-/* Return a length of repeated field list. */
-static size_t repeated_field_list_get_length(const repeated_field* head) {
-  repeated_field* field = const_cast<repeated_field*>(head);
-  size_t len = 0;
-  while (field != nullptr) {
-    len++;
-    field = field->next;
-  }
-  return len;
-}
-
-/**
- * Check if a pair of repeated field lists contain the same set of repeated
- * fields.
- */
-static bool repeated_field_list_equals_identity(const repeated_field* l_head,
-                                                const repeated_field* r_head) {
-  if (repeated_field_list_get_length(l_head) !=
-      repeated_field_list_get_length(r_head)) {
-    return false;
-  }
-  repeated_field* field = const_cast<repeated_field*>(l_head);
-  repeated_field* head = const_cast<repeated_field*>(r_head);
-  while (field != nullptr) {
-    if (!repeated_field_list_contains_identity(head, field)) {
-      return false;
-    }
-    field = field->next;
-  }
-  return true;
-}
-
-static bool repeated_field_list_equals_string(const repeated_field* l_head,
-                                              const repeated_field* r_head) {
-  if (repeated_field_list_get_length(l_head) !=
-      repeated_field_list_get_length(r_head)) {
-    return false;
-  }
-  repeated_field* field = const_cast<repeated_field*>(l_head);
-  repeated_field* head = const_cast<repeated_field*>(r_head);
-  while (field != nullptr) {
-    if (!repeated_field_list_contains_string(head, field)) {
-      return false;
-    }
-    field = field->next;
-  }
-  return true;
-}
-
-/* Check equality of a pair of ALTS client_start handshake requests. */
-bool grpc_gcp_handshaker_client_start_req_equals(
-    grpc_gcp_start_client_handshake_req* l_req,
-    grpc_gcp_start_client_handshake_req* r_req) {
-  bool result = true;
-  /* Compare handshake_security_protocol. */
-  result &=
-      l_req->handshake_security_protocol == r_req->handshake_security_protocol;
-  /* Compare application_protocols, record_protocols, and target_identities. */
-  result &= repeated_field_list_equals_string(
-      static_cast<const repeated_field*>(l_req->application_protocols.arg),
-      static_cast<const repeated_field*>(r_req->application_protocols.arg));
-  result &= repeated_field_list_equals_string(
-      static_cast<const repeated_field*>(l_req->record_protocols.arg),
-      static_cast<const repeated_field*>(r_req->record_protocols.arg));
-  result &= repeated_field_list_equals_identity(
-      static_cast<const repeated_field*>(l_req->target_identities.arg),
-      static_cast<const repeated_field*>(r_req->target_identities.arg));
-  if ((l_req->has_local_identity ^ r_req->has_local_identity) |
-      (l_req->has_local_endpoint ^ r_req->has_local_endpoint) |
-      ((l_req->has_remote_endpoint ^ r_req->has_remote_endpoint)) |
-      (l_req->has_rpc_versions ^ r_req->has_rpc_versions)) {
-    return false;
-  }
-  /* Compare local_identity, local_endpoint, and remote_endpoint. */
-  if (l_req->has_local_identity) {
-    result &= handshaker_identity_equals(&l_req->local_identity,
-                                         &r_req->local_identity);
-  }
-  if (l_req->has_local_endpoint) {
-    result &= handshaker_endpoint_equals(&l_req->local_endpoint,
-                                         &r_req->local_endpoint);
-  }
-  if (l_req->has_remote_endpoint) {
-    result &= handshaker_endpoint_equals(&l_req->remote_endpoint,
-                                         &r_req->remote_endpoint);
-  }
-  if (l_req->has_rpc_versions) {
-    result &= handshaker_rpc_versions_equals(&l_req->rpc_versions,
-                                             &r_req->rpc_versions);
-  }
-  return result;
-}
-
-/* Check equality of a pair of ALTS server_start handshake requests. */
-bool grpc_gcp_handshaker_server_start_req_equals(
-    grpc_gcp_start_server_handshake_req* l_req,
-    grpc_gcp_start_server_handshake_req* r_req) {
-  bool result = true;
-  /* Compare application_protocols. */
-  result &= repeated_field_list_equals_string(
-      static_cast<const repeated_field*>(l_req->application_protocols.arg),
-      static_cast<const repeated_field*>(r_req->application_protocols.arg));
-  /* Compare handshake_parameters. */
-  size_t i = 0, j = 0;
-  result &=
-      (l_req->handshake_parameters_count == r_req->handshake_parameters_count);
-  for (i = 0; i < l_req->handshake_parameters_count; i++) {
-    bool found = false;
-    for (j = 0; j < r_req->handshake_parameters_count; j++) {
-      if (l_req->handshake_parameters[i].key ==
-          r_req->handshake_parameters[j].key) {
-        found = true;
-        result &= repeated_field_list_equals_string(
-            static_cast<const repeated_field*>(
-                l_req->handshake_parameters[i].value.record_protocols.arg),
-            static_cast<const repeated_field*>(
-                r_req->handshake_parameters[j].value.record_protocols.arg));
-        result &= repeated_field_list_equals_identity(
-            static_cast<const repeated_field*>(
-                l_req->handshake_parameters[i].value.local_identities.arg),
-            static_cast<const repeated_field*>(
-                r_req->handshake_parameters[j].value.local_identities.arg));
-      }
-    }
-    if (!found) {
-      return false;
-    }
-  }
-  /* Compare in_bytes, local_endpoint, remote_endpoint. */
-  result &= slice_equals(static_cast<grpc_slice*>(l_req->in_bytes.arg),
-                         static_cast<grpc_slice*>(r_req->in_bytes.arg));
-  if ((l_req->has_local_endpoint ^ r_req->has_local_endpoint) |
-      (l_req->has_remote_endpoint ^ r_req->has_remote_endpoint) |
-      (l_req->has_rpc_versions ^ r_req->has_rpc_versions))
-    return false;
-  if (l_req->has_local_endpoint) {
-    result &= handshaker_endpoint_equals(&l_req->local_endpoint,
-                                         &r_req->local_endpoint);
-  }
-  if (l_req->has_remote_endpoint) {
-    result &= handshaker_endpoint_equals(&l_req->remote_endpoint,
-                                         &r_req->remote_endpoint);
-  }
-  if (l_req->has_rpc_versions) {
-    result &= handshaker_rpc_versions_equals(&l_req->rpc_versions,
-                                             &r_req->rpc_versions);
-  }
-  return result;
-}
-
-/* Check equality of a pair of ALTS handshake requests. */
-bool grpc_gcp_handshaker_req_equals(grpc_gcp_handshaker_req* l_req,
-                                    grpc_gcp_handshaker_req* r_req) {
-  if (l_req->has_next && r_req->has_next) {
-    return slice_equals(static_cast<grpc_slice*>(l_req->next.in_bytes.arg),
-                        static_cast<grpc_slice*>(r_req->next.in_bytes.arg));
-  } else if (l_req->has_client_start && r_req->has_client_start) {
-    return grpc_gcp_handshaker_client_start_req_equals(&l_req->client_start,
-                                                       &r_req->client_start);
-  } else if (l_req->has_server_start && r_req->has_server_start) {
-    return grpc_gcp_handshaker_server_start_req_equals(&l_req->server_start,
-                                                       &r_req->server_start);
-  }
-  return false;
-}
-
-/* Check equality of a pair of ALTS handshake results. */
-bool grpc_gcp_handshaker_resp_result_equals(
-    grpc_gcp_handshaker_result* l_result,
-    grpc_gcp_handshaker_result* r_result) {
-  bool result = true;
-  /* Compare application_protocol, record_protocol, and key_data. */
-  result &= slice_equals(
-      static_cast<grpc_slice*>(l_result->application_protocol.arg),
-      static_cast<grpc_slice*>(r_result->application_protocol.arg));
-  result &=
-      slice_equals(static_cast<grpc_slice*>(l_result->record_protocol.arg),
-                   static_cast<grpc_slice*>(r_result->record_protocol.arg));
-  result &= slice_equals(static_cast<grpc_slice*>(l_result->key_data.arg),
-                         static_cast<grpc_slice*>(r_result->key_data.arg));
-  /* Compare local_identity, peer_identity, and keep_channel_open. */
-  if ((l_result->has_local_identity ^ r_result->has_local_identity) |
-      (l_result->has_peer_identity ^ r_result->has_peer_identity) |
-      (l_result->has_peer_rpc_versions ^ r_result->has_peer_rpc_versions)) {
-    return false;
-  }
-  if (l_result->has_local_identity) {
-    result &= handshaker_identity_equals(&l_result->local_identity,
-                                         &r_result->local_identity);
-  }
-  if (l_result->has_peer_identity) {
-    result &= handshaker_identity_equals(&l_result->peer_identity,
-                                         &r_result->peer_identity);
-  }
-  if (l_result->has_peer_rpc_versions) {
-    result &= handshaker_rpc_versions_equals(&l_result->peer_rpc_versions,
-                                             &r_result->peer_rpc_versions);
-  }
-  result &= (l_result->keep_channel_open == r_result->keep_channel_open);
-  return result;
+    const grpc_gcp_RpcProtocolVersions* l_version,
+    const grpc_gcp_RpcProtocolVersions* r_version) {
+  const grpc_gcp_RpcProtocolVersions_Version* l_maxver =
+      grpc_gcp_RpcProtocolVersions_max_rpc_version(l_version);
+  const grpc_gcp_RpcProtocolVersions_Version* r_maxver =
+      grpc_gcp_RpcProtocolVersions_max_rpc_version(r_version);
+  const grpc_gcp_RpcProtocolVersions_Version* l_minver =
+      grpc_gcp_RpcProtocolVersions_min_rpc_version(l_version);
+  const grpc_gcp_RpcProtocolVersions_Version* r_minver =
+      grpc_gcp_RpcProtocolVersions_min_rpc_version(r_version);
+  return (grpc_gcp_RpcProtocolVersions_Version_major(l_maxver) ==
+          grpc_gcp_RpcProtocolVersions_Version_major(r_maxver)) &&
+         (grpc_gcp_RpcProtocolVersions_Version_minor(l_maxver) ==
+          grpc_gcp_RpcProtocolVersions_Version_minor(r_maxver)) &&
+         (grpc_gcp_RpcProtocolVersions_Version_major(l_minver) ==
+          grpc_gcp_RpcProtocolVersions_Version_major(r_minver)) &&
+         (grpc_gcp_RpcProtocolVersions_Version_minor(l_minver) ==
+          grpc_gcp_RpcProtocolVersions_Version_minor(r_minver));
 }
 
 /* Check equality of a pair of ALTS handshake responses. */
-bool grpc_gcp_handshaker_resp_equals(grpc_gcp_handshaker_resp* l_resp,
-                                     grpc_gcp_handshaker_resp* r_resp) {
-  bool result = true;
-  /* Compare out_frames and bytes_consumed. */
-  result &= slice_equals(static_cast<grpc_slice*>(l_resp->out_frames.arg),
-                         static_cast<grpc_slice*>(r_resp->out_frames.arg));
-  result &= (l_resp->bytes_consumed == r_resp->bytes_consumed);
-  /* Compare result and status. */
-  if ((l_resp->has_result ^ r_resp->has_result) |
-      (l_resp->has_status ^ r_resp->has_status)) {
+bool grpc_gcp_handshaker_resp_equals(const grpc_gcp_HandshakerResp* l_resp,
+                                     const grpc_gcp_HandshakerResp* r_resp) {
+  return upb_strview_eql(grpc_gcp_HandshakerResp_out_frames(l_resp),
+                         grpc_gcp_HandshakerResp_out_frames(r_resp)) &&
+         (grpc_gcp_HandshakerResp_bytes_consumed(l_resp) ==
+          grpc_gcp_HandshakerResp_bytes_consumed(l_resp)) &&
+         grpc_gcp_handshaker_resp_result_equals(
+             grpc_gcp_HandshakerResp_result(l_resp),
+             grpc_gcp_HandshakerResp_result(r_resp)) &&
+         grpc_gcp_handshaker_resp_status_equals(
+             grpc_gcp_HandshakerResp_status(l_resp),
+             grpc_gcp_HandshakerResp_status(r_resp));
+}
+
+/* This method checks equality of two handshaker response results. */
+bool grpc_gcp_handshaker_resp_result_equals(
+    const grpc_gcp_HandshakerResult* l_result,
+    const grpc_gcp_HandshakerResult* r_result) {
+  if (l_result == nullptr && r_result == nullptr) {
+    return true;
+  } else if ((l_result != nullptr && r_result == nullptr) ||
+             (l_result == nullptr && r_result != nullptr)) {
     return false;
   }
-  if (l_resp->has_result) {
-    result &= grpc_gcp_handshaker_resp_result_equals(&l_resp->result,
-                                                     &r_resp->result);
+  return upb_strview_eql(
+             grpc_gcp_HandshakerResult_application_protocol(l_result),
+             grpc_gcp_HandshakerResult_application_protocol(r_result)) &&
+         upb_strview_eql(grpc_gcp_HandshakerResult_record_protocol(l_result),
+                         grpc_gcp_HandshakerResult_record_protocol(r_result)) &&
+         upb_strview_eql(grpc_gcp_HandshakerResult_key_data(l_result),
+                         grpc_gcp_HandshakerResult_key_data(r_result)) &&
+         handshaker_identity_equals(
+             grpc_gcp_HandshakerResult_peer_identity(l_result),
+             grpc_gcp_HandshakerResult_peer_identity(r_result)) &&
+         handshaker_identity_equals(
+             grpc_gcp_HandshakerResult_local_identity(l_result),
+             grpc_gcp_HandshakerResult_local_identity(r_result)) &&
+         (grpc_gcp_HandshakerResult_keep_channel_open(l_result) ==
+          grpc_gcp_HandshakerResult_keep_channel_open(r_result)) &&
+         handshaker_rpc_versions_equals(
+             grpc_gcp_HandshakerResult_peer_rpc_versions(l_result),
+             grpc_gcp_HandshakerResult_peer_rpc_versions(r_result));
+}
+
+/* This method checks equality of two handshaker response statuses. */
+bool grpc_gcp_handshaker_resp_status_equals(
+    const grpc_gcp_HandshakerStatus* l_status,
+    const grpc_gcp_HandshakerStatus* r_status) {
+  if (l_status == nullptr && r_status == nullptr) {
+    return true;
+  } else if ((l_status != nullptr && r_status == nullptr) ||
+             (l_status == nullptr && r_status != nullptr)) {
+    return false;
   }
-  if (l_resp->has_status) {
-    result &= (l_resp->status.code == r_resp->status.code);
-    result &=
-        slice_equals(static_cast<grpc_slice*>(l_resp->status.details.arg),
-                     static_cast<grpc_slice*>(r_resp->status.details.arg));
-  }
-  return result;
+  return (grpc_gcp_HandshakerStatus_code(l_status) ==
+          grpc_gcp_HandshakerStatus_code(r_status)) &&
+         upb_strview_eql(grpc_gcp_HandshakerStatus_details(l_status),
+                         grpc_gcp_HandshakerStatus_details(r_status));
 }
diff --git a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h b/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h
index 2fcbb4e..d0a7cc8 100644
--- a/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h
+++ b/test/core/tsi/alts/handshaker/alts_handshaker_service_api_test_lib.h
@@ -19,9 +19,8 @@
 #ifndef GRPC_TEST_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_TEST_LIB_H
 #define GRPC_TEST_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_TEST_LIB_H
 
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h"
-#include "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h"
 #include "src/core/tsi/alts/handshaker/transport_security_common_api.h"
+#include "src/proto/grpc/gcp/handshaker.upb.h"
 
 /**
  * The first part of this file contains function signatures for de-serializing
@@ -30,114 +29,27 @@
  * service.
  */
 
-/**
- * This method creates a ALTS handshaker request that is used to hold
- * de-serialized result.
- */
-grpc_gcp_handshaker_req* grpc_gcp_handshaker_decoded_req_create(
-    grpc_gcp_handshaker_req_type type);
-
-/* This method de-serializes a ALTS handshaker request. */
-bool grpc_gcp_handshaker_req_decode(grpc_slice slice,
-                                    grpc_gcp_handshaker_req* req);
-
-/* This method serializes a ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_encode(grpc_gcp_handshaker_resp* resp,
-                                     grpc_slice* slice);
-
-/* This method sets application protocol of ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_application_protocol(
-    grpc_gcp_handshaker_resp* resp, const char* application_protocol);
-
-/* This method sets record protocol of ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_record_protocol(
-    grpc_gcp_handshaker_resp* resp, const char* record_protocol);
-
-/* This method sets key_data of ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_key_data(grpc_gcp_handshaker_resp* resp,
-                                           const char* key_data, size_t size);
-
-/* This method sets local identity's hostname for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_local_identity_hostname(
-    grpc_gcp_handshaker_resp* resp, const char* hostname);
-
-/**
- * This method sets local identity's service account for ALTS handshaker
- * response.
- */
-bool grpc_gcp_handshaker_resp_set_local_identity_service_account(
-    grpc_gcp_handshaker_resp* resp, const char* service_account);
-
-/* This method sets peer identity's hostname for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_peer_identity_hostname(
-    grpc_gcp_handshaker_resp* resp, const char* hostname);
-
-/**
- * This method sets peer identity's service account for ALTS handshaker
- * response.
- */
-bool grpc_gcp_handshaker_resp_set_peer_identity_service_account(
-    grpc_gcp_handshaker_resp* resp, const char* service_account);
-
-/* This method sets keep_channel_open for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_channel_open(grpc_gcp_handshaker_resp* resp,
-                                               bool keep_channel_open);
-
-/* This method sets code for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_code(grpc_gcp_handshaker_resp* resp,
-                                       uint32_t code);
-
-/* This method sets details for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_details(grpc_gcp_handshaker_resp* resp,
-                                          const char* details);
-
-/* This method sets out_frames for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_out_frames(grpc_gcp_handshaker_resp* resp,
-                                             const char* out_frames,
-                                             size_t size);
-
 /* This method sets peer_rpc_versions for ALTS handshaker response. */
 bool grpc_gcp_handshaker_resp_set_peer_rpc_versions(
-    grpc_gcp_handshaker_resp* resp, uint32_t max_major, uint32_t max_minor,
-    uint32_t min_major, uint32_t min_minor);
-
-/* This method sets bytes_consumed for ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_set_bytes_consumed(grpc_gcp_handshaker_resp* resp,
-                                                 int32_t bytes_consumed);
-
-/* This method serializes ALTS handshaker response. */
-bool grpc_gcp_handshaker_resp_encode(grpc_gcp_handshaker_resp* resp,
-                                     grpc_slice* slice);
+    grpc_gcp_HandshakerResp* resp, upb_arena* arena, uint32_t max_major,
+    uint32_t max_minor, uint32_t min_major, uint32_t min_minor);
 
 /* This method de-serializes ALTS handshaker request. */
-bool grpc_gcp_handshaker_req_decode(grpc_slice slice,
-                                    grpc_gcp_handshaker_req* req);
+grpc_gcp_HandshakerReq* grpc_gcp_handshaker_req_decode(grpc_slice slice,
+                                                       upb_arena* arena);
 
-/**
- * The second part contains function signatures for checking equality of a pair
- * of ALTS handshake requests/responses.
- */
-
-/* This method checks equality of two client_start handshaker requests. */
-bool grpc_gcp_handshaker_client_start_req_equals(
-    grpc_gcp_start_client_handshake_req* l_req,
-    grpc_gcp_start_client_handshake_req* r_req);
-
-/* This method checks equality of two server_start handshaker requests. */
-bool grpc_gcp_handshaker_server_start_req_equals(
-    grpc_gcp_start_server_handshake_req* l_req,
-    grpc_gcp_start_server_handshake_req* r_req);
-
-/* This method checks equality of two ALTS handshaker requests. */
-bool grpc_gcp_handshaker_req_equals(grpc_gcp_handshaker_req* l_req,
-                                    grpc_gcp_handshaker_req* r_req);
+/* This method checks equality of two ALTS handshaker responses. */
+bool grpc_gcp_handshaker_resp_equals(const grpc_gcp_HandshakerResp* l_resp,
+                                     const grpc_gcp_HandshakerResp* r_resp);
 
 /* This method checks equality of two handshaker response results. */
 bool grpc_gcp_handshaker_resp_result_equals(
-    grpc_gcp_handshaker_result* l_result, grpc_gcp_handshaker_result* r_result);
+    const grpc_gcp_HandshakerResult* l_result,
+    const grpc_gcp_HandshakerResult* r_result);
 
-/* This method checks equality of two ALTS handshaker responses. */
-bool grpc_gcp_handshaker_resp_equals(grpc_gcp_handshaker_resp* l_resp,
-                                     grpc_gcp_handshaker_resp* r_resp);
+/* This method checks equality of two handshaker response statuses. */
+bool grpc_gcp_handshaker_resp_status_equals(
+    const grpc_gcp_HandshakerStatus* l_status,
+    const grpc_gcp_HandshakerStatus* r_status);
 
 #endif  // GRPC_TEST_CORE_TSI_ALTS_HANDSHAKER_ALTS_HANDSHAKER_SERVICE_API_TEST_LIB_H
diff --git a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc
index 316ff13..3773137 100644
--- a/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc
+++ b/test/core/tsi/alts/handshaker/alts_tsi_handshaker_test.cc
@@ -110,55 +110,64 @@
  */
 static grpc_byte_buffer* generate_handshaker_response(
     alts_handshaker_response_type type) {
-  grpc_gcp_handshaker_resp* resp = grpc_gcp_handshaker_resp_create();
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_code(resp, 0));
+  upb::Arena arena;
+  grpc_gcp_HandshakerResult* result;
+  grpc_gcp_Identity* peer_identity;
+  grpc_gcp_HandshakerResp* resp = grpc_gcp_HandshakerResp_new(arena.ptr());
+  grpc_gcp_HandshakerStatus* status =
+      grpc_gcp_HandshakerResp_mutable_status(resp, arena.ptr());
+  grpc_gcp_HandshakerStatus_set_code(status, 0);
   switch (type) {
     case INVALID:
       break;
     case CLIENT_START:
     case SERVER_START:
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_out_frames(
-          resp, ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME,
-          strlen(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME)));
+      grpc_gcp_HandshakerResp_set_out_frames(
+          resp, upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME));
       break;
     case CLIENT_NEXT:
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_out_frames(
-          resp, ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME,
-          strlen(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME)));
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_identity_service_account(
-          resp, ALTS_TSI_HANDSHAKER_TEST_PEER_IDENTITY));
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_bytes_consumed(
-          resp, strlen(ALTS_TSI_HANDSHAKER_TEST_CONSUMED_BYTES)));
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_key_data(
-          resp, ALTS_TSI_HANDSHAKER_TEST_KEY_DATA,
-          strlen(ALTS_TSI_HANDSHAKER_TEST_KEY_DATA)));
+      grpc_gcp_HandshakerResp_set_out_frames(
+          resp, upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME));
+      grpc_gcp_HandshakerResp_set_bytes_consumed(
+          resp, strlen(ALTS_TSI_HANDSHAKER_TEST_CONSUMED_BYTES));
+      result = grpc_gcp_HandshakerResp_mutable_result(resp, arena.ptr());
+      peer_identity =
+          grpc_gcp_HandshakerResult_mutable_peer_identity(result, arena.ptr());
+      grpc_gcp_Identity_set_service_account(
+          peer_identity,
+          upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_PEER_IDENTITY));
+      grpc_gcp_HandshakerResult_set_key_data(
+          result, upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_KEY_DATA));
       GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_rpc_versions(
-          resp, ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MAJOR,
+          resp, arena.ptr(), ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MAJOR,
           ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MINOR,
           ALTS_TSI_HANDSHAKER_TEST_MIN_RPC_VERSION_MAJOR,
           ALTS_TSI_HANDSHAKER_TEST_MIN_RPC_VERSION_MINOR));
       break;
     case SERVER_NEXT:
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_identity_service_account(
-          resp, ALTS_TSI_HANDSHAKER_TEST_PEER_IDENTITY));
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_bytes_consumed(
-          resp, strlen(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME)));
-      GPR_ASSERT(grpc_gcp_handshaker_resp_set_key_data(
-          resp, ALTS_TSI_HANDSHAKER_TEST_KEY_DATA,
-          strlen(ALTS_TSI_HANDSHAKER_TEST_KEY_DATA)));
+      grpc_gcp_HandshakerResp_set_bytes_consumed(
+          resp, strlen(ALTS_TSI_HANDSHAKER_TEST_OUT_FRAME));
+      result = grpc_gcp_HandshakerResp_mutable_result(resp, arena.ptr());
+      peer_identity =
+          grpc_gcp_HandshakerResult_mutable_peer_identity(result, arena.ptr());
+      grpc_gcp_Identity_set_service_account(
+          peer_identity,
+          upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_PEER_IDENTITY));
+      grpc_gcp_HandshakerResult_set_key_data(
+          result, upb_strview_makez(ALTS_TSI_HANDSHAKER_TEST_KEY_DATA));
       GPR_ASSERT(grpc_gcp_handshaker_resp_set_peer_rpc_versions(
-          resp, ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MAJOR,
+          resp, arena.ptr(), ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MAJOR,
           ALTS_TSI_HANDSHAKER_TEST_MAX_RPC_VERSION_MINOR,
           ALTS_TSI_HANDSHAKER_TEST_MIN_RPC_VERSION_MAJOR,
           ALTS_TSI_HANDSHAKER_TEST_MIN_RPC_VERSION_MINOR));
       break;
     case FAILED:
-      GPR_ASSERT(
-          grpc_gcp_handshaker_resp_set_code(resp, 3 /* INVALID ARGUMENT */));
+      grpc_gcp_HandshakerStatus_set_code(status, 3 /* INVALID ARGUMENT */);
       break;
   }
-  grpc_slice slice;
-  GPR_ASSERT(grpc_gcp_handshaker_resp_encode(resp, &slice));
+  size_t buf_len;
+  char* buf = grpc_gcp_HandshakerResp_serialize(resp, arena.ptr(), &buf_len);
+  grpc_slice slice = gpr_slice_from_copied_buffer(buf, buf_len);
   if (type == INVALID) {
     grpc_slice bad_slice =
         grpc_slice_split_head(&slice, GRPC_SLICE_LENGTH(slice) - 1);
@@ -169,7 +178,6 @@
   grpc_byte_buffer* buffer =
       grpc_raw_byte_buffer_create(&slice, 1 /* number of slices */);
   grpc_slice_unref(slice);
-  grpc_gcp_handshaker_resp_destroy(resp);
   return buffer;
 }
 
diff --git a/test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc b/test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc
index 8d75d35..9b4c9f8 100644
--- a/test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc
+++ b/test/core/tsi/alts/handshaker/alts_tsi_utils_test.cc
@@ -36,18 +36,20 @@
 }
 
 static void deserialize_response_test() {
-  grpc_gcp_handshaker_resp* resp = grpc_gcp_handshaker_resp_create();
-  GPR_ASSERT(grpc_gcp_handshaker_resp_set_out_frames(
-      resp, ALTS_TSI_UTILS_TEST_OUT_FRAME,
-      strlen(ALTS_TSI_UTILS_TEST_OUT_FRAME)));
-  grpc_slice slice;
-  GPR_ASSERT(grpc_gcp_handshaker_resp_encode(resp, &slice));
+  upb::Arena arena;
+  grpc_gcp_HandshakerResp* resp = grpc_gcp_HandshakerResp_new(arena.ptr());
+  grpc_gcp_HandshakerResp_set_out_frames(
+      resp, upb_strview_makez(ALTS_TSI_UTILS_TEST_OUT_FRAME));
+  size_t buf_len;
+  char* buf = grpc_gcp_HandshakerResp_serialize(resp, arena.ptr(), &buf_len);
+  grpc_slice slice = grpc_slice_from_copied_buffer(buf, buf_len);
 
   /* Valid serialization. */
+  upb::Arena arena2;
   grpc_byte_buffer* buffer =
       grpc_raw_byte_buffer_create(&slice, 1 /* number of slices */);
-  grpc_gcp_handshaker_resp* decoded_resp =
-      alts_tsi_utils_deserialize_response(buffer);
+  grpc_gcp_HandshakerResp* decoded_resp =
+      alts_tsi_utils_deserialize_response(buffer, arena2.ptr());
   GPR_ASSERT(grpc_gcp_handshaker_resp_equals(resp, decoded_resp));
   grpc_byte_buffer_destroy(buffer);
 
@@ -55,14 +57,13 @@
   grpc_slice bad_slice =
       grpc_slice_split_head(&slice, GRPC_SLICE_LENGTH(slice) - 1);
   buffer = grpc_raw_byte_buffer_create(&bad_slice, 1 /* number of slices */);
-  GPR_ASSERT(alts_tsi_utils_deserialize_response(buffer) == nullptr);
+  GPR_ASSERT(alts_tsi_utils_deserialize_response(buffer, arena2.ptr()) ==
+             nullptr);
 
   /* Clean up. */
   grpc_slice_unref(slice);
   grpc_slice_unref(bad_slice);
   grpc_byte_buffer_destroy(buffer);
-  grpc_gcp_handshaker_resp_destroy(resp);
-  grpc_gcp_handshaker_resp_destroy(decoded_resp);
 }
 
 int main(int argc, char** argv) {
diff --git a/test/core/tsi/alts/handshaker/transport_security_common_api_test.cc b/test/core/tsi/alts/handshaker/transport_security_common_api_test.cc
index 6ff1357..a2c3d48 100644
--- a/test/core/tsi/alts/handshaker/transport_security_common_api_test.cc
+++ b/test/core/tsi/alts/handshaker/transport_security_common_api_test.cc
@@ -31,25 +31,17 @@
     grpc_gcp_rpc_protocol_versions* l_versions,
     grpc_gcp_rpc_protocol_versions* r_versions) {
   GPR_ASSERT(l_versions != nullptr && r_versions != nullptr);
-  if ((l_versions->has_max_rpc_version ^ r_versions->has_max_rpc_version) |
-      (l_versions->has_min_rpc_version ^ r_versions->has_min_rpc_version)) {
+  if ((l_versions->max_rpc_version.major !=
+       r_versions->max_rpc_version.major) ||
+      (l_versions->max_rpc_version.minor !=
+       r_versions->max_rpc_version.minor)) {
     return false;
   }
-  if (l_versions->has_max_rpc_version) {
-    if ((l_versions->max_rpc_version.major !=
-         r_versions->max_rpc_version.major) ||
-        (l_versions->max_rpc_version.minor !=
-         r_versions->max_rpc_version.minor)) {
-      return false;
-    }
-  }
-  if (l_versions->has_min_rpc_version) {
-    if ((l_versions->min_rpc_version.major !=
-         r_versions->min_rpc_version.major) ||
-        (l_versions->min_rpc_version.minor !=
-         r_versions->min_rpc_version.minor)) {
-      return false;
-    }
+  if ((l_versions->min_rpc_version.major !=
+       r_versions->min_rpc_version.major) ||
+      (l_versions->min_rpc_version.minor !=
+       r_versions->min_rpc_version.minor)) {
+    return false;
   }
   return true;
 }
@@ -61,25 +53,14 @@
       &version, kMaxRpcVersionMajor, kMaxRpcVersionMinor));
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_set_min(
       &version, kMinRpcVersionMajor, kMinRpcVersionMinor));
-  /* Serializes to raw bytes. */
-  size_t encoded_length =
-      grpc_gcp_rpc_protocol_versions_encode_length(&version);
-  uint8_t* encoded_bytes = static_cast<uint8_t*>(gpr_malloc(encoded_length));
-  GPR_ASSERT(grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-      &version, encoded_bytes, encoded_length));
-  grpc_slice encoded_slice;
   /* Serializes to grpc slice. */
+  grpc_slice encoded_slice;
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_encode(&version, &encoded_slice));
-  /* Checks serialized raw bytes and serialized grpc slice have same content. */
-  GPR_ASSERT(encoded_length == GRPC_SLICE_LENGTH(encoded_slice));
-  GPR_ASSERT(memcmp(encoded_bytes, GRPC_SLICE_START_PTR(encoded_slice),
-                    encoded_length) == 0);
   /* Deserializes and compares with the original version. */
   GPR_ASSERT(
       grpc_gcp_rpc_protocol_versions_decode(encoded_slice, &decoded_version));
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_equal(&version, &decoded_version));
   grpc_slice_unref(encoded_slice);
-  gpr_free(encoded_bytes);
 }
 
 static void test_failure() {
@@ -90,24 +71,14 @@
       nullptr, kMaxRpcVersionMajor, kMaxRpcVersionMinor));
   GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_set_min(
       nullptr, kMinRpcVersionMajor, kMinRpcVersionMinor));
-  GPR_ASSERT(grpc_gcp_rpc_protocol_versions_encode_length(nullptr) == 0);
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_set_max(
       &version, kMaxRpcVersionMajor, kMaxRpcVersionMinor));
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_set_min(
       &version, kMinRpcVersionMajor, kMinRpcVersionMinor));
-  size_t encoded_length =
-      grpc_gcp_rpc_protocol_versions_encode_length(&version);
-  uint8_t* encoded_bytes = static_cast<uint8_t*>(gpr_malloc(encoded_length));
-  GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-      nullptr, encoded_bytes, encoded_length));
-  GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-      &version, nullptr, encoded_length));
-  GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_encode_to_raw_bytes(
-      &version, encoded_bytes, 0));
   GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_encode(nullptr, &encoded_slice));
   GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_encode(&version, nullptr));
   GPR_ASSERT(!grpc_gcp_rpc_protocol_versions_decode(encoded_slice, nullptr));
-  /* Test for nanopb decode. */
+  /* Test for upb decode. */
   GPR_ASSERT(grpc_gcp_rpc_protocol_versions_encode(&version, &encoded_slice));
   grpc_slice bad_slice = grpc_slice_split_head(
       &encoded_slice, GRPC_SLICE_LENGTH(encoded_slice) - 1);
@@ -115,7 +86,6 @@
   GPR_ASSERT(
       !grpc_gcp_rpc_protocol_versions_decode(bad_slice, &decoded_version));
   grpc_slice_unref(bad_slice);
-  gpr_free(encoded_bytes);
 }
 
 static void test_copy() {
diff --git a/tools/distrib/check_nanopb_output.sh b/tools/distrib/check_nanopb_output.sh
index 7317e84..573e02e 100755
--- a/tools/distrib/check_nanopb_output.sh
+++ b/tools/distrib/check_nanopb_output.sh
@@ -15,7 +15,6 @@
 
 set -ex
 
-readonly NANOPB_ALTS_TMP_OUTPUT="$(mktemp -d)"
 readonly NANOPB_HEALTH_TMP_OUTPUT="$(mktemp -d)"
 readonly NANOPB_TMP_OUTPUT="$(mktemp -d)"
 readonly PROTOBUF_INSTALL_PREFIX="$(mktemp -d)"
@@ -58,29 +57,3 @@
     exit 2
   fi
 done
-
-#
-# Checks for handshaker.proto and transport_security_common.proto
-#
-readonly HANDSHAKER_GRPC_OUTPUT_PATH='src/core/tsi/alts/handshaker'
-# nanopb-compile the proto to a temp location
-./tools/codegen/core/gen_nano_proto.sh \
-  src/core/tsi/alts/handshaker/proto/handshaker.proto \
-  "$NANOPB_ALTS_TMP_OUTPUT" \
-  "$HANDSHAKER_GRPC_OUTPUT_PATH"
-./tools/codegen/core/gen_nano_proto.sh \
-  src/core/tsi/alts/handshaker/proto/transport_security_common.proto \
-  "$NANOPB_ALTS_TMP_OUTPUT" \
-  "$HANDSHAKER_GRPC_OUTPUT_PATH"
-./tools/codegen/core/gen_nano_proto.sh \
-  src/core/tsi/alts/handshaker/proto/altscontext.proto \
-  "$NANOPB_ALTS_TMP_OUTPUT" \
-  "$HANDSHAKER_GRPC_OUTPUT_PATH"
-
-# compare outputs to checked compiled code
-for NANOPB_OUTPUT_FILE in $NANOPB_ALTS_TMP_OUTPUT/*.pb.*; do
-  if ! diff "$NANOPB_OUTPUT_FILE" "src/core/tsi/alts/handshaker/$(basename $NANOPB_OUTPUT_FILE)"; then
-    echo "Outputs differ: $NANOPB_ALTS_TMP_OUTPUT vs $HANDSHAKER_GRPC_OUTPUT_PATH"
-    exit 2
-  fi
-done
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 4579af5..5180fab 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -1116,6 +1116,12 @@
 src/core/ext/upb-generated/google/protobuf/wrappers.upb.h \
 src/core/ext/upb-generated/google/rpc/status.upb.c \
 src/core/ext/upb-generated/google/rpc/status.upb.h \
+src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c \
+src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h \
+src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c \
+src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h \
+src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c \
+src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h \
 src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c \
 src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h \
 src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c \
@@ -1598,10 +1604,6 @@
 src/core/tsi/alts/frame_protector/frame_handler.h \
 src/core/tsi/alts/handshaker/alts_handshaker_client.cc \
 src/core/tsi/alts/handshaker/alts_handshaker_client.h \
-src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc \
-src/core/tsi/alts/handshaker/alts_handshaker_service_api.h \
-src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc \
-src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h \
 src/core/tsi/alts/handshaker/alts_shared_resource.cc \
 src/core/tsi/alts/handshaker/alts_shared_resource.h \
 src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc \
@@ -1609,12 +1611,6 @@
 src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h \
 src/core/tsi/alts/handshaker/alts_tsi_utils.cc \
 src/core/tsi/alts/handshaker/alts_tsi_utils.h \
-src/core/tsi/alts/handshaker/altscontext.pb.c \
-src/core/tsi/alts/handshaker/altscontext.pb.h \
-src/core/tsi/alts/handshaker/handshaker.pb.c \
-src/core/tsi/alts/handshaker/handshaker.pb.h \
-src/core/tsi/alts/handshaker/transport_security_common.pb.c \
-src/core/tsi/alts/handshaker/transport_security_common.pb.h \
 src/core/tsi/alts/handshaker/transport_security_common_api.cc \
 src/core/tsi/alts/handshaker/transport_security_common_api.h \
 src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc \
@@ -1646,13 +1642,6 @@
 src/core/tsi/transport_security_grpc.cc \
 src/core/tsi/transport_security_grpc.h \
 src/core/tsi/transport_security_interface.h \
-third_party/nanopb/pb.h \
-third_party/nanopb/pb_common.c \
-third_party/nanopb/pb_common.h \
-third_party/nanopb/pb_decode.c \
-third_party/nanopb/pb_decode.h \
-third_party/nanopb/pb_encode.c \
-third_party/nanopb/pb_encode.h \
 third_party/upb/upb/decode.c \
 third_party/upb/upb/decode.h \
 third_party/upb/upb/encode.c \
diff --git a/tools/run_tests/generated/sources_and_headers.json b/tools/run_tests/generated/sources_and_headers.json
index 60ba4d7..36e6ef1 100644
--- a/tools/run_tests/generated/sources_and_headers.json
+++ b/tools/run_tests/generated/sources_and_headers.json
@@ -2584,22 +2584,6 @@
     "headers": [], 
     "is_filegroup": false, 
     "language": "c++", 
-    "name": "alts_handshaker_service_api_test", 
-    "src": [
-      "test/core/tsi/alts/handshaker/alts_handshaker_service_api_test.cc"
-    ], 
-    "third_party": false, 
-    "type": "target"
-  }, 
-  {
-    "deps": [
-      "alts_test_util", 
-      "gpr", 
-      "grpc"
-    ], 
-    "headers": [], 
-    "is_filegroup": false, 
-    "language": "c++", 
     "name": "alts_iovec_record_protocol_test", 
     "src": [
       "test/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol_test.cc"
@@ -8114,29 +8098,6 @@
   }, 
   {
     "deps": [
-      "nanopb"
-    ], 
-    "headers": [
-      "src/core/tsi/alts/handshaker/altscontext.pb.h", 
-      "src/core/tsi/alts/handshaker/handshaker.pb.h", 
-      "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
-    ], 
-    "is_filegroup": true, 
-    "language": "c", 
-    "name": "alts_proto", 
-    "src": [
-      "src/core/tsi/alts/handshaker/altscontext.pb.c", 
-      "src/core/tsi/alts/handshaker/altscontext.pb.h", 
-      "src/core/tsi/alts/handshaker/handshaker.pb.c", 
-      "src/core/tsi/alts/handshaker/handshaker.pb.h", 
-      "src/core/tsi/alts/handshaker/transport_security_common.pb.c", 
-      "src/core/tsi/alts/handshaker/transport_security_common.pb.h"
-    ], 
-    "third_party": false, 
-    "type": "filegroup"
-  }, 
-  {
-    "deps": [
       "alts_util", 
       "gpr", 
       "grpc_base", 
@@ -8205,7 +8166,9 @@
     "type": "filegroup"
   }, 
   {
-    "deps": [], 
+    "deps": [
+      "upb"
+    ], 
     "headers": [
       "src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h", 
       "src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h", 
@@ -8227,10 +8190,9 @@
   }, 
   {
     "deps": [
-      "alts_proto", 
+      "alts_upb", 
       "gpr", 
       "grpc_base", 
-      "nanopb", 
       "tsi_interface", 
       "upb"
     ], 
@@ -8238,8 +8200,6 @@
       "include/grpc/grpc_security.h", 
       "src/core/lib/security/credentials/alts/check_gcp_environment.h", 
       "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h", 
       "src/core/tsi/alts/handshaker/alts_tsi_utils.h", 
       "src/core/tsi/alts/handshaker/transport_security_common_api.h"
     ], 
@@ -8257,10 +8217,6 @@
       "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc", 
       "src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h", 
       "src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api.cc", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api.h", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.cc", 
-      "src/core/tsi/alts/handshaker/alts_handshaker_service_api_util.h", 
       "src/core/tsi/alts/handshaker/alts_tsi_utils.cc", 
       "src/core/tsi/alts/handshaker/alts_tsi_utils.h", 
       "src/core/tsi/alts/handshaker/transport_security_common_api.cc", 
@@ -8407,7 +8363,9 @@
     "type": "filegroup"
   }, 
   {
-    "deps": [], 
+    "deps": [
+      "upb"
+    ], 
     "headers": [
       "src/core/ext/upb-generated/google/api/annotations.upb.h", 
       "src/core/ext/upb-generated/google/api/http.upb.h", 
@@ -9586,7 +9544,8 @@
   }, 
   {
     "deps": [
-      "google_api_upb"
+      "google_api_upb", 
+      "upb"
     ], 
     "headers": [
       "src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h"
diff --git a/tools/run_tests/generated/tests.json b/tools/run_tests/generated/tests.json
index 255db94..cb5093d 100644
--- a/tools/run_tests/generated/tests.json
+++ b/tools/run_tests/generated/tests.json
@@ -3266,30 +3266,6 @@
     "flaky": false, 
     "gtest": false, 
     "language": "c++", 
-    "name": "alts_handshaker_service_api_test", 
-    "platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "uses_polling": true
-  }, 
-  {
-    "args": [], 
-    "benchmark": false, 
-    "ci_platforms": [
-      "linux", 
-      "mac", 
-      "posix", 
-      "windows"
-    ], 
-    "cpu_cost": 1.0, 
-    "exclude_configs": [], 
-    "exclude_iomgrs": [], 
-    "flaky": false, 
-    "gtest": false, 
-    "language": "c++", 
     "name": "alts_iovec_record_protocol_test", 
     "platforms": [
       "linux",