blob: 0dd755b5bcbbca20304f6e5af18bfd5f7b8b159a [file] [log] [blame]
Asim Shankarae8d4c52014-10-08 13:03:31 -07001package security
Ankur100eb272014-09-15 16:48:12 -07002
3import (
4 "io/ioutil"
5 "os"
6 "path"
7
Jiri Simsa519c5072014-09-17 21:37:57 -07008 "veyron.io/veyron/veyron/security/serialization"
Ankur100eb272014-09-15 16:48:12 -07009
Jiri Simsa519c5072014-09-17 21:37:57 -070010 "veyron.io/veyron/veyron2/security"
11 "veyron.io/veyron/veyron2/vom"
Ankur100eb272014-09-15 16:48:12 -070012)
13
14func encodeAndStore(obj interface{}, dir, dataFile, sigFile string, signer serialization.Signer) error {
15 // Save the object to temporary data and signature files, and then move
16 // those files to the actual data and signature file. This reduces the
17 // risk of loosing all saved data on disk in the event of a Write failure.
18 data, err := ioutil.TempFile(dir, "data")
19 if err != nil {
20 return err
21 }
22 defer os.Remove(data.Name())
23 sig, err := ioutil.TempFile(dir, "sig")
24 if err != nil {
25 return err
26 }
27 defer os.Remove(sig.Name())
28
29 swc, err := serialization.NewSigningWriteCloser(data, sig, signer, nil)
30 if err != nil {
31 return err
32 }
33 if err := vom.NewEncoder(swc).Encode(obj); err != nil {
34 swc.Close()
35 return err
36 }
37 if err := swc.Close(); err != nil {
38 return err
39 }
40
41 if err := os.Rename(data.Name(), path.Join(dir, dataFile)); err != nil {
42 return err
43 }
44 return os.Rename(sig.Name(), path.Join(dir, sigFile))
45}
46
47func decodeFromStorage(obj interface{}, dir, dataFile, sigFile string, publicKey security.PublicKey) error {
48 data, dataErr := os.Open(path.Join(dir, dataFile))
49 defer data.Close()
50 sig, sigErr := os.Open(path.Join(dir, sigFile))
51 defer sig.Close()
52
53 switch {
54 case os.IsNotExist(dataErr) && os.IsNotExist(sigErr):
55 return nil
56 case dataErr != nil:
57 return dataErr
58 case sigErr != nil:
59 return sigErr
60 }
61
62 vr, err := serialization.NewVerifyingReader(data, sig, publicKey)
63 if err != nil {
64 return err
65 }
66 return vom.NewDecoder(vr).Decode(obj)
67}