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

Verfies an RSA Signature

See more Apple Keychain Examples

Verifies an RSA signature against the original data.

Chilkat PureBasic Downloads

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

Procedure ChilkatExample()

    success.i = 0

    ;  The following data was signed by the following example:
    ;  RSA Sign using a Private Key on a USB Token or Smartcard
    bd.i = CkBinData::ckCreate()
    If bd.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    i.i
    For i = 0 To 100
        CkBinData::ckAppendEncoded(bd,"000102030405060708090A0B0C0D0E0F","hex")
    Next

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

    success = CkBinData::ckLoadFile(bdSig,"rsaSignatures/test1.sig")
    If success = 0
        Debug "Failed to load the RSA signature"
        CkBinData::ckDispose(bd)
        CkBinData::ckDispose(bdSig)
        ProcedureReturn
    EndIf

    ;  Get the public key to be used for signature verification.
    pubKey.i = CkPublicKey::ckCreate()
    If pubKey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPublicKey::ckLoadFromFile(pubKey,"rsaKeys/chilkat-rsa-2048.pem")
    If success = 0
        Debug CkPublicKey::ckLastErrorText(pubKey)
        CkBinData::ckDispose(bd)
        CkBinData::ckDispose(bdSig)
        CkPublicKey::ckDispose(pubKey)
        ProcedureReturn
    EndIf

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

    success = CkRsa::ckUsePublicKey(rsa,pubKey)
    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkBinData::ckDispose(bd)
        CkBinData::ckDispose(bdSig)
        CkPublicKey::ckDispose(pubKey)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    ;  Verify the hash of the data against the signature.
    ;  We pass in the original data.  Internally, the hash is generated
    ;  and used to validate the signature.
    ;  Validating the RSA signature means two things:  
    ;  (1) the original data is exactly what was signed, and 
    ;  (2) it was signed by the owner of the RSA private key.
    success = CkRsa::ckVerifyBd(rsa,bd,"sha256",bdSig)

    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        Debug "Signature invalid."
    Else
        Debug "Signature valid."
    EndIf



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


    ProcedureReturn
EndProcedure