diff --git a/python/cc/BUILD.bazel b/python/cc/BUILD.bazel
index b33c5524ad518f1890d5d8672e6a6bc4f74a702f..95fe24b6a155a5d9e48b1319b922e425ad85a8cc 100644
--- a/python/cc/BUILD.bazel
+++ b/python/cc/BUILD.bazel
@@ -14,3 +14,12 @@ cc_library(
         "//proto:tink_cc_proto",
     ],
 )
+
+cc_library(
+    name = "simple_output_stream",
+    hdrs = ["simple_output_stream.h"],
+    deps = [
+        "//cc/util:status",
+        "@com_google_absl//absl/strings",
+    ],
+)
diff --git a/python/cc/clif/simple_output_stream.clif b/python/cc/clif/simple_output_stream.clif
new file mode 100644
index 0000000000000000000000000000000000000000..211a20581839a663393537be3e2e96f7ac989db5
--- /dev/null
+++ b/python/cc/clif/simple_output_stream.clif
@@ -0,0 +1,25 @@
+# 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.
+
+from "tink/python/util/clif.h" import *  # Status
+
+from "tink/python/cc/simple_output_stream.h":
+  namespace `crypto::tink`:
+    class SimpleOutputStream:
+      @virtual
+      def `Write` as write(self, data: bytes) -> Status
+
+      @virtual
+      def `Close` as close(self) -> Status
+
+      @virtual
+      def `Position` as position(self) -> int
diff --git a/python/cc/simple_output_stream.h b/python/cc/simple_output_stream.h
new file mode 100644
index 0000000000000000000000000000000000000000..05c81246be99f92c8b06e23b8cf306d681475617
--- /dev/null
+++ b/python/cc/simple_output_stream.h
@@ -0,0 +1,43 @@
+// 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 TINK_PYTHON_CC_SIMPLE_OUTPUT_STREAM_H_
+#define TINK_PYTHON_CC_SIMPLE_OUTPUT_STREAM_H_
+
+#include "absl/strings/string_view.h"
+#include "tink/util/status.h"
+
+namespace crypto {
+namespace tink {
+
+// A simple interface for an output stream like object which can be used to go
+// from Python to C++ via CLIF and vice versa.
+class SimpleOutputStream {
+ public:
+  // Writes 'data' to the underlying stream.
+  virtual util::Status Write(absl::string_view data) = 0;
+
+  // Closes the underlying stream.
+  virtual util::Status Close() = 0;
+
+  // Returns the total number of bytes written.
+  virtual int64_t Position() const = 0;
+
+  virtual ~SimpleOutputStream() {}
+};
+
+}  // namespace tink
+}  // namespace crypto
+
+#endif  // TINK_PYTHON_CC_SIMPLE_OUTPUT_STREAM_H_