package mfer import ( "bytes" "encoding/hex" "errors" "fmt" "github.com/multiformats/go-multihash" ) var ( errOuterNotSet = errors.New("pbOuter not set") errUUIDNotSet = errors.New("UUID not set") errSHA256NotSet = errors.New("SHA256 hash not set") ) // manifest holds the internal representation of a manifest file. // Use NewManifestFromFile or NewManifestFromReader to load an existing // manifest, or use Builder to create a new one. // // Whether this type should be exported is an open design question owned by // the repository owner; see README design question 13. type manifest struct { pbInner *MFFile pbOuter *MFFileOuter output *bytes.Buffer signingOptions *SigningOptions fixedUUID []byte // if set, use this UUID instead of generating one } func (m *manifest) String() string { count := 0 if m.pbInner != nil { count = len(m.pbInner.GetFiles()) } return fmt.Sprintf("", count) } // Files returns all file entries from a loaded manifest. func (m *manifest) Files() []*MFFilePath { if m.pbInner == nil { return nil } return m.pbInner.GetFiles() } // signatureString generates the canonical string used for signing/verification. // Format: MAGIC-UUID-MULTIHASH where UUID and multihash are hex-encoded. // Requires pbOuter to be set with Uuid and Sha256 fields. func (m *manifest) signatureString() (string, error) { if m.pbOuter == nil { return "", errOuterNotSet } if len(m.pbOuter.GetUuid()) == 0 { return "", errUUIDNotSet } if len(m.pbOuter.GetSha256()) == 0 { return "", errSHA256NotSet } mh, err := multihash.Encode(m.pbOuter.GetSha256(), multihash.SHA2_256) if err != nil { return "", fmt.Errorf("failed to encode multihash: %w", err) } uuidStr := hex.EncodeToString(m.pbOuter.GetUuid()) mhStr := hex.EncodeToString(mh) return fmt.Sprintf("%s-%s-%s", MAGIC, uuidStr, mhStr), nil }