1 /*
2 * Copyright (c) 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 <mbedtls/sha256.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <sysexits.h>
38
39 #include "common/code_utils.hpp"
40 #include "utils/hex.hpp"
41 #include "utils/steering_data.hpp"
42
help(void)43 void help(void)
44 {
45 printf("steering-data - compute steering data\n"
46 "SYNTAX:\n"
47 " steering-data [LENGTH] <JOINER_ID> ...\n"
48 "EXAMPLE:\n"
49 " steering-data 18b4300000000001\n"
50 " steering-data 15 18b4300000000001\n"
51 " steering-data 18b4300000000001 18b4300000000002\n");
52 }
53
ComputeJoinerId(const char * aEui64,uint8_t * aJoinerId)54 int ComputeJoinerId(const char *aEui64, uint8_t *aJoinerId)
55 {
56 int ret = -1;
57
58 VerifyOrExit(strlen(aEui64) == otbr::SteeringData::kSizeJoinerId * 2);
59 VerifyOrExit(otbr::Utils::Hex2Bytes(aEui64, aJoinerId, otbr::SteeringData::kSizeJoinerId) ==
60 otbr::SteeringData::kSizeJoinerId);
61 otbr::SteeringData::ComputeJoinerId(aJoinerId, aJoinerId);
62 ret = 0;
63
64 exit:
65 if (ret != 0)
66 {
67 fprintf(stderr, "Invalid EUI64: %s", aEui64);
68 }
69
70 return ret;
71 }
72
main(int argc,char * argv[])73 int main(int argc, char *argv[])
74 {
75 otbr::SteeringData computer;
76 int ret = EX_USAGE;
77 int length = 16;
78 int i = 1;
79
80 if (argc < 2)
81 {
82 ExitNow(help());
83 }
84
85 if (strlen(argv[i]) != otbr::SteeringData::kSizeJoinerId * 2)
86 {
87 length = atoi(argv[i]);
88 VerifyOrExit(length > 0 && length <= otbr::SteeringData::kMaxSizeOfBloomFilter,
89 fprintf(stderr, "Invalid bloom filter length: %d\n", length));
90
91 ++i;
92 }
93
94 computer.Init(static_cast<uint8_t>(length));
95
96 for (; i < argc; ++i)
97 {
98 uint8_t joinerId[otbr::SteeringData::kSizeJoinerId];
99
100 VerifyOrExit(ComputeJoinerId(argv[i], joinerId) == 0, fprintf(stderr, "Invalid EUI64 : %s\n", argv[i]));
101 computer.ComputeBloomFilter(joinerId);
102 }
103
104 for (i = 0; i < length; i++)
105 {
106 printf("%02x", computer.GetBloomFilter()[i]);
107 }
108 printf("\n");
109
110 ret = EX_OK;
111
112 exit:
113 return ret;
114 }
115