package signedtag_test import ( "testing" objectid "codeberg.org/lindenii/furgit/object/id" signedtag "codeberg.org/lindenii/furgit/object/signed/tag" ) func TestParseSignedTag(t *testing.T) { t.Parallel() body := []byte("" + "object 04b871796dc0420f8e7561a895b52484b701d51a\n" + "type commit\n" + "tag signedtag\n" + "tagger C O Mitter 1465981006 +0000\n" + "gpgsig-sha256 -----BEGIN PGP SIGNATURE-----\n" + " Version: GnuPG v1\n" + " \n" + " header-signature\n" + " -----END PGP SIGNATURE-----\n" + "\n" + "signed tag\n" + "\n" + "signed tag message body\n" + "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1\n" + "\n" + "body-signature\n" + "-----END PGP SIGNATURE-----\n") tag, err := signedtag.Parse(body, objectid.AlgorithmSHA1) if err != nil { t.Fatalf("Parse: %v", err) } gotPayload := string(tag.AppendPayload(nil)) wantPayload := "" + "object 04b871796dc0420f8e7561a895b52484b701d51a\n" + "type commit\n" + "tag signedtag\n" + "tagger C O Mitter 1465981006 +0000\n" + "\n" + "signed tag\n" + "\n" + "signed tag message body\n" if gotPayload != wantPayload { t.Fatalf("payload mismatch:\n got: %q\nwant: %q", gotPayload, wantPayload) } gotAlgorithms := tag.Algorithms() if len(gotAlgorithms) != 2 || gotAlgorithms[0] != objectid.AlgorithmSHA1 || gotAlgorithms[1] != objectid.AlgorithmSHA256 { t.Fatalf("algorithms mismatch: got %v", gotAlgorithms) } gotSignature, ok := tag.AppendSignature(nil, objectid.AlgorithmSHA1) if !ok { t.Fatal("missing sha1 signature") } wantSignature := "" + "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1\n" + "\n" + "body-signature\n" + "-----END PGP SIGNATURE-----\n" if string(gotSignature) != wantSignature { t.Fatalf("signature mismatch:\n got: %q\nwant: %q", string(gotSignature), wantSignature) } gotHeaderSignature, ok := tag.AppendSignature(nil, objectid.AlgorithmSHA256) if !ok { t.Fatal("missing sha256 signature") } wantHeaderSignature := "" + "-----BEGIN PGP SIGNATURE-----\n" + "Version: GnuPG v1\n" + "\n" + "header-signature\n" + "-----END PGP SIGNATURE-----\n" if string(gotHeaderSignature) != wantHeaderSignature { t.Fatalf("header signature mismatch:\n got: %q\nwant: %q", string(gotHeaderSignature), wantHeaderSignature) } } func TestParseHeaderOnlyTagStripsHeaderAndKeepsHeaderSignature(t *testing.T) { t.Parallel() body := []byte("" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "gpgsig-sha256 header\n" + " continued\n" + "\n" + "message\n") tag, err := signedtag.Parse(body, objectid.AlgorithmSHA1) if err != nil { t.Fatalf("Parse: %v", err) } gotPayload := string(tag.AppendPayload(nil)) wantPayload := "" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "\n" + "message\n" if gotPayload != wantPayload { t.Fatalf("payload mismatch:\n got: %q\nwant: %q", gotPayload, wantPayload) } gotSignature, ok := tag.AppendSignature(nil, objectid.AlgorithmSHA256) if !ok { t.Fatal("missing sha256 signature") } wantSignature := "" + "header\n" + "continued\n" if string(gotSignature) != wantSignature { t.Fatalf("signature mismatch:\n got: %q\nwant: %q", string(gotSignature), wantSignature) } if _, ok := tag.AppendSignature(nil, objectid.AlgorithmSHA1); ok { t.Fatal("unexpected sha1 signature") } } func TestParseKeepsUnknownHeaderSignatureTextInPayload(t *testing.T) { t.Parallel() body := []byte("" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "gpgsig-future header\n" + " continued\n" + "\n" + "message line\n" + "-----BEGIN PGP SIGNATURE-----\n" + "body-signature\n" + "-----END PGP SIGNATURE-----\n") tag, err := signedtag.Parse(body, objectid.AlgorithmSHA1) if err != nil { t.Fatalf("Parse: %v", err) } gotPayload := string(tag.AppendPayload(nil)) wantPayload := "" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "gpgsig-future header\n" + " continued\n" + "\n" + "message line\n" if gotPayload != wantPayload { t.Fatalf("payload mismatch:\n got: %q\nwant: %q", gotPayload, wantPayload) } } func TestParseKeepsMessageGpgsigTextInPayload(t *testing.T) { t.Parallel() body := []byte("" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "\n" + "message line\n" + "gpgsig-future header\n" + " continued\n" + "-----BEGIN PGP SIGNATURE-----\n" + "body-signature\n" + "-----END PGP SIGNATURE-----\n") tag, err := signedtag.Parse(body, objectid.AlgorithmSHA1) if err != nil { t.Fatalf("Parse: %v", err) } gotPayload := string(tag.AppendPayload(nil)) wantPayload := "" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "\n" + "message line\n" + "gpgsig-future header\n" + " continued\n" if gotPayload != wantPayload { t.Fatalf("payload mismatch:\n got: %q\nwant: %q", gotPayload, wantPayload) } } func TestParseUsesLastSignatureBeginByPrefix(t *testing.T) { t.Parallel() body := []byte("" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "\n" + "message\n" + "-----BEGIN PGP SIGNATURE----- stray\n" + "still message\n" + "-----BEGIN PGP SIGNATURE----- trailing\n" + "body-signature\n") tag, err := signedtag.Parse(body, objectid.AlgorithmSHA1) if err != nil { t.Fatalf("Parse: %v", err) } gotPayload := string(tag.AppendPayload(nil)) wantPayload := "" + "object deadbeef\n" + "type commit\n" + "tag signedtag\n" + "tagger T A Gger 1465981006 +0000\n" + "\n" + "message\n" + "-----BEGIN PGP SIGNATURE----- stray\n" + "still message\n" if gotPayload != wantPayload { t.Fatalf("payload mismatch:\n got: %q\nwant: %q", gotPayload, wantPayload) } gotSignature, ok := tag.AppendSignature(nil, objectid.AlgorithmSHA1) if !ok { t.Fatal("missing signature") } wantSignature := "" + "-----BEGIN PGP SIGNATURE----- trailing\n" + "body-signature\n" if string(gotSignature) != wantSignature { t.Fatalf("signature mismatch:\n got: %q\nwant: %q", string(gotSignature), wantSignature) } }