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