Fix for x86_64 build fail
[platform/upstream/connectedhomeip.git] / third_party / ot-br-posix / repo / tools / pskc.cpp
1 /*
2  *    Copyright (c) 2017-2018, The OpenThread Authors.
3  *    All rights reserved.
4  *
5  *    Redistribution and use in source and binary forms, with or without
6  *    modification, are permitted provided that the following conditions are met:
7  *    1. Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *    2. Redistributions in binary form must reproduce the above copyright
10  *       notice, this list of conditions and the following disclaimer in the
11  *       documentation and/or other materials provided with the distribution.
12  *    3. Neither the name of the copyright holder nor the
13  *       names of its contributors may be used to endorse or promote products
14  *       derived from this software without specific prior written permission.
15  *
16  *    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *    POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 /**
30  * @file
31  *   This file implements a simple tool to compute pskc.
32  */
33
34 #include <stdio.h>
35 #include <sysexits.h>
36
37 #include "common/code_utils.hpp"
38 #include "utils/hex.hpp"
39 #include "utils/pskc.hpp"
40
41 /**
42  * Constants.
43  */
44 enum
45 {
46     kMaxNetworkName = 16,
47     kMaxPassphrase  = 255,
48     kSizeExtPanId   = 8,
49 };
50
51 void help(void)
52 {
53     printf("pskc - compute PSKc\n"
54            "SYNTAX:\n"
55            "    pskc <PASSPHRASE> <EXTPANID> <NETWORK_NAME>\n"
56            "EXAMPLE:\n"
57            "    pskc 654321 1122334455667788 OpenThread\n");
58 }
59
60 int printPSKc(const char *aPassphrase, const char *aExtPanId, const char *aNetworkName)
61 {
62     uint8_t extpanid[kSizeExtPanId];
63     size_t  length;
64     int     ret = -1;
65
66     otbr::Psk::Pskc pskcComputer;
67     const uint8_t * pskc;
68
69     length = strlen(aPassphrase);
70     VerifyOrExit(length > 0, printf("PASSPHRASE must not be empty.\n"));
71     VerifyOrExit(length <= kMaxPassphrase,
72                  printf("PASSPHRASE Passphrase must be no more than %d bytes.\n", kMaxPassphrase));
73
74     length = strlen(aExtPanId);
75     VerifyOrExit(length == kSizeExtPanId * 2, printf("EXTPANID length must be %d bytes.\n", kSizeExtPanId));
76     for (size_t i = 0; i < length; i++)
77     {
78         VerifyOrExit((aExtPanId[i] <= '9' && aExtPanId[i] >= '0') || (aExtPanId[i] <= 'f' && aExtPanId[i] >= 'a') ||
79                          (aExtPanId[i] <= 'F' && aExtPanId[i] >= 'A'),
80                      printf("EXTPANID must be encoded in hex.\n"));
81     }
82     otbr::Utils::Hex2Bytes(aExtPanId, extpanid, sizeof(extpanid));
83
84     length = strlen(aNetworkName);
85     VerifyOrExit(length > 0, printf("NETWORK_NAME must not be empty.\n"));
86     VerifyOrExit(length <= kMaxNetworkName,
87                  printf("NETWOR_KNAME length must be no more than %d bytes.\n", kMaxNetworkName));
88
89     pskc = pskcComputer.ComputePskc(extpanid, aNetworkName, aPassphrase);
90     for (int i = 0; i < 16; i++)
91     {
92         printf("%02x", pskc[i]);
93     }
94     printf("\n");
95     ret = 0;
96
97 exit:
98     return ret;
99 }
100
101 int main(int argc, char *argv[])
102 {
103     int ret = 0;
104
105     VerifyOrExit(argc == 4, help(), ret = EX_USAGE);
106     ret = printPSKc(argv[1], argv[2], argv[3]);
107
108 exit:
109     return ret;
110 }