]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/journal/test-journal-verify.c
2 This file is part of systemd.
4 Copyright 2012 Lennart Poettering
6 systemd is free software; you can redistribute it and/or modify it
7 under the terms of the GNU Lesser General Public License as published by
8 the Free Software Foundation; either version 2.1 of the License, or
9 (at your option) any later version.
11 systemd is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public License
17 along with systemd; If not, see <http://www.gnu.org/licenses/>.
25 #include "journal-file.h"
26 #include "journal-verify.h"
29 #include "terminal-util.h"
32 #define N_ENTRIES 6000
33 #define RANDOM_RANGE 77
35 static void bit_toggle(const char *fn
, uint64_t p
) {
40 fd
= open(fn
, O_RDWR
|O_CLOEXEC
);
43 r
= pread(fd
, &b
, 1, p
/8);
48 r
= pwrite(fd
, &b
, 1, p
/8);
54 static int raw_verify(const char *fn
, const char *verification_key
) {
58 r
= journal_file_open(fn
, O_RDONLY
, 0666, true, !!verification_key
, NULL
, NULL
, NULL
, NULL
, &f
);
62 r
= journal_file_verify(f
, verification_key
, NULL
, NULL
, NULL
, false);
63 (void) journal_file_close(f
);
68 int main(int argc
, char *argv
[]) {
69 char t
[] = "/tmp/journal-XXXXXX";
72 const char *verification_key
= argv
[1];
73 usec_t from
= 0, to
= 0, total
= 0;
74 char a
[FORMAT_TIMESTAMP_MAX
];
75 char b
[FORMAT_TIMESTAMP_MAX
];
76 char c
[FORMAT_TIMESPAN_MAX
];
80 /* journal_file_open requires a valid machine id */
81 if (access("/etc/machine-id", F_OK
) != 0)
82 return EXIT_TEST_SKIP
;
84 log_set_max_level(LOG_DEBUG
);
86 assert_se(mkdtemp(t
));
87 assert_se(chdir(t
) >= 0);
89 log_info("Generating...");
91 assert_se(journal_file_open("test.journal", O_RDWR
|O_CREAT
, 0666, true, !!verification_key
, NULL
, NULL
, NULL
, NULL
, &f
) == 0);
93 for (n
= 0; n
< N_ENTRIES
; n
++) {
95 struct dual_timestamp ts
;
98 dual_timestamp_get(&ts
);
100 assert_se(asprintf(&test
, "RANDOM=%lu", random() % RANDOM_RANGE
));
102 iovec
.iov_base
= (void*) test
;
103 iovec
.iov_len
= strlen(test
);
105 assert_se(journal_file_append_entry(f
, &ts
, &iovec
, 1, NULL
, NULL
, NULL
) == 0);
110 (void) journal_file_close(f
);
112 log_info("Verifying...");
114 assert_se(journal_file_open("test.journal", O_RDONLY
, 0666, true, !!verification_key
, NULL
, NULL
, NULL
, NULL
, &f
) == 0);
115 /* journal_file_print_header(f); */
116 journal_file_dump(f
);
118 assert_se(journal_file_verify(f
, verification_key
, &from
, &to
, &total
, true) >= 0);
120 if (verification_key
&& JOURNAL_HEADER_SEALED(f
->header
))
121 log_info("=> Validated from %s to %s, %s missing",
122 format_timestamp(a
, sizeof(a
), from
),
123 format_timestamp(b
, sizeof(b
), to
),
124 format_timespan(c
, sizeof(c
), total
> to
? total
- to
: 0, 0));
126 (void) journal_file_close(f
);
128 if (verification_key
) {
129 log_info("Toggling bits...");
131 assert_se(stat("test.journal", &st
) >= 0);
133 for (p
= 38448*8+0; p
< ((uint64_t) st
.st_size
* 8); p
++) {
134 bit_toggle("test.journal", p
);
136 log_info("[ %"PRIu64
"+%"PRIu64
"]", p
/ 8, p
% 8);
138 if (raw_verify("test.journal", verification_key
) >= 0)
139 log_notice(ANSI_HIGHLIGHT_RED
">>>> %"PRIu64
" (bit %"PRIu64
") can be toggled without detection." ANSI_NORMAL
, p
/ 8, p
% 8);
141 bit_toggle("test.journal", p
);
145 log_info("Exiting...");
147 assert_se(rm_rf(t
, REMOVE_ROOT
|REMOVE_PHYSICAL
) >= 0);