Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion signatures.go
Original file line number Diff line number Diff line change
Expand Up @@ -208,6 +208,18 @@ func SignRpmFile(infile *os.File, outpath string, key *packet.PrivateKey, opts *
return header, rewriteRpm(infile, outpath, header)
}

// SignRpmFileIntoStream signs the rpmfile represented by infile with the
// provided private key and sig options. The entire signed RPM file is then
// written to the outstream.
func SignRpmFileIntoStream(outstream io.Writer, infile io.ReadSeeker, key *packet.PrivateKey, opts *SignatureOptions) error {
header, err := SignRpmStream(infile, key, opts)
if err != nil {
return err
}
delete(header.sigHeader.entries, SIG_RESERVEDSPACE-_SIGHEADER_TAG_BASE)
return writeRpm(infile, outstream, header.sigHeader)
}

// RewriteWithSignatures inserts raw signatures into a RPM header.
//
// DEPRECATED: To perform a detached signature, use SignRpmStream and call
Expand Down Expand Up @@ -261,7 +273,7 @@ func rewriteRpm(infile *os.File, outpath string, header *RpmHeader) error {
if err != nil {
os.Remove(tempfile.Name())
} else {
_ = tempfile.Chmod(0644)
_ = tempfile.Chmod(0o644)
if err = tempfile.Close(); err != nil {
return
}
Expand Down
28 changes: 28 additions & 0 deletions signatures_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,34 @@ func TestSign(t *testing.T) {
}
}

func TestSignRpmFileIntoStream(t *testing.T) {
keyring, err := openpgp.ReadArmoredKeyRing(bytes.NewReader([]byte(testkey)))
if err != nil {
t.Fatal("failed to parse test key:", err)
}
entity := keyring[0]

f, err := os.Open("testdata/simple-1.0.1-1.i386.rpm")
if err != nil {
t.Fatal("failed to open test rpm:", err)
}
defer f.Close()

buf := &bytes.Buffer{}
err = SignRpmFileIntoStream(buf, f, entity.PrivateKey, nil)
if err != nil {
t.Fatal("error signing rpm:", err)
}

_, sigs, err := Verify(buf, keyring)
if err != nil {
t.Fatal("error verifying signature:", err)
}
if len(sigs) != 2 || sigs[0].Signer != entity || sigs[1].Signer != entity {
t.Fatalf("error verifying signature: incorrect signers. found: %#v", sigs)
}
}

const testkey = `
-----BEGIN PGP PRIVATE KEY BLOCK-----

Expand Down