xref: /aosp_15_r20/external/tink/python/tink/_keyset_reader.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"""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