mirror of
https://codeberg.org/scip/gowipe.git
synced 2025-12-17 04:30:57 +01:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f2116f39ef | |||
| 5907c5b2be | |||
| 8dbdebee46 | |||
| daabdc5c9b | |||
| f4b1ba5863 | |||
| eaca5ad181 | |||
| 5ca1be594b | |||
| aa03ba5281 | |||
| 74c801b914 |
35
.github/workflows/ci.yaml
vendored
Normal file
35
.github/workflows/ci.yaml
vendored
Normal 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
32
.github/workflows/release.yaml
vendored
Normal 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
|
||||
4
Makefile
4
Makefile
@@ -55,8 +55,8 @@ goupdate:
|
||||
buildall:
|
||||
./mkrel.sh $(tool) $(VERSION)
|
||||
|
||||
release: buildall
|
||||
gh release create v$(VERSION) --generate-notes releases/*
|
||||
release:
|
||||
gh release create v$(VERSION) --generate-notes
|
||||
|
||||
show-versions: buildlocal
|
||||
@echo "### gowipe version:"
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
## gowipe - securely delete files and directories (not for SSD)
|
||||
|
||||
[](https://github.com/tlinden/gowipe/actions)
|
||||
[](https://github.com/tlinden/gowipe/blob/master/LICENSE)
|
||||
[](https://goreportcard.com/report/github.com/tlinden/gowipe)
|
||||
[](https://github.com/TLINDEN/gowipe/releases/latest)
|
||||
|
||||
|
||||
```
|
||||
Usage: gowipe [-rcvz] <file|directory>...
|
||||
|
||||
@@ -22,7 +28,7 @@ encrypt Overwrite with ChaCha2Poly1305 encryption (most secure) (-E)
|
||||
|
||||
## 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.
|
||||
|
||||
In order to report a bug, unexpected behavior, feature requests
|
||||
|
||||
69
crypto.go
69
crypto.go
@@ -119,7 +119,7 @@ func GetRandomKey() ([]byte, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
salt, err := GenerateSecureRandomBytes(chapo.NonceSize)
|
||||
salt, err := GenerateSecureRandomBytes(chapo.NonceSizeX)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -156,11 +156,17 @@ func Encrypt(c *Conf, filename string) error {
|
||||
for i := 0; i < c.count; i++ {
|
||||
for {
|
||||
if size < chunkSize {
|
||||
EncryptChunk(aead, outfile, size)
|
||||
if err := EncryptChunk(aead, outfile, size); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
break
|
||||
}
|
||||
|
||||
EncryptChunk(aead, outfile, chunkSize)
|
||||
if err := EncryptChunk(aead, outfile, chunkSize); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
size = size - chunkSize
|
||||
|
||||
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 {
|
||||
chunk := make([]byte, size)
|
||||
nonce, err := GenerateSecureRandomBytes(int(chapo.NonceSize))
|
||||
nonce, err := GenerateSecureRandomBytes(int(chapo.NonceSizeX))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -192,58 +198,3 @@ func EncryptChunk(aead cipher.AEAD, file *os.File, size int64) error {
|
||||
|
||||
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
9
go.mod
@@ -3,9 +3,12 @@ module gowipe
|
||||
go 1.20
|
||||
|
||||
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/spf13/pflag v1.0.5 // indirect
|
||||
golang.org/x/crypto v0.15.0 // indirect
|
||||
golang.org/x/sys v0.14.0 // indirect
|
||||
)
|
||||
|
||||
27
main.go
27
main.go
@@ -18,7 +18,6 @@ package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"log"
|
||||
"os"
|
||||
"path/filepath"
|
||||
@@ -28,7 +27,7 @@ import (
|
||||
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.
|
||||
|
||||
Usage: gowipe [-rcvz] <file|directory>...
|
||||
@@ -84,7 +83,7 @@ func main() {
|
||||
flag.BoolVarP(&optzero, "zero", "Z", optzero, "zero mode")
|
||||
flag.BoolVarP(&optsecure, "secure", "S", optsecure, "secure 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.nodelete, "nodelete", "n", c.nodelete, "don't delete")
|
||||
@@ -153,7 +152,7 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
||||
return
|
||||
}
|
||||
|
||||
files, err := ioutil.ReadDir(file)
|
||||
files, err := os.ReadDir(file)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
@@ -162,6 +161,7 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
||||
Wipe(filepath.Join(file, entry.Name()), c, wiper)
|
||||
}
|
||||
|
||||
// delete dir
|
||||
if !c.nodelete {
|
||||
err = os.Remove(Rename(file, c))
|
||||
if err != nil {
|
||||
@@ -170,14 +170,21 @@ func Wipe(file string, c *Conf, wiper *shred.ShredderConf) {
|
||||
}
|
||||
} else {
|
||||
if c.mode == "encrypt" {
|
||||
err := Encrypt(c, file)
|
||||
if err != nil {
|
||||
if err := Encrypt(c, file); err != nil {
|
||||
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 {
|
||||
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 {
|
||||
switch c.mode {
|
||||
case `secure`:
|
||||
case `secure`, `encrypt`:
|
||||
new, err := GenerateSecureRandomString(length)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@@ -220,11 +227,9 @@ func Rename(file string, c *Conf) string {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
if c.verbose {
|
||||
fmt.Printf("renaming %s/%s => %s/%s\n", dir, base, dir, newname)
|
||||
}
|
||||
*/
|
||||
|
||||
err := os.Rename(filepath.Join(dir, base), filepath.Join(dir, newname))
|
||||
if err != nil {
|
||||
|
||||
2
mkrel.sh
2
mkrel.sh
@@ -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}'"
|
||||
mkdir -p ${tardir}
|
||||
cp ${binfile} README.md LICENSE ${tardir}/
|
||||
echo 'tool = tablizer
|
||||
echo 'tool = gowipe
|
||||
PREFIX = /usr/local
|
||||
UID = root
|
||||
GID = 0
|
||||
|
||||
Reference in New Issue
Block a user