blob: 6d454009be260475f3297998b82016eb73d31064 [file] [log] [blame]
/*
*
* Copyright (c) 2013-2017 Nest Labs, Inc.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @file
* This file implements the Weave command line tool.
*
* The Weave command line tool is used, primarily, for generating
* and manipulating Weave security certificate material.
*
*/
#include <stdio.h>
#include <string.h>
#include <Weave/WeaveVersion.h>
#include "weave-tool.h"
static const char *const sHelp =
"Usage: weave <command> [ <args...> ]\n"
"\n"
"Commands:\n"
"\n"
" gen-ca-cert -- Generate a Weave CA certificate.\n"
"\n"
" gen-device-cert -- Generate a Weave device certificate.\n"
"\n"
" gen-code-signing-cert -- Generate a Weave code signing certificate.\n"
"\n"
" gen-service-endpoint-cert -- Generate a Weave service endpoint certificate.\n"
"\n"
" gen-general-cert -- Generate a general Weave certificate with a string subject.\n"
"\n"
" gen-provisioning-data -- Generate manufacturing provisioning data for one or more devices.\n"
"\n"
" convert-cert -- Convert a certificate between Weave and X509 form.\n"
"\n"
" convert-key -- Convert a private key between Weave and PEM/DER form.\n"
"\n"
" resign-cert -- Resign a weave certificate using a new CA key.\n"
"\n"
" make-service-config -- Make a service config object.\n"
"\n"
" validate-cert -- Validate a Weave certificate chain.\n"
"\n"
" print-cert -- Print a Weave certificate.\n"
"\n"
" print-tlv -- Print a Weave TLV object.\n"
"\n"
" version -- Print the program version and exit.\n"
"\n"
;
/**
* Print to standard output the program version information.
*
* @return Unconditionally returns true.
*
*/
static bool PrintVersion(void)
{
printf("weave " WEAVE_VERSION_STRING "\n" COPYRIGHT_STRING);
return true;
}
extern "C"
int main(int argc, char *argv[])
{
bool res = false;
if (argc == 1)
fprintf(stderr, "weave: Please specify a command, or 'help' for help.\n");
else if (strcasecmp(argv[1], "help") == 0 || strcasecmp(argv[1], "--help") == 0 || strcasecmp(argv[1], "-h") == 0)
res = (fputs(sHelp, stdout) != EOF);
else if (strcasecmp(argv[1], "version") == 0 || strcasecmp(argv[1], "--version") == 0 || strcasecmp(argv[1], "-v") == 0)
res = PrintVersion();
else if (strcasecmp(argv[1], "gen-ca-cert") == 0 || strcasecmp(argv[1], "gencacert") == 0)
res = Cmd_GenCACert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "gen-device-cert") == 0 || strcasecmp(argv[1], "gendevicecert") == 0)
res = Cmd_GenDeviceCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "gen-code-signing-cert") == 0 || strcasecmp(argv[1], "gencodesigningcert") == 0)
res = Cmd_GenCodeSigningCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "gen-service-endpoint-cert") == 0 || strcasecmp(argv[1], "genserviceendpointcert") == 0)
res = Cmd_GenServiceEndpointCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "gen-general-cert") == 0 || strcasecmp(argv[1], "gengeneralcert") == 0)
res = Cmd_GenGeneralCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "convert-cert") == 0 || strcasecmp(argv[1], "convertcert") == 0)
res = Cmd_ConvertCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "convert-key") == 0 || strcasecmp(argv[1], "convertkey") == 0)
res = Cmd_ConvertKey(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "resign-cert") == 0 || strcasecmp(argv[1], "resigncert") == 0)
res = Cmd_ResignCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "make-service-config") == 0 || strcasecmp(argv[1], "makeserviceconfig") == 0)
res = Cmd_MakeServiceConfig(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "make-access-token") == 0 || strcasecmp(argv[1], "makeaccesstoken") == 0)
res = Cmd_MakeAccessToken(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "gen-provisioning-data") == 0 || strcasecmp(argv[1], "genprovisioningdata") == 0)
res = Cmd_GenProvisioningData(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "validate-cert") == 0 || strcasecmp(argv[1], "validatecert") == 0)
res = Cmd_ValidateCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "print-cert") == 0 || strcasecmp(argv[1], "printcert") == 0)
res = Cmd_PrintCert(argc - 1, argv + 1);
else if (strcasecmp(argv[1], "print-tlv") == 0 || strcasecmp(argv[1], "printtlv") == 0)
res = Cmd_PrintTLV(argc - 1, argv + 1);
else
fprintf(stderr, "weave: Unrecognized command: %s\n", argv[1]);
return res ? 0 : -1;
}