Skip to content

Commit 9386a7f

Browse files
authored
Merge pull request #104 from wking/go-digest
image: Port to go-digest
2 parents 6058078 + adb0766 commit 9386a7f

File tree

5 files changed

+33
-31
lines changed

5 files changed

+33
-31
lines changed

glide.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

glide.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package: github.com/opencontainers/image-tools
22
import:
3+
- package: github.com/opencontainers/go-digest
4+
version: v1.0.0-rc0
35
- package: github.com/opencontainers/image-spec
46
version: v1.0.0-rc4
57
subpackages:

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,8 +115,13 @@ 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)
119+
if err != nil {
120+
return err
121+
}
122+
123+
verifier := parsed.Verifier()
124+
n, err := io.Copy(verifier, r)
121125
if err != nil {
122126
return errors.Wrap(err, "error generating hash")
123127
}
@@ -126,9 +130,7 @@ func (d *descriptor) validateContent(r io.Reader) error {
126130
return errors.New("size mismatch")
127131
}
128132

129-
digest := "sha256:" + hex.EncodeToString(h.Sum(nil))
130-
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)