| 
					
				 | 
			
			
				@@ -16,26 +16,29 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include "test/core/end2end/end2end_tests.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <stdio.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <string.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <grpc/support/alloc.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include <grpc/support/log.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <gtest/gtest.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <stdio.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include <string.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/channel/channel_args.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gpr/string.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gpr/tmpfile.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/gprpp/host_port.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "src/core/lib/iomgr/load_file.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/security/credentials/credentials.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "src/core/lib/security/security_connector/ssl_utils_config.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/end2end/cq_verifier.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include "test/core/end2end/data/ssl_test_data.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#include "test/core/end2end/end2end_tests.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/port.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "test/core/util/test_config.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <gtest/gtest.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define CLIENT_CERT_PATH "src/core/tsi/test_creds/client.pem" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define CLIENT_KEY_PATH "src/core/tsi/test_creds/client.key" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace grpc { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 namespace testing { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -46,10 +49,22 @@ void* tag(intptr_t t) { return (void*)t; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 gpr_timespec five_seconds_time() { return grpc_timeout_seconds_to_deadline(5); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {test_server1_key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                  test_server1_cert}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice ca_slice, cert_slice, key_slice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "load_file", grpc_load_file(SERVER_CERT_PATH, 1, &cert_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               grpc_load_file(SERVER_KEY_PATH, 1, &key_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* ca_cert = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* server_cert = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* server_key = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_ssl_pem_key_cert_pair pem_cert_key_pair = {server_key, server_cert}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_server_credentials* server_creds = grpc_ssl_server_credentials_create_ex( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_root_cert, &pem_cert_key_pair, 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ca_cert, &pem_cert_key_pair, 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       GRPC_SSL_REQUEST_CLIENT_CERTIFICATE_AND_VERIFY, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_server* server = grpc_server_create(nullptr, nullptr); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -59,14 +74,30 @@ grpc_server* server_create(grpc_completion_queue* cq, char* server_addr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_server_credentials_release(server_creds); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_server_start(server); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(cert_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(key_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(ca_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return server; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_signed_client_key, test_signed_client_cert}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice ca_slice, cert_slice, key_slice; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               grpc_load_file(CA_CERT_PATH, 1, &ca_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      "load_file", grpc_load_file(CLIENT_CERT_PATH, 1, &cert_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_ASSERT(GRPC_LOG_IF_ERROR("load_file", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               grpc_load_file(CLIENT_KEY_PATH, 1, &key_slice))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* ca_cert = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(ca_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* client_cert = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(cert_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const char* client_key = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      reinterpret_cast<const char*> GRPC_SLICE_START_PTR(key_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_ssl_pem_key_cert_pair signed_client_key_cert_pair = {client_key, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                            client_cert}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_credentials* client_creds = grpc_ssl_credentials_create( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      test_root_cert, &signed_client_key_cert_pair, nullptr, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      ca_cert, &signed_client_key_cert_pair, nullptr, nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_arg args[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       grpc_channel_arg_string_create( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -88,6 +119,9 @@ grpc_channel* client_create(char* server_addr, grpc_ssl_session_cache* cache) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_channel_args_destroy(client_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(cert_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(key_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_slice_unref(ca_slice); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -253,27 +287,13 @@ TEST(H2SessionReuseTest, SingleReuse) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // namespace grpc 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int main(int argc, char** argv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  FILE* roots_file; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  size_t roots_size = strlen(test_root_cert); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  char* roots_filename; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc::testing::TestEnvironment env(argc, argv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* Set the SSL roots env var. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  roots_file = gpr_tmpfile("chttp2_ssl_session_reuse_test", &roots_filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(roots_filename != nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(roots_file != nullptr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_ASSERT(fwrite(test_root_cert, 1, roots_size, roots_file) == roots_size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  fclose(roots_file); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, roots_filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  GPR_GLOBAL_CONFIG_SET(grpc_default_ssl_roots_file_path, CA_CERT_PATH); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_init(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ::testing::InitGoogleTest(&argc, argv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int ret = RUN_ALL_TESTS(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_shutdown(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* Cleanup. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  remove(roots_filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_free(roots_filename); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |