/// <summary> /// Signs a message and returns a MIME encoded array of bytes containing the signature. /// </summary> /// <param name="arMessage"></param> /// <param name="bPackageHeader"></param> /// <returns></returns> public static byte[] Sign(byte[] arMessage, object signerCert, string signerPassword, out string sContentType) { byte[] bInPKCS7 = new byte[0]; // get a MIME boundary string sBoundary = MIMEBoundary(); // Get the Headers for the entire message. sContentType = "multipart/signed; protocol=\"application/pkcs7-signature\"; micalg=\"sha1\"; boundary=\"" + sBoundary + "\""; // Define the boundary byte array. byte[] bBoundary = ASCIIEncoding.ASCII.GetBytes(Environment.NewLine + "--" + sBoundary + Environment.NewLine); // Encode the header for the signature portion. byte[] bSignatureHeader = ASCIIEncoding.ASCII.GetBytes(MIMEHeader("application/pkcs7-signature; name=\"smime.p7s\"", "base64", "attachment; filename=smime.p7s")); // Get the signature. byte[] bSignature = AS2Encryption.Encode(arMessage, signerCert, signerPassword); // convert to base64 string sig = Convert.ToBase64String(bSignature, Base64FormattingOptions.InsertLineBreaks) + MESSAGE_SEPARATOR; bSignature = System.Text.ASCIIEncoding.ASCII.GetBytes(sig); // Calculate the final footer elements. byte[] bFinalFooter = ASCIIEncoding.ASCII.GetBytes("--" + sBoundary + "--" + Environment.NewLine); // Concatenate all the above together to form the message. bInPKCS7 = ConcatBytes(bBoundary, arMessage, bBoundary, bSignatureHeader, bSignature, bFinalFooter); return(bInPKCS7); }
public static HttpStatusCode SendFile(Uri uri, string filename, byte[] fileData, string from, string to, ProxySettings proxySettings, int timeoutMs, object signingCert, string signingCertPassword, object recipientCert) { if (String.IsNullOrEmpty(filename)) { throw new ArgumentNullException("filename"); } if (fileData.Length == 0) { throw new ArgumentException("filedata"); } byte[] content = fileData; //Initialise the request HttpWebRequest http = (HttpWebRequest)WebRequest.Create(uri); if (!String.IsNullOrEmpty(proxySettings.Name)) { WebProxy proxy = new WebProxy(proxySettings.Name); NetworkCredential proxyCredential = new NetworkCredential(); proxyCredential.Domain = proxySettings.Domain; proxyCredential.UserName = proxySettings.Username; proxyCredential.Password = proxySettings.Password; proxy.Credentials = proxyCredential; http.Proxy = proxy; } //Define the standard request objects http.Method = "POST"; http.AllowAutoRedirect = true; http.KeepAlive = true; http.PreAuthenticate = false; //Means there will be two requests sent if Authentication required. http.SendChunked = false; http.UserAgent = "Freight Trust"; //These Headers are common to all transactions http.Headers.Add("Mime-Version", "1.0"); http.Headers.Add("AS2-Version", "1.2"); http.Headers.Add("AS2-From", from); http.Headers.Add("AS2-To", to); http.Headers.Add("Subject", filename); http.Headers.Add("Message-Id", "<AS2_" + DateTime.Now.ToString("hhmmssddd") + ">"); http.Timeout = timeoutMs; string contentType = (Path.GetExtension(filename) == ".xml") ? "application/xml" : "application/EDIFACT"; bool encrypt = recipientCert != null; bool sign = signingCert != null; if (!sign && !encrypt) { http.Headers.Add("Content-Transfer-Encoding", "binary"); http.Headers.Add("Content-Disposition", "inline; filename=\"" + filename + "\""); } if (sign) { // Wrap the file data with a mime header content = AS2MIMEUtilities.CreateMessage(contentType, "binary", "", content); content = AS2MIMEUtilities.Sign(content, signingCert, signingCertPassword, out contentType); http.Headers.Add("EDIINT-Features", "multiple-attachments"); } if (encrypt) { byte[] signedContentTypeHeader = System.Text.ASCIIEncoding.ASCII.GetBytes("Content-Type: " + contentType + Environment.NewLine); byte[] contentWithContentTypeHeaderAdded = AS2MIMEUtilities.ConcatBytes(signedContentTypeHeader, content); content = AS2Encryption.Encrypt(contentWithContentTypeHeaderAdded, recipientCert, EncryptionAlgorithm.DES3); contentType = "application/pkcs7-mime; smime-type=enveloped-data; name=\"smime.p7m\""; } http.ContentType = contentType; http.ContentLength = content.Length; SendWebRequest(http, content); return(HandleWebResponse(http)); }