Sample code for 30+ languages & platforms
PureBasic Requires Chilkat v11.0.0+

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 PureBasic Downloads

PureBasic
IncludeFile "CkCert.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkMime.pb"
IncludeFile "CkPfx.pb"

Procedure ChilkatExample()

    success.i = 0

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

    mime.i = CkMime::ckCreate()
    If mime.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ;  Create a MIME message to sign.
    CkMime::ckNewMultipartMixed(mime)
    CkMime::ckAddHeaderField(mime,"someHeader1","Some value 1")
    CkMime::ckAddHeaderField(mime,"someHeader2","Some value 2")

    part0.i = CkMime::ckCreate()
    If part0.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkMime::ckAddHeaderField(part0,"hdrA","Some value A")
    CkMime::ckAddHeaderField(part0,"hdrB","Some value B")
    CkMime::setCkContentType(part0, "text/plain")
    CkMime::ckSetBody(part0,"This is the plain-text body.")

    part1.i = CkMime::ckCreate()
    If part1.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkMime::ckAddHeaderField(part1,"hdrX","Some value X")
    CkMime::ckAddHeaderField(part1,"hdrY","Some value Y")
    CkMime::setCkContentType(part1, "text/xml")
    CkMime::ckSetBody(part1,"<a>This is the XML body</a>")

    CkMime::ckAppendPart(mime,part0)
    CkMime::ckAppendPart(mime,part1)

    ;  The MIME to be signed:
    sbUnsignedMime.i = CkStringBuilder::ckCreate()
    If sbUnsignedMime.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkMime::ckGetMimeSb(mime,sbUnsignedMime)
    Debug CkStringBuilder::ckGetAsString(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.i = CkPfx::ckCreate()
    If pfx.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPfx::ckLoadPfxFile(pfx,"qa_data/rsassa-pss/privatekey.pfx","PFX_PASSWORD")
    If success = 0
        Debug CkPfx::ckLastErrorText(pfx)
        CkMime::ckDispose(mime)
        CkMime::ckDispose(part0)
        CkMime::ckDispose(part1)
        CkStringBuilder::ckDispose(sbUnsignedMime)
        CkPfx::ckDispose(pfx)
        ProcedureReturn
    EndIf

    ;  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.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPfx::ckCertAt(pfx,0,cert)
    If success = 0
        Debug CkPfx::ckLastErrorText(pfx)
        CkMime::ckDispose(mime)
        CkMime::ckDispose(part0)
        CkMime::ckDispose(part1)
        CkStringBuilder::ckDispose(sbUnsignedMime)
        CkPfx::ckDispose(pfx)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ;  Indicate that RSASSA-PSS with SHA256 should be used.
    CkMime::setCkSigningAlg(mime, "pss")
    CkMime::setCkSigningHashAlg(mime, "sha256")

    ;  Add a detached signature.
    success = CkMime::ckAddDetachedSignature(mime,cert)
    If success <> 1
        Debug CkMime::ckLastErrorText(mime)
        CkMime::ckDispose(mime)
        CkMime::ckDispose(part0)
        CkMime::ckDispose(part1)
        CkStringBuilder::ckDispose(sbUnsignedMime)
        CkPfx::ckDispose(pfx)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ;  Show the clear-signed MIME. (see the sample output below)
    Debug "-------------------------------------------------------------"
    Debug "Clear-signed MIME using detached signature:"
    Debug "-------------------------------------------------------------"
    Debug CkMime::ckGetMime(mime)

    ;  Restore the original unsigned MIME, and this time create an opaque signature.
    CkMime::ckLoadMime(mime,CkStringBuilder::ckGetAsString(sbUnsignedMime))

    ;  Sign using an opaque signature
    success = CkMime::ckConvertToSigned(mime,cert)
    If success <> 1
        Debug CkMime::ckLastErrorText(mime)
        CkMime::ckDispose(mime)
        CkMime::ckDispose(part0)
        CkMime::ckDispose(part1)
        CkStringBuilder::ckDispose(sbUnsignedMime)
        CkPfx::ckDispose(pfx)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    ;  Show the opaque-signed MIME. (see the sample output below)
    Debug "-------------------------------------------------------------"
    Debug "Opaque-signed MIME :"
    Debug "-------------------------------------------------------------"
    Debug CkMime::ckGetMime(mime)
    Debug "Success."

    ;  -----------------------------------------------
    ;  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
    ;  


    CkMime::ckDispose(mime)
    CkMime::ckDispose(part0)
    CkMime::ckDispose(part1)
    CkStringBuilder::ckDispose(sbUnsignedMime)
    CkPfx::ckDispose(pfx)
    CkCert::ckDispose(cert)


    ProcedureReturn
EndProcedure