/// <inheritdoc/> public IEnumerable<OpenPgpSignature> Verify(byte[] data, byte[] signature) { #region Sanity checks if (data == null) throw new ArgumentNullException(nameof(data)); if (signature == null) throw new ArgumentNullException(nameof(signature)); #endregion string result; using (var signatureFile = new TemporaryFile("0install-sig")) { File.WriteAllBytes(signatureFile, signature); result = new CliControl(HomeDir, data).Execute("--batch", "--no-secmem-warning", "--status-fd", "1", "--verify", signatureFile.Path, "-"); } string[] lines = result.SplitMultilineText(); // Each signature is represented by one line of encoded information var signatures = new List<OpenPgpSignature>(lines.Length); foreach (var line in lines) { try { var parsedSignature = ParseSignatureLine(line); if (parsedSignature != null) signatures.Add(parsedSignature); } #region Error handling catch (FormatException ex) { // Wrap exception since only certain exception types are allowed throw new IOException(ex.Message, ex); } #endregion } return signatures; }
/// <inheritdoc/> public IEnumerable <OpenPgpSignature> Verify(byte[] data, byte[] signature) { #region Sanity checks if (data == null) { throw new ArgumentNullException(nameof(data)); } if (signature == null) { throw new ArgumentNullException(nameof(signature)); } #endregion string result; using (var signatureFile = new TemporaryFile("0install-sig")) { File.WriteAllBytes(signatureFile, signature); result = new CliControl(_homeDir, data).Execute("--batch", "--no-secmem-warning", "--status-fd", "1", "--verify", signatureFile.Path, "-"); } var lines = result.SplitMultilineText(); // Each signature is represented by one line of encoded information var signatures = new List <OpenPgpSignature>(lines.Length); foreach (string line in lines) { try { var parsedSignature = ParseSignatureLine(line); if (parsedSignature != null) { signatures.Add(parsedSignature); } } #region Error handling catch (FormatException ex) { // Wrap exception since only certain exception types are allowed throw new IOException(ex.Message, ex); } #endregion } return(signatures); }
/// <inheritdoc/> public byte[] Sign(byte[] data, OpenPgpSecretKey secretKey, string passphrase = null) { #region Sanity checks if (data == null) { throw new ArgumentNullException(nameof(data)); } if (secretKey == null) { throw new ArgumentNullException(nameof(secretKey)); } #endregion string output = new CliControl(HomeDir, data).Execute("--batch", "--no-secmem-warning", "--passphrase", passphrase ?? "", "--local-user", secretKey.FormatKeyID(), "--detach-sign", "--armor", "--output", "-", "-"); string signatureBase64 = output .GetRightPartAtFirstOccurrence(Environment.NewLine + Environment.NewLine) .GetLeftPartAtLastOccurrence(Environment.NewLine + "=") .Replace(Environment.NewLine, "\n"); return(Convert.FromBase64String(signatureBase64)); }
/// <inheritdoc/> public IEnumerable <OpenPgpSecretKey> ListSecretKeys() { string result = new CliControl(HomeDir).Execute("--batch", "--no-secmem-warning", "--list-secret-keys", "--with-colons", "--fixed-list-mode", "--fingerprint"); string[] sec = null, fpr = null, uid = null; foreach (string line in result.SplitMultilineText()) { var parts = line.Split(':'); switch (parts[0]) { case "sec": // New element starting if (sec != null && fpr != null && uid != null) { yield return(ParseSecretKey(sec, fpr, uid)); } sec = parts; fpr = null; uid = null; break; case "fpr": fpr = parts; break; case "uid": uid = parts; break; } } if (sec != null && fpr != null && uid != null) { yield return(ParseSecretKey(sec, fpr, uid)); } }
/// <inheritdoc/> public byte[] Sign(byte[] data, OpenPgpSecretKey secretKey, string passphrase = null) { #region Sanity checks if (data == null) throw new ArgumentNullException("data"); if (secretKey == null) throw new ArgumentNullException("secretKey"); #endregion string output = new CliControl(_homeDir, data).Execute("--batch", "--no-secmem-warning", "--passphrase", passphrase ?? "", "--local-user", secretKey.KeyID, "--detach-sign", "--armor", "--output", "-", "-"); string signatureBase64 = output .GetRightPartAtFirstOccurrence(Environment.NewLine + Environment.NewLine) .GetLeftPartAtLastOccurrence(Environment.NewLine + "=") .Replace(Environment.NewLine, "\n"); return Convert.FromBase64String(signatureBase64); }
/// <inheritdoc/> public IEnumerable<OpenPgpSecretKey> ListSecretKeys() { string result = new CliControl(_homeDir).Execute("--batch", "--no-secmem-warning", "--list-secret-keys", "--with-colons", "--fixed-list-mode", "--fingerprint"); string[] sec = null, fpr = null, uid = null; foreach (string line in result.SplitMultilineText()) { var parts = line.Split(':'); switch (parts[0]) { case "sec": // New element starting if (sec != null && fpr != null && uid != null) yield return ParseSecretKey(sec, fpr, uid); sec = parts; fpr = null; uid = null; break; case "fpr": fpr = parts; break; case "uid": uid = parts; break; } } if (sec != null && fpr != null && uid != null) yield return ParseSecretKey(sec, fpr, uid); }