feat: works now

This commit is contained in:
2024-09-01 20:23:03 +08:00
parent 77b3e8aa02
commit fa9602fea5
3 changed files with 52 additions and 38 deletions

View File

@@ -4,7 +4,6 @@ import (
"crypto/aes" "crypto/aes"
"crypto/rand" "crypto/rand"
"encoding/binary" "encoding/binary"
"encoding/hex"
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
@@ -29,9 +28,14 @@ type EncFileMeta struct {
Iv []byte `json:"iv"` Iv []byte `json:"iv"`
} }
func newEncFileMeta(name string) (*EncFileMeta, error) { func openOrNewEncFileMeta(name string) (*EncFileMeta, error) {
oldEncFileMeta, err := openEncFileMeta(name)
if err == nil && oldEncFileMeta != nil {
return oldEncFileMeta, nil
}
iv := make([]byte, 16) iv := make([]byte, 16)
_, err := rand.Read(iv) _, err = rand.Read(iv)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -112,7 +116,7 @@ func NewEncFile(name string, file *os.File, encFs *EncFs, isCreate bool) (*EncFi
var encFileMeta *EncFileMeta = nil var encFileMeta *EncFileMeta = nil
if !isDir { if !isDir {
if isCreate { if isCreate {
encFileMeta, err = newEncFileMeta(name) encFileMeta, err = openOrNewEncFileMeta(name)
} else { } else {
encFileMeta, err = openEncFileMeta(name) encFileMeta, err = openEncFileMeta(name)
} }
@@ -168,8 +172,19 @@ func (f *EncFile) ReadAt(p []byte, off int64) (n int, err error) {
return 0, checkIsFileErr return 0, checkIsFileErr
} }
// TODO decrypt readLen, err := f.file.ReadAt(p, off)
return f.file.ReadAt(p, off) if err == nil {
if f.encFs != nil && f.encFs.key != nil && f.encFileMeta != nil {
encryptedBytes, err := generateCtrEncryptBytes(f.encFs.key, f.encFileMeta.Iv, off, int64(readLen))
if err != nil {
return 0, err
}
for i := 0; i < readLen; i++ {
p[i] = p[i] ^ encryptedBytes[i]
}
}
}
return readLen, err
} }
func (f *EncFile) Seek(offset int64, whence int) (int64, error) { func (f *EncFile) Seek(offset int64, whence int) (int64, error) {
@@ -184,7 +199,7 @@ func (f *EncFile) Seek(offset int64, whence int) (int64, error) {
} }
ret, err := f.file.Seek(offset, whence) ret, err := f.file.Seek(offset, whence)
if err != nil { if err == nil {
f.filePos = offset f.filePos = offset
} }
return ret, err return ret, err
@@ -236,9 +251,6 @@ func (f *EncFile) WriteAt(p []byte, off int64) (n int, err error) {
} }
writeLen, err := f.file.WriteAt(writeBuff, off) writeLen, err := f.file.WriteAt(writeBuff, off)
// if err == nil {
// f.filePos += int64(writeLen)
// }
return writeLen, err return writeLen, err
} }
@@ -301,8 +313,7 @@ func (f *EncFile) Truncate(size int64) error {
} }
func (f *EncFile) WriteString(s string) (ret int, err error) { func (f *EncFile) WriteString(s string) (ret int, err error) {
// TODO encrypt return f.Write([]byte(s))
return f.file.WriteString(s)
} }
func (f *EncFile) checkIsFile() error { func (f *EncFile) checkIsFile() error {
@@ -317,7 +328,8 @@ func (f *EncFile) checkIsFile() error {
func generateCtrEncryptBytes(key, iv []byte, offset, len int64) ([]byte, error) { func generateCtrEncryptBytes(key, iv []byte, offset, len int64) ([]byte, error) {
endOffset := offset + len endOffset := offset + len
encryptStartOffset := (offset / 16) * 16 blockOffset := offset / 16
encryptStartOffset := blockOffset * 16
encryptEndOffset := (endOffset / 16) * 16 encryptEndOffset := (endOffset / 16) * 16
if endOffset%16 > 0 { if endOffset%16 > 0 {
encryptEndOffset += 16 encryptEndOffset += 16
@@ -330,12 +342,11 @@ func generateCtrEncryptBytes(key, iv []byte, offset, len int64) ([]byte, error)
} }
encryptBytes := make([]byte, blocksCount*16) encryptBytes := make([]byte, blocksCount*16)
for i := 0; i < blocksCount; i++ { for i := 0; i < blocksCount; i++ {
encNonce := nonceAdd(iv, uint64(i)) encNonce := nonceAdd(iv, uint64(i)+uint64(blockOffset))
cipher.Encrypt(encryptBytes[i*16:(i+1)*16], encNonce) cipher.Encrypt(encryptBytes[i*16:(i+1)*16], encNonce)
} }
// fmt.Println("XX ", hex.EncodeToString(encryptBytes))
encryptedBytes := encryptBytes[offset-encryptStartOffset : offset-encryptStartOffset+len] encryptedBytes := encryptBytes[offset-encryptStartOffset : offset-encryptStartOffset+len]
fmt.Println("XX", hex.EncodeToString(key), hex.EncodeToString(iv), offset, len, hex.EncodeToString(encryptedBytes)) //fmt.Println("XX", hex.EncodeToString(key), hex.EncodeToString(iv), offset, len, hex.EncodeToString(encryptedBytes))
return encryptedBytes, nil return encryptedBytes, nil
} }

7
go.mod
View File

@@ -2,7 +2,6 @@ module git.hatter.ink/hatter/go-afero-encfs
go 1.23.0 go 1.23.0
require ( require github.com/spf13/afero v1.11.0
github.com/spf13/afero v1.11.0 // indirect
golang.org/x/text v0.14.0 // indirect require golang.org/x/text v0.14.0 // indirect
)

40
main.go
View File

@@ -17,8 +17,6 @@ func main() {
encFs := encfs.NewEncFs(key) encFs := encfs.NewEncFs(key)
encFs2 := encfs.NewEncFs(nil) encFs2 := encfs.NewEncFs(nil)
write := false
// ----------------------------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------------------------
encFile1, err := encFs2.Create("test1") encFile1, err := encFs2.Create("test1")
if err != nil { if err != nil {
@@ -27,6 +25,8 @@ func main() {
} }
encFile1.Write([]byte("hello world")) encFile1.Write([]byte("hello world"))
encFile1.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")) encFile1.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"))
encFile1.WriteAt([]byte("TEST"), 10)
encFile1.Write([]byte("------"))
encFile1.Close() encFile1.Close()
encFile2, err := encFs2.Create("test2") encFile2, err := encFs2.Create("test2")
@@ -35,36 +35,32 @@ func main() {
return return
} }
encFile2.Write([]byte("hello world")) encFile2.Write([]byte("hello world"))
// 0 move seekI, err := encFile2.Seek(2, 0)
// 1, 2 append 00
// 3 no effect
seekI, err := encFile2.Seek(2, 3)
fmt.Println(seekI, ", ", err) fmt.Println(seekI, ", ", err)
encFile2.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")) encFile2.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"))
encFile2.Write([]byte("------"))
encFile2.Close() encFile2.Close()
// ----------------------------------------------------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------------------------------------------------
if write { func() {
encFile, err := encFs.Create("test") encFile, err := encFs.Create("test")
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return return
} }
defer encFile.Close()
encFile.Write([]byte("hello world")) encFile.Write([]byte("hello world"))
// seekI, err := encFile.Seek(1, 1)
// fmt.Println(seekI, ", ", err)
encFile.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX")) encFile.Write([]byte("XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"))
encFile.WriteAt([]byte("TEST"), 10)
encFile.Write([]byte("------"))
// encFile.WriteAt([]byte("YYYYYYYYYYYYYYYYYYYYYYYY"), 1) encFile.Write([]byte("Z"))
encFile.Write([]byte("---------------------------------------"))
// encFile.Write([]byte("Z")) encFile.Write([]byte("Z"))
// encFile.Write([]byte("---------------------------------------")) }()
// encFile.Write([]byte("Z")) func() {
} else {
encFile, err := encFs.Open("test") encFile, err := encFs.Open("test")
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
@@ -75,5 +71,13 @@ func main() {
fmt.Println(hex.EncodeToString(rr)) fmt.Println(hex.EncodeToString(rr))
fmt.Println(string(rr), err) fmt.Println(string(rr), err)
} buff := make([]byte, 5)
readLen, err := encFile.ReadAt(buff, 3)
fmt.Println(readLen, err)
fmt.Println(string(buff))
readLen, err = encFile.Read(buff)
fmt.Println(readLen, err)
fmt.Println(string(buff))
}()
} }