diff --git a/lib/symbols/grpc b/lib/symbols/grpc
index 7f11c3e..908bc39 100644
--- a/lib/symbols/grpc
+++ b/lib/symbols/grpc
@@ -16,3 +16,5 @@ _ZN9grpc_impl25InsecureServerCredentialsEv W
_ZN9grpc_impl26InsecureChannelCredentialsEv W
_ZN9grpc_impl7ChannelD0Ev W
_ZN4grpc12experimental29ChannelResetConnectionBackoffEPN9grpc_impl7ChannelE W
+_ZN9grpc_impl20SslServerCredentialsERKN4grpc27SslServerCredentialsOptionsE W
+_ZN9grpc_impl14SslCredentialsERKNS_21SslCredentialsOptionsE W
diff --git a/run/grpc_tls.run b/run/grpc_tls.run
new file mode 100644
index 0000000..54fc90e
--- /dev/null
+++ b/run/grpc_tls.run
@@ -0,0 +1,309 @@
+create_boot_directory
+
+source $gapfruit_dir/repos/gapfruit/run/corallite_functions.inc
+
+import_from_depot [depot_user]/src/[base_src]
+import_from_depot [depot_user]/src/dynamic_rom
+import_from_depot [depot_user]/src/init
+import_from_depot [depot_user]/src/libc
+import_from_depot [depot_user]/src/libcrypto
+import_from_depot [depot_user]/src/libssl
+import_from_depot [depot_user]/src/nic_router
+import_from_depot [depot_user]/src/posix
+import_from_depot [depot_user]/src/protobuf
+import_from_depot [depot_user]/src/report_rom
+import_from_depot [depot_user]/src/stdcxx
+import_from_depot [depot_user]/src/vfs
+import_from_depot [depot_user]/src/vfs_jitterentropy
+import_from_depot [depot_user]/src/vfs_lwip
+import_from_depot [depot_user]/src/zlib
+
+set build_components {
+ test/grpc_tls/server
+ test/grpc_tls/client
+}
+
+
+build $build_components
+
+
+set nic_router_reporting 0
+
+set ssl_server_key {
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpAIBAAKCAQEAt0QT62/ez9rw4GepYLY530y2I6fdrZkQ3v3wzKI0G9t9n8Yo
+YeQkAeHuIoCxLAYzjS4alwki1DVL0hSXD95kO9+H0sBmfJ1k1x/Wn7Y2/WKpG5yK
+x8CobEC1rG4YibeED9n06kaYPtQ01HEGQ/eXEbcSISVN1xK8zTe1uzKZ36H99lkb
+hOZQ6xLOSH/4jSiPacX+3CkeJBIkAFflzDq/ycKVlO429+6F/TimxXn2ZhJtKcW9
+swMTKLas8LPJPTO8jbjv/uQS+ygh1bATWO7iNayS4XdRuyFNkknxHAX48ks59UTb
+bVe4m0yre2cq4w/2f0Rp5NibbvblPzSpMIWGoQIDAQABAoIBAQCFDppfz6M3ykAk
+zV5+Zw9xfqKnFJOwHHfRTxHroMCwkRWOUTK0kA1MiJp61nDMA9yd3iFUE0AEToW0
+C1r6HH8tsUdNzn8abrPuNKGA56zZHy6ka22fRdOCdSDyBiUup9zsHVTiW0riIvQQ
+YdcotbQrGn3BLvJq+qG1ZYM+XKi3YgxErcEQFwhH7RCr4X654NDSms5w/V5M/3nS
+jcDUH19rT180Sy2Pmbus2c51GaF3M7ZET84aPqX/zBNg8aCmXV4BxPmd+R6Kp0DZ
+T8Y1j+Mvkulc0LnP+iONHUbWtbpVL+OFgMQSmW+MSvCgrwHGr8VayVleEmW50+1M
+A/Wu6Yp5AoGBAOjqpl/Rru7PerATK5fjm/bZuUd3GaBGBRRbZBcSorGA6WlX3kOC
+ZJbJfnT0+HF6gWzhHtqxuEgAUG5p2AcP3C2tg0vGUFe7ldePK5yJc147O3FF1/fr
+GRRohHFjgD23xMctySwGVgp4JWzJom0Do+3DBxsyq0JQDmATv4/7MFqnAoGBAMlt
+vF146ofZmrgDESd+7gnBEK5r9XzX2q/5Rd6TXz5WMpw5OAM9i650KciKd1j96tIf
+JhU2ccFtk9GgWCaMxpIkDyTo8kTwc5fuFdmdo9Hi4w6bRxSDFcBqD2xEH9i3xlQw
+1h4bxc8Iggv2Fozh5jqKxTBEz1t8n0oxRaLW7OV3AoGAfNrEQtsJFhT8ZIRyOuKV
+CXde3ZNXllXShT4UYlXoBpTfCkxC5hdwym/KrPFgeJw94tquinb4HQimFPoCBo8W
+7Rl1J1pwWQdCZKHns+rugBXqYGcbRVeuQwVf8dRvuyXWgxrlGwduegA7t5xCyINK
+DbsdBRRdP5fgjNopNwpkukMCgYAoTyCB6B+u/fn7VwnIyJrkMtGexhYDXMLzskOs
+LfvCYseQAddWtqtMRwzRh/woP/ANCpS5bALJvZ72NUtOs59NQZASR9eruh63ybpv
+qR9OckQT+Tj5Pt5Mei0J8nwZB3XWBUvkDJTCQKadtCqBGPfUwU6CwVJpsX/C/ic8
+VhxkMwKBgQDQNAL/F+T4/UQ+DcayruTAUyv/mE85LpQ+pkP4bmeUbKg9L/evCDdc
+IyFb0d3QOGxtumRa3QXTJv6/YRcYT6QpjtegoxCNT4Efy4XfTg0ZSlD3fM854oKy
+inL6CnjqcXGZnm+bsmnAu0Eebhx9/wUA3msaivUY8aBTMIzhkpoVfw==
+-----END RSA PRIVATE KEY-----
+}
+set ssl_server_cert {
+-----BEGIN CERTIFICATE-----
+MIIDZTCCAk0CFE5tmzIRllqBMUbhj7lUFlOd6KXaMA0GCSqGSIb3DQEBDQUAMHQx
+CzAJBgNVBAYTAkNIMQwwCgYDVQQIDANadWcxDDAKBgNVBAcMA1p1ZzEUMBIGA1UE
+CgwLZ2FwZnJ1aXQgQUcxFDASBgNVBAsMC0RldmVsb3BtZW50MR0wGwYDVQQDDBRn
+YXBmcnVpdCBEZXYvVGVzdCBDQTAeFw0xOTEyMTgxNDIxNTJaFw0yOTEyMTUxNDIx
+NTJaMGoxCzAJBgNVBAYTAkNIMQwwCgYDVQQIDANadWcxDDAKBgNVBAcMA1p1ZzEU
+MBIGA1UECgwLZ2FwZnJ1aXQgQUcxFDASBgNVBAsMC0RldmVsb3BtZW50MRMwEQYD
+VQQDDApncnBjLmxvY2FsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+t0QT62/ez9rw4GepYLY530y2I6fdrZkQ3v3wzKI0G9t9n8YoYeQkAeHuIoCxLAYz
+jS4alwki1DVL0hSXD95kO9+H0sBmfJ1k1x/Wn7Y2/WKpG5yKx8CobEC1rG4YibeE
+D9n06kaYPtQ01HEGQ/eXEbcSISVN1xK8zTe1uzKZ36H99lkbhOZQ6xLOSH/4jSiP
+acX+3CkeJBIkAFflzDq/ycKVlO429+6F/TimxXn2ZhJtKcW9swMTKLas8LPJPTO8
+jbjv/uQS+ygh1bATWO7iNayS4XdRuyFNkknxHAX48ks59UTbbVe4m0yre2cq4w/2
+f0Rp5NibbvblPzSpMIWGoQIDAQABMA0GCSqGSIb3DQEBDQUAA4IBAQCYk7rAYBFK
+ynvDgO+wfVmHI/imxsBPBFSD/5YerUt5TSjbjFiNmCTkRfgaBjBNg8kqDxt4LwVU
+w6s5eazqHYs7B8pWDieJwvrWRRmpPD+QRvNLbFOB7n+b+7LtcUAmgOMZzCddcahN
+1bO3t+J4ULWoLgpGvfPtEZJHrgSvlCAleVH0/CVZ2cZ9ngXwYZzW+uzDLuq8t+cy
+PrQ7iWvSX9k/N2f6/MxiFdr1kjjXFLDmweFztUy2tlzbI/jA1VEyiT3MBWrPvq8z
+YXrvUx64+/4/eHjkrpTIqO2K5NMFw218WzxlnmEeVwarP0kmhoDyr75z3SUT4Ygt
+gDANZRHtzkRg
+-----END CERTIFICATE-----
+}
+set ssl_root_cert {
+-----BEGIN CERTIFICATE-----
+MIIDyTCCArGgAwIBAgIUNyy3GIyo2XwhohJyZHHC5mMyLKkwDQYJKoZIhvcNAQEN
+BQAwdDELMAkGA1UEBhMCQ0gxDDAKBgNVBAgMA1p1ZzEMMAoGA1UEBwwDWnVnMRQw
+EgYDVQQKDAtnYXBmcnVpdCBBRzEUMBIGA1UECwwLRGV2ZWxvcG1lbnQxHTAbBgNV
+BAMMFGdhcGZydWl0IERldi9UZXN0IENBMB4XDTE5MTIxODEzMTgxN1oXDTI5MTIx
+NTEzMTgxN1owdDELMAkGA1UEBhMCQ0gxDDAKBgNVBAgMA1p1ZzEMMAoGA1UEBwwD
+WnVnMRQwEgYDVQQKDAtnYXBmcnVpdCBBRzEUMBIGA1UECwwLRGV2ZWxvcG1lbnQx
+HTAbBgNVBAMMFGdhcGZydWl0IERldi9UZXN0IENBMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAteFTvvk/p0mBsj6xyUGnu4ESlWyOM6ctXX7I0oLFgZD/
+iI8aaYs9mfmn0xHHUmQ1cwg9rQOOruYqdpF0897H2t5dOVcGYKyluPzVT95Khnag
+J/hw3oo6UH00oThLC8yY0Zu9dMTGQvsiYUKLazbsiz37IfoSrRP9LOEMecl+3kWV
+1EczZKwsOCf5QXB60nXtMnakelGhX9AdhmIx3GfigAsRAyzZKpNdlbiTYoH9cnuQ
+3RJPAnOXawnJkQGpT12CNrKhAKNlTT91CHIE08/4zbrRrNP80bZN7VS6M/8QSQRE
+7/OPXp7MiqeLEdIpUD3EIHezf+omZmVdHkM/QeYipwIDAQABo1MwUTAdBgNVHQ4E
+FgQUvDmvbNuKYAb3xMmIyd6j9OIULukwHwYDVR0jBBgwFoAUvDmvbNuKYAb3xMmI
+yd6j9OIULukwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOCAQEAESOs
+duTRSzCNlBvDzP2ushB6P3JtN2eqBj/W+I1DnDAm/wpKkbAHxB26Ldm/AS/APq/D
+IOgP3OltOVBjotRi+I5z7oSq3RHzU2fT6ZS8JfiRaVOTAs9ImQwVGT/xTN79oILW
+7ivbLacF4L7BXFFq22HBK+DYnP8zdWud7g+8KTwwv2m2uijLkiw4oBqwo8SGUVU0
+xYL0iBrMfbtc2cg0mGNsfMpVMe0ZJdtyK7EzZvWi6jw3T2qsxNNTM89tYvRpcoUL
+AeOLXBSuuz5FnClb95mSVMpFYrHYwYzwx677fJjFKrLsaCSeledPSXN6GpPMl6bg
+1pr81E45WPuAQBX5jw==
+-----END CERTIFICATE-----
+}
+set server_start_node {
+
+
+
+
+
+
+
+
+
+
+
+ 2019-12-19 14:22
+
+
+
+
+ }
+append server_start_node $ssl_server_key
+append server_start_node {
+
+ }
+append server_start_node $ssl_server_cert
+append server_start_node {
+
+
+
+
+}
+
+set config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+append_if $nic_router_reporting config {
+
+
+
+
+
+
+
+
+
+}
+append config {
+
+
+
+ }
+append_if $nic_router_reporting config {
+ }
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+append config $server_start_node
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+append config $server_start_node
+append config {
+
+
+
+
+
+
+
+
+
+
+
+ 2019-12-19 14:22
+
+
+
+
+
+ nameserver 8.8.8.8
+ order hosts,bind
+multi on
+ 10.10.10.55 grpc.local
+
+
+
+
+ }
+append config $ssl_root_cert
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+install_config [replace_package_template_info $config]
+
+set boot_modules {
+ grpc_tls_server
+ grpc_tls_client
+ grpc.lib.so
+ libc_pipe.lib.so
+}
+
+append qemu_args " -nographic "
+
+
+build_boot_image $boot_modules
+
+
+run_genode_until {.*say hello} 200000
diff --git a/src/test/grpc_tls/client/greeter_client.cc b/src/test/grpc_tls/client/greeter_client.cc
new file mode 100644
index 0000000..43a14c3
--- /dev/null
+++ b/src/test/grpc_tls/client/greeter_client.cc
@@ -0,0 +1,107 @@
+/*
+ *
+ * Copyright 2015 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
+#include
+#include
+
+#include
+
+#ifdef BAZEL_BUILD
+#include "examples/protos/helloworld.grpc.pb.h"
+#else
+#include "helloworld.grpc.pb.h"
+#endif
+
+using grpc::Channel;
+using grpc::ClientContext;
+using grpc::Status;
+using helloworld::HelloRequest;
+using helloworld::HelloReply;
+using helloworld::Greeter;
+
+class GreeterClient {
+ public:
+ GreeterClient(std::shared_ptr channel)
+ : stub_(Greeter::NewStub(channel)) {}
+
+ // Assembles the client's payload, sends it and presents the response back
+ // from the server.
+ std::string SayHello(const std::string& user) {
+ // Data we are sending to the server.
+ HelloRequest request;
+ request.set_name(user);
+
+ // Container for the data we expect from the server.
+ HelloReply reply;
+
+ // Context for the client. It could be used to convey extra information to
+ // the server and/or tweak certain RPC behaviors.
+ ClientContext context;
+
+ // The actual RPC.
+ Status status = stub_->SayHello(&context, request, &reply);
+
+ // Act upon its status.
+ if (status.ok()) {
+ return reply.message();
+ } else {
+ std::cout << status.error_code() << ": " << status.error_message()
+ << std::endl;
+ return "RPC failed";
+ }
+ }
+
+ private:
+ std::unique_ptr stub_;
+};
+
+std::string read_file(const char* filename)
+{
+ const long max_size = 4096;
+
+ auto f = fopen(filename, "rb");
+
+ if (f == nullptr) {
+ throw -1;
+ }
+
+ std::string res;
+ res.resize(max_size);
+
+ // C++17 defines .data() which returns a non-const pointer
+ const long size = fread(const_cast(res.data()), 1, max_size, f);
+ res.resize(size);
+
+ fclose(f);
+
+ return res;
+}
+
+int main(int argc, char** argv) {
+ auto ssl_options = grpc::SslCredentialsOptions{};
+ auto credentials = grpc::SslCredentials(ssl_options);
+
+ GreeterClient greeter(grpc::CreateChannel(
+ "grpc.local:50051", credentials));
+ std::string user("world");
+ std::string reply = greeter.SayHello(user);
+ std::cout << "Greeter received: " << reply << std::endl;
+
+ return 0;
+}
diff --git a/src/test/grpc_tls/client/target.mk b/src/test/grpc_tls/client/target.mk
new file mode 100644
index 0000000..090ffe2
--- /dev/null
+++ b/src/test/grpc_tls/client/target.mk
@@ -0,0 +1,33 @@
+GRPC_DIR := $(call select_from_ports,protobuf_grpc)/src/lib/grpc
+PROTO_DIR := $(GRPC_DIR)/examples/protos
+TARGET := grpc_tls_client
+
+LIBS := posix
+LIBS += protobuf
+LIBS += stdcxx
+LIBS += grpc
+LIBS += libc_pipe
+
+CC_CXX_WARN_STRICT :=
+
+PROTOC := /usr/local/genode/protobuf_grpc/current/bin/protoc
+GRPC_PLUGIN := /usr/local/genode/protobuf_grpc/current/bin/grpc_cpp_plugin
+
+SRC_CC := greeter_client.cc
+SRC_CC += helloworld.pb.cc
+SRC_CC += helloworld.grpc.pb.cc
+
+vpath helloworld.proto $(PROTO_DIR)
+
+$(SRC_CC): helloworld.grpc.pb.h
+
+helloworld.pb.h: helloworld.proto
+ $(VERBOSE)$(PROTOC) --proto_path=$(PROTO_DIR) \
+ --cpp_out=. \
+ $<
+
+helloworld.grpc.pb.h: helloworld.proto helloworld.pb.h
+ $(VERBOSE)$(PROTOC) --plugin=protoc-gen-grpc=$(GRPC_PLUGIN) \
+ --proto_path=$(PROTO_DIR) \
+ --grpc_out=. \
+ $<
diff --git a/src/test/grpc_tls/server/greeter_server.cc b/src/test/grpc_tls/server/greeter_server.cc
new file mode 100644
index 0000000..eb82c12
--- /dev/null
+++ b/src/test/grpc_tls/server/greeter_server.cc
@@ -0,0 +1,104 @@
+/*
+ *
+ * Copyright 2015 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
+#include
+#include
+#include
+
+
+#include
+
+#ifdef BAZEL_BUILD
+#include "examples/protos/helloworld.grpc.pb.h"
+#else
+#include "helloworld.grpc.pb.h"
+#endif
+
+#include "greeter_server.h"
+
+using grpc::Server;
+using grpc::ServerBuilder;
+using grpc::ServerContext;
+using grpc::Status;
+using grpc::ServerCredentials;
+using helloworld::HelloRequest;
+using helloworld::HelloReply;
+using helloworld::Greeter;
+
+// Logic and data behind the server's behavior.
+class GreeterServiceImpl final : public Greeter::Service {
+ Status SayHello(ServerContext* context, const HelloRequest* request,
+ HelloReply* reply) override {
+ printf("say hello\n");
+ std::string prefix("Hello ");
+ reply->set_message(prefix + request->name());
+ return Status::OK;
+ }
+};
+
+std::string read_file(const char* filename)
+{
+ const long max_size = 4096;
+
+ auto f = fopen(filename, "rb");
+
+ if (f == nullptr) {
+ Genode::error("cannot open file ", filename);
+ throw -1;
+ }
+
+ std::string res;
+ res.resize(max_size);
+
+ // C++17 defines .data() which returns a non-const pointer
+ const long size = fread(const_cast(res.data()), 1, max_size, f);
+ res.resize(size);
+
+ fclose(f);
+
+ return res;
+}
+
+void RunServer() {
+ GreeterServiceImpl service;
+
+ auto certificate = read_file("/server.crt");
+ auto private_key = read_file("/server.key");
+
+ grpc::SslServerCredentialsOptions::PemKeyCertPair pkcp = { private_key.c_str(), certificate.c_str() };
+ grpc::SslServerCredentialsOptions ssl_opts;
+ ssl_opts.pem_root_certs = "";
+ ssl_opts.pem_key_cert_pairs.push_back(pkcp);
+ std::shared_ptr credentials = grpc::SslServerCredentials(ssl_opts);
+
+ ServerBuilder builder;
+ // Listen on the given address without any authentication mechanism.
+ builder.AddListeningPort("0.0.0.0:50051", credentials);
+ // Register "service" as the instance through which we'll communicate with
+ // clients. In this case it corresponds to an *synchronous* service.
+ builder.RegisterService(&service);
+ // Finally assemble the server.
+ std::unique_ptr server(builder.BuildAndStart());
+ std::cout << "Server listening on" << std::endl;
+
+ // Wait for the server to shutdown. Note that some other thread must be
+ // responsible for shutting down the server for this call to ever return.
+ server->Wait();
+}
+
diff --git a/src/test/grpc_tls/server/greeter_server.h b/src/test/grpc_tls/server/greeter_server.h
new file mode 100644
index 0000000..1dc0617
--- /dev/null
+++ b/src/test/grpc_tls/server/greeter_server.h
@@ -0,0 +1,4 @@
+#pragma once
+
+void RunServer();
+
diff --git a/src/test/grpc_tls/server/main.cc b/src/test/grpc_tls/server/main.cc
new file mode 100644
index 0000000..a68ffd4
--- /dev/null
+++ b/src/test/grpc_tls/server/main.cc
@@ -0,0 +1,43 @@
+#include
+#include
+#include
+#include
+#include
+#include
+#include "greeter_server.h"
+
+enum { STACK_SIZE = 0xF000 };
+
+namespace Grpc_server {
+ using namespace Genode;
+
+ class Server_main;
+}
+
+static void *start_func(void*)
+{
+ Libc::with_libc([&] () {
+ RunServer();
+ });
+
+ return nullptr;
+}
+
+class Grpc_server::Server_main
+{
+ private:
+ Env& _env;
+ pthread_t _t;
+
+ public:
+ Server_main(Env& env)
+ : _env(env)
+ {
+ pthread_create(&_t, 0, start_func, &env);
+ }
+};
+
+void Libc::Component::construct(Libc::Env &env)
+{
+ static Grpc_server::Server_main main(env);
+}
diff --git a/src/test/grpc_tls/server/server.crt b/src/test/grpc_tls/server/server.crt
new file mode 100644
index 0000000..133dc51
--- /dev/null
+++ b/src/test/grpc_tls/server/server.crt
@@ -0,0 +1,20 @@
+-----BEGIN CERTIFICATE-----
+MIIDNzCCAh8CFDmH0KbQjaQFqix5NuZGZ6dyIOlRMA0GCSqGSIb3DQEBCwUAMFgx
+CzAJBgNVBAYTAkNIMQ0wCwYDVQQIDARUZXN0MQ0wCwYDVQQHDARUZXN0MQ0wCwYD
+VQQKDARUZXN0MQ0wCwYDVQQLDARUZXN0MQ0wCwYDVQQDDAR0ZXN0MB4XDTE5MTIx
+NDE2MDQyOVoXDTI5MTIxMTE2MDQyOVowWDELMAkGA1UEBhMCQ0gxDTALBgNVBAgM
+BFRlc3QxDTALBgNVBAcMBFRlc3QxDTALBgNVBAoMBFRlc3QxDTALBgNVBAsMBFRl
+c3QxDTALBgNVBAMMBHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCZroIEzgfq5WJQxlKf+BzovzJGtYcmIILW2e7ldc5GJDQGlTJ1/+aT+BmU/p7z
+redg3FoCIb4zV60If5/whbnL2d5sto/RKowr2Pl9WGmZ9WFP/gi92QwTfflmSMlR
+SGY0vxWKh/+XXTOxibgVnq5mBFPq1G2adMqDDjBkz+EuFyCtuiOJnwuhRmnGtckD
+UyrPo/tFgbAbd21OatqJzFPU2gPgHYBnXO0+IDcg+oMh8pUZbrglfoi3cqftcSZF
+7QtCz2ywjXTYKL4J3WGLimE5gzhcrAbridv4dJxuXuyNGOlD5kCzdhNeZpD3YiZw
+U4wY0LuQF8iTD2dp1MJY6cZRAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFDQlrgD
+nUV5rgVQuVgFh6vaMQ8pWwRtIsd8CuDfNIO+eE2yqaEkZNZVQ3pg60G9L6nUKq8c
+KndYJ2Ifx7B7XpgTDqIpfk63gGHf8qAf7LHQQ/4zj9tUZLFdZEHw08pwfDSAbdEf
+UGE1cdQb58mggLi8M5iCFPdTVxzhrKdXGah/H5BuLGdqj4RN86x2X6vi9gR3oEdZ
+XKgMnTakmm63CUunVKTJng1rvxEL8CXQN2oMBgbPmYkbfkzVv+R1VtqXUiclMx6H
+QlMKGmxqsBd6vSy10LkaOTJ+GScSNtr4ySoS9TQ6Jp+K7uz9n61o9lQUDdXbusRc
+h6t9Jl5c8l8aO/8=
+-----END CERTIFICATE-----
diff --git a/src/test/grpc_tls/server/server.csr b/src/test/grpc_tls/server/server.csr
new file mode 100644
index 0000000..054f4cf
--- /dev/null
+++ b/src/test/grpc_tls/server/server.csr
@@ -0,0 +1,17 @@
+-----BEGIN CERTIFICATE REQUEST-----
+MIICnTCCAYUCAQAwWDELMAkGA1UEBhMCQ0gxDTALBgNVBAgMBFRlc3QxDTALBgNV
+BAcMBFRlc3QxDTALBgNVBAoMBFRlc3QxDTALBgNVBAsMBFRlc3QxDTALBgNVBAMM
+BHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCZroIEzgfq5WJQ
+xlKf+BzovzJGtYcmIILW2e7ldc5GJDQGlTJ1/+aT+BmU/p7zredg3FoCIb4zV60I
+f5/whbnL2d5sto/RKowr2Pl9WGmZ9WFP/gi92QwTfflmSMlRSGY0vxWKh/+XXTOx
+ibgVnq5mBFPq1G2adMqDDjBkz+EuFyCtuiOJnwuhRmnGtckDUyrPo/tFgbAbd21O
+atqJzFPU2gPgHYBnXO0+IDcg+oMh8pUZbrglfoi3cqftcSZF7QtCz2ywjXTYKL4J
+3WGLimE5gzhcrAbridv4dJxuXuyNGOlD5kCzdhNeZpD3YiZwU4wY0LuQF8iTD2dp
+1MJY6cZRAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAQEATDOgGwIY/10Ubdhcdafm
+BjHZdkfwYUbusT0Qz97Mhgr/zDcBQizIyKUutWjAKs4+fku1Jorx7iQnVSidh4WI
+Cbsnf+AufVdS82VdkX3vMf0jm4yADIx2E5mH/eaXNB0NNsBoENNbOm7N5vJH1GXd
+NmJnc514O13yZ6LKIo78d6AI5qPFXwo3VQq7C3f/ekb3uvhwK3u4GrJmpvEuJDHw
+jL7KB8rlJRnmgzzB2nC8zO0w+OivsD9vmfCfNUul1g/4i7JMJMIXGmP8WiLOxSo2
+IU1p3edndeMSHFs4oiFC1Slf67Oc2yWoTLdLQWE3qn0exb056mfdyRAnAyJsv+Xt
+uQ==
+-----END CERTIFICATE REQUEST-----
diff --git a/src/test/grpc_tls/server/server.key b/src/test/grpc_tls/server/server.key
new file mode 100644
index 0000000..556a0c2
--- /dev/null
+++ b/src/test/grpc_tls/server/server.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAma6CBM4H6uViUMZSn/gc6L8yRrWHJiCC1tnu5XXORiQ0BpUy
+df/mk/gZlP6e863nYNxaAiG+M1etCH+f8IW5y9nebLaP0SqMK9j5fVhpmfVhT/4I
+vdkME335ZkjJUUhmNL8Viof/l10zsYm4FZ6uZgRT6tRtmnTKgw4wZM/hLhcgrboj
+iZ8LoUZpxrXJA1Mqz6P7RYGwG3dtTmraicxT1NoD4B2AZ1ztPiA3IPqDIfKVGW64
+JX6It3Kn7XEmRe0LQs9ssI102Ci+Cd1hi4phOYM4XKwG64nb+HScbl7sjRjpQ+ZA
+s3YTXmaQ92ImcFOMGNC7kBfIkw9nadTCWOnGUQIDAQABAoIBAHGbNlRU9jdn8KDj
+qurEoKJRzNnGkazWtcIcAuUvjBf/5VHEczQVwx85dbfV7i0XLodE/Wi8Bv2vX6N7
+rQFB6dJPMYTOBEzMlihH0k8dz5rXcWOP2Gh3jdzO8FHzlpb23U86vrLUzFXZuUAS
+Hbolvqh9pIdhF9Dpa1csYwvzPHQz0VrNxBjzhpusvATEM0XF0eeugLAJgS78PStL
+x6nh+g8Xj6G2ZZaKboDMs3sDCzHbuwjgSjRR8F0iPQ44v4b1ZiPlDlLH1m+jjHY/
+Yph3iR7InbNukg5W+qefserRdkVu6KtXa54Mx1Y13frN9jfDkk2L43Fbr8c+nGMN
+tJ277gECgYEAx1rN2oqRGREtFGsdeFd+a/3uqi2OpBHuxyVkrLWzzPVHwm30OlNo
+bEqjm0+oo9CsnJDfIAGctbZumT/uXTg2zTtDz470MX8HhB5vLBha9LZissrOIHPe
+VO3QeEcfeqS/jPnwuhhwjUnmYMhRPW6JRQpDcw17sq4Y7wtGN9HjseECgYEAxVlq
+omZggPQBDJkYg1ibB1HrjRN6X06jKKC0XXjR2hvGfZ1lUim/KQWlr5u0Tc3DLcHZ
+hM6/s3ZvvdQHJLlfUr3fgN9jQ3Iv6736LkkTSxqyweHuMErdobEGnlyhn58CfoX/
+MNC3fbRt0dD/lVr/c4xt5qAx4RHBFi0eN92UgnECgYBjVcvdac6DPxvHYNh+bpqA
+FTgndCvvdUAV23we0yuUpWPsbf2UUptl2otLiJXvirt4CHgl6qe7o/vYQRL1QF2O
+Rkmz0ve68iE8pC2hO0GXToo/rO6pHRNcHmQSit4UrqMEDEb3c9YhkQFKmIZipgGg
+dUzGt6E7l6S0+Fk011EuAQKBgDiN+FYT2qH5yvcuRG0Xjk3ZtxQVueLoKS+yZh3H
+SvQjM4259lhGaGa8HJAnodMOHVnWjJxXl245iaovweBPUzbl/M/0tICWj48SQUjU
+XjgOrZ2MPnMOcVct4QSu7Q5ORiu2ALyfg4X9l98h8qx9iGk3nCMUU1b5fIj7YwaF
+dFKxAoGAHhDg/WBf6oPxx9jTOCHfi8y9vEqSO+ANe0oldHWjTA9clljiypNJ9nGp
+LdEoJ3Nt6uG2OqVIag49Hs9gv7KOet/8NxZs9pVgqQqHRZhSWCK/klRCMnqmlk4K
+RfEih8s44da5hDlebF+gYS1YmmywnrGtn1nxYEhbNnG/TaQdYcA=
+-----END RSA PRIVATE KEY-----
diff --git a/src/test/grpc_tls/server/target.mk b/src/test/grpc_tls/server/target.mk
new file mode 100644
index 0000000..4ce1792
--- /dev/null
+++ b/src/test/grpc_tls/server/target.mk
@@ -0,0 +1,35 @@
+GRPC_DIR := $(call select_from_ports,protobuf_grpc)/src/lib/grpc
+PROTO_DIR := $(GRPC_DIR)/examples/protos
+TARGET := grpc_tls_server
+
+LIBS += protobuf
+LIBS += stdcxx
+LIBS += grpc
+LIBS += libc_pipe
+LIBS += vfs
+LIBS += vfs_lwip
+
+CC_CXX_WARN_STRICT :=
+
+PROTOC := /usr/local/genode/protobuf_grpc/current/bin/protoc
+GRPC_PLUGIN := /usr/local/genode/protobuf_grpc/current/bin/grpc_cpp_plugin
+
+SRC_CC := main.cc
+SRC_CC += greeter_server.cc
+SRC_CC += helloworld.pb.cc
+SRC_CC += helloworld.grpc.pb.cc
+
+vpath helloworld.proto $(PROTO_DIR)
+
+$(SRC_CC): helloworld.grpc.pb.h
+
+helloworld.pb.h: helloworld.proto
+ $(VERBOSE)$(PROTOC) --proto_path=$(PROTO_DIR) \
+ --cpp_out=. \
+ $<
+
+helloworld.grpc.pb.h: helloworld.proto helloworld.pb.h
+ $(VERBOSE)$(PROTOC) --plugin=protoc-gen-grpc=$(GRPC_PLUGIN) \
+ --proto_path=$(PROTO_DIR) \
+ --grpc_out=. \
+ $<