Define Python Streaming AEAD.
PiperOrigin-RevId: 267113585
diff --git a/python/streaming_aead/streaming_aead.py b/python/streaming_aead/streaming_aead.py
new file mode 100644
index 0000000..5d5a074
--- /dev/null
+++ b/python/streaming_aead/streaming_aead.py
@@ -0,0 +1,114 @@
+# 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.
+"""This module defines the interface for Streaming AEAD."""
+
+from __future__ import absolute_import
+from __future__ import division
+from __future__ import google_type_annotations
+from __future__ import print_function
+
+import abc
+from typing import BinaryIO
+
+
+class StreamingAead(object):
+ """The interface for streaming authenticated encryption with associated data.
+
+ Streaming encryption is typically used for encrypting large plaintexts such
+ as large files. This interface supports a streaming interface for symmetric
+ encryption with authentication. The underlying encryption modes are selected
+ so that partial plaintext can be obtained fast by decrypting and
+ authenticating just a part of the ciphertext.
+ """
+
+ __metaclass__ = abc.ABCMeta
+
+ @abc.abstractmethod
+ def new_encrypting_stream(self, ciphertext_destination: BinaryIO,
+ associated_data: bytes) -> BinaryIO:
+ """Get a new encrypting stream that writes to ciphertext_destination.
+
+ Args:
+ ciphertext_destination: A writable binary file object to which ciphertext
+ will be written. It must support write(), close(), closed, and
+ writable().
+ associated_data: Associated data to be used by the AEAD encryption. It is
+ not included in the ciphertext and must be passed in as a parameter for
+ decryption.
+
+ Returns:
+ An encrypting file object wrapper around 'ciphertext_destination', such
+ that any bytes written to the wrapper are AEAD-encrypted using
+ 'associated_data' as associated authenticated data.
+
+ It supports the following:
+ write()
+ close()
+ closed
+ tell()
+ isatty()
+ flush() (no-op)
+ writable()
+ readable()
+ seekable()
+ __enter__() and __exit__()
+ Other methods, including read() and seek(), raise io.UnsupportedOperation.
+ Closing the wrapper also closes the ciphertext_destination.
+
+ Raises:
+ tink.TinkError if the creation fails.
+ """
+ raise NotImplementedError()
+
+ @abc.abstractmethod
+ def new_decrypting_stream(self, ciphertext_source: BinaryIO,
+ associated_data: bytes) -> BinaryIO:
+ """Get a new decrypting stream that reads from ciphertext_source.
+
+ Args:
+ ciphertext_source: A readable binary file object from which ciphertext
+ will be read.
+ associated_data: Associated data to be used by the AEAD decryption. It
+ must match the associated_data supplied for the encryption.
+
+ Returns:
+ A decrypting file object wrapper around 'ciphertext_source', such that
+ any bytes read from the wrapper are AEAD-decrypted using 'associated_data'
+ as associated authenticated data.
+
+ It supports the following:
+ read()
+ read1()
+ readinto()
+ readinto1()
+ readline()
+ readlines()
+ readall()
+ close()
+ closed
+ tell()
+ isatty()
+ flush() (no-op)
+ readable()
+ writable()
+ seekable()
+ __enter__() and __exit__()
+ __iter__() and __next__()
+ Other methods, including write() and seek(), raise
+ io.UnsupportedOperation.
+ Closing the wrapper also closes the ciphertext_source.
+
+ Raises:
+ tink.TinkError if the creation fails.
+
+ """
+ raise NotImplementedError()