blob: 07058f3fdb01a19a98af43e21da21f92155a5547 [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// Copyright 2015 The Vanadium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
Asim Shankarae8d4c52014-10-08 13:03:31 -07005package security
Ankur100eb272014-09-15 16:48:12 -07006
7import (
gauthamt1e313bc2014-11-10 15:45:56 -08008 "io"
Ankur100eb272014-09-15 16:48:12 -07009
Jiri Simsa6ac95222015-02-23 16:11:49 -080010 "v.io/v23/security"
Mike Burrows7f7088d2015-03-25 13:05:00 -070011 "v.io/v23/verror"
Jiri Simsa6ac95222015-02-23 16:11:49 -080012 "v.io/v23/vom"
Todd Wangb3511492015-04-07 23:32:34 -070013 "v.io/x/ref/lib/security/serialization"
Ankur100eb272014-09-15 16:48:12 -070014)
15
Mike Burrows7f7088d2015-03-25 13:05:00 -070016var (
17 errBadDataOrSig = verror.Register(pkgPath+".errBadDataOrSig", verror.NoRetry, "{1:}{2:} invalid data/signature handles data:{3} sig:{4}{:_}")
18)
19
gauthamt1e313bc2014-11-10 15:45:56 -080020func encodeAndStore(obj interface{}, data, signature io.WriteCloser, signer serialization.Signer) error {
21 if data == nil || signature == nil {
Mike Burrows7f7088d2015-03-25 13:05:00 -070022 return verror.New(errBadDataOrSig, nil, data, signature)
Ankur100eb272014-09-15 16:48:12 -070023 }
gauthamt1e313bc2014-11-10 15:45:56 -080024 swc, err := serialization.NewSigningWriteCloser(data, signature, signer, nil)
Ankur100eb272014-09-15 16:48:12 -070025 if err != nil {
26 return err
27 }
Jungho Ahn5d1fe972015-04-27 17:51:32 -070028 enc := vom.NewEncoder(swc)
Suharsh Sivakumar51afaa32015-01-05 15:36:10 -080029 if err := enc.Encode(obj); err != nil {
Ankur100eb272014-09-15 16:48:12 -070030 swc.Close()
31 return err
32 }
gauthamt1e313bc2014-11-10 15:45:56 -080033 return swc.Close()
Ankur100eb272014-09-15 16:48:12 -070034}
35
gauthamt1e313bc2014-11-10 15:45:56 -080036func decodeFromStorage(obj interface{}, data, signature io.ReadCloser, publicKey security.PublicKey) error {
37 if data == nil || signature == nil {
Mike Burrows7f7088d2015-03-25 13:05:00 -070038 return verror.New(errBadDataOrSig, nil, data, signature)
Ankur100eb272014-09-15 16:48:12 -070039 }
gauthamt1e313bc2014-11-10 15:45:56 -080040 defer data.Close()
41 defer signature.Close()
42 vr, err := serialization.NewVerifyingReader(data, signature, publicKey)
Ankur100eb272014-09-15 16:48:12 -070043 if err != nil {
44 return err
45 }
Jungho Ahn5d1fe972015-04-27 17:51:32 -070046 dec := vom.NewDecoder(vr)
Suharsh Sivakumar51afaa32015-01-05 15:36:10 -080047 return dec.Decode(obj)
Ankur100eb272014-09-15 16:48:12 -070048}