Sample code for 30+ languages & platforms
Xbase++

RSA Sign an Encoded Hash

See more RSA Examples

Demonstrates signing a hash (e.g., SHA256) provided as an encoded string (e.g., base64 or hex).

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oCert
LOCAL oBd
LOCAL i
LOCAL oRsa
LOCAL cSha256_base64
LOCAL cRsaSig_base64

nSuccess := 0

//  Assuming the smartcard/USB token is installed with the correct drivers from the manufacturer,
//  this code can work on multiple platforms including Windows, MacOS, Linux, and iOS.

//  Chilkat automatically detects and determines the way in which the HSM is used,
//  which can be by PKCS11, Apple Keychain, Microsoft CNG / Crypto API, or ScMinidriver.

oCert := CreateObject("Chilkat.Cert")

//  Set the token/smartcard PIN prior to loading.
oCert:SmartCardPin := "123456"

//  Specify the certificate by its common name.
nSuccess := oCert:LoadFromSmartcard("cn=chilkat-rsa-2048")
IF (nSuccess == 0)
    ? oCert:LastErrorText
    oCert:destroy()
    RETURN
ENDIF

? "Signing with the private key for this cert: " + oCert:SubjectCN

//  Create data to be hashed and signed.
oBd := CreateObject("Chilkat.BinData")

FOR i := 0 TO 100
    oBd:AppendEncoded("000102030405060708090A0B0C0D0E0F", "hex")
NEXT

oRsa := CreateObject("Chilkat.Rsa")

//  Use the certificate's private key for signing.
nSuccess := oRsa:SetX509Cert(oCert, 1)
IF (nSuccess == 0)
    ? oRsa:LastErrorText
    oCert:destroy()
    oBd:destroy()
    oRsa:destroy()
    RETURN
ENDIF

//  We'll first compute the hash and then pass the encoded hash to be signed.
cSha256_base64 := oBd:GetHash("sha256", "base64")
? "sha256 hash in base64 format: " + cSha256_base64

//  Pass in the base64 hash and return a base64 signature.
oRsa:EncodingMode := "base64"
cRsaSig_base64 := oRsa:SignHashENC(cSha256_base64, "sha256")
IF (nSuccess == 0)
    ? oRsa:LastErrorText
    oCert:destroy()
    oBd:destroy()
    oRsa:destroy()
    RETURN
ENDIF

? "RSA signature as base64: " + cRsaSig_base64

oCert:destroy()
oBd:destroy()
oRsa:destroy()