mirror of
https://github.com/rwinkhart/rcw.git
synced 2026-08-31 22:36:41 -04:00
36 lines
1.1 KiB
Go
36 lines
1.1 KiB
Go
package wrappers
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"os"
|
|
|
|
"github.com/rwinkhart/go-boilerplate/security"
|
|
)
|
|
|
|
// GenSanityCheckAndZeroizePassphrase creates an encrypted file containing known plaintext
|
|
// to later be used for ensuring the user does not encrypt data with
|
|
// an incorrect passphrase.
|
|
func GenSanityCheckAndZeroizePassphrase(path string, passphrase []byte) error {
|
|
err := os.WriteFile(path, EncryptAndZeroizeDecBytesAndPassphrase([]byte("thx4usin'rcw"), passphrase), 0600)
|
|
security.ZeroizeBytes(passphrase)
|
|
return err
|
|
}
|
|
|
|
// RunSanityCheck should be run before any encryption operation
|
|
// to ensure the user does not encrypt data with an incorrect passphrase.
|
|
// Failure to perform this check could result in data loss.
|
|
func RunSanityCheck(path string, passphrase []byte) error {
|
|
encBytes, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return errors.New("Failed to read sanity check file (" + path + ")")
|
|
}
|
|
decBytes, err := DecryptAndZeroizePassphrase(encBytes, passphrase)
|
|
if err == nil {
|
|
if bytes.Equal(decBytes, []byte("thx4usin'rcw")) {
|
|
return nil
|
|
}
|
|
}
|
|
return errors.New("sanity check failed (likely due to inconsistent passphrase)")
|
|
}
|