Skip to content

Commit c47544c

Browse files
committed
Add DigestIfAlgorithmUnknown
Signed-off-by: Miloslav Trmač <mitr@redhat.com>
1 parent 16904dc commit c47544c

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

image/internal/putblobdigest/put_blob_digest.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,15 @@ type Digester struct {
1313
digester digest.Digester // Or nil
1414
}
1515

16-
// newDigester initiates computation of a digest.Canonical digest of stream,
16+
// newDigester initiates computation of a digest of stream using the specified algorithm,
1717
// if !validDigest; otherwise it just records knownDigest to be returned later.
1818
// The caller MUST use the returned stream instead of the original value.
19-
func newDigester(stream io.Reader, knownDigest digest.Digest, validDigest bool) (Digester, io.Reader) {
19+
func newDigester(stream io.Reader, knownDigest digest.Digest, validDigest bool, algorithm digest.Algorithm) (Digester, io.Reader) {
2020
if validDigest {
2121
return Digester{knownDigest: knownDigest}, stream
2222
} else {
2323
res := Digester{
24-
digester: digest.Canonical.Digester(),
24+
digester: algorithm.Digester(),
2525
}
2626
stream = io.TeeReader(stream, res.digester.Hash())
2727
return res, stream
@@ -34,7 +34,7 @@ func newDigester(stream io.Reader, knownDigest digest.Digest, validDigest bool)
3434
// The caller MUST use the returned stream instead of the original value.
3535
func DigestIfUnknown(stream io.Reader, blobInfo types.BlobInfo) (Digester, io.Reader) {
3636
d := blobInfo.Digest
37-
return newDigester(stream, d, d != "")
37+
return newDigester(stream, d, d != "", digest.Canonical)
3838
}
3939

4040
// DigestIfCanonicalUnknown initiates computation of a digest.Canonical digest of stream,
@@ -43,7 +43,16 @@ func DigestIfUnknown(stream io.Reader, blobInfo types.BlobInfo) (Digester, io.Re
4343
// The caller MUST use the returned stream instead of the original value.
4444
func DigestIfCanonicalUnknown(stream io.Reader, blobInfo types.BlobInfo) (Digester, io.Reader) {
4545
d := blobInfo.Digest
46-
return newDigester(stream, d, d != "" && d.Algorithm() == digest.Canonical)
46+
return newDigester(stream, d, d != "" && d.Algorithm() == digest.Canonical, digest.Canonical)
47+
}
48+
49+
// DigestIfAlgorithmUnknown initiates computation of a digest of stream,
50+
// if a digest of the specified algorithm is not supplied in the provided blobInfo;
51+
// otherwise blobInfo.Digest will be used.
52+
// The caller MUST use the returned stream instead of the original value.
53+
func DigestIfAlgorithmUnknown(stream io.Reader, blobInfo types.BlobInfo, algorithm digest.Algorithm) (Digester, io.Reader) {
54+
d := blobInfo.Digest
55+
return newDigester(stream, d, d != "" && d.Algorithm() == algorithm, algorithm)
4756
}
4857

4958
// Digest() returns a digest value possibly computed by Digester.

image/internal/putblobdigest/put_blob_digest_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,30 @@ func TestDigestIfCanonicalUnknown(t *testing.T) {
7373
},
7474
})
7575
}
76+
77+
func TestDigestIfAlgorithmUnknown(t *testing.T) {
78+
testDigester(t, func(r io.Reader, bi types.BlobInfo) (Digester, io.Reader) {
79+
return DigestIfAlgorithmUnknown(r, bi, digest.SHA512)
80+
}, []testCase{
81+
{
82+
inputDigest: digest.Digest("sha512:uninspected-value"),
83+
computesDigest: false,
84+
expectedDigest: digest.Digest("sha512:uninspected-value"),
85+
},
86+
{
87+
inputDigest: digest.Digest("sha256:uninspected-value"),
88+
computesDigest: true,
89+
expectedDigest: digest.SHA512.FromBytes(testData),
90+
},
91+
{
92+
inputDigest: digest.Digest("unknown-algorithm:uninspected-value"),
93+
computesDigest: true,
94+
expectedDigest: digest.SHA512.FromBytes(testData),
95+
},
96+
{
97+
inputDigest: "",
98+
computesDigest: true,
99+
expectedDigest: digest.SHA512.FromBytes(testData),
100+
},
101+
})
102+
}

0 commit comments

Comments
 (0)