private string getCerter(string ruta) { string certdigital = ""; Chilkat.Cert certificado = new Chilkat.Cert(); ///verifica que sea un certificado debuelbe un true bool es_certificado = certificado.LoadFromFile(ruta); if (es_certificado) { int revocado = certificado.CheckRevoked(); string larg_numcer = certificado.SerialNumber; if (revocado == 1) { MessageBox.Show("Certificado Revocado"); } else { certdigital = certificado.ExportCertPem(); certdigital = certdigital.Replace("-----BEGIN CERTIFICATE-----", ""); certdigital = certdigital.Replace("-----END CERTIFICATE-----", ""); certdigital = certdigital.Replace("\r\n", ""); } } else { MessageBox.Show("No es certificado"); } return(certdigital); }
static void testencrypt() { string Token = String.Format("{0:yyyy-MM-dd HH:mm:ss}", new DateTime(2010, 02, 02, 21, 15, 0)); //ENCRYPT Chilkat.Cert cert3 = new Chilkat.Cert(); bool success = cert3.LoadFromBase64(mycert); Chilkat.PublicKey pubKey3 = null; pubKey3 = cert3.ExportPublicKey(); Chilkat.Rsa rsa3 = new Chilkat.Rsa(); success = rsa3.UnlockComponent("HAFSJORSA_K36nxU3n1Yui"); rsa3.EncodingMode = "base64"; rsa3.Charset = "ANSI"; rsa3.LittleEndian = true; rsa3.OaepPadding = false; rsa3.ImportPublicKey(pubKey3.GetXml()); bool usePrivateKey = false; System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); byte[] TokenArr = encoding.GetBytes(Token); //array('B', [50, 48, 49, 48, 45, 48, 50, 45, 48, 50, 32, 50, 49, 58, 49, 53, 58, 48, 48]) //byte[] encryptedArr = rsa3.EncryptBytes(TokenArr, usePrivateKey); string encryptedStr = rsa3.EncryptBytesENC(TokenArr, usePrivateKey); }
static void Main(string[] args) { Chilkat.Global glob = new Chilkat.Global(); bool success = glob.UnlockBundle("Anything for 30-day trial"); if (success != true) { Debug.WriteLine(glob.LastErrorText); return; } int status = glob.UnlockStatus; if (status == 2) { Debug.WriteLine("Unlocked using purchased unlock code."); } else { Debug.WriteLine("Unlocked in trial mode."); } // The LastErrorText can be examined in the success case to see if it was unlocked in // trial more, or with a purchased unlock code. Debug.WriteLine(glob.LastErrorText); var certPath = $@"{AppDomain.CurrentDomain.BaseDirectory}server_20110101.pfx"; var server = "83.220.246.39"; var port = 9000; var maxWaitMillisec = 10000; //var certPass = "******"; using (var socket = new Chilkat.Socket { SocksHostname = server, SocksPort = port, SocksUsername = "******", SocksPassword = "******", SocksVersion = 5, MaxReadIdleMs = maxWaitMillisec, MaxSendIdleMs = maxWaitMillisec }) { var cert = new Chilkat.Cert(); cert.LoadFromFile(certPath); socket.SetSslClientCert(cert); socket.Connect(server, port, true, maxWaitMillisec); var receivedString = socket.ReceiveString(); Console.WriteLine(receivedString ?? "none"); } }
/// <summary> /// Firma del file /// </summary> /// <param name="SubjectCN">Subject Common Name</param> /// <param name="pathFile">file da firmare</param> /// <param name="lastError">ultimo errore nella funzionalità</param> /// <param name="pin">pin smartcard/usb (opzionale). Se non fornito comparirà una finestra di dialogo del sistema operativo Windows per indicare il pin</param> /// <param name="csp">provider csp (opzionale). Se non indicato verrà selezionato automaticamente. Utilizzare questo parametro per indicarne uno specifico. Utilizzare il metodo CSPs per visualizza i csp presenti nel sistema</param> /// <returns>firma avvenuta con successo</returns> public static bool Firma(string SubjectCN, string pathFile, ref string lastError, string pin = null, string csp = null) { bool success = false; try { if (Utilities.glob.UnlockStatus == 0) { lastError = "Licenza bloccata"; return(success); } Chilkat.Crypt2 crypt = new Chilkat.Crypt2(); // Utilizza il certificato su una smartcard o su USB. Chilkat.Cert cert = new Chilkat.Cert(); // cryptographic service provider if (!string.IsNullOrWhiteSpace(csp)) { success = cert.LoadFromSmartcard(csp); if (success != true) { lastError = cert.LastErrorText; return(success); } } // Passa il Subject CN del certificato al metodo LoadByCommonName. success = cert.LoadByCommonName(SubjectCN); if (success != true) { lastError = cert.LastErrorText; return(success); } // Fornire il PIN della smartcard. // Se il pin non è fornito esplicitamente qui, // Se non fornito dovrebbe comparire una finestra di dialogo del sistema operativo Windows per indicare il pin if (!string.IsNullOrWhiteSpace(pin)) { cert.SmartCardPin = pin; } // Fornisce il certificato per firmarlo success = crypt.SetSigningCert(cert); if (success != true) { lastError = crypt.LastErrorText; return(success); } // Indica l'algoritmo da utilizzare crypt.HashAlgorithm = "sha256"; // Specifico gli attributi firmati per essere inclusi. // (Questo è quello che fa un CAdES-BES compliant.) Chilkat.JsonObject jsonSignedAttrs = new Chilkat.JsonObject(); jsonSignedAttrs.UpdateInt("contentType", 1); jsonSignedAttrs.UpdateInt("signingTime", 1); jsonSignedAttrs.UpdateInt("messageDigest", 1); jsonSignedAttrs.UpdateInt("signingCertificateV2", 1); crypt.SigningAttributes = jsonSignedAttrs.Emit(); string sigFile = $"{pathFile}.{Enum.GetName(typeof(EstensioniFile), EstensioniFile.p7m)}"; // Creo una firma CAdES-BES, che contiene i dati originali success = crypt.CreateP7M(pathFile, sigFile); if (!success) { lastError = crypt.LastErrorText; return(success); } success = true; } catch { throw; } return(success); }
static string HttpGet(string url) { bool success = false; HttpWebRequest req = WebRequest.Create(url) as HttpWebRequest; string Token = String.Format("{0:yyyy-MM-dd HH:mm:ss}", new DateTime(2010, 02, 02, 21, 15, 0)); //SIGN Chilkat.PrivateKey privkey1 = new Chilkat.PrivateKey(); privkey1.LoadPem(mykey); Chilkat.Rsa rsa1 = new Chilkat.Rsa(); success = rsa1.UnlockComponent("HAFSJORSA_K36nxU3n1Yui"); success = rsa1.ImportPrivateKey(privkey1.GetXml()); rsa1.EncodingMode = "base64"; rsa1.Charset = "ANSI"; rsa1.LittleEndian = false; rsa1.OaepPadding = false; string hexSig = rsa1.SignStringENC(Token, "sha-1"); //VERIFY Chilkat.Cert cert2 = new Chilkat.Cert(); success = cert2.LoadFromBase64(mycert); Chilkat.PublicKey pubKey2 = null; pubKey2 = cert2.ExportPublicKey(); Chilkat.Rsa rsa2 = new Chilkat.Rsa(); success = rsa2.ImportPublicKey(pubKey2.GetXml()); rsa2.EncodingMode = "base64"; rsa2.Charset = "ANSI"; rsa2.LittleEndian = false; rsa2.OaepPadding = false; success = rsa2.VerifyStringENC(Token, "sha-1", hexSig); req.Headers.Add("Token", Token); req.Headers.Add("Signature", hexSig); //ENCRYPT Chilkat.Cert cert3 = new Chilkat.Cert(); success = cert3.LoadFromBase64(mycert); Chilkat.PublicKey pubKey3 = null; pubKey3 = cert3.ExportPublicKey(); Chilkat.Rsa rsa3 = new Chilkat.Rsa(); success = rsa3.UnlockComponent("HAFSJORSA_K36nxU3n1Yui"); rsa3.EncodingMode = "base64"; rsa3.Charset = "ANSI"; rsa3.LittleEndian = true; rsa3.OaepPadding = false; rsa3.ImportPublicKey(pubKey3.GetXml()); bool usePrivateKey = false; System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); byte[] TokenArr = encoding.GetBytes(Token); //byte[] encryptedArr = rsa3.EncryptBytes(TokenArr, usePrivateKey); string encryptedstr = rsa3.EncryptBytesENC(TokenArr, usePrivateKey); //DECRYPT Chilkat.Rsa rsa4 = new Chilkat.Rsa(); rsa4.EncodingMode = "base64"; rsa4.Charset = "ANSI"; rsa4.LittleEndian = true; rsa4.OaepPadding = false; rsa4.ImportPrivateKey(privkey1.GetXml()); usePrivateKey = true; //encryptedStr = "XJ65xTR/xvD2N9xBKyKPqPijqTAyJuVtOlbaFUIboJaEPHH9pv+Lhrd5o6MSwKF6TeXs6hVsKnj8jVeYFYoEDgJS95GqaaUomWBhEZYchOp/6dn3ZxCeQoljAWLt6m4C829R9b5JYatYar9YV0d+QV+jVWE4U0rlNrkTqtA02Qw4ztN4/oehgCISrBnc81N1MYNwG9vrTHSVM6tSUWjWxMRubpOBvqKqOxyA9fpJNHgUyzio2X1cp12K++1GEUWNWyYVhTiBr/QM3mUN67mHcn0vvWZvmPhYlIaVn9DqIvVdMbHRbLwrCczFgY4PdHrhcH9yDTlkkAbKUatgDQiI4w=="; //encryptedStr = "6KQbxh+x5SGIzD89zEwj+/IVVCBocemCXWl1mr+mk9wxRMydCfmMSUHDOafnqiJ6GAJapKbLTHOc9d1OyWTwsp5BQBT5VM20hb9r+AkDrHwkgL06ifizP0gTEO17cyO95jwlRXOfkQKb3cERLBEtOAnRep4bKMSsPLyxRRBX5VT4d19yxRor2V9js0CEFONinxl7qRxjckwvQk53+qpxeQ8jOx+pmrQukX7nWkMajWi+ZFndyfLL3LfRBYZKN2R0vdrnSMKdkxUEUUJybsv4QCMWshNpQznPSantq2dKNe07eB5mX4fRufy4mY4qjqBlf8+XFKdD+J37C6r3THL6pw=="; //string decryptedStr = rsa4.DecryptStringENC(encryptedStr, usePrivateKey); Chilkat.Crypt2 crypt = new Chilkat.Crypt2(); success = crypt.UnlockComponent("HAFSJOCrypt_0xo09cJWVQAw"); crypt.EncodingMode = "base64"; crypt.CryptAlgorithm = "none"; req.Headers.Add("authorization", "Basic " + crypt.EncryptStringENC("Mogens:Hafsjold")); string result = null; using (HttpWebResponse resp = req.GetResponse() as HttpWebResponse) { StreamReader reader = new StreamReader(resp.GetResponseStream()); result = reader.ReadToEnd(); } return(result); }
/// <summary> /// Tests loading of a 3rd party unsigned action with a dependency on an unmanaged dll. /// Verifies that all the action ifaces are loaded from the correct location and that the unmanaged dll /// is loaded from the correct location. /// </summary> // [Test] public void LoadUnsignedActionFromLocation() { if (Marshal.SizeOf(typeof(IntPtr)) == 8) throw new IgnoreException("can't run this test easily on 64 bit without recompiling the action and adding its references and a whole bunch of related stuff"); #region setup ActionDetails ad = new ActionDetails("3rd Party", Workshare.TestUtils.TestFileUtils.MakeRootPathAbsolute(@"\projects\Hygiene\src\PolicyEngine.Tests\TestFiles\UnsignedAction"), "Typical3rdPartyAction.dll", "Workshare\\ProtectEnterprise\\Actions", "Typical3rdPartyAction", "f2c04c19-54fb-48f6-af3d-82c9404deaf2"); string managedDll = "unmanageddll.dll"; string managedDllLocation = Path.Combine(Path.GetDirectoryName(ad.Path), managedDll); string targetDllLocation = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, managedDll); //attempt to copy the managed dll to the basedirectory of current appdomain so its in 2 locations System.IO.File.Copy(managedDllLocation,targetDllLocation, true); //add temp file to the deletion list m_TempFiles.Add(targetDllLocation); RegistryTree rt = new RegistryTree(ad.HKLMRegLocation, ad.AssemblyName, ad.Path); string rulesXML = System.IO.File.ReadAllText(Workshare.TestUtils.TestFileUtils.MakeRootPathAbsolute(@"\projects\Hygiene\src\PolicyEngine.Tests\TestFiles\SignedPartyAction\rules.xml")); string objectsXML = System.IO.File.ReadAllText(Workshare.TestUtils.TestFileUtils.MakeRootPathAbsolute(@"\projects\Hygiene\src\PolicyEngine.Tests\TestFiles\SignedPartyAction\objects.xml")); GeneralPolicyProcessor gpp = new GeneralPolicyProcessor(); //start following parameters have no bearing on this test case but need to be filled in for the gpp to run gpp.FileType = "*.email"; gpp.CurrentUser = "******"; gpp.CurrentRunAtMode = RunAt.Client; gpp.RecipientList = new string[] { "*****@*****.**" }; //end irrelevant parameters gpp.Initialise(RunAt.Client, rulesXML, objectsXML); Chilkat.Cert cert = new Chilkat.Cert(); #endregion string assemblyName, className; CachedAction action = gpp.LoadActionObject(ad.ObjectRef, ad.Name, out assemblyName, out className); Assert.IsNotNull(action, "No {0} action found", ad.Name); VerifyObjectLocation(action.Action, ad); //verify location of unmanaged dll - cause unmanaged dll is latebound we need to invoke to make sure it gets loaded first ActionPropertySet adata = action.Action.PropertySet; ActionData testData = new ActionData(); testData.FileName = Workshare.TestUtils.TestFileUtils.MakeRootPathAbsolute(@"\projects\Hygiene\src\PolicyEngine.Tests\TestFiles\TestfileActionLoad.txt"); testData.Properties.Add("DisplayName", Path.GetFileName(testData.FileName)); action.Action.Execute(testData, adata); // testdll.dll should be loaded now bool found = false; foreach (ProcessModule pm in Process.GetCurrentProcess().Modules) { if (pm.ModuleName.Equals(managedDll, StringComparison.InvariantCultureIgnoreCase)) { found = true; Assert.IsTrue(string.Equals(managedDllLocation, pm.FileName, StringComparison.InvariantCultureIgnoreCase), "{0} loaded from incorrect location, expected {1}, actual {2}", managedDll, managedDllLocation, pm.FileName); } } Assert.IsTrue(found, "unmanaged dll {0} not found in current process' modules", managedDll); }
public static void Sign() { // This example requires the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // The SOAP XML to be signed in this example contains the following: // <?xml version="1.0" encoding="UTF-8" standalone="no" ?> // <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> // <SOAP-ENV:Header> // <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"></wsse:Security> // </SOAP-ENV:Header> // <SOAP-ENV:Body xmlns:SOAP-SEC="http://schemas.xmlsoap.org/soap/security/2000-12" SOAP-SEC:id="Body"> // <z:FooBar xmlns:z="http://example.com" /> // </SOAP-ENV:Body> // </SOAP-ENV:Envelope> // // The above XML is available at https://www.chilkatsoft.com/exampleData/soapToSign.xml // Fetch the XML and then sign it.. string url = "https://www.chilkatsoft.com/exampleData/soapToSign.xml"; Chilkat.Http http = new Chilkat.Http(); Chilkat.StringBuilder sbSoapXml = new Chilkat.StringBuilder(); bool success = http.QuickGetSb(url, sbSoapXml); //Not Working if (success != true) { Debug.WriteLine(http.LastErrorText); return; } // Load a PFX file containing the certificate + private key. Chilkat.Cert cert = new Chilkat.Cert(); success = cert.LoadPfxFile("E:\\XML\\keystore-demo\\certificate-sha256.pfx", "1234567890"); if (success != true) { Debug.WriteLine(cert.LastErrorText); return; } // Get the RSA private key for signing... Chilkat.PrivateKey rsaKey = cert.ExportPrivateKey(); if (cert.LastMethodSuccess != true) { Debug.WriteLine(cert.LastErrorText); return; } // To create the XML digital signature (i.e. embed the signature within // the SOAP XML), we specify what is desired, and then call the method to // create the XML signature. // // For example, the application must provide the following: // - Where to put the signature. // - What to sign. // - The algorithms to be used. // - The key to be used for signing. // Chilkat.XmlDSigGen xmlSigGen = new Chilkat.XmlDSigGen(); // In this example, we're going to put the signature within the wsse:Security element. // To specify the location, set the SigLocation property to the XML path to this element, // using vertical bar characters to separate tags. xmlSigGen.SigLocation = "SOAP-ENV:Envelope|SOAP-ENV:Header|wsse:Security"; // An XML digital signature contains one or more references. These are references to the parts // of the XML document to be signed (a same document reference), or can be external references. // This example will add a single same-document reference. We'll add a reference to the XML fragment // at SOAP-ENV:Body, which is indicated by providing the value of the "ID" attribute (where "ID" is case // insensitive). For each same-document reference, we must also indicate the hash algorithm and XML canonicalization // algorithm to be used. For this example we'll choose SHA-256 and Exclusive XML Canonicalization. xmlSigGen.AddSameDocRef("Body", "sha256", "EXCL_C14N", "", ""); // Let's provide the RSA key to be used for signing: xmlSigGen.SetPrivateKey(rsaKey); // We're leaving the following properties at their default values: // // - SigNamespacePrefix (default is "ds") // - SigningAlg (for RSA keys. The default is PKCS1-v1_5, can be changed to RSASSA-PSS.) // - SignedInfoCanonAlg (default is EXCL_C14N) // - SignedInfoDigestMethod (default is sha256) // - KeyInfoType (default is "KeyValue", where the RSA public key is included in the Signature) // Note: Each Reference has it's own specified algorithms for XML canonicalization and hashing, // and the actual signature part (the SignedInfo) has it's own algorithms for the same. // They may or may not be the same. In this example, we use Exclusive XML Canonicalization and SHA-256 throughout. // Finally, we're going to set one property that's optional, but commonly used. // It's the SignedInfoPrefixList. In this case, we're using Exclusive Canonicalization, and the signature // will be placed in a location within the XML document where namespace prefixes are used in the ancestors. // Specifically, the "wsse" and "SOAP-ENV" namespace prefixes are used. xmlSigGen.SignedInfoPrefixList = "wsse SOAP-ENV"; // OK, everything's specified, so let's create the XML digital signature: // This in-place signs the XML. If successful, sbSoapXml will contain the // XML with the digital signature at the specified location. success = xmlSigGen.CreateXmlDSigSb(sbSoapXml); if (success != true) { Debug.WriteLine(xmlSigGen.LastErrorText); return; } // Examine the signed SOAP XML: Debug.WriteLine(sbSoapXml.GetAsString()); // This is the signed SOAP XML. // Chilkat emits the Signature in compact form on a single line. Whitespace in XML signatures // matters. Chilkat's opinion is that writing the Signature without whitespace minimizes the chance // for problems with whatever software might be verifying the signature. // <?xml version="1.0" encoding="UTF-8" standalone="no" ?> // <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> // <SOAP-ENV:Header> // <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"><InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse SOAP-ENV"/></ds:CanonicalizationMethod><ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/><ds:Reference URI="#Body"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/><ds:DigestValue>OwgHPZNfDkXnZsjpfzXqAcT3RV3HzmTsEy2bP44FJ0M=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>C+7FWngUpJ33Q1yq8uuscjCyPN2IO4cJhpMv03Jrrht1V+4gvJQLIBk6HHjo1uPQyfYj6zji3pg+fOyGUptp17CsRvjCzSpP35vB2lEzHeS8dcY8XfrEtTP/0FNn75LmhhkOPy0wjWkgDVbgzhXpEk9az8r8fQVTM3vrcmXT+WdMWJXKBRFt6PLAhsFt0scOFTWAkLGyCwygzimDKX2nT63TOit9BigtIx7fPRuMkbybMKCGGABq2DiEbvrPOiN3SUYpyMNR9KehRAGN+OWnESaDC6DhOvbKR88XHkM+GeaRe9PWdrRHrwGfp3qgolKjR/wFRSa1YGSBKAhDJFBcdg==</ds:SignatureValue><ds:KeyInfo><ds:KeyValue><ds:RSAKeyValue><ds:Modulus>sXeRhM55P13FbpNcXAMR3olbw2Wa6keZIHu5YTZYUBTlYWId+pNiwUz3zFIEo+0IfYR0H27ybIycQO+1IIzJofUFNMAL3tZps2OKPlsjuCPls6kXpXhv/gvhux8LrCtp4PcKWqJ6QVOZKChc7WAx40qFWzHi57ueqRTv3x0kESqGg/VjsqyTEvb55psJO2RsfhLT7+YVh3hImRM3RDaJdkTkPuOxeFyT6N7VXD09329sLuS3QkUbE9zEKDnz9X3d8dEQdJhSI9ba5fxl8R7fu8pB67ElfzFml96X1jLFtzy1pzOT5Fc4ROcaqlYckVzdBq9sxezm6MYmDBjNAcibRw==</ds:Modulus><ds:Exponent>AQAB</ds:Exponent></ds:RSAKeyValue></ds:KeyValue></ds:KeyInfo></ds:Signature></wsse:Security> // </SOAP-ENV:Header> // <SOAP-ENV:Body xmlns:SOAP-SEC="http://schemas.xmlsoap.org/soap/security/2000-12" SOAP-SEC:id="Body"> // <z:FooBar xmlns:z="http://example.com" /> // </SOAP-ENV:Body> // </SOAP-ENV:Envelope> // Here's the signature part formatted for easier reading. // (Adding whitespace to the SignedInfo breaks the signature, so you wouldn't want to do this..) // <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"> // <ds:SignedInfo> // <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> // <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse SOAP-ENV" /> // </ds:CanonicalizationMethod> // <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" /> // <ds:Reference URI="#Body"> // <ds:Transforms> // <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> // </ds:Transforms> // <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256" /> // <ds:DigestValue>OwgHPZNfDkXnZsjpfzXqAcT3RV3HzmTsEy2bP44FJ0M=</ds:DigestValue> // </ds:Reference> // </ds:SignedInfo> // <ds:SignatureValue>C+7FWngUp....BKAhDJFBcdg==</ds:SignatureValue> // <ds:KeyInfo> // <ds:KeyValue> // <ds:RSAKeyValue> // <ds:Modulus>sXeRhM55P13FbpNcXAMR....MYmDBjNAcibRw==</ds:Modulus> // <ds:Exponent>AQAB</ds:Exponent> // </ds:RSAKeyValue> // </ds:KeyValue> // </ds:KeyInfo> // </ds:Signature> }