Mercurial > projects > sencrypt
comparison sencrypt.c @ 20:c45f17f58de1
Simplify key file reading
author | Guido Berhoerster <guido+sencrypt@berhoerster.name> |
---|---|
date | Wed, 31 Jul 2019 13:28:37 +0200 |
parents | 07f525330bc7 |
children |
comparison
equal
deleted
inserted
replaced
19:0bd16b428fc0 | 20:c45f17f58de1 |
---|---|
67 static size_t | 67 static size_t |
68 read_keyfile(const char *filename, unsigned char *key, size_t key_size_max) | 68 read_keyfile(const char *filename, unsigned char *key, size_t key_size_max) |
69 { | 69 { |
70 size_t keyfile_size = 0; | 70 size_t keyfile_size = 0; |
71 FILE *fp = NULL; | 71 FILE *fp = NULL; |
72 struct stat statbuf; | |
73 | 72 |
74 fp = fopen(filename, "r"); | 73 fp = fopen(filename, "r"); |
75 if (fp == NULL) { | 74 if (fp == NULL) { |
76 warn("could not open key file \"%s\"", filename); | 75 warn("could not open key file \"%s\"", filename); |
77 goto out; | 76 goto out; |
78 } | 77 } |
79 | 78 |
80 if (fstat(fileno(fp), &statbuf) == -1) { | 79 keyfile_size = fread(key, 1, key_size_max, fp); |
81 warn("could not stat key file \"%s\"", filename); | 80 if (ferror(fp)) { |
82 goto out; | 81 warn("failed to read key file \"%s\"", filename); |
83 } | 82 goto out; |
84 | 83 } else if (!feof(fp) || (keyfile_size < 1)) { |
85 if (!S_ISREG(statbuf.st_mode)) { | |
86 warnx("key file \"%s\" is not a regular file", filename); | |
87 goto out; | |
88 } | |
89 | |
90 if ((uintmax_t)statbuf.st_size > SIZE_MAX) { | |
91 warnx("key file \"%s\" is too large", filename); | |
92 goto out; | |
93 } | |
94 keyfile_size = (size_t)statbuf.st_size; | |
95 if ((keyfile_size > key_size_max) || | |
96 (keyfile_size == 0)) { | |
97 warnx("invalid key size"); | 84 warnx("invalid key size"); |
98 goto out; | |
99 } | |
100 | |
101 if (fread(key, 1, keyfile_size, fp) != keyfile_size) { | |
102 warnx("could not read key file \"%s\"", filename); | |
103 goto out; | 85 goto out; |
104 } | 86 } |
105 | 87 |
106 out: | 88 out: |
107 if (fp != NULL) { | 89 if (fp != NULL) { |
587 list_algorithms(); | 569 list_algorithms(); |
588 goto out; | 570 goto out; |
589 } | 571 } |
590 | 572 |
591 if (kflag) { | 573 if (kflag) { |
592 key_file_len = read_keyfile(key_filename, key, | 574 key_file_len = read_keyfile(key_filename, key, sizeof (key)); |
593 (off_t)sizeof (key)); | |
594 if (key_file_len < 1) { | 575 if (key_file_len < 1) { |
595 status = EXIT_FAILURE; | 576 status = EXIT_FAILURE; |
596 goto out; | 577 goto out; |
597 } | 578 } |
598 key_len = key_file_len; | 579 key_len = key_file_len; |