xref: /aosp_15_r20/external/tink/go/keyset/binary_io.go (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1// Copyright 2019 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//      http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
15////////////////////////////////////////////////////////////////////////////////
16
17package keyset
18
19import (
20	"io"
21
22	"google.golang.org/protobuf/proto"
23
24	tinkpb "github.com/google/tink/go/proto/tink_go_proto"
25)
26
27// BinaryReader deserializes a keyset from binary proto format.
28type BinaryReader struct {
29	r io.Reader
30}
31
32// NewBinaryReader returns new BinaryReader that will read from r.
33func NewBinaryReader(r io.Reader) *BinaryReader {
34	return &BinaryReader{r: r}
35}
36
37// Read parses a (cleartext) keyset from the underlying io.Reader.
38func (bkr *BinaryReader) Read() (*tinkpb.Keyset, error) {
39	keyset := &tinkpb.Keyset{}
40
41	if err := read(bkr.r, keyset); err != nil {
42		return nil, err
43	}
44	return keyset, nil
45}
46
47// ReadEncrypted parses an EncryptedKeyset from the underlying io.Reader.
48func (bkr *BinaryReader) ReadEncrypted() (*tinkpb.EncryptedKeyset, error) {
49	keyset := &tinkpb.EncryptedKeyset{}
50
51	if err := read(bkr.r, keyset); err != nil {
52		return nil, err
53	}
54	return keyset, nil
55}
56
57func read(r io.Reader, msg proto.Message) error {
58	data, err := io.ReadAll(r)
59	if err != nil {
60		return err
61	}
62
63	return proto.Unmarshal(data, msg)
64}
65
66// BinaryWriter serializes a keyset into binary proto format.
67type BinaryWriter struct {
68	w io.Writer
69}
70
71// NewBinaryWriter returns a new BinaryWriter that will write to w.
72func NewBinaryWriter(w io.Writer) *BinaryWriter {
73	return &BinaryWriter{w: w}
74}
75
76// Write writes the keyset to the underlying io.Writer.
77func (bkw *BinaryWriter) Write(keyset *tinkpb.Keyset) error {
78	return write(bkw.w, keyset)
79}
80
81// WriteEncrypted writes the encrypted keyset to the underlying io.Writer.
82func (bkw *BinaryWriter) WriteEncrypted(keyset *tinkpb.EncryptedKeyset) error {
83	return write(bkw.w, keyset)
84}
85
86func write(w io.Writer, msg proto.Message) error {
87	data, err := proto.Marshal(msg)
88	if err != nil {
89		return err
90	}
91
92	_, err = w.Write(data)
93	return err
94}
95