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;