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