diff options
author | axtloss <axtlos@getcryst.al> | 2024-02-05 15:29:21 +0100 |
---|---|---|
committer | axtloss <axtlos@getcryst.al> | 2024-02-05 15:29:21 +0100 |
commit | f1524db2c9d935daabd3b1557caf54fbdd63dde5 (patch) | |
tree | 04dc65245855f5975ab3002e9749ba666ea1af37 /verifysetup | |
parent | a215d3358f35e3331b4ce6c7f5a03b4544e04d43 (diff) | |
download | fsverify-f1524db2c9d935daabd3b1557caf54fbdd63dde5.tar.gz fsverify-f1524db2c9d935daabd3b1557caf54fbdd63dde5.tar.bz2 |
verifysetup storage reader
Diffstat (limited to '')
-rw-r--r-- | verifysetup/cmd/setup.go | 61 | ||||
-rw-r--r-- | verifysetup/core/crypt.go | 18 | ||||
-rw-r--r-- | verifysetup/core/storage.go | 75 | ||||
-rw-r--r-- | verifysetup/go.mod | 12 | ||||
-rw-r--r-- | verifysetup/go.sum | 22 | ||||
-rw-r--r-- | verifysetup/main.go | 13 |
6 files changed, 199 insertions, 2 deletions
diff --git a/verifysetup/cmd/setup.go b/verifysetup/cmd/setup.go index 3897903..c2676fc 100644 --- a/verifysetup/cmd/setup.go +++ b/verifysetup/cmd/setup.go @@ -1,10 +1,16 @@ package cmd import ( + "bytes" + "fmt" + verify "github.com/axtloss/fsverify/core" + "github.com/axtloss/fsverify/verifysetup/core" "github.com/spf13/cobra" + "math" + "os" ) -func NewVerifyCommand() *cobra.Command { +func NewSetupCommand() *cobra.Command { cmd := &cobra.Command{ Use: "setup", Short: "Set up fsverify", @@ -16,5 +22,56 @@ func NewVerifyCommand() *cobra.Command { } func SetupCommand(_ *cobra.Command, args []string) error { - return nil + if len(args) != 1 { + return fmt.Errorf("Usage: verifysetup setup [partition]") + } + fmt.Println("Using partition: ", args[0]) + disk, err := os.Open(args[0]) + if err != nil { + return err + } + defer disk.Close() + fmt.Println("Reading from disk") + diskInfo, err := disk.Stat() + if err != nil { + return err + } + diskSize := diskInfo.Size() + blockCount := math.Floor(float64(diskSize / 4000)) + lastBlockSize := float64(diskSize) - blockCount*4000.0 + fmt.Println(diskSize) + fmt.Println(blockCount) + fmt.Println(lastBlockSize) + node := verify.Node{} + block := make([]byte, 4000) + diskBytes := make([]byte, diskSize) + _, err = disk.Read(diskBytes) + if err != nil { + return err + } + reader := bytes.NewReader(diskBytes) + for i := 0; i < int(blockCount); i++ { + reader = bytes.NewReader(diskBytes) + block, err = core.ReadBlock(i*4000, (i*4000)+4000, reader) + if err != nil { + return err + } + node, err = core.CreateNode(i*4000, (i*4000)+4000, block, &node) + if err != nil { + return err + } + fmt.Println(node) + err = core.AddNode(node, nil, "./fsverify.db") + } + finalBlock, err := core.ReadBlock(int(blockCount*4000), int((blockCount*4000)+lastBlockSize), reader) + if err != nil { + return err + } + finalNode, err := core.CreateNode(int(blockCount*4000), int((blockCount*4000)+lastBlockSize), finalBlock, &node) + if err != nil { + return err + } + fmt.Println(finalNode) + err = core.AddNode(finalNode, nil, "./fsverify.db") + return err } diff --git a/verifysetup/core/crypt.go b/verifysetup/core/crypt.go new file mode 100644 index 0000000..81130a3 --- /dev/null +++ b/verifysetup/core/crypt.go @@ -0,0 +1,18 @@ +package core + +import ( + "bytes" + "crypto/sha256" + "fmt" + "io" + "strings" +) + +func CalculateBlockHash(block []byte) (string, error) { + hash := sha256.New() + if _, err := io.Copy(hash, bytes.NewReader(block)); err != nil { + return "", err + } + hashInBytes := hash.Sum(nil)[:32] + return strings.TrimSpace(fmt.Sprintf("%x", hashInBytes)), nil +} diff --git a/verifysetup/core/storage.go b/verifysetup/core/storage.go new file mode 100644 index 0000000..831d637 --- /dev/null +++ b/verifysetup/core/storage.go @@ -0,0 +1,75 @@ +package core + +import ( + "bytes" + "encoding/json" + "fmt" + verify "github.com/axtloss/fsverify/core" + bolt "go.etcd.io/bbolt" +) + +var TotalReadBlocks = 0 + +func ReadBlock(start int, end int, device *bytes.Reader) ([]byte, error) { + block := make([]byte, end-start) + _, err := device.Seek(int64(start), 0) + if err != nil { + return []byte{}, err + } + _, err = device.Read(block) + TotalReadBlocks = TotalReadBlocks + (end - start) + return block, err +} + +func CreateNode(blockStart int, blockEnd int, block []byte, prevNode *verify.Node) (verify.Node, error) { + node := verify.Node{} + node.BlockStart = blockStart + node.BlockEnd = blockEnd + blockHash, err := CalculateBlockHash(block) + if err != nil { + return verify.Node{}, err + } + node.BlockSum = blockHash + var prevNodeHash string + if prevNode.PrevNodeSum != "" { + prevNodeHash, err = prevNode.GetHash() + if err != nil { + return verify.Node{}, err + } + } else { + prevNodeHash = "Entrypoint" + } + node.PrevNodeSum = prevNodeHash + return node, nil +} + +func AddNode(node verify.Node, db *bolt.DB, dbPath string) error { + var err error + var deferDB bool + if db == nil { + db, err = bolt.Open(dbPath, 0777, nil) + if err != nil { + return err + } + deferDB = true + } else if db.IsReadOnly() { + return fmt.Errorf("Error: database is opened read only, unable to add nodes") + } + err = db.Update(func(tx *bolt.Tx) error { + nodes, err := tx.CreateBucketIfNotExists([]byte("Nodes")) + if err != nil { + return err + } + if buf, err := json.Marshal(node); err != nil { + return err + } else if err := nodes.Put([]byte(node.PrevNodeSum), buf); err != nil { + return err + } + return nil + + }) + if deferDB { + defer db.Close() + } + return err +} diff --git a/verifysetup/go.mod b/verifysetup/go.mod index 25642c6..7acfa12 100644 --- a/verifysetup/go.mod +++ b/verifysetup/go.mod @@ -1,3 +1,15 @@ module github.com/axtloss/fsverify/verifysetup go 1.21.6 + +require ( + github.com/axtloss/fsverify v0.0.0-20240204141913-a215d3358f35 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 // indirect + github.com/spf13/cobra v1.8.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 // indirect + go.etcd.io/bbolt v1.3.8 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect +) diff --git a/verifysetup/go.sum b/verifysetup/go.sum new file mode 100644 index 0000000..9ad7abe --- /dev/null +++ b/verifysetup/go.sum @@ -0,0 +1,22 @@ +github.com/axtloss/fsverify v0.0.0-20240204141913-a215d3358f35 h1:GnvD9HxKht9mD1NLjDaffqNfTJcxbOgXfkexYDGAJ5E= +github.com/axtloss/fsverify v0.0.0-20240204141913-a215d3358f35/go.mod h1:Tve3hFV8BxkGp5iY/k+sKSF/Qv1SGLDoHFYQI3xjdHQ= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07 h1:UyzmZLoiDWMRywV4DUYb9Fbt8uiOSooupjTq10vpvnU= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= +go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA= +go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/verifysetup/main.go b/verifysetup/main.go new file mode 100644 index 0000000..2c1bd69 --- /dev/null +++ b/verifysetup/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "github.com/axtloss/fsverify/verifysetup/cmd" +) + +var ( + Version = "0.1.0" +) + +func main() { + cmd.Execute() +} |