()
| 245 | } |
| 246 | |
| 247 | func cmdRekey() { |
| 248 | fs := flag.NewFlagSet("rekey", flag.ExitOnError) |
| 249 | fs.Parse(os.Args[2:]) |
| 250 | old, err := keychain.LoadMasterKey() |
| 251 | if err != nil { fatal(err) } |
| 252 | newk := make([]byte, 32) |
| 253 | if _, err := io.ReadFull(rand.Reader, newk); err != nil { fatal(err) } |
| 254 | dir := store.KeysDir() |
| 255 | entries, err := os.ReadDir(dir) |
| 256 | if err != nil && !os.IsNotExist(err) { fatal(err) } |
| 257 | for _, e := range entries { |
| 258 | if e.IsDir() || !strings.HasSuffix(e.Name(), ".enc") { continue } |
| 259 | alias := strings.TrimSuffix(e.Name(), ".enc") |
| 260 | rec, err := store.LoadDecryptedRecord(alias, old) |
| 261 | if err != nil { fatal(err) } |
| 262 | if err := store.SaveEncryptedRecord(rec, newk); err != nil { fatal(err) } |
| 263 | } |
| 264 | if err := keychain.StoreMasterKey(newk, true); err != nil { fatal(err) } |
| 265 | fmt.Println("rekeyed master key and re-encrypted all records") |
| 266 | } |
| 267 | |
| 268 | func fatal(err error) { |
| 269 | fmt.Fprintln(os.Stderr, "error:", err) |
no test coverage detected