9 Commits

Author SHA1 Message Date
f2116f39ef fix name typo 2025-01-18 11:36:56 +01:00
5907c5b2be add badges 2025-01-18 11:35:12 +01:00
8dbdebee46 fix ci builder 2025-01-18 11:33:02 +01:00
daabdc5c9b update dependencies 2025-01-18 11:29:45 +01:00
f4b1ba5863 fixes:
- fix encryption, used the wrong nonce size
- encrypted files were not deleted
- fixed recursion
- fixed linter warnings
2025-01-18 11:27:57 +01:00
eaca5ad181 fix typo 2025-01-18 11:03:18 +01:00
5ca1be594b mv to correct dir 2025-01-18 11:02:26 +01:00
aa03ba5281 add ci pipelines 2025-01-18 11:00:15 +01:00
74c801b914 typo 2023-11-25 14:53:07 +01:00
8 changed files with 112 additions and 80 deletions

35
.github/workflows/ci.yaml vendored Normal file
View File

@@ -0,0 +1,35 @@
name: build-and-test-gowipe
on: [push, pull_request]
jobs:
build:
strategy:
matrix:
version: ['1.21','1.22']
os: [ubuntu-latest, macos-latest, windows-latest]
name: Build
runs-on: ${{ matrix.os }}
steps:
- name: Set up Go ${{ matrix.version }}
uses: actions/setup-go@v5
with:
go-version: '${{ matrix.version }}'
id: go
- name: checkout
uses: actions/checkout@v4
- name: build
run: go build
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v5
with:
go-version: 1.22
- uses: actions/checkout@v4
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
skip-cache: true

32
.github/workflows/release.yaml vendored Normal file
View File

@@ -0,0 +1,32 @@
name: build-and-test
on:
push:
tags:
- "*"
jobs:
release:
name: Build Release Assets
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v1
with:
go-version: 1.22.11
- name: Build the executables
run: ./mkrel.sh gowipe ${{ github.ref_name}}
- name: List the executables
run: ls -l ./releases
- name: Upload the binaries
uses: svenstaro/upload-release-action@v2
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref_name }}
file: ./releases/*
file_glob: true

View File

@@ -55,8 +55,8 @@ goupdate:
buildall: buildall:
./mkrel.sh $(tool) $(VERSION) ./mkrel.sh $(tool) $(VERSION)
release: buildall release:
gh release create v$(VERSION) --generate-notes releases/* gh release create v$(VERSION) --generate-notes
show-versions: buildlocal show-versions: buildlocal
@echo "### gowipe version:" @echo "### gowipe version:"

View File

@@ -1,5 +1,11 @@
## gowipe - securely delete files and directories (not for SSD) ## gowipe - securely delete files and directories (not for SSD)
[![Actions](https://github.com/tlinden/gowipe/actions/workflows/ci.yaml/badge.svg)](https://github.com/tlinden/gowipe/actions)
[![License](https://img.shields.io/badge/license-GPL-blue.svg)](https://github.com/tlinden/gowipe/blob/master/LICENSE)
[![Go Report Card](https://goreportcard.com/badge/github.com/tlinden/gowipe)](https://goreportcard.com/report/github.com/tlinden/gowipe)
[![GitHub release](https://img.shields.io/github/v/release/tlinden/gowipe?color=%2300a719)](https://github.com/TLINDEN/gowipe/releases/latest)
``` ```
Usage: gowipe [-rcvz] <file|directory>... Usage: gowipe [-rcvz] <file|directory>...
@@ -22,7 +28,7 @@ encrypt Overwrite with ChaCha2Poly1305 encryption (most secure) (-E)
## Getting help ## Getting help
Although I'm happy to hear from tablizer users in private email, Although I'm happy to hear from gowipe users in private email,
that's the best way for me to forget to do something. that's the best way for me to forget to do something.
In order to report a bug, unexpected behavior, feature requests In order to report a bug, unexpected behavior, feature requests

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)
}
}
}
*/

9
go.mod
View File

@@ -3,9 +3,12 @@ module gowipe
go 1.20 go 1.20
require ( require (
github.com/JojiiOfficial/shred v1.2.1 // indirect github.com/JojiiOfficial/shred v1.2.1
github.com/spf13/pflag v1.0.5
golang.org/x/crypto v0.15.0
)
require (
github.com/lu4p/shred v0.0.0-20201211173428-0347b645d724 // indirect github.com/lu4p/shred v0.0.0-20201211173428-0347b645d724 // indirect
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/crypto v0.15.0 // indirect
golang.org/x/sys v0.14.0 // indirect golang.org/x/sys v0.14.0 // indirect
) )

27
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 {

View File

@@ -46,7 +46,7 @@ for D in $DIST; do
GOOS=${os} GOARCH=${arch} go build -o ${binfile} -ldflags "-X 'github.com/tlinden/tablizer/cfg.VERSION=${version}'" GOOS=${os} GOARCH=${arch} go build -o ${binfile} -ldflags "-X 'github.com/tlinden/tablizer/cfg.VERSION=${version}'"
mkdir -p ${tardir} mkdir -p ${tardir}
cp ${binfile} README.md LICENSE ${tardir}/ cp ${binfile} README.md LICENSE ${tardir}/
echo 'tool = tablizer echo 'tool = gowipe
PREFIX = /usr/local PREFIX = /usr/local
UID = root UID = root
GID = 0 GID = 0