Zig
Zig
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 Zig Downloads
const std = @import("std");
const chilkat = @import("chilkat");
pub fn main(init: std.process.Init) !void {
const alloc = init.arena.allocator();
// 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("=", "");
// }
const dt = try chilkat.DateTime.init();
defer dt.deinit();
dt.setFromCurrentSystemTime() catch {};
const time_created = try dt.getAsTimestamp(alloc, true);
// Such as 2019-04-01T19:35:44-05:00
std.debug.print("{s}\n", .{time_created});
const sb_token = try chilkat.StringBuilder.init();
defer sb_token.deinit();
sb_token.append("validityTimeMinutes:=10.0;timeCreated:=") catch {};
sb_token.append(time_created) catch {};
const cert = try chilkat.Cert.init();
defer cert.deinit();
cert.loadPfxFile("Some path to p12/p12file_name.p12", "Password_for_p12") catch {
std.debug.print("{s}\n", .{try cert.getLastErrorText(alloc)});
return;
};
const rsa = try chilkat.Rsa.init();
defer rsa.deinit();
rsa.setX509Cert(cert, true) catch {
std.debug.print("{s}\n", .{try rsa.getLastErrorText(alloc)});
return;
};
rsa.setEncodingMode("base64url");
const signature = rsa.signStringENC(alloc, try sb_token.getAsString(alloc), "sha256") catch {
std.debug.print("{s}\n", .{try rsa.getLastErrorText(alloc)});
return;
};
sb_token.append(";signature:=") catch {};
sb_token.append(signature) catch {};
// Base64URL encode the result
sb_token.encode("base64url", "utf-8") catch {};
const token = try sb_token.getAsString(alloc);
std.debug.print("{s}\n", .{token});
}