Update Picocrypt.go

This commit is contained in:
Evan Su 2021-05-26 15:04:28 -04:00 committed by GitHub
parent 599c7bddd9
commit c48e39af58
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 313 additions and 136 deletions

View File

@ -41,6 +41,7 @@ import (
"golang.org/x/crypto/blake2b" "golang.org/x/crypto/blake2b"
"golang.org/x/crypto/blake2s" "golang.org/x/crypto/blake2s"
"github.com/atotto/clipboard" "github.com/atotto/clipboard"
"golang.org/x/crypto/ripemd160"
"github.com/klauspost/reedsolomon" "github.com/klauspost/reedsolomon"
ig "github.com/AllenDang/imgui-go" ig "github.com/AllenDang/imgui-go"
"golang.org/x/crypto/chacha20poly1305" "golang.org/x/crypto/chacha20poly1305"
@ -70,6 +71,7 @@ var orLabel = "or"
var passwordState = g.InputTextFlags_Password var passwordState = g.InputTextFlags_Password
var showPassword = false var showPassword = false
var keyfile = false var keyfile = false
var keyfilePrompt = "Keyfile (optional):"
var progress float32 = 0 var progress float32 = 0
var progressInfo = "" var progressInfo = ""
var status = "Ready." var status = "Ready."
@ -89,8 +91,11 @@ var shredding = "Ready."
// User input variables // User input variables
var password string var password string
var cPassword string var cPassword string
var keyfilePath string
var keyfileLabel = "Use a keyfile"
var metadata string var metadata string
var keep bool var keep bool
var erase bool
var reedsolo bool var reedsolo bool
var split bool var split bool
var splitSize string var splitSize string
@ -109,6 +114,7 @@ var rs64_128,_ = reedsolomon.New(64,128)
// File checksum generator variables // File checksum generator variables
var cs_md5 string var cs_md5 string
var cs_ripemd string
var cs_sha1 string var cs_sha1 string
var cs_sha256 string var cs_sha256 string
var cs_sha3_256 string var cs_sha3_256 string
@ -117,6 +123,7 @@ var cs_blake2s string
var cs_blake3 string var cs_blake3 string
var cs_validate string var cs_validate string
var md5_color = color.RGBA{0x10,0x10,0x10,255} var md5_color = color.RGBA{0x10,0x10,0x10,255}
var ripemd_color = color.RGBA{0x10,0x10,0x10,255}
var sha1_color = color.RGBA{0x10,0x10,0x10,255} var sha1_color = color.RGBA{0x10,0x10,0x10,255}
var sha256_color = color.RGBA{0x10,0x10,0x10,255} var sha256_color = color.RGBA{0x10,0x10,0x10,255}
var sha3_256_color = color.RGBA{0x10,0x10,0x10,255} var sha3_256_color = color.RGBA{0x10,0x10,0x10,255}
@ -125,6 +132,7 @@ var blake2s_color = color.RGBA{0x10,0x10,0x10,255}
var blake3_color = color.RGBA{0x10,0x10,0x10,255} var blake3_color = color.RGBA{0x10,0x10,0x10,255}
var cs_progress float32 = 0 var cs_progress float32 = 0
var md5_selected = false var md5_selected = false
var ripemd_selected = false
var sha1_selected = false var sha1_selected = false
var sha256_selected = false var sha256_selected = false
var sha3_256_selected = false var sha3_256_selected = false
@ -197,8 +205,8 @@ func startUI(){
//g.Dummy(10,0), //g.Dummy(10,0),
g.Row( g.Row(
g.Label("Password:"), g.Label("Password:"),
g.Dummy(-200,0), g.Dummy(-220,0),
g.Label("Password:"), g.Label(keyfilePrompt),
), ),
g.Row( g.Row(
g.InputText("##password",&password).Size(200/dpi).Flags(passwordState), g.InputText("##password",&password).Size(200/dpi).Flags(passwordState),
@ -210,8 +218,20 @@ func startUI(){
} }
g.Update() g.Update()
}), }),
g.Dummy(-200,0), g.Dummy(-220,0),
g.Checkbox("Use a keyfile",&keyfile), g.Checkbox(keyfileLabel,&keyfile).OnChange(func(){
if !keyfile{
keyfileLabel = "Use a keyfile"
return
}
filename,err := di.File().Load()
if err!=nil{
keyfile = false
return
}
keyfileLabel = filename
keyfilePath = filename
}),
), ),
// Prompt to confirm password // Prompt to confirm password
@ -222,11 +242,12 @@ func startUI(){
// Optional metadata // Optional metadata
//g.Dummy(10,0), //g.Dummy(10,0),
g.Label("Metadata (optional):"), g.Label("Metadata (optional):"),
g.InputTextMultiline("##metadata",&metadata).Size(226,126), g.InputTextMultiline("##metadata",&metadata).Size(230,126),
// Advanced options can be enabled with checkboxes // Advanced options can be enabled with checkboxes
//g.Dummy(10,0), //g.Dummy(10,0),
g.Checkbox("Keep decrypted output even if it's corrupted or modified",&keep), g.Checkbox("Keep decrypted output even if it's corrupted or modified",&keep),
g.Checkbox("Securely shred the original file(s) and folder(s)",&erase),
g.Row( g.Row(
g.Checkbox("Encode with Reed-Solomon to prevent corruption",&reedsolo), g.Checkbox("Encode with Reed-Solomon to prevent corruption",&reedsolo),
g.Button("?").OnClick(func(){ g.Button("?").OnClick(func(){
@ -271,7 +292,7 @@ func startUI(){
} }
}), }),
g.Label("Select a mode below and drop a file here."), g.Label("Select a mode below and drop file(s) and folder(s) here."),
g.Label("Warning: Anything dropped here will be shredded immediately!"), g.Label("Warning: Anything dropped here will be shredded immediately!"),
//g.Dummy(10,0), //g.Dummy(10,0),
g.Combo("##shredder_mode",items[itemSelected],items,&itemSelected).Size(464), g.Combo("##shredder_mode",items[itemSelected],items,&itemSelected).Size(464),
@ -299,10 +320,24 @@ func startUI(){
g.Button("Copy##md5").Size(36,0).OnClick(func(){ g.Button("Copy##md5").Size(36,0).OnClick(func(){
clipboard.WriteAll(cs_md5) clipboard.WriteAll(cs_md5)
}), }),
), g.Style().SetColor(ig.StyleColorBorder,md5_color).To( ),
g.Style().SetColor(ig.StyleColorBorder,md5_color).To(
g.InputText("##cs_md5",&cs_md5).Size(-1).Flags(g.InputTextFlags_ReadOnly), g.InputText("##cs_md5",&cs_md5).Size(-1).Flags(g.InputTextFlags_ReadOnly),
), ),
// RIPEMD
//g.Dummy(10,0),
g.Row(
g.Checkbox("RIPEMD-160:",&ripemd_selected),
g.Dummy(-45,0),
g.Button("Copy##ripemd").Size(36,0).OnClick(func(){
clipboard.WriteAll(cs_ripemd)
}),
),
g.Style().SetColor(ig.StyleColorBorder,ripemd_color).To(
g.InputText("##cs_ripemd",&cs_ripemd).Size(-1).Flags(g.InputTextFlags_ReadOnly),
),
// SHA1 // SHA1
//g.Dummy(10,0), //g.Dummy(10,0),
g.Row( g.Row(
@ -506,7 +541,6 @@ func onDrop(names []string){
// Open input file in read-only mode // Open input file in read-only mode
fin,_ := os.Open(names[0]) fin,_ := os.Open(names[0])
defer fin.Close()
// Read metadata and insert into box // Read metadata and insert into box
fin.Read(make([]byte,133)) fin.Read(make([]byte,133))
@ -519,6 +553,16 @@ func onDrop(names []string){
fin.Read(tmp) fin.Read(tmp)
metadata = string(tmp) metadata = string(tmp)
flags := make([]byte,133)
fin.Read(flags)
flags = rsDecode(flags,rs5_128,5)
if flags[1]==1{
keyfilePrompt = "Keyfile (required):"
keyfileLabel = "Click here to select keyfile."
}
fin.Close()
}else{ }else{
mode = "encrypt" mode = "encrypt"
inputLabel = name+" (will encrypt)" inputLabel = name+" (will encrypt)"
@ -591,7 +635,7 @@ func onDrop(names []string){
} }
} }
}else if tab==1{ }else if tab==1{
go shred(names) go shred(names,true)
}else if tab==2{ }else if tab==2{
go generateChecksums(names[0]) go generateChecksums(names[0])
} }
@ -611,7 +655,9 @@ func work(){
var nonce []byte var nonce []byte
var keyHash []byte var keyHash []byte
var _keyHash []byte var _keyHash []byte
var keyfileHash []byte var khash []byte
var khash_hash []byte
var _khash_hash []byte
var nonces []byte var nonces []byte
// Set the output file based on mode // Set the output file based on mode
@ -687,6 +733,9 @@ func work(){
if fast{ if fast{
flags[0] = 1 flags[0] = 1
} }
if keyfile{
flags[1] = 1
}
//fmt.Println("flags:",flags) //fmt.Println("flags:",flags)
flags = rsEncode(flags,rs5_128,133) flags = rsEncode(flags,rs5_128,133)
fout.Write(flags) fout.Write(flags)
@ -739,6 +788,7 @@ func work(){
flags = rsDecode(flags,rs5_128,5) flags = rsDecode(flags,rs5_128,5)
//fmt.Println("flags",flags) //fmt.Println("flags",flags)
fast = flags[0]==1 fast = flags[0]==1
keyfile = flags[1]==1
salt = make([]byte,144) salt = make([]byte,144)
fin.Read(salt) fin.Read(salt)
@ -756,9 +806,9 @@ func work(){
_keyHash = rsDecode(_keyHash,rs64_128,64) _keyHash = rsDecode(_keyHash,rs64_128,64)
//fmt.Println("keyHash",keyHash) //fmt.Println("keyHash",keyHash)
keyfileHash = make([]byte,160) _khash_hash = make([]byte,160)
fin.Read(keyfileHash) fin.Read(_khash_hash)
keyfileHash = rsDecode(keyfileHash,rs32_128,32) _khash_hash = rsDecode(_khash_hash,rs32_128,32)
//fmt.Println("crcHash",crcHash) //fmt.Println("crcHash",crcHash)
_tmp := math.Ceil(float64(total-int64(metadataLength+1196))/float64(1048728)) _tmp := math.Ceil(float64(total-int64(metadataLength+1196))/float64(1048728))
@ -784,6 +834,24 @@ func work(){
32, 32,
)[:] )[:]
//fmt.Println("key",key) //fmt.Println("key",key)
if keyfile{
kin,_ := os.Open(keyfilePath)
kstat,_ := os.Stat(keyfilePath)
fmt.Println(kstat.Size())
kbytes := make([]byte,kstat.Size())
kin.Read(kbytes)
kin.Close()
ksha3 := sha3.New256()
ksha3.Write(kbytes)
khash = ksha3.Sum(nil)
khash_sha3 := sha3.New256()
khash_sha3.Write(khash)
khash_hash = khash_sha3.Sum(nil)
fmt.Println("khash",khash)
fmt.Println("khash_hash",khash_hash)
}
//key = make([]byte,32) //key = make([]byte,32)
fmt.Println("output",outputFile) fmt.Println("output",outputFile)
@ -795,21 +863,43 @@ func work(){
// Check is password is correct // Check is password is correct
if mode=="decrypt"{ if mode=="decrypt"{
keyCorrect := true keyCorrect := true
keyfileCorrect := true
var tmp bool
for i,j := range(_keyHash){ for i,j := range(_keyHash){
if keyHash[i]!=j{ if keyHash[i]!=j{
keyCorrect = false keyCorrect = false
break break
} }
} }
if !keyCorrect{ if keyfile{
for i,j := range(_khash_hash){
if khash_hash[i]!=j{
keyfileCorrect = false
break
}
}
tmp = !keyCorrect||!keyfileCorrect
}else{
tmp = !keyCorrect
}
if tmp{
if keep{ if keep{
kept = true kept = true
}else{ }else{
fin.Close() fin.Close()
broken() working = false
if !keyCorrect{
_status = "The provided password is incorrect."
}else{
_status = "The provided keyfile is incorrect."
}
_status_color = color.RGBA{0xff,0x00,0x00,255}
key = nil
debug.FreeOSMemory()
return return
} }
} }
fout,_ = os.OpenFile( fout,_ = os.OpenFile(
outputFile, outputFile,
os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.O_RDWR|os.O_CREATE|os.O_TRUNC,
@ -817,7 +907,16 @@ func work(){
) )
} }
//crc := blake3.New() if keyfile{
// XOR key and keyfile
tmp := key
key = make([]byte,32)
for i,_ := range(key){
key[i] = tmp[i]^khash[i]
}
fmt.Println("key",key)
}
done := 0 done := 0
counter := 0 counter := 0
@ -977,7 +1076,7 @@ func work(){
//fmt.Println("'nonces' before RS: ",nonces) //fmt.Println("'nonces' before RS: ",nonces)
fout.Seek(int64(700+len(metadata)),0) fout.Seek(int64(700+len(metadata)),0)
fout.Write(rsEncode(keyHash,rs64_128,192)) fout.Write(rsEncode(keyHash,rs64_128,192))
fout.Write(rsEncode(make([]byte,32),rs32_128,160)) fout.Write(rsEncode(khash_hash,rs32_128,160))
_mac,tmp := monocypher.Lock(nonces,nonce,key) _mac,tmp := monocypher.Lock(nonces,nonce,key)
fmt.Println(_mac) fmt.Println(_mac)
@ -1003,11 +1102,66 @@ func work(){
//fmt.Println("crc.Sum: ",crc.Sum(nil)) //fmt.Println("crc.Sum: ",crc.Sum(nil))
} }
fin.Close()
fout.Close()
// Delete the temporary zip file // Delete the temporary zip file
if len(allFiles)>1{ if len(allFiles)>1{
os.Remove(outputEntry) if erase{
shred([]string{outputEntry}[:],false)
}else{
os.Remove(outputEntry)
}
} }
fmt.Println("==============================") fmt.Println("==============================")
if erase{
shred(onlyFiles,false)
shred(onlyFolders,false)
}
if split{
status = "Splitting file..."
stat,_ := os.Stat(outputFile)
size := stat.Size()
finished := 0
fmt.Println(size)
chunkSize,_ := strconv.Atoi(splitSize)
chunkSize *= 1048576
chunks := int(math.Ceil(float64(size)/float64(chunkSize)))
fin,_ := os.Open(outputFile)
for i:=0;i<chunks;i++{
fmt.Println(fmt.Sprintf("%s.%d",outputFile,i))
fout,_ := os.OpenFile(
fmt.Sprintf("%s.%d",outputFile,i),
os.O_RDWR|os.O_CREATE|os.O_TRUNC,
0755,
)
done := 0
for{
data := make([]byte,1048576)
read,err := fin.Read(data)
if err!=nil{
break
}
data = data[:read]
fout.Write(data)
done += read
if done>=chunkSize{
break
}
}
fout.Close()
finished++
progress = float32(finished)/float32(chunks)
progressInfo = fmt.Sprintf("%d/%d",finished,chunks)
g.Update()
}
fin.Close()
os.Remove(outputFile)
}
resetUI() resetUI()
if kept{ if kept{
_status = "The input is corrupted and/or modified. Please be careful." _status = "The input is corrupted and/or modified. Please be careful."
@ -1019,121 +1173,17 @@ func work(){
working = false working = false
kept = false kept = false
key = nil key = nil
fin.Close()
fout.Close()
status = "Ready." status = "Ready."
debug.FreeOSMemory() debug.FreeOSMemory()
fmt.Println("Exit goroutine") fmt.Println("Exit goroutine")
} }
// Generate file checksums func shred(names []string,separate bool){
func generateChecksums(file string){
fin,_ := os.Open(file)
cs_md5 = ""
cs_sha1 = ""
cs_sha256 = ""
cs_sha3_256 = ""
cs_blake2b = ""
cs_blake2s = ""
cs_blake3 = ""
if md5_selected{
cs_md5 = "Calculating..."
}
if sha1_selected{
cs_sha1 = "Calculating..."
}
if sha256_selected{
cs_sha256 = "Calculating..."
}
if sha3_256_selected{
cs_sha3_256 = "Calculating..."
}
if blake2b_selected{
cs_blake2b = "Calculating..."
}
if blake2s_selected{
cs_blake2s = "Calculating..."
}
if blake3_selected{
cs_blake3 = "Calculating..."
}
crc_md5 := md5.New()
crc_sha1 := sha1.New()
crc_sha256 := sha256.New()
crc_sha3_256 := sha3.New256()
crc_blake2b,_ := blake2b.New256(nil)
crc_blake2s,_ := blake2s.New256(nil)
crc_blake3 := blake3.New()
stat,_ := os.Stat(file)
total := stat.Size()
var done int64 = 0
for{
var data []byte
_data := make([]byte,1048576)
size,err := fin.Read(_data)
if err!=nil{
break
}
data = _data[:size]
if md5_selected{
crc_md5.Write(data)
}
if sha1_selected{
crc_sha1.Write(data)
}
if sha256_selected{
crc_sha256.Write(data)
}
if sha3_256_selected{
crc_sha3_256.Write(data)
}
if blake2b_selected{
crc_blake2b.Write(data)
}
if blake2s_selected{
crc_blake2s.Write(data)
}
if blake3_selected{
crc_blake3.Write(data)
}
done += int64(size)
cs_progress = float32(done)/float32(total)
g.Update()
}
cs_progress = 0
if md5_selected{
cs_md5 = hex.EncodeToString(crc_md5.Sum(nil))
}
if sha1_selected{
cs_sha1 = hex.EncodeToString(crc_sha1.Sum(nil))
}
if sha256_selected{
cs_sha256 = hex.EncodeToString(crc_sha256.Sum(nil))
}
if sha3_256_selected{
cs_sha3_256 = hex.EncodeToString(crc_sha3_256.Sum(nil))
}
if blake2b_selected{
cs_blake2b = hex.EncodeToString(crc_blake2b.Sum(nil))
}
if blake2s_selected{
cs_blake2s = hex.EncodeToString(crc_blake2s.Sum(nil))
}
if blake3_selected{
cs_blake3 = hex.EncodeToString(crc_blake3.Sum(nil))
}
g.Update()
}
func shred(names []string){
shredTotal = 0 shredTotal = 0
shredDone = 0 shredDone = 0
shredOverlay = "Calculating..." if separate{
shredOverlay = "Calculating..."
}
for _,name := range(names){ for _,name := range(names){
filepath.Walk(name,func(path string,_ os.FileInfo,err error) error{ filepath.Walk(name,func(path string,_ os.FileInfo,err error) error{
if err!=nil{ if err!=nil{
@ -1171,7 +1221,7 @@ func shred(names []string){
fmt.Println(output) fmt.Println(output)
shredding = j shredding = j
shredDone++ shredDone++
shredUpdate() shredUpdate(separate)
g.Update() g.Update()
}(&wg,i,j) }(&wg,i,j)
@ -1193,7 +1243,7 @@ func shred(names []string){
fmt.Println(output) fmt.Println(output)
shredding = i shredding = i
shredDone++ shredDone++
shredUpdate() shredUpdate(separate)
g.Update() g.Update()
}() }()
} }
@ -1203,7 +1253,7 @@ func shred(names []string){
cmd.Run() cmd.Run()
shredding = name+"/*" shredding = name+"/*"
shredDone++ shredDone++
shredUpdate() shredUpdate(separate)
} }
}else if runtime.GOOS=="windows"{ }else if runtime.GOOS=="windows"{
stat,_ := os.Stat(name) stat,_ := os.Stat(name)
@ -1223,7 +1273,7 @@ func shred(names []string){
} }
} }
shredDone += float32(t) shredDone += float32(t)
shredUpdate() shredUpdate(separate)
tmp := filepath.Join(rootDir,"sdelete64.exe") tmp := filepath.Join(rootDir,"sdelete64.exe")
cmd := exec.Command(tmp,"*","-p","4") cmd := exec.Command(tmp,"*","-p","4")
cmd.Dir = path cmd.Dir = path
@ -1234,9 +1284,10 @@ func shred(names []string){
}) })
os.RemoveAll(name) os.RemoveAll(name)
}else{ }else{
exec.Command(filepath.Join(rootDir,"sdelete64.exe"),name,"-p","4").Run() o,e := exec.Command(filepath.Join(rootDir,"sdelete64.exe"),name,"-p","4").Output()
fmt.Println(string(o),e)
shredDone++ shredDone++
shredUpdate() shredUpdate(separate)
} }
}else if runtime.GOOS=="darwin"{ }else if runtime.GOOS=="darwin"{
if itemSelected==0{ if itemSelected==0{
@ -1259,12 +1310,133 @@ func shred(names []string){
shredOverlay = "" shredOverlay = ""
} }
func shredUpdate(){ func shredUpdate(separate bool){
shredOverlay = fmt.Sprintf("%d/%d",int(shredDone),int(shredTotal)) if separate{
shredProgress = shredDone/shredTotal shredOverlay = fmt.Sprintf("%d/%d",int(shredDone),int(shredTotal))
shredProgress = shredDone/shredTotal
}else{
status = fmt.Sprintf("%d/%d",int(shredDone),int(shredTotal))
progress = shredDone/shredTotal
}
g.Update() g.Update()
} }
// Generate file checksums
func generateChecksums(file string){
fin,_ := os.Open(file)
cs_md5 = ""
cs_ripemd = ""
cs_sha1 = ""
cs_sha256 = ""
cs_sha3_256 = ""
cs_blake2b = ""
cs_blake2s = ""
cs_blake3 = ""
if md5_selected{
cs_md5 = "Calculating..."
}
if ripemd_selected{
cs_ripemd = "Calculating..."
}
if sha1_selected{
cs_sha1 = "Calculating..."
}
if sha256_selected{
cs_sha256 = "Calculating..."
}
if sha3_256_selected{
cs_sha3_256 = "Calculating..."
}
if blake2b_selected{
cs_blake2b = "Calculating..."
}
if blake2s_selected{
cs_blake2s = "Calculating..."
}
if blake3_selected{
cs_blake3 = "Calculating..."
}
crc_md5 := md5.New()
crc_ripemd := ripemd160.New()
crc_sha1 := sha1.New()
crc_sha256 := sha256.New()
crc_sha3_256 := sha3.New256()
crc_blake2b,_ := blake2b.New256(nil)
crc_blake2s,_ := blake2s.New256(nil)
crc_blake3 := blake3.New()
stat,_ := os.Stat(file)
total := stat.Size()
var done int64 = 0
for{
var data []byte
_data := make([]byte,1048576)
size,err := fin.Read(_data)
if err!=nil{
break
}
data = _data[:size]
if md5_selected{
crc_md5.Write(data)
}
if ripemd_selected{
crc_ripemd.Write(data)
}
if sha1_selected{
crc_sha1.Write(data)
}
if sha256_selected{
crc_sha256.Write(data)
}
if sha3_256_selected{
crc_sha3_256.Write(data)
}
if blake2b_selected{
crc_blake2b.Write(data)
}
if blake2s_selected{
crc_blake2s.Write(data)
}
if blake3_selected{
crc_blake3.Write(data)
}
done += int64(size)
cs_progress = float32(done)/float32(total)
g.Update()
}
cs_progress = 0
if md5_selected{
cs_md5 = hex.EncodeToString(crc_md5.Sum(nil))
}
if ripemd_selected{
cs_ripemd = hex.EncodeToString(crc_ripemd.Sum(nil))
}
if sha1_selected{
cs_sha1 = hex.EncodeToString(crc_sha1.Sum(nil))
}
if sha256_selected{
cs_sha256 = hex.EncodeToString(crc_sha256.Sum(nil))
}
if sha3_256_selected{
cs_sha3_256 = hex.EncodeToString(crc_sha3_256.Sum(nil))
}
if blake2b_selected{
cs_blake2b = hex.EncodeToString(crc_blake2b.Sum(nil))
}
if blake2s_selected{
cs_blake2s = hex.EncodeToString(crc_blake2s.Sum(nil))
}
if blake3_selected{
cs_blake3 = hex.EncodeToString(crc_blake3.Sum(nil))
}
g.Update()
}
// Reset the UI to a clean state with no nothing selected // Reset the UI to a clean state with no nothing selected
func resetUI(){ func resetUI(){
inputLabel = "Drag and drop file(s) and folder(s) into this window." inputLabel = "Drag and drop file(s) and folder(s) into this window."
@ -1273,8 +1445,12 @@ func resetUI(){
outputWidth = 376 outputWidth = 376
password = "" password = ""
cPassword = "" cPassword = ""
keyfilePrompt = "Keyfile (optional):"
keyfileLabel = "Use a keyfile"
keyfile = false
metadata = "" metadata = ""
keep = false keep = false
erase = false
reedsolo = false reedsolo = false
split = false split = false
splitSize = "" splitSize = ""
@ -1291,6 +1467,7 @@ func broken(){
_status = "The file is either corrupted or intentionally modified." _status = "The file is either corrupted or intentionally modified."
_status_color = color.RGBA{0xff,0x00,0x00,255} _status_color = color.RGBA{0xff,0x00,0x00,255}
os.Remove(outputFile) os.Remove(outputFile)
debug.FreeOSMemory()
} }
func rsEncode(data []byte,encoder reedsolomon.Encoder,size int) []byte{ func rsEncode(data []byte,encoder reedsolomon.Encoder,size int) []byte{
@ -1324,7 +1501,7 @@ func main(){
if runtime.GOOS=="windows"{ if runtime.GOOS=="windows"{
exec.Command(filepath.Join(rootDir,"sdelete64.exe"),"/accepteula") exec.Command(filepath.Join(rootDir,"sdelete64.exe"),"/accepteula")
} }
window := g.NewMasterWindow("Picocrypt",480,480,g.MasterWindowFlagsNotResizable,nil) window := g.NewMasterWindow("Picocrypt",480,482,g.MasterWindowFlagsNotResizable,nil)
window.SetDropCallback(onDrop) window.SetDropCallback(onDrop)
dpi = g.Context.GetPlatform().GetContentScale() dpi = g.Context.GetPlatform().GetContentScale()
window.Run(startUI) window.Run(startUI)