Ejemplo n.º 1
0
 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);
 }
Ejemplo n.º 2
0
        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);
        }