blob: 633456dd1859494ceb106a945721b5a7264dadfa [file] [log] [blame]
gauthamtb7bb39b2014-11-10 11:40:41 -08001package security
2
3import (
4 "io"
gauthamt1e313bc2014-11-10 15:45:56 -08005 "os"
gauthamtb7bb39b2014-11-10 11:40:41 -08006)
7
8// SerializerReaderWriter is a factory for managing the readers and writers used for
9// serialization and deserialization of signed data.
10type SerializerReaderWriter interface {
11 // Readers returns io.ReadCloser for reading serialized data and its
12 // integrity signature.
13 Readers() (data io.ReadCloser, signature io.ReadCloser, err error)
14 // Writers returns io.WriteCloser for writing serialized data and its
15 // integrity signature.
16 Writers() (data io.WriteCloser, signature io.WriteCloser, err error)
17}
gauthamt1e313bc2014-11-10 15:45:56 -080018
19// FileSerializer implements SerializerReaderWriter that persists state to files.
20type FileSerializer struct {
21 data *os.File
22 signature *os.File
23
24 dataFilePath string
25 signatureFilePath string
26}
27
28// NewFileSerializer creates a FileSerializer with the given data and signature files.
29func NewFileSerializer(dataFilePath, signatureFilePath string) (*FileSerializer, error) {
30 data, err := os.Open(dataFilePath)
31 if err != nil && !os.IsNotExist(err) {
32 return nil, err
33 }
34 signature, err := os.Open(signatureFilePath)
35 if err != nil && !os.IsNotExist(err) {
36 return nil, err
37 }
38 return &FileSerializer{
39 data: data,
40 signature: signature,
41 dataFilePath: dataFilePath,
42 signatureFilePath: signatureFilePath,
43 }, nil
44}
45
46func (fs *FileSerializer) Readers() (io.ReadCloser, io.ReadCloser, error) {
47 if fs.data == nil || fs.signature == nil {
48 return nil, nil, nil
49 }
50 return fs.data, fs.signature, nil
51}
52
53func (fs *FileSerializer) Writers() (io.WriteCloser, io.WriteCloser, error) {
54 // Remove previous version of the files
55 os.Remove(fs.dataFilePath)
56 os.Remove(fs.signatureFilePath)
57 var err error
58 if fs.data, err = os.Create(fs.dataFilePath); err != nil {
59 return nil, nil, err
60 }
61 if fs.signature, err = os.Create(fs.signatureFilePath); err != nil {
62 return nil, nil, err
63 }
64 return fs.data, fs.signature, nil
65}