Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit fc8c0ca

Browse files
committed
plumbing: object/tag, add signature verification
1 parent 850b9f8 commit fc8c0ca

File tree

2 files changed

+92
-0
lines changed

2 files changed

+92
-0
lines changed

plumbing/object/tag.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
stdioutil "io/ioutil"
99
"strings"
1010

11+
"golang.org/x/crypto/openpgp"
12+
1113
"gopkg.in/src-d/go-git.v4/plumbing"
1214
"gopkg.in/src-d/go-git.v4/plumbing/storer"
1315
"gopkg.in/src-d/go-git.v4/utils/ioutil"
@@ -267,6 +269,31 @@ func (t *Tag) String() string {
267269
)
268270
}
269271

272+
func (t *Tag) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
273+
keyRingReader := strings.NewReader(armoredKeyRing)
274+
keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader)
275+
if err != nil {
276+
return nil, err
277+
}
278+
279+
// Extract signature.
280+
signature := strings.NewReader(t.PGPSignature)
281+
282+
// Remove signature. Keep only the tag components.
283+
t.PGPSignature = ""
284+
285+
encoded := &plumbing.MemoryObject{}
286+
if err := t.Encode(encoded); err != nil {
287+
return nil, err
288+
}
289+
er, err := encoded.Reader()
290+
if err != nil {
291+
return nil, err
292+
}
293+
294+
return openpgp.CheckArmoredDetachedSignature(keyring, er, signature)
295+
}
296+
270297
// TagIter provides an iterator for a set of tags.
271298
type TagIter struct {
272299
storer.EncodedObjectIter

plumbing/object/tag_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,3 +311,68 @@ RUysgqjcpT8+iQM1PblGfHR4XAhuOqN5Fx06PSaFZhqvWFezJ28/CLyX5q+oIVk=
311311
c.Assert(err, IsNil)
312312
c.Assert(decoded.PGPSignature, Equals, pgpsignature)
313313
}
314+
315+
func (s *TagSuite) TestVerify(c *C) {
316+
ts := time.Unix(1511524851, 0)
317+
loc, _ := time.LoadLocation("Asia/Kolkata")
318+
tag := &Tag{
319+
Name: "v0.2",
320+
Tagger: Signature{Name: "Sunny", Email: "[email protected]", When: ts.In(loc)},
321+
Message: `This is a signed tag
322+
`,
323+
TargetType: plumbing.CommitObject,
324+
Target: plumbing.NewHash("064f92fe00e70e6b64cb358a65039daa4b6ae8d2"),
325+
PGPSignature: `
326+
-----BEGIN PGP SIGNATURE-----
327+
328+
iQFHBAABCAAxFiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAloYCg8THG1lQGRhcmtv
329+
d2x6ei5zcGFjZQAKCRBDIt4ypybJTs0cCACjQZe2610t3gfbUPbgQiWDL9uvlCeb
330+
sNSeTC6hLAFSvHTMqLr/6RpiLlfQXyATD7TZUH0DUSLsERLheG82OgVxkOTzPCpy
331+
GL6iGKeZ4eZ1KiV+SBPjqizC9ShhGooPUw9oUSVdj4jsaHDdDHtY63Pjl0KvJmms
332+
OVi9SSxjeMbmaC81C8r0ZuOLTXJh/JRKh2BsehdcnK3736BK+16YRD7ugXLpkQ5d
333+
nsCFVbuYYoLMoJL5NmEun0pbUrpY+MI8VPK0f9HV5NeaC4NksC+ke/xYMT+P2lRL
334+
CN+9zcCIU+mXr2fCl1xOQcnQzwOElObDxpDcPcxVn0X+AhmPc+uj0mqD
335+
=l75D
336+
-----END PGP SIGNATURE-----
337+
`,
338+
}
339+
340+
armoredKeyRing := `
341+
-----BEGIN PGP PUBLIC KEY BLOCK-----
342+
343+
mQENBFmtHgABCADnfThM7q8D4pgUub9jMppSpgFh3ev84g3Csc3yQUlszEOVgXmu
344+
YiSWP1oAiWFQ8ahCydh3LT8TnEB2QvoRNiExUI5XlXFwVfKW3cpDu8gdhtufs90Q
345+
NvpaHOgTqRf/texGEKwXi6fvS47fpyaQ9BKNdN52LeaaHzDDZkVsAFmroE+7MMvj
346+
P4Mq8qDn2WcWnX9zheQKYrX6Cs48Tx80eehHor4f/XnuaP8DLmPQx7URdJ0Igckh
347+
N+i91Qv2ujin8zxUwhkfus66EZS9lQ4qR9iVHs4WHOs3j7whsejd4VhajonilVHj
348+
uqTtqHmpN/4njbIKb8q8uQkS26VQYoSYm2UvABEBAAG0GlN1bm55IDxtZUBkYXJr
349+
b3dsenouc3BhY2U+iQFUBBMBCAA+FiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAlmt
350+
HgACGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQQyLeMqcmyU7V
351+
nAf+J5BYu26B2i+iwctOzDRFcPwCLka9cBwe5wcDvoF2qL8QRo8NPWBBH4zWHa/k
352+
BthtGo1b89a53I2hnTwTQ0NOtAUNV+Vvu6nOHJd9Segsx3E1nM43bd2bUfGJ1eeO
353+
jDOlOvtP4ozuV6Ej+0Ln2ouMOc87yAwbAzTfQ9axU6CKUbqy0/t2dW1jdKntGH+t
354+
VPeFxJHL2gXjP89skCSPYA7yKqqyJRPFvC+7rde1OLdCmZi4VwghUiNbh3s1+xM3
355+
gfr2ahsRDTN2SQzwuHu4y1EgZgPtuWfRxzHqduoRoSgfOfFr9H9Il3UMHf2Etleu
356+
rif40YZJhge6STwsIycGh4wOiLkBDQRZrR4AAQgArpUvPdGC/W9X4AuZXrXEShvx
357+
TqM4K2Jk9n0j+ABx87k9fm48qgtae7+TayMbb0i7kcbgnjltKbauTbyRbju/EJvN
358+
CdIw76IPpjy6jUM37wG2QGLFo6Ku3x8/ZpNGGOZ8KMU258/EBqDlJQ/4g4kJ8D+m
359+
9yOH0r6/Xpe/jOY2V8Jo9pdFTm+8eAsSyZF0Cl7drz603Pymq1IS2wrwQbdxQA/w
360+
B75pQ5es7X34Ac7/9UZCwCPmZDAldnjHyw5dZgZe8XLrG84BIfbG0Hj8PjrFdF1D
361+
Czt9bk+PbYAnLORW2oX1oedxVrNFo5UrbWgBSjA1ppbGFjwSDHFlyjuEuxqyFwAR
362+
AQABiQE8BBgBCAAmFiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAlmtHgACGwwFCQPC
363+
ZwAACgkQQyLeMqcmyU7ZBggArzc8UUVSjde987Vqnu/S5Cv8Qhz+UB7gAFyTW2iF
364+
VYvB86r30H/NnfjvjCVkBE6FHCNHoxWVyDWmuxKviB7nkReHuwqniQHPgdJDcTKC
365+
tBboeX2IYBLJbEvEJuz5NSvnvFuYkIpZHqySFaqdl/qu9XcmoPL5AmIzIFOeiNty
366+
qT0ldkf3ru6yQQDDqBDpkfz4AzkpFnLYL59z6IbJDK2Hz7aKeSEeVOGiZLCjIZZV
367+
uISZThYqh5zUkvF346OHLDqfDdgQ4RZriqd/DTtRJPlz2uL0QcEIjJuYCkG0UWgl
368+
sYyf9RfOnw/KUFAQbdtvLx3ikODQC+D3KBtuKI9ISHQfgw==
369+
=FPev
370+
-----END PGP PUBLIC KEY BLOCK-----
371+
`
372+
373+
e, err := tag.Verify(armoredKeyRing)
374+
c.Assert(err, IsNil)
375+
376+
_, ok := e.Identities["Sunny <[email protected]>"]
377+
c.Assert(ok, Equals, true)
378+
}

0 commit comments

Comments
 (0)