Sample code for 30+ languages & platforms
PureBasic

Duplicate Java Secure Token Creation

See more RSA Examples

Demonstrates how to duplicate some Java code that creates an RSA signature to create a base64 token.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkCert.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkRsa.pb"
IncludeFile "CkDateTime.pb"

Procedure ChilkatExample()

    success.i = 0

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

    ; This example duplicates the following Java code:

    ; public X509Certificate2 cert = new X509Certificate2(@"Some path to p12/p12file_name.p12","Password_for_p12"); 
    ; 
    ; public string GenerateSignToken(double timeValidityMin){ 
    ;   string equalsSign = ":="; 
    ;   string timeCreated = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz"); 
    ;   string tokenTimeInfo = "validityTimeMinutes" + equalsSign + timeValidityMin + ";"+"timeCreated" + equalsSign + timeCreated; 
    ;   string signature = SignData(tokenTimeInfo); 
    ;   string secureToken = tokenTimeInfo + ";" + "signature" + equalsSign + signature; 
    ;   return Base64UrlEncode(secureToken); 
    ; } 
    ;  
    ; public string SignData(string stringToSign){ 
    ;   byte[] dataToSign = Encoding.UTF8.GetBytes(stringToSign); 
    ;   RSACryptoServiceProvider privKey = (RSACryptoServiceProvider)cert.PrivateKey; 
    ;   CspKeyContainerInfo containerInfo = new RSACryptoServiceProvider().CspKeyContainerInfo; 
    ;   CspParameters cspparams = new CspParameters(containerInfo.ProviderType, containerInfo.ProviderName, privKey.CspKeyContainerInfo.KeyContainerName); 
    ;   privKey = new RSACryptoServiceProvider(cspparams); 
    ;   string id = CryptoConfig.MapNameToOID("SHA256"); 
    ;   byte[] sign = privKey.SignData(dataToSign, id); 
    ;   bool res = privKey.VerifyData(dataToSign, id, sign); 
    ;   return Convert.ToBase64String(sign).Replace('+', '-').Replace('/', '_').Replace("=", ""); 
    ; } 
    ;  
    ; private static string Base64UrlEncode(string input){ 
    ;   var inputBytes = Encoding.UTF8.GetBytes(input); 
    ;   return Convert.ToBase64String(inputBytes).Replace('+', '-').Replace('/', '_').Replace("=", ""); 
    ; } 

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

    CkDateTime::ckSetFromCurrentSystemTime(dt)
    timeCreated.s = CkDateTime::ckGetAsTimestamp(dt,1)

    ; Such as 2019-04-01T19:35:44-05:00
    Debug timeCreated

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

    CkStringBuilder::ckAppend(sbToken,"validityTimeMinutes:=10.0;timeCreated:=")
    CkStringBuilder::ckAppend(sbToken,timeCreated)

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

    success = CkCert::ckLoadPfxFile(cert,"Some path to p12/p12file_name.p12","Password_for_p12")
    If success <> 1
        Debug CkCert::ckLastErrorText(cert)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbToken)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

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

    success = CkRsa::ckSetX509Cert(rsa,cert,1)
    If success <> 1
        Debug CkRsa::ckLastErrorText(rsa)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbToken)
        CkCert::ckDispose(cert)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    CkRsa::setCkEncodingMode(rsa, "base64url")

    signature.s = CkRsa::ckSignStringENC(rsa,CkStringBuilder::ckGetAsString(sbToken),"sha256")
    If CkRsa::ckLastMethodSuccess(rsa) = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbToken)
        CkCert::ckDispose(cert)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    CkStringBuilder::ckAppend(sbToken,";signature:=")
    CkStringBuilder::ckAppend(sbToken,signature)

    ; Base64URL encode the result
    CkStringBuilder::ckEncode(sbToken,"base64url","utf-8")
    token.s = CkStringBuilder::ckGetAsString(sbToken)

    Debug token


    CkDateTime::ckDispose(dt)
    CkStringBuilder::ckDispose(sbToken)
    CkCert::ckDispose(cert)
    CkRsa::ckDispose(rsa)


    ProcedureReturn
EndProcedure