private bool CheckSignature(ISource source, string cellFileName, string cellPath, string signaturePath) { S63SignatureFile sig = new S63SignatureFile(source.OpenRead(signaturePath)); var certSig = sig.DataServerCertSignedBySA; var publicKeyFromFile = sig.PublicKeyOfDSCert();// the whole second half the of the signature file -- Encoding.ASCII.GetBytes(LineRange(8, 8)); var pkHash = SHA1.ComputeHash(publicKeyFromFile); if (!SA.VerifySignature(pkHash, certSig)) { WriteVerbose($"Cell certificate not signed {cellFileName}"); return(false); } var cellHash = SHA1.ComputeHash(source.OpenRead(cellPath)); using (var dsaCell = new DSACryptoServiceProvider()) { dsaCell.ImportParameters(new DSAParameters() { P = sig.BigP, Q = sig.BigQ, G = sig.BigG, Y = sig.BigY, }); return(dsaCell.VerifySignature(cellHash, sig.CellSignature)); } }
public XmlSignature(XElement fileSignature) { var ns = S63SignaturesXmlFile.Namespace; DataServerID = (string)fileSignature.Attribute("dataServerID"); FileLocation = (string)fileSignature.Element(ns + "fileLocation"); FileName = (string)fileSignature.Element(ns + "fileName"); string r = (string)fileSignature.Element(ns + "Signature").Element(ns + "R"); string s = (string)fileSignature.Element(ns + "Signature").Element(ns + "S"); SignatureR = S63SignatureFile.StringToByteArray(r); SignatureS = S63SignatureFile.StringToByteArray(s); }
public XmlDataServer(XElement dataServerElement) { var ns = S63SignaturesXmlFile.Namespace; ID = (string)dataServerElement.Attribute("dataServerID"); string parameterP = (string)dataServerElement.Element(ns + "Parameters").Element(ns + "P"); string parameterQ = (string)dataServerElement.Element(ns + "Parameters").Element(ns + "Q"); string parameterG = (string)dataServerElement.Element(ns + "Parameters").Element(ns + "G"); string publicKeyY = (string)dataServerElement.Element(ns + "PublicKey").Element(ns + "Y"); string certR = (string)dataServerElement.Element(ns + "dataserverCertificate").Element(ns + "R"); string certS = (string)dataServerElement.Element(ns + "dataserverCertificate").Element(ns + "S"); BigP = S63SignatureFile.StringToByteArray(parameterP); BigQ = S63SignatureFile.StringToByteArray(parameterQ); BigG = S63SignatureFile.StringToByteArray(parameterG); BigY = S63SignatureFile.StringToByteArray(publicKeyY); CertR = S63SignatureFile.StringToByteArray(certR); CertS = S63SignatureFile.StringToByteArray(certS); // I found this bit fairly troubling to program. Formatting something in a very specific way and then taking the bytes! StringBuilder sb = new StringBuilder(); sb.Append("// BIG p"); sb.Append("\r\n"); sb.Append(parameterP); sb.Append(".\r\n"); sb.Append("// BIG q"); sb.Append("\r\n"); sb.Append(parameterQ); sb.Append(".\r\n"); sb.Append("// BIG g"); sb.Append("\r\n"); sb.Append(parameterG); sb.Append(".\r\n"); sb.Append("// BIG y"); sb.Append("\r\n"); sb.Append(publicKeyY); sb.Append(".\r\n"); PublicKeyOfDSCert = Encoding.ASCII.GetBytes(sb.ToString()); }