onionscan/scans/pgp_content_scan.go

41 lines
1.1 KiB
Go
Raw Normal View History

package scans
import (
"github.com/s-rah/onionscan/report"
2016-05-27 17:03:42 +02:00
"golang.org/x/crypto/openpgp"
"log"
"regexp"
2016-05-27 17:03:42 +02:00
"strings"
2016-06-01 16:15:44 +02:00
"fmt"
)
type PGPContentScan struct {
}
func (cs *PGPContentScan) ScanContent(content string, report *report.OnionScanReport) {
2016-05-27 17:03:42 +02:00
log.Printf("Scanning for PGP Key\n")
pgpRegexp := regexp.MustCompile("-----BEGIN PGP PUBLIC KEY BLOCK-----((?s).*)-----END PGP PUBLIC KEY BLOCK-----")
foundPGP := pgpRegexp.FindAllString(content, -1)
2016-05-27 17:03:42 +02:00
for _, keyString := range foundPGP {
keys, err := openpgp.ReadArmoredKeyRing(strings.NewReader(keyString));
if err != nil {
log.Printf("ERROR: %s\n", err)
continue
}
2016-06-01 16:15:44 +02:00
if len(keys) < 1 || len(keys[0].Subkeys) < 1 || len(keys[0].Identities) < 1{
2016-05-27 17:03:42 +02:00
log.Printf("ERROR: failed to accept key\n")
continue
}
2016-06-01 16:15:44 +02:00
var identity string
for identity, _ = range keys[0].Identities {
break
2016-05-27 17:03:42 +02:00
}
2016-06-01 16:15:44 +02:00
var fingerprint string
fingerprint = fmt.Sprintf("%X", keys[0].Subkeys[0].PublicKey.Fingerprint)
log.Printf("\tFound PGP Key fingerprint: %s belonging to %s", fingerprint, identity)
2016-05-27 17:03:42 +02:00
2016-06-01 16:15:44 +02:00
report.AddPGPKey(keyString, identity, fingerprint)
}
}