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/core | |
parent | a215d3358f35e3331b4ce6c7f5a03b4544e04d43 (diff) | |
download | fsverify-f1524db2c9d935daabd3b1557caf54fbdd63dde5.tar.gz fsverify-f1524db2c9d935daabd3b1557caf54fbdd63dde5.tar.bz2 |
verifysetup storage reader
Diffstat (limited to '')
-rw-r--r-- | verifysetup/core/crypt.go | 18 | ||||
-rw-r--r-- | verifysetup/core/storage.go | 75 |
2 files changed, 93 insertions, 0 deletions
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 +} |