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