// importTombFile decrypts a file with the given path, using a hex-encoded key // and loads the client state from the result. func (c *client) importTombFile(stateFile *disk.StateFile, keyHex, path string) error { keyBytes, err := hex.DecodeString(keyHex) if err != nil { return err } var key [32]byte var nonce [24]byte if len(keyBytes) != len(key) { return fmt.Errorf("Incorrect key length: %d (want %d)", len(keyBytes), len(key)) } copy(key[:], keyBytes) tombBytes, err := ioutil.ReadFile(path) if err != nil { return err } plaintext, ok := secretbox.Open(nil, tombBytes, &nonce, &key) if !ok { return errors.New("Incorrect key") } c.stateLock, err = stateFile.Lock(true /* create */) if c.stateLock == nil && err == nil { return errors.New("Output statefile is locked.") } if err != nil { return err } writerChan := make(chan disk.NewState) writerDone := make(chan struct{}) go stateFile.StartWriter(writerChan, writerDone) writerChan <- disk.NewState{State: plaintext} close(writerChan) <-writerDone return nil }