blob: 0dd755b5bcbbca20304f6e5af18bfd5f7b8b159a [file] [log] [blame]
package security
import (
"io/ioutil"
"os"
"path"
"veyron.io/veyron/veyron/security/serialization"
"veyron.io/veyron/veyron2/security"
"veyron.io/veyron/veyron2/vom"
)
func encodeAndStore(obj interface{}, dir, dataFile, sigFile string, signer serialization.Signer) error {
// Save the object to temporary data and signature files, and then move
// those files to the actual data and signature file. This reduces the
// risk of loosing all saved data on disk in the event of a Write failure.
data, err := ioutil.TempFile(dir, "data")
if err != nil {
return err
}
defer os.Remove(data.Name())
sig, err := ioutil.TempFile(dir, "sig")
if err != nil {
return err
}
defer os.Remove(sig.Name())
swc, err := serialization.NewSigningWriteCloser(data, sig, signer, nil)
if err != nil {
return err
}
if err := vom.NewEncoder(swc).Encode(obj); err != nil {
swc.Close()
return err
}
if err := swc.Close(); err != nil {
return err
}
if err := os.Rename(data.Name(), path.Join(dir, dataFile)); err != nil {
return err
}
return os.Rename(sig.Name(), path.Join(dir, sigFile))
}
func decodeFromStorage(obj interface{}, dir, dataFile, sigFile string, publicKey security.PublicKey) error {
data, dataErr := os.Open(path.Join(dir, dataFile))
defer data.Close()
sig, sigErr := os.Open(path.Join(dir, sigFile))
defer sig.Close()
switch {
case os.IsNotExist(dataErr) && os.IsNotExist(sigErr):
return nil
case dataErr != nil:
return dataErr
case sigErr != nil:
return sigErr
}
vr, err := serialization.NewVerifyingReader(data, sig, publicKey)
if err != nil {
return err
}
return vom.NewDecoder(vr).Decode(obj)
}