feat: works now
This commit is contained in:
@@ -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
7
go.mod
@@ -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
40
main.go
@@ -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))
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user