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"""Reads Keysets from file.""" 16*e7b1675dSTing-Kang Chang 17*e7b1675dSTing-Kang Changimport abc 18*e7b1675dSTing-Kang Chang 19*e7b1675dSTing-Kang Changfrom google.protobuf import json_format 20*e7b1675dSTing-Kang Changfrom google.protobuf import message 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 KeysetReader(metaclass=abc.ABCMeta): 26*e7b1675dSTing-Kang Chang """Reads a Keyset.""" 27*e7b1675dSTing-Kang Chang 28*e7b1675dSTing-Kang Chang @abc.abstractmethod 29*e7b1675dSTing-Kang Chang def read(self) -> tink_pb2.Keyset: 30*e7b1675dSTing-Kang Chang """Reads and returns a (cleartext) tink_pb2.Keyset from its source.""" 31*e7b1675dSTing-Kang Chang raise NotImplementedError() 32*e7b1675dSTing-Kang Chang 33*e7b1675dSTing-Kang Chang @abc.abstractmethod 34*e7b1675dSTing-Kang Chang def read_encrypted(self) -> tink_pb2.EncryptedKeyset: 35*e7b1675dSTing-Kang Chang """Reads and returns an tink_pb2.EncryptedKeyset from its source.""" 36*e7b1675dSTing-Kang Chang raise NotImplementedError() 37*e7b1675dSTing-Kang Chang 38*e7b1675dSTing-Kang Chang 39*e7b1675dSTing-Kang Changclass JsonKeysetReader(KeysetReader): 40*e7b1675dSTing-Kang Chang """Reads a JSON Keyset.""" 41*e7b1675dSTing-Kang Chang 42*e7b1675dSTing-Kang Chang def __init__(self, serialized_keyset: str): 43*e7b1675dSTing-Kang Chang self._serialized_keyset = serialized_keyset 44*e7b1675dSTing-Kang Chang 45*e7b1675dSTing-Kang Chang def read(self) -> tink_pb2.Keyset: 46*e7b1675dSTing-Kang Chang try: 47*e7b1675dSTing-Kang Chang return json_format.Parse(self._serialized_keyset, tink_pb2.Keyset()) 48*e7b1675dSTing-Kang Chang except json_format.ParseError as e: 49*e7b1675dSTing-Kang Chang raise core.TinkError(e) 50*e7b1675dSTing-Kang Chang 51*e7b1675dSTing-Kang Chang def read_encrypted(self) -> tink_pb2.EncryptedKeyset: 52*e7b1675dSTing-Kang Chang try: 53*e7b1675dSTing-Kang Chang return json_format.Parse(self._serialized_keyset, 54*e7b1675dSTing-Kang Chang tink_pb2.EncryptedKeyset()) 55*e7b1675dSTing-Kang Chang except json_format.ParseError as e: 56*e7b1675dSTing-Kang Chang raise core.TinkError(e) 57*e7b1675dSTing-Kang Chang 58*e7b1675dSTing-Kang Chang 59*e7b1675dSTing-Kang Changclass BinaryKeysetReader(KeysetReader): 60*e7b1675dSTing-Kang Chang """Reads a binary Keyset.""" 61*e7b1675dSTing-Kang Chang 62*e7b1675dSTing-Kang Chang def __init__(self, serialized_keyset: bytes): 63*e7b1675dSTing-Kang Chang self._serialized_keyset = serialized_keyset 64*e7b1675dSTing-Kang Chang 65*e7b1675dSTing-Kang Chang def read(self) -> tink_pb2.Keyset: 66*e7b1675dSTing-Kang Chang if not self._serialized_keyset: 67*e7b1675dSTing-Kang Chang raise core.TinkError('No keyset found') 68*e7b1675dSTing-Kang Chang try: 69*e7b1675dSTing-Kang Chang return tink_pb2.Keyset.FromString(self._serialized_keyset) 70*e7b1675dSTing-Kang Chang except message.DecodeError as e: 71*e7b1675dSTing-Kang Chang raise core.TinkError(e) 72*e7b1675dSTing-Kang Chang 73*e7b1675dSTing-Kang Chang def read_encrypted(self) -> tink_pb2.EncryptedKeyset: 74*e7b1675dSTing-Kang Chang if not self._serialized_keyset: 75*e7b1675dSTing-Kang Chang raise core.TinkError('No keyset found') 76*e7b1675dSTing-Kang Chang try: 77*e7b1675dSTing-Kang Chang return tink_pb2.EncryptedKeyset.FromString(self._serialized_keyset) 78*e7b1675dSTing-Kang Chang except message.DecodeError as e: 79*e7b1675dSTing-Kang Chang raise core.TinkError(e) 80