#!/usr/bin/env rdmd /** * A simple script that generates the keys needed by DigiOPP Auth for signing * tokens and other cryptographic needs. Use this in your development * environment to ensure that your local auth project can issue keys to other * development services. * * Authors: Andrew Lalis */ module gen_keys; import std.stdio; import std.file; const privateKeyFile = "private_key.pem"; const privateKeyDerFile = "private_key.der"; const publicKeyDerFile = "public_key.der"; const cmdGenRSAPrivateKey = "openssl genrsa -out private_key.pem 2048"; const cmdGenDERPrivateKey = "openssl pkcs8 -topk8 -inform PEM -outform DER -in private_key.pem -out private_key.der -nocrypt"; const cmdGenDERPublicKey = "openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der"; void removeIfExists(string[] files...) { foreach (f; files) if (exists(f)) remove(f); } void genKeys(string[] files...) { import std.process : executeShell; import std.algorithm : canFind; if (canFind(files, privateKeyFile)) executeShell(cmdGenRSAPrivateKey); if (canFind(files, privateKeyDerFile)) executeShell(cmdGenDERPrivateKey); if (canFind(files, publicKeyDerFile)) executeShell(cmdGenDERPublicKey); } void main() { if (!exists(privateKeyFile)) { writeln("No RSA private key found. Regenerating all key files."); removeIfExists(privateKeyDerFile, publicKeyDerFile); genKeys(privateKeyFile, privateKeyDerFile, publicKeyDerFile); } else if (!exists(privateKeyDerFile)) { writeln("No DER private key found. Regenerating private and public DER files."); removeIfExists(privateKeyDerFile, publicKeyDerFile); genKeys(privateKeyDerFile, publicKeyDerFile); } else if (!exists(publicKeyDerFile)) { writeln("No DER public key found. Regenerating it."); genKeys(publicKeyDerFile); } writeln("All keys are now generated."); }