Sample code for 30+ languages & platforms
PureBasic

Verify the RSA Signature of a SHA256 Hash

See more RSA Examples

Demonstrates how to verify an RSA signature of a SHA256 hash.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkBinData.pb"
IncludeFile "CkPublicKey.pb"
IncludeFile "CkRsa.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ; Let's say you have a file containing the 32-bytes of a SHA256 hash,
    ; and a file that is an RSA signature of those 32 bytes.
    ; Here's how you verify using the RSA public key found in a PEM.

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

    success = CkPublicKey::ckLoadFromFile(pubKey,"rsaPubKey.pem")
    If success = 0
        Debug CkPublicKey::ckLastErrorText(pubKey)
        CkPublicKey::ckDispose(pubKey)
        ProcedureReturn
    EndIf

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

    ; Get the public key.
    success = CkRsa::ckUsePublicKey(rsa,pubKey)
    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkPublicKey::ckDispose(pubKey)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    ; Get the 32-byte SHA256 hash.
    bdHash.i = CkBinData::ckCreate()
    If bdHash.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bdHash,"myHash.sha256")
    If success = 0
        Debug "Failed to load SHA256 hash."
        CkPublicKey::ckDispose(pubKey)
        CkRsa::ckDispose(rsa)
        CkBinData::ckDispose(bdHash)
        ProcedureReturn
    EndIf

    ; Get the RSA signature to be validated.
    bdSig.i = CkBinData::ckCreate()
    If bdSig.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkBinData::ckLoadFile(bdSig,"mySig.sig")
    If success = 0
        Debug "Failed to load RSA signature."
        CkPublicKey::ckDispose(pubKey)
        CkRsa::ckDispose(rsa)
        CkBinData::ckDispose(bdHash)
        CkBinData::ckDispose(bdSig)
        ProcedureReturn
    EndIf

    ; Verify the signature against the SHA256 hash.
    enc.s = "base64"
    CkRsa::setCkEncodingMode(rsa, enc)
    success = CkRsa::ckVerifyHashENC(rsa,CkBinData::ckGetEncoded(bdHash,enc),"sha256",CkBinData::ckGetEncoded(bdSig,enc))
    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkPublicKey::ckDispose(pubKey)
        CkRsa::ckDispose(rsa)
        CkBinData::ckDispose(bdHash)
        CkBinData::ckDispose(bdSig)
        ProcedureReturn
    EndIf

    Debug "Signature validated."


    CkPublicKey::ckDispose(pubKey)
    CkRsa::ckDispose(rsa)
    CkBinData::ckDispose(bdHash)
    CkBinData::ckDispose(bdSig)


    ProcedureReturn
EndProcedure