Skip to content

Commit fd56b09

Browse files
committed
image: Port to go-digest
Outsource this stuff to avoid duplication of effort. newDescriptor was returning just the hex and createHashedBlob (its only consumer) was fixing that (by the "Normalize the hashed digest" comment) so it didn't have to split the hash (Hex) back off. But that seems confusing to me, so I've fixed newDescriptor to create a non-busted digest which we split back apart in createHashedBlob. Signed-off-by: W. Trevor King <[email protected]>
1 parent 6058078 commit fd56b09

File tree

3 files changed

+29
-29
lines changed

3 files changed

+29
-29
lines changed

image/descriptor.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
package image
1616

1717
import (
18-
"crypto/sha256"
19-
"encoding/hex"
2018
"encoding/json"
2119
"fmt"
2220
"io"
2321
"os"
2422
"path/filepath"
2523
"strings"
2624

25+
"github.com/opencontainers/go-digest"
2726
"github.com/pkg/errors"
2827
)
2928

@@ -116,19 +115,22 @@ func (d *descriptor) validate(w walker, mts []string) error {
116115
}
117116

118117
func (d *descriptor) validateContent(r io.Reader) error {
119-
h := sha256.New()
120-
n, err := io.Copy(h, r)
118+
parsed, err := digest.Parse(d.Digest)
121119
if err != nil {
122-
return errors.Wrap(err, "error generating hash")
120+
return err
123121
}
124122

125123
if n != d.Size {
126124
return errors.New("size mismatch")
127125
}
128126

129-
digest := "sha256:" + hex.EncodeToString(h.Sum(nil))
127+
verifier := parsed.Verifier()
128+
n, err := io.Copy(verifier, r)
129+
if err != nil {
130+
return errors.Wrap(err, "error generating hash")
131+
}
130132

131-
if digest != d.Digest {
133+
if !verifier.Verified() {
132134
return errors.New("digest mismatch")
133135
}
134136

image/image_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import (
1818
"archive/tar"
1919
"bytes"
2020
"compress/gzip"
21-
"crypto/sha256"
22-
"fmt"
2321
"io"
2422
"io/ioutil"
2523
"os"
@@ -28,6 +26,7 @@ import (
2826
"strings"
2927
"testing"
3028

29+
"github.com/opencontainers/go-digest"
3130
"github.com/opencontainers/image-spec/specs-go/v1"
3231
)
3332

@@ -298,14 +297,16 @@ func createHashedBlob(name string) (descriptor, error) {
298297
return descriptor{}, err
299298
}
300299

301-
// Rename the file to hashed-digest name.
302-
err = os.Rename(name, filepath.Join(filepath.Dir(name), desc.Digest))
300+
parsed, err := digest.Parse(desc.Digest)
303301
if err != nil {
304302
return descriptor{}, err
305303
}
306304

307-
//Normalize the hashed digest.
308-
desc.Digest = "sha256:" + desc.Digest
305+
// Rename the file to hashed-digest name.
306+
err = os.Rename(name, filepath.Join(filepath.Dir(name), parsed.Hex()))
307+
if err != nil {
308+
return descriptor{}, err
309+
}
309310

310311
return desc, nil
311312
}
@@ -317,15 +318,14 @@ func newDescriptor(name string) (descriptor, error) {
317318
}
318319
defer file.Close()
319320

320-
// generate sha256 hash
321-
hash := sha256.New()
322-
size, err := io.Copy(hash, file)
321+
digester := digest.SHA256.Digester()
322+
size, err := io.Copy(digester.Hash(), file)
323323
if err != nil {
324324
return descriptor{}, err
325325
}
326326

327327
return descriptor{
328-
Digest: fmt.Sprintf("%x", hash.Sum(nil)),
328+
Digest: digester.Digest().String(),
329329
Size: size,
330330
}, nil
331331
}

image/manifest_test.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ import (
1818
"archive/tar"
1919
"bytes"
2020
"compress/gzip"
21-
"crypto/sha256"
22-
"fmt"
2321
"io"
2422
"io/ioutil"
2523
"os"
2624
"path/filepath"
2725
"strings"
2826
"testing"
27+
28+
"github.com/opencontainers/go-digest"
2929
)
3030

3131
func TestUnpackLayerDuplicateEntries(t *testing.T) {
@@ -90,26 +90,25 @@ func TestUnpackLayer(t *testing.T) {
9090
gw.Close()
9191
f.Close()
9292

93-
// generate sha256 hash
94-
h := sha256.New()
93+
digester := digest.SHA256.Digester()
9594
file, err := os.Open(tarfile)
9695
if err != nil {
9796
t.Fatal(err)
9897
}
9998
defer file.Close()
100-
_, err = io.Copy(h, file)
99+
_, err = io.Copy(digester.Hash(), file)
101100
if err != nil {
102101
t.Fatal(err)
103102
}
104-
err = os.Rename(tarfile, filepath.Join(tmp1, "blobs", "sha256", fmt.Sprintf("%x", h.Sum(nil))))
103+
err = os.Rename(tarfile, filepath.Join(tmp1, "blobs", "sha256", digester.Digest().Hex()))
105104
if err != nil {
106105
t.Fatal(err)
107106
}
108107

109108
testManifest := manifest{
110109
Layers: []descriptor{descriptor{
111110
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
112-
Digest: fmt.Sprintf("sha256:%s", fmt.Sprintf("%x", h.Sum(nil))),
111+
Digest: digester.Digest().String(),
113112
}},
114113
}
115114
err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs"))
@@ -151,26 +150,25 @@ func TestUnpackLayerRemovePartialyUnpackedFile(t *testing.T) {
151150
gw.Close()
152151
f.Close()
153152

154-
// generate sha256 hash
155-
h := sha256.New()
153+
digester := digest.SHA256.Digester()
156154
file, err := os.Open(tarfile)
157155
if err != nil {
158156
t.Fatal(err)
159157
}
160158
defer file.Close()
161-
_, err = io.Copy(h, file)
159+
_, err = io.Copy(digester.Hash(), file)
162160
if err != nil {
163161
t.Fatal(err)
164162
}
165-
err = os.Rename(tarfile, filepath.Join(tmp1, "blobs", "sha256", fmt.Sprintf("%x", h.Sum(nil))))
163+
err = os.Rename(tarfile, filepath.Join(tmp1, "blobs", "sha256", digester.Digest().Hex()))
166164
if err != nil {
167165
t.Fatal(err)
168166
}
169167

170168
testManifest := manifest{
171169
Layers: []descriptor{descriptor{
172170
MediaType: "application/vnd.oci.image.layer.v1.tar+gzip",
173-
Digest: fmt.Sprintf("sha256:%s", fmt.Sprintf("%x", h.Sum(nil))),
171+
Digest: digester.Digest().String(),
174172
}},
175173
}
176174
err = testManifest.unpack(newPathWalker(tmp1), filepath.Join(tmp1, "rootfs"))

0 commit comments

Comments
 (0)