private void GenKey(HttpListenerContext ctx) { if (ctx.Request.HasEntityBody) { var Req = ctx.Request.InputStream.ReadAllText(ctx.Request.ContentEncoding).FromJson <ApiGenRsaKey>(); if (Req != null && CertCommands.IsValidKeySize(Req.keySize)) { var Key = CertCommands.GenerateKey(Req.keySize); if (!string.IsNullOrEmpty(Key)) { var KeyData = new ApiRsaKey(); KeyData.key = Key; var FileName = Path.Combine(Base, KeyData.id + ".key"); try { File.WriteAllText(FileName, KeyData.key); SendJson(ctx, new ApiRsaKey(FileName), true); return; } catch (Exception ex) { Logger.Error("HTTP: Unable to save generated key to {0}. Reason: {1}", FileName, ex.Message); } SendJson(ctx, "Unable to write Key to filesystem", false); return; } SendJson(ctx, "Unable to generate key", false); return; } SendJson(ctx, "Invalid Request Content", false); return; } SendJson(ctx, "Invalid Request Method", false); }
private static CmdArgs ParseArgs(string[] args) { var A = new CmdArgs(); A.Mode = Mode.INVALID; A.Action = Action.INVALID; A.Domains = new List <string>(); A.IPs = new List <string>(); if (args == null || args.Length == 0 || HelpRequest(args)) { A.Mode = Mode.help; A.Valid = true; return(A); } for (var i = 0; i < args.Length; i++) { var arg = args[i]; var hasMore = args.Length > i + 1; if (A.Mode == Mode.INVALID) { #region Mode switch (arg.ToLower()) { case "/http": A.Mode = Mode.server; break; case "/rsa": A.Mode = Mode.rsa; break; case "/ca": A.Mode = Mode.ca; break; case "/cert": A.Mode = Mode.cert; break; default: Logger.Error("Invalid mode: {0}", arg); return(A); } #endregion } else if (A.Action == Action.INVALID) { #region Action switch (arg.ToLower()) { case "/install": if (A.Mode == Mode.ca) { A.Action = Action.install; } else { Logger.Error("Invalid mode for /ca: {0}", arg); return(A); } break; case "/query": if (A.Mode == Mode.ca) { A.Action = Action.query; } else { Logger.Error("Invalid mode for /ca: {0}", arg); return(A); } break; case "/uninstall": if (A.Mode == Mode.ca) { A.Action = Action.uninstall; } else { Logger.Error("Invalid mode for /ca: {0}", arg); return(A); } break; case "/key": if (A.Mode != Mode.rsa) { if (hasMore) { A.Action = Action.create; A.Key = args[++i]; } else { Logger.Error("{0} requires a file name", arg); return(A); } } else { Logger.Error("Invalid mode for /rsa: {0}", arg); return(A); } break; default: if (A.Mode == Mode.server) { if (Server.IsValidPort(Tools.IntOrDefault(arg, -1))) { A.Port = Tools.IntOrDefault(arg); A.Action = Action.create; } else { Logger.Error("Invalid port number: {0}", arg); return(A); } } else if (A.Mode == Mode.rsa) { if (CertCommands.IsValidKeySize(Tools.IntOrDefault(arg))) { A.RsaSize = Tools.IntOrDefault(arg); A.Action = Action.create; } else { Logger.Error("Invalid RSA key size: {0}", arg); return(A); } } else { Logger.Error("Invalid action: {0}", arg); return(A); } break; } #endregion } else { #region Params switch (arg.ToLower()) { case "/b": if (A.Mode == Mode.server) { if (!A.OpenBrowser) { A.OpenBrowser = true; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/lm": if (A.Mode == Mode.ca && (A.Action == Action.install || A.Action == Action.query || A.Action == Action.uninstall)) { if (!A.LM) { A.LM = true; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/exp": if ((A.Mode == Mode.cert || A.Mode == Mode.ca) && A.Action == Action.create) { if (A.Expiration == 0) { A.Expiration = Tools.IntOrDefault(args[++i]); if (A.Expiration < 1) { Logger.Error("Invalid expiration: {0}", args[i]); return(A); } } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/256": if ((A.Mode == Mode.cert || A.Mode == Mode.ca) && A.Action == Action.create) { if (!A.Sha256) { A.Sha256 = true; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/key": if (hasMore) { if (A.Key == null) { A.Key = args[++i]; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} requires a file name", arg); return(A); } break; case "/dn": case "/ip": if (hasMore) { if (A.Mode == Mode.cert && A.Action == Action.create) { if (arg.ToLower() == "/ip") { if (Tools.IsValidIp(args[i + 1])) { A.IPs.Add(args[++i]); } else { Logger.Error("{0} requires a valid IP, {1} given", arg, args[i + 1]); return(A); } } else { if (Tools.IsValidDomainName(args[i + 1])) { A.Domains.Add(args[++i]); } else { Logger.Error("{0} requires a valid Domain, {1} given", arg, args[i + 1]); return(A); } } } } else { Logger.Error("{0} requires a value", arg); return(A); } break; case "/f": if (A.Mode == Mode.ca && (A.Action == Action.query || A.Action == Action.uninstall)) { if (!A.IsFile) { A.IsFile = true; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/ou": case "/o": case "/cc": case "/st": case "/l": case "/cn": case "/e": case "/cac": case "/cak": #region CertProps if (A.Mode == Mode.cert || (A.Mode == Mode.ca && A.Action == Action.create)) { if (hasMore) { switch (arg.ToLower()) { case "/cac": if (A.Mode == Mode.cert) { if (hasMore) { if (A.CAC == null) { A.CAC = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } } else { Logger.Error("{0} requires a file name", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/cak": if (A.Mode == Mode.cert) { if (hasMore) { if (A.CAK == null) { A.CAK = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } } else { Logger.Error("{0} requires a file name", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } break; case "/ou": if (A.OU == null) { A.OU = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/o": if (A.O == null) { A.O = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/cc": if (A.CC == null) { A.CC = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/st": if (A.ST == null) { A.ST = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/l": if (A.L == null) { A.L = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/cn": if (A.CN == null) { A.CN = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; case "/e": if (A.E == null) { A.E = args[++i]; } else { Logger.Error("{0} defined multiple times", arg); return(A); } break; } } else { Logger.Error("{0} requires a value", arg); return(A); } } else { Logger.Error("{0} is not supported for mode {1} and action {2}", arg, A.Mode, A.Action); return(A); } #endregion break; case "/out": if (args.Length > i + 1) { if (A.Mode == Mode.rsa || A.Mode == Mode.cert || (A.Mode == Mode.ca && A.Action == Action.create)) { A.Output = args[++i]; } else { Logger.Error("/out is not supported for mode {0} and action {1}", A.Mode, A.Action); return(A); } } else { Logger.Error("/out requires a file name"); return(A); } break; default: //The first argument is to be treated special sometimes if (i == 2 && A.Mode == Mode.ca && (A.Action == Action.install || A.Action == Action.query || A.Action == Action.uninstall)) { if (A.Action == Action.install) { if (A.CAC == null) { A.CAC = arg; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } else { if (A.Thumbprint == null) { A.Thumbprint = arg; } else { Logger.Error("{0} specified multiple times", arg); return(A); } } } else { Logger.Error("Unsupported argument: {0}", arg); return(A); } break; } #endregion } } #region Validation if (A.Mode == Mode.rsa && !CertCommands.IsValidKeySize(A.RsaSize)) { Logger.Error("/RSA misses key size argument"); return(A); } if (A.Mode == Mode.ca) { switch (A.Action) { case Action.create: if (A.Key == null) { Logger.Error("RSA Key not specified"); return(A); } break; case Action.install: if (A.CAC == null) { Logger.Error("Certificate not specified"); return(A); } break; case Action.query: case Action.uninstall: if (A.Thumbprint == null) { Logger.Error("Thumbprint not specified"); return(A); } break; } } if (A.Mode == Mode.cert) { if (A.Key == null) { Logger.Error("RSA Key not specified"); return(A); } if (A.CAC == null) { Logger.Error("Root Certificate not specified"); return(A); } if (A.CAK == null) { Logger.Error("Root RSA Key not specified"); return(A); } } A.SetDefaults(); #endregion A.Valid = true; return(A); }