From 2b050ad0bfc2875cab4a78fa978603cbf58b14c1 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Mon, 26 Jun 2017 20:52:02 +0000 Subject: [PATCH 1/9] Fix digest --- control.go | 4 ++++ debpkg.go | 25 ++++++++++++++--------- digest.go | 47 ++++++++++++++++++++++++++++---------------- digest_test.go | 41 ++++++++++---------------------------- lib/targzip/targz.go | 13 ++++++++++++ 5 files changed, 73 insertions(+), 57 deletions(-) diff --git a/control.go b/control.go index a92b460..0690044 100644 --- a/control.go +++ b/control.go @@ -235,6 +235,10 @@ func (c *control) version() string { c.info.version.patch) } +func (c *control) size() int64 { + return c.tgz.Size() +} + // Create control file for control.tar.gz func (c *control) String(installedSize uint64) string { var o string diff --git a/debpkg.go b/debpkg.go index afbea1c..9e2e4d1 100644 --- a/debpkg.go +++ b/debpkg.go @@ -76,8 +76,7 @@ func (deb *DebPkg) Close() error { return nil } -// Write the debian package to the filename -func (deb *DebPkg) Write(filename string) error { +func (deb *DebPkg) writeControlData() error { err := deb.control.verify() if err != nil { return err @@ -88,10 +87,6 @@ func (deb *DebPkg) Write(filename string) error { return fmt.Errorf("error while creating control.tar.gz: %s", err) } - if filename == "" { - filename = deb.GetFilename() - } - if err := deb.control.tgz.Close(); err != nil { return fmt.Errorf("cannot close tgz writer: %v", err) } @@ -99,7 +94,17 @@ func (deb *DebPkg) Write(filename string) error { if err := deb.data.tgz.Close(); err != nil { return fmt.Errorf("cannot close tgz writer: %v", err) } + return nil +} +// Write the debian package to the filename +func (deb *DebPkg) Write(filename string) error { + if err := deb.writeControlData(); err != nil { + return err + } + if filename == "" { + filename = deb.GetFilename() + } return deb.createDebAr(filename) } @@ -136,9 +141,8 @@ func (deb *DebPkg) WriteSigned(filename string, entity *openpgp.Entity, keyid st return fmt.Errorf("error while signing: %s", err) } - err = createControlTarGz(deb) - if err != nil { - return fmt.Errorf("error while creating control.tar.gz: %s", err) + if err := deb.writeControlData(); err != nil { + return err } deb.digest.plaintext = createDigestFileString(deb) @@ -153,6 +157,9 @@ func (deb *DebPkg) WriteSigned(filename string, entity *openpgp.Entity, keyid st deb.digest.clearsign = buf.String() + if filename == "" { + filename = deb.GetFilename() + } return deb.createDebAr(filename) } diff --git a/digest.go b/digest.go index d0bd5cd..320ea05 100644 --- a/digest.go +++ b/digest.go @@ -5,6 +5,7 @@ package debpkg import ( + "os" "bytes" "crypto" "crypto/md5" @@ -22,10 +23,8 @@ const digestRole = "builder" type digest struct { plaintext string // Plaintext package digest (empty when unsigned) clearsign string // GPG clearsigned package digest (empty when unsigned) - version int // Always version 4 (for dpkg-sig 0.13.1+nmu2) signer string // Name date string // Mon Jan 2 15:04:05 2006 (time.ANSIC) - role string // builder files string // Multiple "\t " // E.g: // 3cf918272ffa5de195752d73f3da3e5e 7959c969e092f2a5a8604e2287807ac5b1b384ad 4 debian-binary @@ -42,40 +41,54 @@ Date: %s Role: %s Files: %s` - deb.digest.version = digestVersion - deb.digest.role = digestRole - // debian-binary + md5sum, _ := digestCalcDataHash(bytes.NewBuffer([]byte(deb.debianBinary)), md5.New()) + sha1sum, _ := digestCalcDataHash(bytes.NewBuffer([]byte(deb.debianBinary)), sha1.New()) deb.digest.files += fmt.Sprintf("\t%x %x %d %s\n", - digestCalcDataHash(bytes.NewBuffer([]byte(deb.debianBinary)), md5.New()), - digestCalcDataHash(bytes.NewBuffer([]byte(deb.debianBinary)), sha1.New()), + md5sum, + sha1sum, len(deb.debianBinary), "debian-binary") // control.tar.gz + md5sum, _ = digestCalcDataHashFromFile(deb.control.tgz.Name(), md5.New()) + sha1sum, _ = digestCalcDataHashFromFile(deb.control.tgz.Name(), sha1.New()) deb.digest.files += fmt.Sprintf("\t%x %x %d %s\n", - 0, 0, - 0, // TODO control size + md5sum, + sha1sum, + deb.control.tgz.Size(), "control.tar.gz") // data.tar.gz + md5sum, _ = digestCalcDataHashFromFile(deb.data.tgz.Name(), md5.New()) + sha1sum, _ = digestCalcDataHashFromFile(deb.data.tgz.Name(), sha1.New()) deb.digest.files += fmt.Sprintf("\t%x %x %d %s\n", - 0, 0, - 0, // TODO data size + md5sum, + sha1sum, + deb.data.tgz.Size(), "data.tar.gz") return fmt.Sprintf(digestFileTmpl, - deb.digest.version, + digestVersion, deb.digest.signer, deb.digest.date, - deb.digest.role, + digestRole, deb.digest.files) } -func digestCalcDataHash(data *bytes.Buffer, hash hash.Hash) string { +func digestCalcDataHashFromFile(filename string, hash hash.Hash) (string, error) { + f, err := os.Open(filename) + if err != nil { + return "", err + } + defer f.Close() + return digestCalcDataHash(f, hash) +} + +func digestCalcDataHash(in io.Reader, hash hash.Hash) (string, error) { var result []byte - if _, err := io.Copy(hash, data); err != nil { - return "" + if _, err := io.Copy(hash, in); err != nil { + return "", err } - return string(hash.Sum(result)) + return string(hash.Sum(result)),nil } diff --git a/digest_test.go b/digest_test.go index 2cdc700..15aa4ea 100644 --- a/digest_test.go +++ b/digest_test.go @@ -5,7 +5,7 @@ package debpkg import ( - "fmt" +// "fmt" "testing" "golang.org/x/crypto/openpgp" @@ -18,28 +18,16 @@ func init() { e, _ = openpgp.NewEntity("Foo Bar", "", "foo@bar.com", nil) } -// Test creation of empty digest +/* func TestDigestCreateEmpty(t *testing.T) { - // FIXME it seems whe digesting the data buf the whole tarball will go corrupt... - /* - digestExpect := `Version: 4 - Signer: - Date: - Role: builder - Files: - 3cf918272ffa5de195752d73f3da3e5e 7959c969e092f2a5a8604e2287807ac5b1b384ad 4 debian-binary - d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 0 control.tar.gz - d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 0 data.tar.gz - ` - */ digestExpect := `Version: 4 -Signer: -Date: +Signer: +Date: Role: builder -Files: +Files: 3cf918272ffa5de195752d73f3da3e5e 7959c969e092f2a5a8604e2287807ac5b1b384ad 4 debian-binary - 0 0 0 control.tar.gz - 0 0 0 data.tar.gz + d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 0 control.tar.gz + d41d8cd98f00b204e9800998ecf8427e da39a3ee5e6b4b0d3255bfef95601890afd80709 0 data.tar.gz ` deb := New() @@ -51,24 +39,16 @@ Files: fmt.Printf("--- expected (len %d):\n'%s'\n--- got (len %d):\n'%s'---\n", len(digestExpect), digestExpect, len(digest), digest) } } - -/* -func TestWriteSignedEmpty(t *testing.T) { - deb := New() - - // WriteSigned package - err := deb.WriteSigned("debpkg-test-signed-empty.deb", e, "00000000") - if err != nil { - t.Errorf("Error in writing signed package: %v", err) - } -} +*/ func TestWriteSigned(t *testing.T) { deb := New() + defer deb.Close() deb.SetName("debpkg-test-signed") deb.SetVersion("0.0.1") deb.SetMaintainer("Foo Bar") + deb.SetArchitecture("any") deb.SetMaintainerEmail("foo@bar.com") deb.SetHomepage("https://foobar.com") deb.SetShortDescription("some awesome foobar pkg") @@ -90,4 +70,3 @@ func TestWriteSigned(t *testing.T) { t.Errorf("Error in writing unsigned package: %v", err) } } -*/ diff --git a/lib/targzip/targz.go b/lib/targzip/targz.go index ec80699..e113d52 100644 --- a/lib/targzip/targz.go +++ b/lib/targzip/targz.go @@ -171,6 +171,19 @@ func (t *TarGzip) Name() string { return t.fileName } +func (t *TarGzip) Size() int64 { + f, err := os.Open(t.Name()) + if err != nil { + return 0 + } + defer f.Close() + fi, err := f.Stat() + if err != nil { + return 0 + } + return fi.Size() +} + // Remove removes the tempfile func (t *TarGzip) Remove() error { if t.fileName == "" { From 38e69ad26d38eaf8f82e21c38c4828913d834d0c Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Mon, 26 Jun 2017 21:09:28 +0000 Subject: [PATCH 2/9] debpkg: Fix TempDir --- debpkg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debpkg.go b/debpkg.go index 9e2e4d1..cfa3098 100644 --- a/debpkg.go +++ b/debpkg.go @@ -52,7 +52,7 @@ func SetTempDir(dir string) error { } // TempDir returns the directory to use for temporary files. -func TempDir() string () { +func TempDir() string { return debpkgTempDir } From 1ecf83a62383b915bfd5e922baf219565ecedb68 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Mon, 26 Jun 2017 21:19:22 +0000 Subject: [PATCH 3/9] Processed review comments --- digest_test.go | 1 - lib/targzip/targz.go | 7 +------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/digest_test.go b/digest_test.go index 15aa4ea..df16757 100644 --- a/digest_test.go +++ b/digest_test.go @@ -5,7 +5,6 @@ package debpkg import ( -// "fmt" "testing" "golang.org/x/crypto/openpgp" diff --git a/lib/targzip/targz.go b/lib/targzip/targz.go index e113d52..c1712dc 100644 --- a/lib/targzip/targz.go +++ b/lib/targzip/targz.go @@ -172,12 +172,7 @@ func (t *TarGzip) Name() string { } func (t *TarGzip) Size() int64 { - f, err := os.Open(t.Name()) - if err != nil { - return 0 - } - defer f.Close() - fi, err := f.Stat() + fi, err := os.Stat(t.Name()) if err != nil { return 0 } From 9924eb30346d35b47b1b1e915b1bffd5b95a1b59 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Mon, 26 Jun 2017 21:45:30 +0000 Subject: [PATCH 4/9] digest: Export GPG key generated in test for use with gpg --import or apt-key add --- digest_test.go | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/digest_test.go b/digest_test.go index df16757..cbfcac1 100644 --- a/digest_test.go +++ b/digest_test.go @@ -5,16 +5,41 @@ package debpkg import ( + "fmt" + "os" "testing" "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/armor" ) var e *openpgp.Entity func init() { // Create random new GPG identity for signage - e, _ = openpgp.NewEntity("Foo Bar", "", "foo@bar.com", nil) + e, _ = openpgp.NewEntity("Debpkg Authors", "", "debpkg-authors@xor-gate.org", nil) + + // Sign all the identities + for _, id := range e.Identities { + err := id.SelfSignature.SignUserId(id.UserId.Id, e.PrimaryKey, e.PrivateKey, nil) + if err != nil { + fmt.Println(err) + return + } + } + + f, _ := os.Create("digest_test.key") + w, err := armor.Encode(f, openpgp.PublicKeyType, nil) + if err != nil { + fmt.Println(err) + return + } + devnull, _ := os.Open(os.DevNull) + e.SerializePrivate(devnull, nil) + devnull.Close() + e.Serialize(w) + w.Close() + f.Close() } /* From 46f4cd1bb0cc2adcb281f6bb25d8c774b4cba170 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Mon, 26 Jun 2017 21:55:07 +0000 Subject: [PATCH 5/9] digest: Cleanup --- debpkg.go | 48 ----------------------------------------------- digest.go | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ digest_test.go | 2 +- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/debpkg.go b/debpkg.go index cfa3098..04d0e11 100644 --- a/debpkg.go +++ b/debpkg.go @@ -5,18 +5,12 @@ package debpkg import ( - "bytes" "fmt" "go/build" "os" "path/filepath" - "time" "github.com/xor-gate/debpkg/lib/targzip" - - "golang.org/x/crypto/openpgp" - "golang.org/x/crypto/openpgp/clearsign" - "golang.org/x/crypto/openpgp/packet" ) // DebPkg holds data for a single debian package @@ -121,48 +115,6 @@ func (deb *DebPkg) GetFilename() string { debianFileExtension) } -// WriteSigned package with GPG entity -func (deb *DebPkg) WriteSigned(filename string, entity *openpgp.Entity, keyid string) error { - var buf bytes.Buffer - var cfg packet.Config - var signer string - cfg.DefaultHash = digestDefaultHash - - for id := range entity.Identities { - // TODO real search for keyid, need to investigate maybe a subkey? - signer = id - } - - deb.digest.date = time.Now().Format(time.ANSIC) - deb.digest.signer = signer - - clearsign, err := clearsign.Encode(&buf, entity.PrivateKey, &cfg) - if err != nil { - return fmt.Errorf("error while signing: %s", err) - } - - if err := deb.writeControlData(); err != nil { - return err - } - - deb.digest.plaintext = createDigestFileString(deb) - - if _, err = clearsign.Write([]byte(deb.digest.plaintext)); err != nil { - return fmt.Errorf("error from Write: %s", err) - } - - if err = clearsign.Close(); err != nil { - return fmt.Errorf("error from Close: %s", err) - } - - deb.digest.clearsign = buf.String() - - if filename == "" { - filename = deb.GetFilename() - } - return deb.createDebAr(filename) -} - // AddFile adds a file by filename to the package func (deb *DebPkg) AddFile(filename string, dest ...string) error { return deb.data.addFile(filename, dest...) diff --git a/digest.go b/digest.go index 320ea05..f38df79 100644 --- a/digest.go +++ b/digest.go @@ -6,6 +6,7 @@ package debpkg import ( "os" + "time" "bytes" "crypto" "crypto/md5" @@ -13,6 +14,10 @@ import ( "fmt" "hash" "io" + + "golang.org/x/crypto/openpgp" + "golang.org/x/crypto/openpgp/clearsign" + "golang.org/x/crypto/openpgp/packet" ) const digestDefaultHash = crypto.SHA1 @@ -92,3 +97,49 @@ func digestCalcDataHash(in io.Reader, hash hash.Hash) (string, error) { } return string(hash.Sum(result)),nil } + +// WriteSigned package with GPG entity +func (deb *DebPkg) WriteSigned(filename string, entity *openpgp.Entity) error { + var buf bytes.Buffer + var cfg packet.Config + var signer string + cfg.DefaultHash = digestDefaultHash + + fmt.Printf("e: %+v\n", e) + + for id := range entity.Identities { + // TODO real search for keyid, need to investigate maybe a subkey? + signer = id + } + + deb.digest.date = time.Now().Format(time.ANSIC) + deb.digest.signer = signer + + clearsign, err := clearsign.Encode(&buf, entity.PrivateKey, &cfg) + if err != nil { + return fmt.Errorf("error while signing: %s", err) + } + + if err := deb.writeControlData(); err != nil { + return err + } + + deb.digest.plaintext = createDigestFileString(deb) + + if _, err = clearsign.Write([]byte(deb.digest.plaintext)); err != nil { + return fmt.Errorf("error from Write: %s", err) + } + + if err = clearsign.Close(); err != nil { + return fmt.Errorf("error from Close: %s", err) + } + + deb.digest.clearsign = buf.String() + + if filename == "" { + filename = deb.GetFilename() + } + return deb.createDebAr(filename) +} + + diff --git a/digest_test.go b/digest_test.go index cbfcac1..16e9719 100644 --- a/digest_test.go +++ b/digest_test.go @@ -89,7 +89,7 @@ func TestWriteSigned(t *testing.T) { deb.AddFile("debpkg.go") // WriteSigned the package - err := deb.WriteSigned("debpkg-test-signed.deb", e, "00000000") + err := deb.WriteSigned("debpkg-test-signed.deb", e) if err != nil { t.Errorf("Error in writing unsigned package: %v", err) } From fede7bceaa74e257b0cdeb6bea1bc45cb4684ced Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Tue, 27 Jun 2017 20:47:05 +0200 Subject: [PATCH 6/9] digest: Remove unnessary printf --- digest.go | 2 -- digest_test.go | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/digest.go b/digest.go index f38df79..390a59b 100644 --- a/digest.go +++ b/digest.go @@ -105,8 +105,6 @@ func (deb *DebPkg) WriteSigned(filename string, entity *openpgp.Entity) error { var signer string cfg.DefaultHash = digestDefaultHash - fmt.Printf("e: %+v\n", e) - for id := range entity.Identities { // TODO real search for keyid, need to investigate maybe a subkey? signer = id diff --git a/digest_test.go b/digest_test.go index 16e9719..ab9e6bf 100644 --- a/digest_test.go +++ b/digest_test.go @@ -28,6 +28,7 @@ func init() { } } + // TODO write to tempfile f, _ := os.Create("digest_test.key") w, err := armor.Encode(f, openpgp.PublicKeyType, nil) if err != nil { From e5573837d2acab80d9953721ebf27689fbd52080 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Tue, 27 Jun 2017 21:07:32 +0200 Subject: [PATCH 7/9] Makefile: Don't run test target with race detector, it slows down test with 100x (88secs -> 3.5secs) --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e2845ed..715fd3e 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ build: go install github.com/xor-gate/debpkg/cmd/debpkg test: - go test -v -race + go test -v lint: go tool vet . From 121a0a90b6d85d39dfcf8565d56eb9c6076727b1 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Tue, 27 Jun 2017 21:14:23 +0200 Subject: [PATCH 8/9] Appveyor dat spul --- .appveyor.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 39546c9..d0efb05 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -5,7 +5,6 @@ environment: build_script: - cmd: go version - cmd: go env -- cmd: go get -v github.com/xor-gate/debpkg/... - cmd: go build github.com/xor-gate/debpkg test_script: - cmd: go get github.com/stretchr/testify/assert From 3d537013b2e9cd134d0cb948930d3dc71bc05d00 Mon Sep 17 00:00:00 2001 From: Jerry Jacobs Date: Tue, 27 Jun 2017 21:16:24 +0200 Subject: [PATCH 9/9] Appveyor, submodules... --- .appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index d0efb05..6337ab8 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -2,6 +2,8 @@ version: '{build}' clone_folder: C:\gopath\src\github.com\xor-gate\debpkg environment: GOPATH: C:\gopath +install: +- cmd: git submodule update --init --recursive build_script: - cmd: go version - cmd: go env