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

Commit 42719aa

Browse files
authored
Merge pull request #653 from darkowlzz/verify-commit
plumbing: object, new Commit.Verify method
2 parents be7a64e + 923647a commit 42719aa

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

plumbing/object/commit.go

+30
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"io"
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"
@@ -311,6 +313,34 @@ func (c *Commit) String() string {
311313
)
312314
}
313315

316+
// Verify performs PGP verification of the commit with a provided armored
317+
// keyring and returns openpgp.Entity associated with verifying key on success.
318+
func (c *Commit) Verify(armoredKeyRing string) (*openpgp.Entity, error) {
319+
keyRingReader := strings.NewReader(armoredKeyRing)
320+
keyring, err := openpgp.ReadArmoredKeyRing(keyRingReader)
321+
if err != nil {
322+
return nil, err
323+
}
324+
325+
// Extract signature.
326+
signature := strings.NewReader(c.PGPSignature)
327+
328+
// Remove signature. Keep only the commit components.
329+
c.PGPSignature = ""
330+
331+
// Encode commit and get a reader object.
332+
encoded := &plumbing.MemoryObject{}
333+
if err := c.Encode(encoded); err != nil {
334+
return nil, err
335+
}
336+
er, err := encoded.Reader()
337+
if err != nil {
338+
return nil, err
339+
}
340+
341+
return openpgp.CheckArmoredDetachedSignature(keyring, er, signature)
342+
}
343+
314344
func indent(t string) string {
315345
var output []string
316346
for _, line := range strings.Split(t, "\n") {

plumbing/object/commit_test.go

+65
Original file line numberDiff line numberDiff line change
@@ -296,3 +296,68 @@ func (s *SuiteCommit) TestStat(c *C) {
296296
c.Assert(fileStats[1].Deletion, Equals, 0)
297297
c.Assert(fileStats[1].String(), Equals, " php/crappy.php | 259 ++++++++++++++++++++++++++++++++++++++++++++++++++++\n")
298298
}
299+
300+
func (s *SuiteCommit) TestVerify(c *C) {
301+
ts := time.Unix(1511197315, 0)
302+
commit := &Commit{
303+
Hash: plumbing.NewHash("8a9cea36fe052711fbc42b86e1f99a4fa0065deb"),
304+
Author: Signature{Name: "Sunny", Email: "[email protected]", When: ts},
305+
Committer: Signature{Name: "Sunny", Email: "[email protected]", When: ts},
306+
Message: `status: simplify template command selection
307+
`,
308+
TreeHash: plumbing.NewHash("6572ba6df4f1fb323c8aaa24ce07bca0648b161e"),
309+
ParentHashes: []plumbing.Hash{plumbing.NewHash("ede5f57ea1280a0065beec96d3e1a3453d010dbd")},
310+
PGPSignature: `
311+
-----BEGIN PGP SIGNATURE-----
312+
313+
iQFHBAABCAAxFiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAloTCrsTHG1lQGRhcmtv
314+
d2x6ei5zcGFjZQAKCRBDIt4ypybJTul5CADmVxB4kqlqRZ9fAcSU5LKva3GRXx0+
315+
leX6vbzoyQztSWYgl7zALh4kB3a3t2C9EnnM6uehlgaORNigyMArCSY1ivWVviCT
316+
BvldSVi8f8OvnqwbWX0I/5a8KmItthDf5WqZRFjhcRlY1AK5Bo2hUGVRq71euf8F
317+
rE6wNhDoyBCEpftXuXbq8duD7D6qJ7QiOS4m5+ej1UCssS2WQ60yta7q57odduHY
318+
+txqTKI8MQUpBgoTqh+V4lOkwQQxLiz7hIQ/ZYLUcnp6fan7/kY/G7YoLt9pOG1Y
319+
vLzAWdidLH2P+EUOqlNMuVScHYWD1FZB0/L5LJ8no5pTowQd2Z+Nggxl
320+
=0uC8
321+
-----END PGP SIGNATURE-----
322+
`,
323+
}
324+
325+
armoredKeyRing := `
326+
-----BEGIN PGP PUBLIC KEY BLOCK-----
327+
328+
mQENBFmtHgABCADnfThM7q8D4pgUub9jMppSpgFh3ev84g3Csc3yQUlszEOVgXmu
329+
YiSWP1oAiWFQ8ahCydh3LT8TnEB2QvoRNiExUI5XlXFwVfKW3cpDu8gdhtufs90Q
330+
NvpaHOgTqRf/texGEKwXi6fvS47fpyaQ9BKNdN52LeaaHzDDZkVsAFmroE+7MMvj
331+
P4Mq8qDn2WcWnX9zheQKYrX6Cs48Tx80eehHor4f/XnuaP8DLmPQx7URdJ0Igckh
332+
N+i91Qv2ujin8zxUwhkfus66EZS9lQ4qR9iVHs4WHOs3j7whsejd4VhajonilVHj
333+
uqTtqHmpN/4njbIKb8q8uQkS26VQYoSYm2UvABEBAAG0GlN1bm55IDxtZUBkYXJr
334+
b3dsenouc3BhY2U+iQFUBBMBCAA+FiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAlmt
335+
HgACGwMFCQPCZwAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQQyLeMqcmyU7V
336+
nAf+J5BYu26B2i+iwctOzDRFcPwCLka9cBwe5wcDvoF2qL8QRo8NPWBBH4zWHa/k
337+
BthtGo1b89a53I2hnTwTQ0NOtAUNV+Vvu6nOHJd9Segsx3E1nM43bd2bUfGJ1eeO
338+
jDOlOvtP4ozuV6Ej+0Ln2ouMOc87yAwbAzTfQ9axU6CKUbqy0/t2dW1jdKntGH+t
339+
VPeFxJHL2gXjP89skCSPYA7yKqqyJRPFvC+7rde1OLdCmZi4VwghUiNbh3s1+xM3
340+
gfr2ahsRDTN2SQzwuHu4y1EgZgPtuWfRxzHqduoRoSgfOfFr9H9Il3UMHf2Etleu
341+
rif40YZJhge6STwsIycGh4wOiLkBDQRZrR4AAQgArpUvPdGC/W9X4AuZXrXEShvx
342+
TqM4K2Jk9n0j+ABx87k9fm48qgtae7+TayMbb0i7kcbgnjltKbauTbyRbju/EJvN
343+
CdIw76IPpjy6jUM37wG2QGLFo6Ku3x8/ZpNGGOZ8KMU258/EBqDlJQ/4g4kJ8D+m
344+
9yOH0r6/Xpe/jOY2V8Jo9pdFTm+8eAsSyZF0Cl7drz603Pymq1IS2wrwQbdxQA/w
345+
B75pQ5es7X34Ac7/9UZCwCPmZDAldnjHyw5dZgZe8XLrG84BIfbG0Hj8PjrFdF1D
346+
Czt9bk+PbYAnLORW2oX1oedxVrNFo5UrbWgBSjA1ppbGFjwSDHFlyjuEuxqyFwAR
347+
AQABiQE8BBgBCAAmFiEEoRt6IzxHaZkkUslhQyLeMqcmyU4FAlmtHgACGwwFCQPC
348+
ZwAACgkQQyLeMqcmyU7ZBggArzc8UUVSjde987Vqnu/S5Cv8Qhz+UB7gAFyTW2iF
349+
VYvB86r30H/NnfjvjCVkBE6FHCNHoxWVyDWmuxKviB7nkReHuwqniQHPgdJDcTKC
350+
tBboeX2IYBLJbEvEJuz5NSvnvFuYkIpZHqySFaqdl/qu9XcmoPL5AmIzIFOeiNty
351+
qT0ldkf3ru6yQQDDqBDpkfz4AzkpFnLYL59z6IbJDK2Hz7aKeSEeVOGiZLCjIZZV
352+
uISZThYqh5zUkvF346OHLDqfDdgQ4RZriqd/DTtRJPlz2uL0QcEIjJuYCkG0UWgl
353+
sYyf9RfOnw/KUFAQbdtvLx3ikODQC+D3KBtuKI9ISHQfgw==
354+
=FPev
355+
-----END PGP PUBLIC KEY BLOCK-----
356+
`
357+
358+
e, err := commit.Verify(armoredKeyRing)
359+
c.Assert(err, IsNil)
360+
361+
_, ok := e.Identities["Sunny <[email protected]>"]
362+
c.Assert(ok, Equals, true)
363+
}

0 commit comments

Comments
 (0)