diff --git a/lhash/labeledhash.go b/lhash/labeledhash.go index d0674b1..b395b5a 100644 --- a/lhash/labeledhash.go +++ b/lhash/labeledhash.go @@ -175,16 +175,38 @@ func (lh *LabeledHash) EqualRaw(otherDigest []byte) bool { return subtle.ConstantTimeCompare(lh.digest, otherDigest) == 1 } -// MatchesString returns true if the digest of the given string matches the hash. -func (lh *LabeledHash) MatchesString(s string) bool { - return lh.MatchesData([]byte(s)) +// Matches returns true if the digest of the given data matches the hash. +func (lh *LabeledHash) Matches(data []byte) bool { + return lh.Equal(Digest(lh.alg, data)) } // MatchesData returns true if the digest of the given data matches the hash. +// DEPRECATED: Use Matches instead. func (lh *LabeledHash) MatchesData(data []byte) bool { - hasher := lh.alg.new() - _, _ = hasher.Write(data) // never returns an error - defer hasher.Reset() // internal state may leak data if kept in memory - - return subtle.ConstantTimeCompare(lh.digest, hasher.Sum(nil)) == 1 + return lh.Equal(Digest(lh.alg, data)) +} + +// MatchesString returns true if the digest of the given string matches the hash. +func (lh *LabeledHash) MatchesString(s string) bool { + return lh.Matches([]byte(s)) +} + +// MatchesFile returns true if the digest of the given file matches the hash. +func (lh *LabeledHash) MatchesFile(pathToFile string) (bool, error) { + fileHash, err := DigestFile(lh.alg, pathToFile) + if err != nil { + return false, err + } + + return lh.Equal(fileHash), nil +} + +// MatchesReader returns true if the digest of the given reader matches the hash. +func (lh *LabeledHash) MatchesReader(reader io.Reader) (bool, error) { + readerHash, err := DigestFromReader(lh.alg, reader) + if err != nil { + return false, err + } + + return lh.Equal(readerHash), nil } diff --git a/lhash/labeledhash_test.go b/lhash/labeledhash_test.go index 8ed91f1..5facd3c 100644 --- a/lhash/labeledhash_test.go +++ b/lhash/labeledhash_test.go @@ -42,13 +42,13 @@ func testAlgorithm(t *testing.T, alg Algorithm, emptyHex, foxHex string) { } // test matching with serialized/loaded labeled hash - if !lh.MatchesData(testFoxData) { + if !lh.Matches(testFoxData) { t.Errorf("alg %d: failed to match reference", alg) } if !lh.MatchesString(testFox) { t.Errorf("alg %d: failed to match reference", alg) } - if lh.MatchesData(noMatchData) { + if lh.Matches(noMatchData) { t.Errorf("alg %d: failed to non-match garbage", alg) } if lh.MatchesString(noMatch) { @@ -99,13 +99,13 @@ func testFormat(t *testing.T, alg Algorithm, lhs, loaded *LabeledHash) { } // Test matching. - if !loaded.MatchesData(testFoxData) { + if !loaded.Matches(testFoxData) { t.Errorf("alg %d: failed to match reference", alg) } if !loaded.MatchesString(testFox) { t.Errorf("alg %d: failed to match reference", alg) } - if loaded.MatchesData(noMatchData) { + if loaded.Matches(noMatchData) { t.Errorf("alg %d: failed to non-match garbage", alg) } if loaded.MatchesString(noMatch) {