diff options
| author | tb <> | 2019-01-27 01:13:20 +0000 | 
|---|---|---|
| committer | tb <> | 2019-01-27 01:13:20 +0000 | 
| commit | 2a1ccc4e16f546046cd0a6be720e51334ef75113 (patch) | |
| tree | 3505fab6fad1f3f38e660180c0d8a49fbff6a4b5 | |
| parent | 22c5663efc9813a7ec74f1d59c835b34aceb6062 (diff) | |
| download | openbsd-2a1ccc4e16f546046cd0a6be720e51334ef75113.tar.gz openbsd-2a1ccc4e16f546046cd0a6be720e51334ef75113.tar.bz2 openbsd-2a1ccc4e16f546046cd0a6be720e51334ef75113.zip | |
refactor and clean up the code generating dot output.
| -rw-r--r-- | src/regress/lib/libssl/handshake/handshake_table.c | 129 | 
1 files changed, 76 insertions, 53 deletions
| diff --git a/src/regress/lib/libssl/handshake/handshake_table.c b/src/regress/lib/libssl/handshake/handshake_table.c index 23b1db3216..6d2fb9842b 100644 --- a/src/regress/lib/libssl/handshake/handshake_table.c +++ b/src/regress/lib/libssl/handshake/handshake_table.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: handshake_table.c,v 1.7 2019/01/25 01:21:44 tb Exp $ */ | 1 | /* $OpenBSD: handshake_table.c,v 1.8 2019/01/27 01:13:20 tb Exp $ */ | 
| 2 | /* | 2 | /* | 
| 3 | * Copyright (c) 2019 Theo Buehler <tb@openbsd.org> | 3 | * Copyright (c) 2019 Theo Buehler <tb@openbsd.org> | 
| 4 | * | 4 | * | 
| @@ -129,21 +129,28 @@ static struct child stateinfo[][TLS13_NUM_MESSAGE_TYPES] = { | |||
| 129 | }, | 129 | }, | 
| 130 | }; | 130 | }; | 
| 131 | 131 | ||
| 132 | const size_t stateinfo_count = sizeof(stateinfo) / sizeof(stateinfo[0]); | 132 | const size_t stateinfo_count = sizeof(stateinfo) / sizeof(stateinfo[0]); | 
| 133 | 133 | ||
| 134 | void build_table(enum tls13_message_type | 134 | void build_table(enum tls13_message_type | 
| 135 | table[UINT8_MAX][TLS13_NUM_MESSAGE_TYPES], struct child current, | 135 | table[UINT8_MAX][TLS13_NUM_MESSAGE_TYPES], | 
| 136 | struct child end, struct child path[], uint8_t flags, unsigned int depth); | 136 | struct child current, struct child end, | 
| 137 | size_t count_handshakes(void); | 137 | struct child path[], uint8_t flags, unsigned int depth); | 
| 138 | const char *flag2str(uint8_t flag); | 138 | size_t count_handshakes(void); | 
| 139 | int generate_graphics(void); | 139 | void edge(enum tls13_message_type start, | 
| 140 | void fprint_entry(FILE *stream, | 140 | enum tls13_message_type end, uint8_t flag); | 
| 141 | enum tls13_message_type path[TLS13_NUM_MESSAGE_TYPES], uint8_t flags); | 141 | const char *flag2str(uint8_t flag); | 
| 142 | void fprint_flags(FILE *stream, uint8_t flags); | 142 | void flag_label(uint8_t flag); | 
| 143 | const char *mt2str(enum tls13_message_type mt); | 143 | void forced_edges(enum tls13_message_type start, | 
| 144 | __dead void usage(void); | 144 | enum tls13_message_type end, uint8_t forced); | 
| 145 | int verify_table(enum tls13_message_type | 145 | int generate_graphics(void); | 
| 146 | table[UINT8_MAX][TLS13_NUM_MESSAGE_TYPES], int print); | 146 | void fprint_entry(FILE *stream, | 
| 147 | enum tls13_message_type path[TLS13_NUM_MESSAGE_TYPES], | ||
| 148 | uint8_t flags); | ||
| 149 | void fprint_flags(FILE *stream, uint8_t flags); | ||
| 150 | const char *mt2str(enum tls13_message_type mt); | ||
| 151 | __dead void usage(void); | ||
| 152 | int verify_table(enum tls13_message_type | ||
| 153 | table[UINT8_MAX][TLS13_NUM_MESSAGE_TYPES], int print); | ||
| 147 | 154 | ||
| 148 | const char * | 155 | const char * | 
| 149 | flag2str(uint8_t flag) | 156 | flag2str(uint8_t flag) | 
| @@ -269,8 +276,8 @@ fprint_flags(FILE *stream, uint8_t flags) | |||
| 269 | } | 276 | } | 
| 270 | 277 | ||
| 271 | void | 278 | void | 
| 272 | fprint_entry(FILE *stream, enum tls13_message_type path[TLS13_NUM_MESSAGE_TYPES], | 279 | fprint_entry(FILE *stream, | 
| 273 | uint8_t flags) | 280 | enum tls13_message_type path[TLS13_NUM_MESSAGE_TYPES], uint8_t flags) | 
| 274 | { | 281 | { | 
| 275 | int i; | 282 | int i; | 
| 276 | 283 | ||
| @@ -286,44 +293,60 @@ fprint_entry(FILE *stream, enum tls13_message_type path[TLS13_NUM_MESSAGE_TYPES] | |||
| 286 | fprintf(stream, "\t},\n"); | 293 | fprintf(stream, "\t},\n"); | 
| 287 | } | 294 | } | 
| 288 | 295 | ||
| 296 | void | ||
| 297 | edge(enum tls13_message_type start, enum tls13_message_type end, | ||
| 298 | uint8_t flag) | ||
| 299 | { | ||
| 300 | printf("\t%s -> %s", mt2str(start), mt2str(end)); | ||
| 301 | flag_label(flag); | ||
| 302 | printf(";\n"); | ||
| 303 | } | ||
| 304 | |||
| 305 | void | ||
| 306 | flag_label(uint8_t flag) | ||
| 307 | { | ||
| 308 | if (flag) | ||
| 309 | printf(" [label=\"%s\"]", flag2str(flag)); | ||
| 310 | } | ||
| 311 | |||
| 312 | void | ||
| 313 | forced_edges(enum tls13_message_type start, enum tls13_message_type end, | ||
| 314 | uint8_t forced) | ||
| 315 | { | ||
| 316 | uint8_t forced_flag, i; | ||
| 317 | |||
| 318 | if (forced == 0) | ||
| 319 | return; | ||
| 320 | |||
| 321 | for (i = 0; i < 8; i++) { | ||
| 322 | forced_flag = forced & (1U << i); | ||
| 323 | if (forced_flag) | ||
| 324 | edge(start, end, forced_flag); | ||
| 325 | } | ||
| 326 | } | ||
| 327 | |||
| 289 | int | 328 | int | 
| 290 | generate_graphics(void) | 329 | generate_graphics(void) | 
| 291 | { | 330 | { | 
| 292 | unsigned int start, end; | 331 | enum tls13_message_type start, end; | 
| 293 | uint8_t flag; | 332 | unsigned int child; | 
| 294 | uint8_t forced, illegal; | 333 | uint8_t flag; | 
| 334 | uint8_t forced; | ||
| 295 | 335 | ||
| 296 | printf("digraph G {\n"); | 336 | printf("digraph G {\n"); | 
| 297 | printf("\t%s [shape=box]\n", mt2str(CLIENT_HELLO)); | 337 | printf("\t%s [shape=box];\n", mt2str(CLIENT_HELLO)); | 
| 298 | printf("\t%s [shape=box]\n", mt2str(APPLICATION_DATA)); | 338 | printf("\t%s [shape=box];\n", mt2str(APPLICATION_DATA)); | 
| 299 | 339 | ||
| 300 | for (start = 1; start < stateinfo_count - 1; start++) { | 340 | for (start = CLIENT_HELLO; start < APPLICATION_DATA; start++) { | 
| 301 | for (end = 0; stateinfo[start][end].mt != 0; end++) { | 341 | for (child = 0; stateinfo[start][child].mt != 0; child++) { | 
| 302 | flag = stateinfo[start][end].flag; | 342 | end = stateinfo[start][child].mt; | 
| 303 | forced = stateinfo[start][end].forced; | 343 | flag = stateinfo[start][child].flag; | 
| 304 | illegal = stateinfo[start][end].illegal; | 344 | forced = stateinfo[start][child].forced; | 
| 305 | 345 | ||
| 306 | printf("\t%s -> %s", mt2str(start), | 346 | if (forced == 0) | 
| 307 | mt2str(stateinfo[start][end].mt)); | 347 | edge(start, end, flag); | 
| 308 | 348 | else | |
| 309 | if (flag || forced || illegal) | 349 | forced_edges(start, end, forced); | 
| 310 | printf(" ["); | ||
| 311 | if (flag) | ||
| 312 | printf("label=\"%s\"%s", flag2str(flag), | ||
| 313 | (forced || illegal) ? ", " : ""); | ||
| 314 | if (forced) { | ||
| 315 | printf("label=\"if "); | ||
| 316 | fprint_flags(stdout, forced); | ||
| 317 | printf("\"%s", illegal ? ", " : ""); | ||
| 318 | } | ||
| 319 | if (illegal) { | ||
| 320 | printf("label=\"not if "); | ||
| 321 | fprint_flags(stdout, illegal); | ||
| 322 | printf("\""); | ||
| 323 | } | ||
| 324 | if (flag || forced || illegal) | ||
| 325 | printf("]"); | ||
| 326 | printf(";\n"); | ||
| 327 | } | 350 | } | 
| 328 | } | 351 | } | 
| 329 | 352 | ||
| @@ -331,8 +354,8 @@ generate_graphics(void) | |||
| 331 | return 0; | 354 | return 0; | 
| 332 | } | 355 | } | 
| 333 | 356 | ||
| 334 | extern enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES]; | 357 | extern enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES]; | 
| 335 | extern size_t handshake_count; | 358 | extern size_t handshake_count; | 
| 336 | 359 | ||
| 337 | size_t | 360 | size_t | 
| 338 | count_handshakes(void) | 361 | count_handshakes(void) | 
