diff --git a/scans/pgp_content_scan.go b/scans/pgp_content_scan.go index ebbdfb5..e3e4b46 100644 --- a/scans/pgp_content_scan.go +++ b/scans/pgp_content_scan.go @@ -2,18 +2,38 @@ package scans import ( "github.com/s-rah/onionscan/report" + "golang.org/x/crypto/openpgp" "log" "regexp" + "strings" ) type PGPContentScan struct { } func (cs *PGPContentScan) ScanContent(content string, report *report.OnionScanReport) { - log.Printf("\tScanning for PGP Key\n") + 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) - for _, key := range foundPGP { - report.AddPGPKey(key) + for _, keyString := range foundPGP { + log.Printf("\tFound key: %s\n", keyString) + keys, err := openpgp.ReadArmoredKeyRing(strings.NewReader(keyString)); + if err != nil { + log.Printf("ERROR: %s\n", err) + continue + } + if len(keys) != 1 || len(keys[0].Subkeys) != 1 { + log.Printf("ERROR: failed to accept key\n") + continue + } + + for name, identity := range keys[0].Identities { + log.Printf("identity: %s,%s,%s\n", name, identity.Name, identity.UserId) + } + + pubkey := keys[0].Subkeys[0].PublicKey + log.Printf("pubkey: %X", pubkey.Fingerprint) + + report.AddPGPKey(keyString) } }