/// <summary> /// Lists the known keys. /// </summary> /// <param name="target">The target.</param> /// <returns></returns> public IEnumerable <KeyId> ListKeys(KeyTarget target) { var args = "--fixed-list-mode --with-colons --with-fingerprint --list-public-keys"; var keyHead = "pub"; if (target == KeyTarget.Secret) { args = "--fixed-list-mode --with-colons --with-fingerprint --list-secret-keys"; keyHead = "sec"; } if (!string.IsNullOrWhiteSpace(KeyringFolder)) { args += string.Format(" --homedir \"{0}\" ", KeyringFolder); } using (var proc = new RedirectedProcess(GnuPGConfig.GnuPGExePath, args)) { if (proc.Start()) { proc.WaitForExit(); string[] lines = proc.Output.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < lines.Length; i++) { var fields = lines[i].Split(':'); if (fields[0] == keyHead) { var id = fields[4]; var allowCap = KeyCapabilities.None; var useCap = KeyCapabilities.None; ParseKeyCapField(fields[11], ref allowCap, ref useCap); i++; // read more lines as part of this key string finger = null; List <string> users = new List <string>(); for (; i < lines.Length; i++) { fields = lines[i].Split(':'); if (fields[0] == keyHead) { // another key, exit loop i--; break; } switch (fields[0]) { case "uid": users.Add(IOUtility.DecodeAsciiEscapes(fields[9])); break; case "fpr": finger = fields[9]; break; } } yield return(new KeyId(id, finger, allowCap, useCap, users)); } } } } }