Sample code for 30+ languages & platforms
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

Zig
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});
}