Fix issue #123 - specify text/binary mode for open files
This commit is contained in:
+22
-3
@@ -46,12 +46,31 @@
|
|||||||
#include "cmdline.h"
|
#include "cmdline.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
FILE *open_file(const char *file_name, int mode) {
|
FILE *open_file(const char *file_name, enum file_mode mode) {
|
||||||
FILE *file;
|
FILE *file;
|
||||||
|
const char *mod;
|
||||||
if(!strcmp(file_name, "-")) {
|
if(!strcmp(file_name, "-")) {
|
||||||
file = mode == INPUT ? stdin : stdout;
|
file = (mode == INPUT_TEXT || mode == INPUT_BIN) ? stdin : stdout;
|
||||||
} else {
|
} else {
|
||||||
file = fopen(file_name, mode == INPUT ? "r" : "w");
|
switch (mode) {
|
||||||
|
case INPUT_TEXT:
|
||||||
|
mod = "r";
|
||||||
|
break;
|
||||||
|
case INPUT_BIN:
|
||||||
|
mod = "rb";
|
||||||
|
break;
|
||||||
|
case OUTPUT_TEXT:
|
||||||
|
mod = "w";
|
||||||
|
break;
|
||||||
|
case OUTPUT_BIN:
|
||||||
|
mod = "wb";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Invalid file mode.\n");
|
||||||
|
return NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
file = fopen(file_name, mod);
|
||||||
if(!file) {
|
if(!file) {
|
||||||
fprintf(stderr, "Failed opening '%s'!\n", file_name);
|
fprintf(stderr, "Failed opening '%s'!\n", file_name);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|||||||
+7
-3
@@ -37,8 +37,12 @@
|
|||||||
|
|
||||||
#include "cmdline.h"
|
#include "cmdline.h"
|
||||||
|
|
||||||
#define INPUT 1
|
enum file_mode {
|
||||||
#define OUTPUT 2
|
INPUT_TEXT,
|
||||||
|
OUTPUT_TEXT,
|
||||||
|
INPUT_BIN,
|
||||||
|
OUTPUT_BIN,
|
||||||
|
};
|
||||||
|
|
||||||
size_t read_data(unsigned char*, size_t, FILE*, enum enum_format);
|
size_t read_data(unsigned char*, size_t, FILE*, enum enum_format);
|
||||||
void dump_data(unsigned const char*, unsigned int, FILE*, bool, enum enum_format);
|
void dump_data(unsigned const char*, unsigned int, FILE*, bool, enum enum_format);
|
||||||
@@ -46,7 +50,7 @@ int set_length(unsigned char*, int);
|
|||||||
int get_length(const unsigned char*, int*);
|
int get_length(const unsigned char*, int*);
|
||||||
X509_NAME *parse_name(const char*);
|
X509_NAME *parse_name(const char*);
|
||||||
unsigned char get_algorithm(EVP_PKEY*);
|
unsigned char get_algorithm(EVP_PKEY*);
|
||||||
FILE *open_file(const char*, int);
|
FILE *open_file(const char *file_name, enum file_mode mode);
|
||||||
int get_slot_hex(enum enum_slot slot_enum);
|
int get_slot_hex(enum enum_slot slot_enum);
|
||||||
bool set_component(unsigned char *in_ptr, const BIGNUM *bn, int element_len);
|
bool set_component(unsigned char *in_ptr, const BIGNUM *bn, int element_len);
|
||||||
bool prepare_rsa_signature(const unsigned char*, unsigned int, unsigned char*,
|
bool prepare_rsa_signature(const unsigned char*, unsigned int, unsigned char*,
|
||||||
|
|||||||
+43
-17
@@ -60,9 +60,35 @@
|
|||||||
|
|
||||||
#define KEY_LEN 24
|
#define KEY_LEN 24
|
||||||
|
|
||||||
|
static enum file_mode key_file_mode(enum enum_key_format fmt, bool output) {
|
||||||
|
if (fmt == key_format_arg_PEM) {
|
||||||
|
if (output) {
|
||||||
|
return OUTPUT_TEXT;
|
||||||
|
}
|
||||||
|
return INPUT_TEXT;
|
||||||
|
}
|
||||||
|
if (output) {
|
||||||
|
return OUTPUT_BIN;
|
||||||
|
}
|
||||||
|
return INPUT_BIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
static enum file_mode data_file_mode(enum enum_format fmt, bool output) {
|
||||||
|
if (fmt == format_arg_binary) {
|
||||||
|
if (output) {
|
||||||
|
return OUTPUT_BIN;
|
||||||
|
}
|
||||||
|
return INPUT_BIN;
|
||||||
|
}
|
||||||
|
if (output) {
|
||||||
|
return OUTPUT_TEXT;
|
||||||
|
}
|
||||||
|
return INPUT_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
static void print_version(ykpiv_state *state, const char *output_file_name) {
|
static void print_version(ykpiv_state *state, const char *output_file_name) {
|
||||||
char version[7];
|
char version[7];
|
||||||
FILE *output_file = open_file(output_file_name, OUTPUT);
|
FILE *output_file = open_file(output_file_name, OUTPUT_TEXT);
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -135,7 +161,7 @@ static bool generate_key(ykpiv_state *state, enum enum_slot slot,
|
|||||||
|
|
||||||
key = get_slot_hex(slot);
|
key = get_slot_hex(slot);
|
||||||
|
|
||||||
output_file = open_file(output_file_name, OUTPUT);
|
output_file = open_file(output_file_name, key_file_mode(key_format, true));
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -264,7 +290,7 @@ static bool import_key(ykpiv_state *state, enum enum_key_format key_format,
|
|||||||
|
|
||||||
key = get_slot_hex(slot);
|
key = get_slot_hex(slot);
|
||||||
|
|
||||||
input_file = open_file(input_file_name, INPUT);
|
input_file = open_file(input_file_name, key_file_mode(key_format, false));
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -427,7 +453,7 @@ static bool import_cert(ykpiv_state *state, enum enum_key_format cert_format,
|
|||||||
int compress = 0;
|
int compress = 0;
|
||||||
int cert_len = -1;
|
int cert_len = -1;
|
||||||
|
|
||||||
input_file = open_file(input_file_name, INPUT);
|
input_file = open_file(input_file_name, key_file_mode(cert_format, false));
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -563,8 +589,8 @@ static bool request_certificate(ykpiv_state *state, enum enum_key_format key_for
|
|||||||
|
|
||||||
key = get_slot_hex(slot);
|
key = get_slot_hex(slot);
|
||||||
|
|
||||||
input_file = open_file(input_file_name, INPUT);
|
input_file = open_file(input_file_name, key_file_mode(key_format, false));
|
||||||
output_file = open_file(output_file_name, OUTPUT);
|
output_file = open_file(output_file_name, key_file_mode(key_format, true));
|
||||||
if(!input_file || !output_file) {
|
if(!input_file || !output_file) {
|
||||||
goto request_out;
|
goto request_out;
|
||||||
}
|
}
|
||||||
@@ -712,8 +738,8 @@ static bool selfsign_certificate(ykpiv_state *state, enum enum_key_format key_fo
|
|||||||
|
|
||||||
key = get_slot_hex(slot);
|
key = get_slot_hex(slot);
|
||||||
|
|
||||||
input_file = open_file(input_file_name, INPUT);
|
input_file = open_file(input_file_name, key_file_mode(key_format, false));
|
||||||
output_file = open_file(output_file_name, OUTPUT);
|
output_file = open_file(output_file_name, key_file_mode(key_format, true));
|
||||||
if(!input_file || !output_file) {
|
if(!input_file || !output_file) {
|
||||||
goto selfsign_out;
|
goto selfsign_out;
|
||||||
}
|
}
|
||||||
@@ -973,7 +999,7 @@ static bool read_certificate(ykpiv_state *state, enum enum_slot slot,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
output_file = open_file(output_file_name, OUTPUT);
|
output_file = open_file(output_file_name, key_file_mode(key_format, true));
|
||||||
if (!output_file) {
|
if (!output_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1041,7 +1067,7 @@ static bool sign_file(ykpiv_state *state, const char *input, const char *output,
|
|||||||
|
|
||||||
key = get_slot_hex(slot);
|
key = get_slot_hex(slot);
|
||||||
|
|
||||||
input_file = open_file(input, INPUT);
|
input_file = open_file(input, INPUT_BIN);
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1050,7 +1076,7 @@ static bool sign_file(ykpiv_state *state, const char *input, const char *output,
|
|||||||
fprintf(stderr, "Please paste the input...\n");
|
fprintf(stderr, "Please paste the input...\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
output_file = open_file(output, OUTPUT);
|
output_file = open_file(output, OUTPUT_BIN);
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
if(input_file && input_file != stdin) {
|
if(input_file && input_file != stdin) {
|
||||||
fclose(input_file);
|
fclose(input_file);
|
||||||
@@ -1231,7 +1257,7 @@ static bool status(ykpiv_state *state, enum enum_hash hash,
|
|||||||
unsigned char buf[3072];
|
unsigned char buf[3072];
|
||||||
long unsigned len = sizeof(buf);
|
long unsigned len = sizeof(buf);
|
||||||
int i;
|
int i;
|
||||||
FILE *output_file = open_file(output_file_name, OUTPUT);
|
FILE *output_file = open_file(output_file_name, OUTPUT_TEXT);
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1284,7 +1310,7 @@ static bool test_signature(ykpiv_state *state, enum enum_slot slot,
|
|||||||
unsigned int data_len;
|
unsigned int data_len;
|
||||||
X509 *x509 = NULL;
|
X509 *x509 = NULL;
|
||||||
EVP_PKEY *pubkey;
|
EVP_PKEY *pubkey;
|
||||||
FILE *input_file = open_file(input_file_name, INPUT);
|
FILE *input_file = open_file(input_file_name, key_file_mode(cert_format, false));
|
||||||
|
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
fprintf(stderr, "Failed opening input file %s.\n", input_file_name);
|
fprintf(stderr, "Failed opening input file %s.\n", input_file_name);
|
||||||
@@ -1417,7 +1443,7 @@ static bool test_decipher(ykpiv_state *state, enum enum_slot slot,
|
|||||||
X509 *x509 = NULL;
|
X509 *x509 = NULL;
|
||||||
EVP_PKEY *pubkey;
|
EVP_PKEY *pubkey;
|
||||||
EC_KEY *tmpkey = NULL;
|
EC_KEY *tmpkey = NULL;
|
||||||
FILE *input_file = open_file(input_file_name, INPUT);
|
FILE *input_file = open_file(input_file_name, key_file_mode(cert_format, false));
|
||||||
|
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
fprintf(stderr, "Failed opening input file %s.\n", input_file_name);
|
fprintf(stderr, "Failed opening input file %s.\n", input_file_name);
|
||||||
@@ -1573,7 +1599,7 @@ static bool attest(ykpiv_state *state, enum enum_slot slot,
|
|||||||
bool ret = false;
|
bool ret = false;
|
||||||
X509 *x509 = NULL;
|
X509 *x509 = NULL;
|
||||||
int key;
|
int key;
|
||||||
FILE *output_file = open_file(output_file_name, OUTPUT);
|
FILE *output_file = open_file(output_file_name, key_file_mode(key_format, true));
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1626,7 +1652,7 @@ static bool write_object(ykpiv_state *state, int id,
|
|||||||
size_t len = sizeof(data);
|
size_t len = sizeof(data);
|
||||||
ykpiv_rc res;
|
ykpiv_rc res;
|
||||||
|
|
||||||
input_file = open_file(input_file_name, INPUT);
|
input_file = open_file(input_file_name, data_file_mode(format, false));
|
||||||
if(!input_file) {
|
if(!input_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1665,7 +1691,7 @@ static bool read_object(ykpiv_state *state, int id, const char *output_file_name
|
|||||||
unsigned long len = sizeof(data);
|
unsigned long len = sizeof(data);
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
output_file = open_file(output_file_name, OUTPUT);
|
output_file = open_file(output_file_name, data_file_mode(format, true));
|
||||||
if(!output_file) {
|
if(!output_file) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user