xref: /aosp_15_r20/external/tink/python/tink/_keyset_writer.py (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang# Copyright 2019 Google LLC
2*e7b1675dSTing-Kang Chang#
3*e7b1675dSTing-Kang Chang# Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang# you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang# You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang#
7*e7b1675dSTing-Kang Chang#      http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang#
9*e7b1675dSTing-Kang Chang# Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang# distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang# See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang# limitations under the License.
14*e7b1675dSTing-Kang Chang
15*e7b1675dSTing-Kang Chang"""Writes Keysets to file."""
16*e7b1675dSTing-Kang Chang
17*e7b1675dSTing-Kang Changimport abc
18*e7b1675dSTing-Kang Changfrom typing import BinaryIO, TextIO
19*e7b1675dSTing-Kang Chang
20*e7b1675dSTing-Kang Changfrom google.protobuf import json_format
21*e7b1675dSTing-Kang Changfrom tink.proto import tink_pb2
22*e7b1675dSTing-Kang Changfrom tink import core
23*e7b1675dSTing-Kang Chang
24*e7b1675dSTing-Kang Chang
25*e7b1675dSTing-Kang Changclass KeysetWriter(metaclass=abc.ABCMeta):
26*e7b1675dSTing-Kang Chang  """Knows how to write keysets to some storage system."""
27*e7b1675dSTing-Kang Chang
28*e7b1675dSTing-Kang Chang  @abc.abstractmethod
29*e7b1675dSTing-Kang Chang  def write(self, keyset: tink_pb2.Keyset) -> None:
30*e7b1675dSTing-Kang Chang    """Tries to write a tink_pb2.Keyset to some storage system."""
31*e7b1675dSTing-Kang Chang    raise NotImplementedError()
32*e7b1675dSTing-Kang Chang
33*e7b1675dSTing-Kang Chang  @abc.abstractmethod
34*e7b1675dSTing-Kang Chang  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
35*e7b1675dSTing-Kang Chang    """Tries to write an tink_pb2.EncryptedKeyset to some storage system."""
36*e7b1675dSTing-Kang Chang    raise NotImplementedError()
37*e7b1675dSTing-Kang Chang
38*e7b1675dSTing-Kang Chang
39*e7b1675dSTing-Kang Changclass JsonKeysetWriter(KeysetWriter):
40*e7b1675dSTing-Kang Chang  """Writes keysets in proto JSON wire format to some storage system.
41*e7b1675dSTing-Kang Chang
42*e7b1675dSTing-Kang Chang  cf. https://developers.google.com/protocol-buffers/docs/encoding
43*e7b1675dSTing-Kang Chang  """
44*e7b1675dSTing-Kang Chang
45*e7b1675dSTing-Kang Chang  def __init__(self, text_io_stream: TextIO):
46*e7b1675dSTing-Kang Chang    self._io_stream = text_io_stream
47*e7b1675dSTing-Kang Chang
48*e7b1675dSTing-Kang Chang  def write(self, keyset: tink_pb2.Keyset) -> None:
49*e7b1675dSTing-Kang Chang    if not isinstance(keyset, tink_pb2.Keyset):
50*e7b1675dSTing-Kang Chang      raise core.TinkError('invalid keyset.')
51*e7b1675dSTing-Kang Chang    json_keyset = json_format.MessageToJson(keyset)
52*e7b1675dSTing-Kang Chang    self._io_stream.write(json_keyset)
53*e7b1675dSTing-Kang Chang    self._io_stream.flush()
54*e7b1675dSTing-Kang Chang
55*e7b1675dSTing-Kang Chang  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
56*e7b1675dSTing-Kang Chang    if not isinstance(encrypted_keyset, tink_pb2.EncryptedKeyset):
57*e7b1675dSTing-Kang Chang      raise core.TinkError('invalid encrypted keyset.')
58*e7b1675dSTing-Kang Chang    json_keyset = json_format.MessageToJson(encrypted_keyset)
59*e7b1675dSTing-Kang Chang    self._io_stream.write(json_keyset)
60*e7b1675dSTing-Kang Chang    self._io_stream.flush()
61*e7b1675dSTing-Kang Chang
62*e7b1675dSTing-Kang Chang
63*e7b1675dSTing-Kang Changclass BinaryKeysetWriter(KeysetWriter):
64*e7b1675dSTing-Kang Chang  """Writes keysets in proto binary wire format to some storage system.
65*e7b1675dSTing-Kang Chang
66*e7b1675dSTing-Kang Chang  cf. https://developers.google.com/protocol-buffers/docs/encoding
67*e7b1675dSTing-Kang Chang  """
68*e7b1675dSTing-Kang Chang
69*e7b1675dSTing-Kang Chang  def __init__(self, binary_io_stream: BinaryIO):
70*e7b1675dSTing-Kang Chang    self._io_stream = binary_io_stream
71*e7b1675dSTing-Kang Chang
72*e7b1675dSTing-Kang Chang  def write(self, keyset: tink_pb2.Keyset) -> None:
73*e7b1675dSTing-Kang Chang    if not isinstance(keyset, tink_pb2.Keyset):
74*e7b1675dSTing-Kang Chang      raise core.TinkError('invalid keyset.')
75*e7b1675dSTing-Kang Chang    self._io_stream.write(keyset.SerializeToString())
76*e7b1675dSTing-Kang Chang    self._io_stream.flush()
77*e7b1675dSTing-Kang Chang
78*e7b1675dSTing-Kang Chang  def write_encrypted(self, encrypted_keyset: tink_pb2.EncryptedKeyset) -> None:
79*e7b1675dSTing-Kang Chang    if not isinstance(encrypted_keyset, tink_pb2.EncryptedKeyset):
80*e7b1675dSTing-Kang Chang      raise core.TinkError('invalid encrypted keyset.')
81*e7b1675dSTing-Kang Chang    self._io_stream.write(encrypted_keyset.SerializeToString())
82*e7b1675dSTing-Kang Chang    self._io_stream.flush()
83