Sign XSharper script with a SNK file
<xsharper>
<versionInfo title="Sign-SNK" value="Sign XSH script with a provided SNK key file" version="0.0.0.1" />
<usage options="ifNoArguments default" />
<param name="key" value="SNK key" required="true" />
<param name="data" value="Script file" required="true" />
<reference name="System.Security" />
<?h using System;
using System.Text;
using System.Security.Cryptography;
using System.Security.Cryptography.Xml;
?>
<?_ RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.ImportCspBlob(System.IO.File.ReadAllBytes((string)c["key"]));
string filename=(string)c["data"];
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.Load(filename);
c.Info.WriteLine("Loaded "+filename);
SignedXml signer= new SignedXml(doc);
var el=doc.GetElementsByTagName("Signature");
if (el!=null && el.Count!=0 && el[0]!=null && el[0] is XmlElement)
el[0].ParentNode.RemoveChild(el[0]);
signer.KeyInfo = new KeyInfo();
signer.KeyInfo.AddClause(new RSAKeyValue(rsa));
signer.SigningKey = rsa;
signer.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NWithCommentsTransformUrl;
XmlDsigExcC14NWithCommentsTransform canMethod = (XmlDsigExcC14NWithCommentsTransform)signer.SignedInfo.CanonicalizationMethodObject;
canMethod.InclusiveNamespacesPrefixList = "Sign";
Reference orderRef = new Reference("");
orderRef.AddTransform(new XmlDsigEnvelopedSignatureTransform());
signer.AddReference(orderRef);
signer.ComputeSignature();
doc.DocumentElement.AppendChild(signer.GetXml());
doc.Save(filename);
c.Print("Script '${=Path.GetFullPath($data)}' has been signed & saved successfully");
return 0;
?>
</xsharper>