- fix encryption, used the wrong nonce size
- encrypted files were not deleted
- fixed recursion
- fixed linter warnings
This commit is contained in:
2025-01-18 11:27:57 +01:00
parent eaca5ad181
commit f4b1ba5863
2 changed files with 29 additions and 73 deletions

View File

@@ -119,7 +119,7 @@ func GetRandomKey() ([]byte, error) {
return nil, err return nil, err
} }
salt, err := GenerateSecureRandomBytes(chapo.NonceSize) salt, err := GenerateSecureRandomBytes(chapo.NonceSizeX)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -156,11 +156,17 @@ func Encrypt(c *Conf, filename string) error {
for i := 0; i < c.count; i++ { for i := 0; i < c.count; i++ {
for { for {
if size < chunkSize { if size < chunkSize {
EncryptChunk(aead, outfile, size) if err := EncryptChunk(aead, outfile, size); err != nil {
return err
}
break break
} }
EncryptChunk(aead, outfile, chunkSize) if err := EncryptChunk(aead, outfile, chunkSize); err != nil {
return err
}
size = size - chunkSize size = size - chunkSize
if size <= 0 { if size <= 0 {
@@ -174,7 +180,7 @@ func Encrypt(c *Conf, filename string) error {
func EncryptChunk(aead cipher.AEAD, file *os.File, size int64) error { func EncryptChunk(aead cipher.AEAD, file *os.File, size int64) error {
chunk := make([]byte, size) chunk := make([]byte, size)
nonce, err := GenerateSecureRandomBytes(int(chapo.NonceSize)) nonce, err := GenerateSecureRandomBytes(int(chapo.NonceSizeX))
if err != nil { if err != nil {
return err return err
} }
@@ -192,58 +198,3 @@ func EncryptChunk(aead cipher.AEAD, file *os.File, size int64) error {
return nil return nil
} }
/*
func Encrypt(c *Conf, filename string) error {
salt, err := GetRand(KeySize)
if err != nil {
return err
}
salt1, err := GetRand(KeySize)
if err != nil {
return err
}
outfile, err := os.OpenFile(filename, os.O_RDWR|os.O_CREATE, 0666)
if err != nil {
return err
}
defer outfile.Close()
key := argon2.IDKey(salt1, salt, KeyTime, KeyMemory, KeyThreads, KeySize)
aead, err := chacha20poly1305.NewX(key)
if err != nil {
return err
}
buf := make([]byte, chunkSize)
ad_counter := 0 // associated data is a counter
for {
if n > 0 {
// Select a random nonce, and leave capacity for the ciphertext.
nonce := make([]byte, aead.NonceSize(), aead.NonceSize()+n+aead.Overhead())
if m, err := cryptorand.Read(nonce); err != nil || m != aead.NonceSize() {
return err
}
msg := buf[:n]
// Encrypt the message and append the ciphertext to the nonce.
encryptedMsg := aead.Seal(nonce, nonce, msg, []byte(string(ad_counter)))
outfile.Write(encryptedMsg)
ad_counter += 1
}
if err == io.EOF {
break
}
if err != nil {
log.Println("Error when reading input file chunk :", err)
panic(err)
}
}
}
*/

33
main.go
View File

@@ -18,7 +18,6 @@ package main
import ( import (
"fmt" "fmt"
"io/ioutil"
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
@@ -28,7 +27,7 @@ import (
flag "github.com/spf13/pflag" flag "github.com/spf13/pflag"
) )
const VERSION string = "0.0.2" const VERSION string = "0.0.3"
const Usage string = `This is gowipe - destruct files in a non-recoverable way. const Usage string = `This is gowipe - destruct files in a non-recoverable way.
Usage: gowipe [-rcvz] <file|directory>... Usage: gowipe [-rcvz] <file|directory>...
@@ -84,7 +83,7 @@ func main() {
flag.BoolVarP(&optzero, "zero", "Z", optzero, "zero mode") flag.BoolVarP(&optzero, "zero", "Z", optzero, "zero mode")
flag.BoolVarP(&optsecure, "secure", "S", optsecure, "secure mode") flag.BoolVarP(&optsecure, "secure", "S", optsecure, "secure mode")
flag.BoolVarP(&optmath, "math", "M", optmath, "math mode") flag.BoolVarP(&optmath, "math", "M", optmath, "math mode")
flag.BoolVarP(&optmath, "encrypt", "E", optmath, "encrypt mode") flag.BoolVarP(&optencrypt, "encrypt", "E", optmath, "encrypt mode")
flag.BoolVarP(&c.recurse, "recursive", "r", c.recurse, "recursive") flag.BoolVarP(&c.recurse, "recursive", "r", c.recurse, "recursive")
flag.BoolVarP(&c.nodelete, "nodelete", "n", c.nodelete, "don't delete") flag.BoolVarP(&c.nodelete, "nodelete", "n", c.nodelete, "don't delete")
@@ -153,7 +152,7 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
return return
} }
files, err := ioutil.ReadDir(file) files, err := os.ReadDir(file)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -162,6 +161,7 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
Wipe(filepath.Join(file, entry.Name()), c, wiper) Wipe(filepath.Join(file, entry.Name()), c, wiper)
} }
// delete dir
if !c.nodelete { if !c.nodelete {
err = os.Remove(Rename(file, c)) err = os.Remove(Rename(file, c))
if err != nil { if err != nil {
@@ -170,14 +170,21 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
} }
} else { } else {
if c.mode == "encrypt" { if c.mode == "encrypt" {
err := Encrypt(c, file) if err := Encrypt(c, file); err != nil {
if err != nil {
log.Fatal(err) log.Fatal(err)
} }
Rename(file, c) // delete encrypted file
if !c.nodelete {
err = os.Remove(Rename(file, c))
if err != nil {
log.Fatal(err)
}
}
} else { } else {
wiper.ShredFile(Rename(file, c)) if err := wiper.ShredFile(Rename(file, c)); err != nil {
log.Fatal(err)
}
} }
} }
@@ -204,7 +211,7 @@ func Rename(file string, c *Conf) string {
for i := 0; i < c.count; i++ { for i := 0; i < c.count; i++ {
for { for {
switch c.mode { switch c.mode {
case `secure`: case `secure`, `encrypt`:
new, err := GenerateSecureRandomString(length) new, err := GenerateSecureRandomString(length)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@@ -220,11 +227,9 @@ func Rename(file string, c *Conf) string {
} }
} }
/* if c.verbose {
if c.verbose { fmt.Printf("renaming %s/%s => %s/%s\n", dir, base, dir, newname)
fmt.Printf("renaming %s/%s => %s/%s\n", dir, base, dir, newname) }
}
*/
err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname)) err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname))
if err != nil { if err != nil {