Sample code for 30+ languages & platforms
Unicode C

Sign MIME using RSASSA-PSS with SHA256

See more MIME Examples

Demonstrates how to sign an MIME using the RSASSA-PSS signing algorithm with the SHA256 hash algorithm.

Chilkat Unicode C Downloads

Unicode C
#include <C_CkMimeW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkPfxW.h>
#include <C_CkCertW.h>

void ChilkatSample(void)
    {
    BOOL success;
    HCkMimeW mime;
    HCkMimeW part0;
    HCkMimeW part1;
    HCkStringBuilderW sbUnsignedMime;
    HCkPfxW pfx;
    HCkCertW cert;

    success = FALSE;

    //  This requires the Chilkat API to have been previously unlocked.
    //  See Global Unlock Sample for sample code.

    mime = CkMimeW_Create();

    //  Create a MIME message to sign.
    CkMimeW_NewMultipartMixed(mime);
    CkMimeW_AddHeaderField(mime,L"someHeader1",L"Some value 1");
    CkMimeW_AddHeaderField(mime,L"someHeader2",L"Some value 2");

    part0 = CkMimeW_Create();
    CkMimeW_AddHeaderField(part0,L"hdrA",L"Some value A");
    CkMimeW_AddHeaderField(part0,L"hdrB",L"Some value B");
    CkMimeW_putContentType(part0,L"text/plain");
    CkMimeW_SetBody(part0,L"This is the plain-text body.");

    part1 = CkMimeW_Create();
    CkMimeW_AddHeaderField(part1,L"hdrX",L"Some value X");
    CkMimeW_AddHeaderField(part1,L"hdrY",L"Some value Y");
    CkMimeW_putContentType(part1,L"text/xml");
    CkMimeW_SetBody(part1,L"<a>This is the XML body</a>");

    CkMimeW_AppendPart(mime,part0);
    CkMimeW_AppendPart(mime,part1);

    //  The MIME to be signed:
    sbUnsignedMime = CkStringBuilderW_Create();
    CkMimeW_GetMimeSb(mime,sbUnsignedMime);
    wprintf(L"%s\n",CkStringBuilderW_getAsString(sbUnsignedMime));

    //  	Content-Type: multipart/mixed; boundary="------------080303020600020604010008"
    //  	someHeader1: Some value 1
    //  	someHeader2: Some value 2
    //  
    //  	--------------080303020600020604010008
    //  	hdrA: Some value A
    //  	hdrB: Some value B
    //  	Content-Type: text/plain
    //  
    //  	This is the plain-text body.
    //  	--------------080303020600020604010008
    //  	hdrX: Some value X
    //  	hdrY: Some value Y
    //  	Content-Type: text/xml
    //  
    //  	<a>This is the XML body</a>
    //  	--------------080303020600020604010008--
    //  

    //  Get a digital certificate with private key from a .pfx
    //  (Chilkat has many different ways to provide a cert + private key for siging.
    //  Using a PFX is just one possible option.)
    pfx = CkPfxW_Create();
    success = CkPfxW_LoadPfxFile(pfx,L"qa_data/rsassa-pss/privatekey.pfx",L"PFX_PASSWORD");
    if (success == FALSE) {
        wprintf(L"%s\n",CkPfxW_lastErrorText(pfx));
        CkMimeW_Dispose(mime);
        CkMimeW_Dispose(part0);
        CkMimeW_Dispose(part1);
        CkStringBuilderW_Dispose(sbUnsignedMime);
        CkPfxW_Dispose(pfx);
        return;
    }

    //  Get the certificate to be used for signing.
    //  (The typical case for a PFX is that it contains a cert with an associated private key,
    //  as well as other certificates in the chain of authentication.  The cert with the private
    //  key should be in the first position at index 0.)

    cert = CkCertW_Create();
    success = CkPfxW_CertAt(pfx,0,cert);
    if (success == FALSE) {
        wprintf(L"%s\n",CkPfxW_lastErrorText(pfx));
        CkMimeW_Dispose(mime);
        CkMimeW_Dispose(part0);
        CkMimeW_Dispose(part1);
        CkStringBuilderW_Dispose(sbUnsignedMime);
        CkPfxW_Dispose(pfx);
        CkCertW_Dispose(cert);
        return;
    }

    //  Indicate that RSASSA-PSS with SHA256 should be used.
    CkMimeW_putSigningAlg(mime,L"pss");
    CkMimeW_putSigningHashAlg(mime,L"sha256");

    //  Add a detached signature.
    success = CkMimeW_AddDetachedSignature(mime,cert);
    if (success != TRUE) {
        wprintf(L"%s\n",CkMimeW_lastErrorText(mime));
        CkMimeW_Dispose(mime);
        CkMimeW_Dispose(part0);
        CkMimeW_Dispose(part1);
        CkStringBuilderW_Dispose(sbUnsignedMime);
        CkPfxW_Dispose(pfx);
        CkCertW_Dispose(cert);
        return;
    }

    //  Show the clear-signed MIME. (see the sample output below)
    wprintf(L"-------------------------------------------------------------\n");
    wprintf(L"Clear-signed MIME using detached signature:\n");
    wprintf(L"-------------------------------------------------------------\n");
    wprintf(L"%s\n",CkMimeW_getMime(mime));

    //  Restore the original unsigned MIME, and this time create an opaque signature.
    CkMimeW_LoadMime(mime,CkStringBuilderW_getAsString(sbUnsignedMime));

    //  Sign using an opaque signature
    success = CkMimeW_ConvertToSigned(mime,cert);
    if (success != TRUE) {
        wprintf(L"%s\n",CkMimeW_lastErrorText(mime));
        CkMimeW_Dispose(mime);
        CkMimeW_Dispose(part0);
        CkMimeW_Dispose(part1);
        CkStringBuilderW_Dispose(sbUnsignedMime);
        CkPfxW_Dispose(pfx);
        CkCertW_Dispose(cert);
        return;
    }

    //  Show the opaque-signed MIME. (see the sample output below)
    wprintf(L"-------------------------------------------------------------\n");
    wprintf(L"Opaque-signed MIME :\n");
    wprintf(L"-------------------------------------------------------------\n");
    wprintf(L"%s\n",CkMimeW_getMime(mime));
    wprintf(L"Success.\n");

    //  -----------------------------------------------
    //  This is sample output for the clear-signed MIME:
    //  -----------------------------------------------
    //  
    //  	Content-Type: multipart/signed; boundary="----=_NextPart_672_c95a_97b64c9a.90b5204d";
    //  	 protocol="application/x-pkcs7-signature";
    //  	 micalg=sha256
    //  
    //  	------=_NextPart_672_c95a_97b64c9a.90b5204d
    //  	Content-Type: multipart/mixed; boundary="------------030207090102000301050504"
    //  	someHeader1: Some value 1
    //  	someHeader2: Some value 2
    //  
    //  	--------------030207090102000301050504
    //  	hdrA: Some value A
    //  	hdrB: Some value B
    //  	Content-Type: text/plain
    //  
    //  	This is the plain-text body.
    //  	--------------030207090102000301050504
    //  	hdrX: Some value X
    //  	hdrY: Some value Y
    //  	Content-Type: text/xml
    //  
    //  	<a>This is the XML body</a>
    //  	--------------030207090102000301050504--
    //  
    //  	------=_NextPart_672_c95a_97b64c9a.90b5204d
    //  	Content-Transfer-Encoding: base64
    //  	Content-Type: application/x-pkcs7-signature; name="smime.p7s"
    //  	Content-Disposition: attachment; filename="smime.p7s"
    //  
    //  	MIIG5wYJKoZIhvcNAQcCoIIG2DCCBtQCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg
    //  	ggL4MIIC9DCCAl2gAwIBAgIJAMPsJCT11cniMA0GCSqGSIb3DQEBCwUAMIGSMQswCQYDVQQGEwJB
    //  	VTERMA8GA1UECAwIVmljdG9yaWExEjAQBgNVBAcMCU1lbGJvdXJuZTEhMB8GA1UECgwYSW50ZXJu
    //  	ZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYDVQQDDAZXaWRnZXQxKDAmBgkqhkiG9w0BCQEWGWFkbWlu
    //  	QGludGVybmV0d2lkZ2V0cy5jb20wHhcNMTYxMTAxMTY1MjMyWhcNMjExMDMxMTY1MjMyWjCBkjEL
    //  	MAkGA1UEBhMCQVUxETAPBgNVBAgMCFZpY3RvcmlhMRIwEAYDVQQHDAlNZWxib3VybmUxITAfBgNV
    //  	BAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGV2lkZ2V0MSgwJgYJKoZIhvcN
    //  	AQkBFhlhZG1pbkBpbnRlcm5ldHdpZGdldHMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
    //  	gQDGIdoCjyavs+F/Rm0VIB4m6O7VL1j+1IqieoR9NEX2GQvu2VCdceyxf9qaw1bxipEvjLwUkw7M
    //  	e+BTlLpWQbBMH87s6KpsC8MVyXhMLpP0oM8NFix/vLz2wdLhUh7CZvJA0plqkJk9bj57QIu+EO1k
    //  	tUHM2DFb6sckvCL2yybD1wIDAQABo1AwTjAdBgNVHQ4EFgQUONKKu2zsXIrinWxIGT654vrcQwsw
    //  	HwYDVR0jBBgwFoAUONKKu2zsXIrinWxIGT654vrcQwswDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0B
    //  	AQsFAAOBgQArFvdi5u9i2QF1Qw+cdC1l7w2Y3+q6RIkln2W8rWJFje00644o8hXy7v46giJCedmF
    //  	ULlhm1n7XIsZGy2W3lJ77v5agn9gFwXu1h3cqkGXkoteE6SQJQXWgsW3GWPveObvTL8LF4y57fgM
    //  	9ZWS+V9MJajeu44Rf/tU17TLYKjvEjGCA7MwggOvAgEBMIGgMIGSMQswCQYDVQQGEwJBVTERMA8G
    //  	A1UECAwIVmljdG9yaWExEjAQBgNVBAcMCU1lbGJvdXJuZTEhMB8GA1UECgwYSW50ZXJuZXQgV2lk
    //  	Z2l0cyBQdHkgTHRkMQ8wDQYDVQQDDAZXaWRnZXQxKDAmBgkqhkiG9w0BCQEWGWFkbWluQGludGVy
    //  	bmV0d2lkZ2V0cy5jb20CCQDD7CQk9dXJ4jANBglghkgBZQMEAgEFAKCCAjQwGAYJKoZIhvcNAQkD
    //  	MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMTcwNDIwMTU1NDMyWjAvBgkqhkiG9w0BCQQx
    //  	IgQgFEtkdw1+iBXvplXCUkOPlq66b+mDg+HBcChLn5YowD8wXwYJKoZIhvcNAQkPMVIwUDALBglg
    //  	hkgBZQMEAQIwCgYIKoZIhvcNAwcwDgYIKoZIhvcNAwICAgCAMA0GCCqGSIb3DQMCAgFAMAcGBSsO
    //  	AwIHMA0GCCqGSIb3DQMCAgEoMIGxBgkrBgEEAYI3EAQxgaMwgaAwgZIxCzAJBgNVBAYTAkFVMREw
    //  	DwYDVQQIDAhWaWN0b3JpYTESMBAGA1UEBwwJTWVsYm91cm5lMSEwHwYDVQQKDBhJbnRlcm5ldCBX
    //  	aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBldpZGdldDEoMCYGCSqGSIb3DQEJARYZYWRtaW5AaW50
    //  	ZXJuZXR3aWRnZXRzLmNvbQIJAMPsJCT11cniMIGzBgsqhkiG9w0BCRACCzGBo6CBoDCBkjELMAkG
    //  	A1UEBhMCQVUxETAPBgNVBAgMCFZpY3RvcmlhMRIwEAYDVQQHDAlNZWxib3VybmUxITAfBgNVBAoM
    //  	GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGV2lkZ2V0MSgwJgYJKoZIhvcNAQkB
    //  	FhlhZG1pbkBpbnRlcm5ldHdpZGdldHMuY29tAgkAw+wkJPXVyeIwPQYJKoZIhvcNAQEKMDCgDTAL
    //  	BglghkgBZQMEAgGhGjAYBgkqhkiG9w0BAQgwCwYJYIZIAWUDBAIBogMCASAEgYAvqIqKBzNXyVbh
    //  	TmaxdAc4d0ZTqWT6Na3C+DMO8owSKWy5FdGbJ2DLKm92qe/KLPTcj51vuwLUQb0Sw7r5Xknl+/6p
    //  	Eqn2qe/6hgDn06vvzNofVAweOtSVJsBO7/cYYPc+pXZZ2BcpZDdf/9Ci56Yrlk7A72BeqPe47J3F
    //  	neC8qw==
    //  
    //  	------=_NextPart_672_c95a_97b64c9a.90b5204d--
    //  

    //  -----------------------------------------------
    //  This is sample output for the opaque-signed MIME:
    //  -----------------------------------------------
    //  	Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="signed-data"
    //  	someHeader1: Some value 1
    //  	someHeader2: Some value 2
    //  	Content-Disposition: attachment; filename="smime.p7m"
    //  	Content-Transfer-Encoding: base64
    //  
    //  	MIIItAYJKoZIhvcNAQcCoIIIpTCCCKECAQExDzANBglghkgBZQMEAgEFADCCAdYGCSqGSIb3DQEH
    //  	AaCCAccEggHDQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSItLS0tLS0t
    //  	LS0tLS0wMDA2MDcwNzA3MDcwMTA1MDAwMTA5MDciDQpzb21lSGVhZGVyMTogU29tZSB2YWx1ZSAx
    //  	DQpzb21lSGVhZGVyMjogU29tZSB2YWx1ZSAyDQoNCi0tLS0tLS0tLS0tLS0tMDAwNjA3MDcwNzA3
    //  	MDEwNTAwMDEwOTA3DQpoZHJBOiBTb21lIHZhbHVlIEENCmhkckI6IFNvbWUgdmFsdWUgQg0KQ29u
    //  	dGVudC1UeXBlOiB0ZXh0L3BsYWluDQoNClRoaXMgaXMgdGhlIHBsYWluLXRleHQgYm9keS4NCi0t
    //  	LS0tLS0tLS0tLS0tMDAwNjA3MDcwNzA3MDEwNTAwMDEwOTA3DQpoZHJYOiBTb21lIHZhbHVlIFgN
    //  	Cmhkclk6IFNvbWUgdmFsdWUgWQ0KQ29udGVudC1UeXBlOiB0ZXh0L3htbA0KDQo8YT5UaGlzIGlz
    //  	IHRoZSBYTUwgYm9keTwvYT4NCi0tLS0tLS0tLS0tLS0tMDAwNjA3MDcwNzA3MDEwNTAwMDEwOTA3
    //  	LS0NCqCCAvgwggL0MIICXaADAgECAgkAw+wkJPXVyeIwDQYJKoZIhvcNAQELBQAwgZIxCzAJBgNV
    //  	BAYTAkFVMREwDwYDVQQIDAhWaWN0b3JpYTESMBAGA1UEBwwJTWVsYm91cm5lMSEwHwYDVQQKDBhJ
    //  	bnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBldpZGdldDEoMCYGCSqGSIb3DQEJARYZ
    //  	YWRtaW5AaW50ZXJuZXR3aWRnZXRzLmNvbTAeFw0xNjExMDExNjUyMzJaFw0yMTEwMzExNjUyMzJa
    //  	MIGSMQswCQYDVQQGEwJBVTERMA8GA1UECAwIVmljdG9yaWExEjAQBgNVBAcMCU1lbGJvdXJuZTEh
    //  	MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYDVQQDDAZXaWRnZXQxKDAmBgkq
    //  	hkiG9w0BCQEWGWFkbWluQGludGVybmV0d2lkZ2V0cy5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0A
    //  	MIGJAoGBAMYh2gKPJq+z4X9GbRUgHibo7tUvWP7UiqJ6hH00RfYZC+7ZUJ1x7LF/2prDVvGKkS+M
    //  	vBSTDsx74FOUulZBsEwfzuzoqmwLwxXJeEwuk/Sgzw0WLH+8vPbB0uFSHsJm8kDSmWqQmT1uPntA
    //  	i74Q7WS1QczYMVvqxyS8IvbLJsPXAgMBAAGjUDBOMB0GA1UdDgQWBBQ40oq7bOxciuKdbEgZPrni
    //  	+txDCzAfBgNVHSMEGDAWgBQ40oq7bOxciuKdbEgZPrni+txDCzAMBgNVHRMEBTADAQH/MA0GCSqG
    //  	SIb3DQEBCwUAA4GBACsW92Lm72LZAXVDD5x0LWXvDZjf6rpEiSWfZbytYkWN7TTrjijyFfLu/jqC
    //  	IkJ52YVQuWGbWftcixkbLZbeUnvu/lqCf2AXBe7WHdyqQZeSi14TpJAlBdaCxbcZY+945u9MvwsX
    //  	jLnt+Az1lZL5X0wlqN67jhF/+1TXtMtgqO8SMYIDszCCA68CAQEwgaAwgZIxCzAJBgNVBAYTAkFV
    //  	MREwDwYDVQQIDAhWaWN0b3JpYTESMBAGA1UEBwwJTWVsYm91cm5lMSEwHwYDVQQKDBhJbnRlcm5l
    //  	dCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBldpZGdldDEoMCYGCSqGSIb3DQEJARYZYWRtaW5A
    //  	aW50ZXJuZXR3aWRnZXRzLmNvbQIJAMPsJCT11cniMA0GCWCGSAFlAwQCAQUAoIICNDAYBgkqhkiG
    //  	9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xNzA0MjAxNTU4NTNaMC8GCSqGSIb3
    //  	DQEJBDEiBCBWTSl3s251U8fqOeSAzUp1Yue53X+UCWT0ux+fclE4FDBfBgkqhkiG9w0BCQ8xUjBQ
    //  	MAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAw
    //  	BwYFKw4DAgcwDQYIKoZIhvcNAwICASgwgbEGCSsGAQQBgjcQBDGBozCBoDCBkjELMAkGA1UEBhMC
    //  	QVUxETAPBgNVBAgMCFZpY3RvcmlhMRIwEAYDVQQHDAlNZWxib3VybmUxITAfBgNVBAoMGEludGVy
    //  	bmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGV2lkZ2V0MSgwJgYJKoZIhvcNAQkBFhlhZG1p
    //  	bkBpbnRlcm5ldHdpZGdldHMuY29tAgkAw+wkJPXVyeIwgbMGCyqGSIb3DQEJEAILMYGjoIGgMIGS
    //  	MQswCQYDVQQGEwJBVTERMA8GA1UECAwIVmljdG9yaWExEjAQBgNVBAcMCU1lbGJvdXJuZTEhMB8G
    //  	A1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMQ8wDQYDVQQDDAZXaWRnZXQxKDAmBgkqhkiG
    //  	9w0BCQEWGWFkbWluQGludGVybmV0d2lkZ2V0cy5jb20CCQDD7CQk9dXJ4jA9BgkqhkiG9w0BAQow
    //  	MKANMAsGCWCGSAFlAwQCAaEaMBgGCSqGSIb3DQEBCDALBglghkgBZQMEAgGiAwIBIASBgILtktxt
    //  	tXWMWio7hLcvHUWk0Q3jP3rRdgNhcd/NdZsgDFP9/aq8/nHLLHSWfSh1PH+eZeKJwXxUH4Lwk6Sm
    //  	xFt97jyi3HaC3fezUSEqyg5WFG6fwOZGK4qF0WF+q29lvyNyV3iIQgDWxZQOcVL2fhpqUjoytkxj
    //  	/QTfrLOuzXKy
    //  


    CkMimeW_Dispose(mime);
    CkMimeW_Dispose(part0);
    CkMimeW_Dispose(part1);
    CkStringBuilderW_Dispose(sbUnsignedMime);
    CkPfxW_Dispose(pfx);
    CkCertW_Dispose(cert);

    }