conf: calculate the checksum over the effective configuration
[olsrd.git] / src / cfgparser / olsrd_conf_checksum.c
1 /*
2  * The olsr.org Optimized Link-State Routing daemon (olsrd)
3  *
4  * (c) by the OLSR project
5  *
6  * See our Git repository to find out who worked on this file
7  * and thus is a copyright holder on it.
8  *
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  *
15  * * Redistributions of source code must retain the above copyright
16  *   notice, this list of conditions and the following disclaimer.
17  * * Redistributions in binary form must reproduce the above copyright
18  *   notice, this list of conditions and the following disclaimer in
19  *   the documentation and/or other materials provided with the
20  *   distribution.
21  * * Neither the name of olsr.org, olsrd nor the names of its
22  *   contributors may be used to endorse or promote products derived
23  *   from this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  *
38  * Visit http://www.olsr.org for more information.
39  *
40  * If you find this software useful feel free to make a donation
41  * to the project. For more information see the website or contact
42  * the copyright holders.
43  *
44  */
45
46 #include "olsrd_conf_checksum.h"
47
48 #include "olsrd_conf.h"
49
50 #include <stdio.h>
51
52 #include <string.h>
53
54 #ifdef NOCONFIGCHECKSUM
55 #define SHA_DIGEST_LENGTH 1
56 #else
57 #include <openssl/sha.h>
58 static SHA256_CTX ctx;
59 #endif /* NOCONFIGCHECKSUM */
60
61 static unsigned char configuration_checksum[SHA_DIGEST_LENGTH];
62 static char configuration_checksum_str[(sizeof(configuration_checksum) * 2) + 1];
63
64 #define CLI_START     "*CLI START*"
65 #define CLI_START_LEN (sizeof(CLI_START) - 1)
66 #define CLI_END       "*CLI END*"
67 #define CLI_END_LEN   (sizeof(CLI_END) - 1)
68
69 bool olsrd_config_checksum_init(void) {
70   memset(configuration_checksum, 0, sizeof(configuration_checksum));
71   memset(configuration_checksum_str, 0, sizeof(configuration_checksum_str));
72
73 #ifndef NOCONFIGCHECKSUM
74   if (!SHA256_Init(&ctx)) {
75     return false;
76   }
77 #endif /* NOCONFIGCHECKSUM */
78
79   return true;
80 }
81
82 bool olsrd_config_checksum_final(void) {
83   memset(configuration_checksum, 0, sizeof(configuration_checksum));
84   memset(configuration_checksum_str, 0, sizeof(configuration_checksum_str));
85
86 #ifndef NOCONFIGCHECKSUM
87   {
88     size_t i;
89
90     if (!SHA256_Final(configuration_checksum, &ctx)) {
91       return false;
92     }
93
94     for (i = 0; i < sizeof(configuration_checksum); i++) {
95       snprintf(&configuration_checksum_str[i * 2], 3, "%02x", configuration_checksum[i]);
96     }
97     configuration_checksum_str[i * 2] = '\0';
98   }
99 #endif /* NOCONFIGCHECKSUM */
100
101   return true;
102 }
103
104 unsigned char *olsrd_config_checksum_get(size_t *len, char ** str) {
105   if (len) {
106     *len = sizeof(configuration_checksum);
107   }
108
109   if (str) {
110     *str = configuration_checksum_str;
111   }
112
113   return configuration_checksum;
114 }
115
116 bool olsrd_config_checksum_add_cli(int argc, char *argv[]) {
117   int i = 1;
118
119   if (!argc || !argv) {
120     return true;
121   }
122
123   if (!olsrd_config_checksum_add(CLI_START, CLI_START_LEN)) {
124     return false;
125   }
126
127   for (i = 0; i < argc; ++i) {
128     if (!argv[i]) {
129       break;
130     }
131
132     if (!olsrd_config_checksum_add(argv[i], strlen(argv[i]))) {
133       return false;
134     }
135   }
136
137   if (!olsrd_config_checksum_add(CLI_END, CLI_END_LEN)) {
138     return false;
139   }
140
141   return true;
142 }
143
144 bool olsrd_config_checksum_add(const char *str, size_t len) {
145   if (!str || !len) {
146     return true;
147   }
148
149 #ifndef NOCONFIGCHECKSUM
150   if (!SHA256_Update(&ctx, str, len)) {
151     return false;
152   }
153
154   if (!SHA256_Update(&ctx, "\n", 1)) {
155     return false;
156   }
157 #endif /* NOCONFIGCHECKSUM */
158
159   return true;
160 }