mirror of
https://github.com/kakwa/uts-server
synced 2025-01-10 05:34:29 +01:00
reformat source code
This commit is contained in:
parent
a0d5a683bb
commit
8fc0360824
10
inc/config.h
10
inc/config.h
@ -1,13 +1,13 @@
|
|||||||
typedef struct uts_config {
|
typedef struct uts_config {
|
||||||
char * port;
|
char *port;
|
||||||
char * listen;
|
char *listen;
|
||||||
bool https;
|
bool https;
|
||||||
cert https_cert;
|
cert https_cert;
|
||||||
void * ts_certs;
|
void *ts_certs;
|
||||||
|
|
||||||
} uts_config;
|
} uts_config;
|
||||||
|
|
||||||
typedef struct cert {
|
typedef struct cert {
|
||||||
char * cert_file;
|
char *cert_file;
|
||||||
char * key_file;
|
char *key_file;
|
||||||
} cert;
|
} cert;
|
||||||
|
14
inc/ini.h
14
inc/ini.h
@ -18,11 +18,11 @@ extern "C" {
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
/* Typedef for prototype of handler function. */
|
/* Typedef for prototype of handler function. */
|
||||||
typedef int (*ini_handler)(void* user, const char* section,
|
typedef int (*ini_handler)(void *user, const char *section, const char *name,
|
||||||
const char* name, const char* value);
|
const char *value);
|
||||||
|
|
||||||
/* Typedef for prototype of fgets-style reader function. */
|
/* Typedef for prototype of fgets-style reader function. */
|
||||||
typedef char* (*ini_reader)(char* str, int num, void* stream);
|
typedef char *(*ini_reader)(char *str, int num, void *stream);
|
||||||
|
|
||||||
/* Parse given INI-style file. May have [section]s, name=value pairs
|
/* Parse given INI-style file. May have [section]s, name=value pairs
|
||||||
(whitespace stripped), and comments starting with ';' (semicolon). Section
|
(whitespace stripped), and comments starting with ';' (semicolon). Section
|
||||||
@ -37,16 +37,16 @@ typedef char* (*ini_reader)(char* str, int num, void* stream);
|
|||||||
stop on first error), -1 on file open error, or -2 on memory allocation
|
stop on first error), -1 on file open error, or -2 on memory allocation
|
||||||
error (only when INI_USE_STACK is zero).
|
error (only when INI_USE_STACK is zero).
|
||||||
*/
|
*/
|
||||||
int ini_parse(const char* filename, ini_handler handler, void* user);
|
int ini_parse(const char *filename, ini_handler handler, void *user);
|
||||||
|
|
||||||
/* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't
|
/* Same as ini_parse(), but takes a FILE* instead of filename. This doesn't
|
||||||
close the file when it's finished -- the caller must do that. */
|
close the file when it's finished -- the caller must do that. */
|
||||||
int ini_parse_file(FILE* file, ini_handler handler, void* user);
|
int ini_parse_file(FILE *file, ini_handler handler, void *user);
|
||||||
|
|
||||||
/* Same as ini_parse(), but takes an ini_reader function pointer instead of
|
/* Same as ini_parse(), but takes an ini_reader function pointer instead of
|
||||||
filename. Used for implementing custom or string-based I/O. */
|
filename. Used for implementing custom or string-based I/O. */
|
||||||
int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
int ini_parse_stream(ini_reader reader, void *stream, ini_handler handler,
|
||||||
void* user);
|
void *user);
|
||||||
|
|
||||||
/* Nonzero to allow multi-line value parsing, in the style of Python's
|
/* Nonzero to allow multi-line value parsing, in the style of Python's
|
||||||
configparser. If allowed, ini_parse() will call the handler with the same
|
configparser. If allowed, ini_parse() will call the handler with the same
|
||||||
|
@ -11,34 +11,31 @@
|
|||||||
|
|
||||||
const char *argp_program_version = UTS_VERSION;
|
const char *argp_program_version = UTS_VERSION;
|
||||||
|
|
||||||
const char *argp_program_bug_address = "Pierre-Francois Carpentier <carpentier.pf@gmail.com>";
|
const char *argp_program_bug_address =
|
||||||
|
"Pierre-Francois Carpentier <carpentier.pf@gmail.com>";
|
||||||
|
|
||||||
static char doc[] = "\nUTS micro timestamp server (RFC 3161)";
|
static char doc[] = "\nUTS micro timestamp server (RFC 3161)";
|
||||||
|
|
||||||
static struct argp_option options[] = {
|
static struct argp_option options[] = {
|
||||||
{"conffile", 'c', "CONFFILE", 0, "Path to configuration file"},
|
{"conffile", 'c', "CONFFILE", 0, "Path to configuration file"},
|
||||||
{"daemonize", 'd', 0, 0, "Launch as a daemon"},
|
{"daemonize", 'd', 0, 0, "Launch as a daemon"},
|
||||||
{ 0 }
|
{0}};
|
||||||
};
|
|
||||||
|
|
||||||
/* A description of the arguments we accept. */
|
/* A description of the arguments we accept. */
|
||||||
static char args_doc[] = "-c CONFFILE -d";
|
static char args_doc[] = "-c CONFFILE -d";
|
||||||
|
|
||||||
struct arguments
|
struct arguments {
|
||||||
{
|
|
||||||
char *args[2]; /* arg1 & arg2 */
|
char *args[2]; /* arg1 & arg2 */
|
||||||
int daemonize;
|
int daemonize;
|
||||||
char *conffile;
|
char *conffile;
|
||||||
};
|
};
|
||||||
|
|
||||||
static error_t parse_opt (int key, char *arg, struct argp_state *state)
|
static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
{
|
|
||||||
/* Get the input argument from argp_parse, which we
|
/* Get the input argument from argp_parse, which we
|
||||||
know is a pointer to our arguments structure. */
|
know is a pointer to our arguments structure. */
|
||||||
struct arguments *arguments = (struct arguments *)state->input;
|
struct arguments *arguments = (struct arguments *)state->input;
|
||||||
|
|
||||||
switch (key)
|
switch (key) {
|
||||||
{
|
|
||||||
case 'd':
|
case 'd':
|
||||||
arguments->daemonize = 1;
|
arguments->daemonize = 1;
|
||||||
break;
|
break;
|
||||||
@ -52,30 +49,26 @@ static error_t parse_opt (int key, char *arg, struct argp_state *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Our argp parser. */
|
/* Our argp parser. */
|
||||||
static struct argp argp = { options, parse_opt, args_doc, doc };
|
static struct argp argp = {options, parse_opt, args_doc, doc};
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
struct arguments args;
|
struct arguments args;
|
||||||
args.conffile = NULL;
|
args.conffile = NULL;
|
||||||
args.daemonize = 0;
|
args.daemonize = 0;
|
||||||
argp_parse (&argp, argc, argv, 0, 0, &args);
|
argp_parse(&argp, argc, argv, 0, 0, &args);
|
||||||
|
|
||||||
if (args.daemonize)
|
if (args.daemonize)
|
||||||
skeleton_daemon();
|
skeleton_daemon();
|
||||||
|
|
||||||
while (1)
|
while (1) {
|
||||||
{
|
// TODO: Insert daemon code here.
|
||||||
//TODO: Insert daemon code here.
|
|
||||||
http_server_start();
|
http_server_start();
|
||||||
syslog (LOG_NOTICE, "First daemon started.");
|
syslog(LOG_NOTICE, "First daemon started.");
|
||||||
sleep (5);
|
sleep(5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
syslog (LOG_NOTICE, "First daemon terminated.");
|
syslog(LOG_NOTICE, "First daemon terminated.");
|
||||||
closelog();
|
closelog();
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
@ -25,27 +25,24 @@ https://github.com/benhoyt/inih
|
|||||||
#define MAX_NAME 50
|
#define MAX_NAME 50
|
||||||
|
|
||||||
/* Strip whitespace chars off end of given string, in place. Return s. */
|
/* Strip whitespace chars off end of given string, in place. Return s. */
|
||||||
static char* rstrip(char* s)
|
static char *rstrip(char *s) {
|
||||||
{
|
char *p = s + strlen(s);
|
||||||
char* p = s + strlen(s);
|
|
||||||
while (p > s && isspace((unsigned char)(*--p)))
|
while (p > s && isspace((unsigned char)(*--p)))
|
||||||
*p = '\0';
|
*p = '\0';
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return pointer to first non-whitespace char in given string. */
|
/* Return pointer to first non-whitespace char in given string. */
|
||||||
static char* lskip(const char* s)
|
static char *lskip(const char *s) {
|
||||||
{
|
|
||||||
while (*s && isspace((unsigned char)(*s)))
|
while (*s && isspace((unsigned char)(*s)))
|
||||||
s++;
|
s++;
|
||||||
return (char*)s;
|
return (char *)s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return pointer to first char (of chars) or inline comment in given string,
|
/* Return pointer to first char (of chars) or inline comment in given string,
|
||||||
or pointer to null at end of string if neither found. Inline comment must
|
or pointer to null at end of string if neither found. Inline comment must
|
||||||
be prefixed by a whitespace character to register as a comment. */
|
be prefixed by a whitespace character to register as a comment. */
|
||||||
static char* find_chars_or_comment(const char* s, const char* chars)
|
static char *find_chars_or_comment(const char *s, const char *chars) {
|
||||||
{
|
|
||||||
#if INI_ALLOW_INLINE_COMMENTS
|
#if INI_ALLOW_INLINE_COMMENTS
|
||||||
int was_space = 0;
|
int was_space = 0;
|
||||||
while (*s && (!chars || !strchr(chars, *s)) &&
|
while (*s && (!chars || !strchr(chars, *s)) &&
|
||||||
@ -58,39 +55,37 @@ static char* find_chars_or_comment(const char* s, const char* chars)
|
|||||||
s++;
|
s++;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return (char*)s;
|
return (char *)s;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Version of strncpy that ensures dest (size bytes) is null-terminated. */
|
/* Version of strncpy that ensures dest (size bytes) is null-terminated. */
|
||||||
static char* strncpy0(char* dest, const char* src, size_t size)
|
static char *strncpy0(char *dest, const char *src, size_t size) {
|
||||||
{
|
|
||||||
strncpy(dest, src, size);
|
strncpy(dest, src, size);
|
||||||
dest[size - 1] = '\0';
|
dest[size - 1] = '\0';
|
||||||
return dest;
|
return dest;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See documentation in header file. */
|
/* See documentation in header file. */
|
||||||
int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
int ini_parse_stream(ini_reader reader, void *stream, ini_handler handler,
|
||||||
void* user)
|
void *user) {
|
||||||
{
|
/* Uses a fair bit of stack (use heap instead if you need to) */
|
||||||
/* Uses a fair bit of stack (use heap instead if you need to) */
|
|
||||||
#if INI_USE_STACK
|
#if INI_USE_STACK
|
||||||
char line[INI_MAX_LINE];
|
char line[INI_MAX_LINE];
|
||||||
#else
|
#else
|
||||||
char* line;
|
char *line;
|
||||||
#endif
|
#endif
|
||||||
char section[MAX_SECTION] = "";
|
char section[MAX_SECTION] = "";
|
||||||
char prev_name[MAX_NAME] = "";
|
char prev_name[MAX_NAME] = "";
|
||||||
|
|
||||||
char* start;
|
char *start;
|
||||||
char* end;
|
char *end;
|
||||||
char* name;
|
char *name;
|
||||||
char* value;
|
char *value;
|
||||||
int lineno = 0;
|
int lineno = 0;
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
|
||||||
#if !INI_USE_STACK
|
#if !INI_USE_STACK
|
||||||
line = (char*)malloc(INI_MAX_LINE);
|
line = (char *)malloc(INI_MAX_LINE);
|
||||||
if (!line) {
|
if (!line) {
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
@ -129,13 +124,11 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
|||||||
*end = '\0';
|
*end = '\0';
|
||||||
strncpy0(section, start + 1, sizeof(section));
|
strncpy0(section, start + 1, sizeof(section));
|
||||||
*prev_name = '\0';
|
*prev_name = '\0';
|
||||||
}
|
} else if (!error) {
|
||||||
else if (!error) {
|
|
||||||
/* No ']' found on section line */
|
/* No ']' found on section line */
|
||||||
error = lineno;
|
error = lineno;
|
||||||
}
|
}
|
||||||
}
|
} else if (*start) {
|
||||||
else if (*start) {
|
|
||||||
/* Not a comment, must be a name[=:]value pair */
|
/* Not a comment, must be a name[=:]value pair */
|
||||||
end = find_chars_or_comment(start, "=:");
|
end = find_chars_or_comment(start, "=:");
|
||||||
if (*end == '=' || *end == ':') {
|
if (*end == '=' || *end == ':') {
|
||||||
@ -153,8 +146,7 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
|||||||
strncpy0(prev_name, name, sizeof(prev_name));
|
strncpy0(prev_name, name, sizeof(prev_name));
|
||||||
if (!handler(user, section, name, value) && !error)
|
if (!handler(user, section, name, value) && !error)
|
||||||
error = lineno;
|
error = lineno;
|
||||||
}
|
} else if (!error) {
|
||||||
else if (!error) {
|
|
||||||
/* No '=' or ':' found on name[=:]value line */
|
/* No '=' or ':' found on name[=:]value line */
|
||||||
error = lineno;
|
error = lineno;
|
||||||
}
|
}
|
||||||
@ -174,15 +166,13 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* See documentation in header file. */
|
/* See documentation in header file. */
|
||||||
int ini_parse_file(FILE* file, ini_handler handler, void* user)
|
int ini_parse_file(FILE *file, ini_handler handler, void *user) {
|
||||||
{
|
|
||||||
return ini_parse_stream((ini_reader)fgets, file, handler, user);
|
return ini_parse_stream((ini_reader)fgets, file, handler, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* See documentation in header file. */
|
/* See documentation in header file. */
|
||||||
int ini_parse(const char* filename, ini_handler handler, void* user)
|
int ini_parse(const char *filename, ini_handler handler, void *user) {
|
||||||
{
|
FILE *file;
|
||||||
FILE* file;
|
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
file = fopen(filename, "r");
|
file = fopen(filename, "r");
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
|
|
||||||
/* Name of config entry that defines the OID file. */
|
/* Name of config entry that defines the OID file. */
|
||||||
# define ENV_OID_FILE "oid_file"
|
#define ENV_OID_FILE "oid_file"
|
||||||
|
|
||||||
static ASN1_OBJECT *txt2obj(const char *oid);
|
static ASN1_OBJECT *txt2obj(const char *oid);
|
||||||
static CONF *load_config_file(const char *configfile);
|
static CONF *load_config_file(const char *configfile);
|
||||||
@ -28,22 +28,21 @@ static CONF *load_config_file(const char *configfile);
|
|||||||
static int reply_command(CONF *conf, char *section, char *engine,
|
static int reply_command(CONF *conf, char *section, char *engine,
|
||||||
char *queryfile, char *passin, char *inkey,
|
char *queryfile, char *passin, char *inkey,
|
||||||
const EVP_MD *md, char *signer, char *chain,
|
const EVP_MD *md, char *signer, char *chain,
|
||||||
const char *policy, char *in, int token_in,
|
const char *policy, char *in, int token_in, char *out,
|
||||||
char *out, int token_out, int text);
|
int token_out, int text);
|
||||||
static TS_RESP *read_PKCS7(BIO *in_bio);
|
static TS_RESP *read_PKCS7(BIO *in_bio);
|
||||||
static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
||||||
char *queryfile, char *passin,
|
char *queryfile, char *passin, char *inkey,
|
||||||
char *inkey, const EVP_MD *md, char *signer,
|
const EVP_MD *md, char *signer, char *chain,
|
||||||
char *chain, const char *policy);
|
const char *policy);
|
||||||
static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data);
|
static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data);
|
||||||
static ASN1_INTEGER *next_serial(const char *serialfile);
|
static ASN1_INTEGER *next_serial(const char *serialfile);
|
||||||
static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial);
|
static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial);
|
||||||
|
|
||||||
# define B_FORMAT_TEXT 0x8000
|
#define B_FORMAT_TEXT 0x8000
|
||||||
# define FORMAT_UNDEF 0
|
#define FORMAT_UNDEF 0
|
||||||
# define FORMAT_TEXT (1 | B_FORMAT_TEXT) /* Generic text */
|
#define FORMAT_TEXT (1 | B_FORMAT_TEXT) /* Generic text */
|
||||||
# define FORMAT_ASN1 4 /* ASN.1/DER */
|
#define FORMAT_ASN1 4 /* ASN.1/DER */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
int ts_http_respond(short event, ad_conn_t *conn, void *userdata) {
|
int ts_http_respond(short event, ad_conn_t *conn, void *userdata) {
|
||||||
@ -67,10 +66,8 @@ static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial);
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
// This function will be called by civetweb on every new request.
|
// This function will be called by civetweb on every new request.
|
||||||
static int begin_request_handler(struct mg_connection *conn)
|
static int begin_request_handler(struct mg_connection *conn) {
|
||||||
{
|
|
||||||
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
const struct mg_request_info *request_info = mg_get_request_info(conn);
|
||||||
char content[100];
|
char content[100];
|
||||||
|
|
||||||
@ -100,7 +97,8 @@ int http_server_start() {
|
|||||||
// List of options. Last element must be NULL.
|
// List of options. Last element must be NULL.
|
||||||
const char *options[] = {"listening_ports", "8080", NULL};
|
const char *options[] = {"listening_ports", "8080", NULL};
|
||||||
|
|
||||||
// Prepare callbacks structure. We have only one callback, the rest are NULL.
|
// Prepare callbacks structure. We have only one callback, the rest are
|
||||||
|
// NULL.
|
||||||
memset(&callbacks, 0, sizeof(callbacks));
|
memset(&callbacks, 0, sizeof(callbacks));
|
||||||
callbacks.begin_request = begin_request_handler;
|
callbacks.begin_request = begin_request_handler;
|
||||||
|
|
||||||
@ -121,24 +119,24 @@ int http_server_start() {
|
|||||||
* Configuration file-related function definitions.
|
* Configuration file-related function definitions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static ASN1_OBJECT *txt2obj(const char *oid)
|
static ASN1_OBJECT *txt2obj(const char *oid) {
|
||||||
{
|
|
||||||
ASN1_OBJECT *oid_obj = NULL;
|
ASN1_OBJECT *oid_obj = NULL;
|
||||||
|
|
||||||
if ((oid_obj = OBJ_txt2obj(oid, 0)) == NULL)
|
if ((oid_obj = OBJ_txt2obj(oid, 0)) == NULL)
|
||||||
// BIO_printf(bio_err, "cannot convert %s to OID\n", oid);
|
// BIO_printf(bio_err, "cannot convert %s to OID\n", oid);
|
||||||
|
|
||||||
return oid_obj;
|
return oid_obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
//static CONF *load_config_file(const char *configfile)
|
// static CONF *load_config_file(const char *configfile)
|
||||||
//{
|
//{
|
||||||
// CONF *conf = app_load_config(configfile);
|
// CONF *conf = app_load_config(configfile);
|
||||||
//
|
//
|
||||||
// if (conf != NULL) {
|
// if (conf != NULL) {
|
||||||
// const char *p;
|
// const char *p;
|
||||||
//
|
//
|
||||||
//// BIO_printf(bio_err, "Using configuration from %s\n", configfile);
|
//// BIO_printf(bio_err, "Using configuration from %s\n",
|
||||||
|
///configfile);
|
||||||
// p = NCONF_get_string(conf, NULL, ENV_OID_FILE);
|
// p = NCONF_get_string(conf, NULL, ENV_OID_FILE);
|
||||||
// if (p != NULL) {
|
// if (p != NULL) {
|
||||||
// BIO *oid_bio = BIO_new_file(p, "r");
|
// BIO *oid_bio = BIO_new_file(p, "r");
|
||||||
@ -163,9 +161,8 @@ static ASN1_OBJECT *txt2obj(const char *oid)
|
|||||||
static int reply_command(CONF *conf, char *section, char *engine,
|
static int reply_command(CONF *conf, char *section, char *engine,
|
||||||
char *queryfile, char *passin, char *inkey,
|
char *queryfile, char *passin, char *inkey,
|
||||||
const EVP_MD *md, char *signer, char *chain,
|
const EVP_MD *md, char *signer, char *chain,
|
||||||
const char *policy, char *in, int token_in,
|
const char *policy, char *in, int token_in, char *out,
|
||||||
char *out, int token_out, int text)
|
int token_out, int text) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
TS_RESP *response = NULL;
|
TS_RESP *response = NULL;
|
||||||
BIO *in_bio = NULL;
|
BIO *in_bio = NULL;
|
||||||
@ -184,20 +181,23 @@ static int reply_command(CONF *conf, char *section, char *engine,
|
|||||||
response = d2i_TS_RESP_bio(in_bio, NULL);
|
response = d2i_TS_RESP_bio(in_bio, NULL);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
response = create_response(conf, section, engine, queryfile,
|
response = create_response(conf, section, engine, queryfile, passin,
|
||||||
passin, inkey, md, signer, chain, policy);
|
inkey, md, signer, chain, policy);
|
||||||
// if (response)
|
// if (response)
|
||||||
// BIO_printf(bio_err, "Response has been generated.\n");
|
// BIO_printf(bio_err, "Response has been
|
||||||
// else
|
//generated.\n");
|
||||||
// BIO_printf(bio_err, "Response is not generated.\n");
|
// else
|
||||||
|
// BIO_printf(bio_err, "Response is not
|
||||||
|
//generated.\n");
|
||||||
}
|
}
|
||||||
if (response == NULL)
|
if (response == NULL)
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Write response. */
|
/* Write response. */
|
||||||
if (text) {
|
if (text) {
|
||||||
// if ((out_bio = bio_open_default(out, 'w', FORMAT_TEXT)) == NULL)
|
// if ((out_bio = bio_open_default(out, 'w', FORMAT_TEXT)) ==
|
||||||
// goto end;
|
//NULL)
|
||||||
|
// goto end;
|
||||||
if (token_out) {
|
if (token_out) {
|
||||||
TS_TST_INFO *tst_info = TS_RESP_get_tst_info(response);
|
TS_TST_INFO *tst_info = TS_RESP_get_tst_info(response);
|
||||||
if (!TS_TST_INFO_print_bio(out_bio, tst_info))
|
if (!TS_TST_INFO_print_bio(out_bio, tst_info))
|
||||||
@ -207,8 +207,9 @@ static int reply_command(CONF *conf, char *section, char *engine,
|
|||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// if ((out_bio = bio_open_default(out, 'w', FORMAT_ASN1)) == NULL)
|
// if ((out_bio = bio_open_default(out, 'w', FORMAT_ASN1)) ==
|
||||||
// goto end;
|
//NULL)
|
||||||
|
// goto end;
|
||||||
if (token_out) {
|
if (token_out) {
|
||||||
PKCS7 *token = TS_RESP_get_token(response);
|
PKCS7 *token = TS_RESP_get_token(response);
|
||||||
if (!i2d_PKCS7_bio(out_bio, token))
|
if (!i2d_PKCS7_bio(out_bio, token))
|
||||||
@ -233,8 +234,7 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Reads a PKCS7 token and adds default 'granted' status info to it. */
|
/* Reads a PKCS7 token and adds default 'granted' status info to it. */
|
||||||
static TS_RESP *read_PKCS7(BIO *in_bio)
|
static TS_RESP *read_PKCS7(BIO *in_bio) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
PKCS7 *token = NULL;
|
PKCS7 *token = NULL;
|
||||||
TS_TST_INFO *tst_info = NULL;
|
TS_TST_INFO *tst_info = NULL;
|
||||||
@ -249,8 +249,8 @@ static TS_RESP *read_PKCS7(BIO *in_bio)
|
|||||||
goto end;
|
goto end;
|
||||||
if ((si = TS_STATUS_INFO_new()) == NULL)
|
if ((si = TS_STATUS_INFO_new()) == NULL)
|
||||||
goto end;
|
goto end;
|
||||||
// if (!TS_STATUS_INFO_set_status(si, TS_STATUS_GRANTED))
|
// if (!TS_STATUS_INFO_set_status(si, TS_STATUS_GRANTED))
|
||||||
// goto end;
|
// goto end;
|
||||||
if (!TS_RESP_set_status_info(resp, si))
|
if (!TS_RESP_set_status_info(resp, si))
|
||||||
goto end;
|
goto end;
|
||||||
TS_RESP_set_tst_info(resp, token, tst_info);
|
TS_RESP_set_tst_info(resp, token, tst_info);
|
||||||
@ -270,10 +270,9 @@ end:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
||||||
char *queryfile, char *passin,
|
char *queryfile, char *passin, char *inkey,
|
||||||
char *inkey, const EVP_MD *md, char *signer,
|
const EVP_MD *md, char *signer, char *chain,
|
||||||
char *chain, const char *policy)
|
const char *policy) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
TS_RESP *response = NULL;
|
TS_RESP *response = NULL;
|
||||||
BIO *query_bio = NULL;
|
BIO *query_bio = NULL;
|
||||||
@ -287,10 +286,10 @@ static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
|||||||
goto end;
|
goto end;
|
||||||
if (!TS_CONF_set_serial(conf, section, serial_cb, resp_ctx))
|
if (!TS_CONF_set_serial(conf, section, serial_cb, resp_ctx))
|
||||||
goto end;
|
goto end;
|
||||||
# ifndef OPENSSL_NO_ENGINE
|
#ifndef OPENSSL_NO_ENGINE
|
||||||
if (!TS_CONF_set_crypto_device(conf, section, engine))
|
if (!TS_CONF_set_crypto_device(conf, section, engine))
|
||||||
goto end;
|
goto end;
|
||||||
# endif
|
#endif
|
||||||
if (!TS_CONF_set_signer_cert(conf, section, signer, resp_ctx))
|
if (!TS_CONF_set_signer_cert(conf, section, signer, resp_ctx))
|
||||||
goto end;
|
goto end;
|
||||||
if (!TS_CONF_set_certs(conf, section, chain, resp_ctx))
|
if (!TS_CONF_set_certs(conf, section, chain, resp_ctx))
|
||||||
@ -298,12 +297,12 @@ static TS_RESP *create_response(CONF *conf, const char *section, char *engine,
|
|||||||
if (!TS_CONF_set_signer_key(conf, section, inkey, passin, resp_ctx))
|
if (!TS_CONF_set_signer_key(conf, section, inkey, passin, resp_ctx))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
// if (md) {
|
// if (md) {
|
||||||
// if (!TS_RESP_CTX_set_signer_digest(resp_ctx, md))
|
// if (!TS_RESP_CTX_set_signer_digest(resp_ctx, md))
|
||||||
// goto end;
|
// goto end;
|
||||||
// } else if (!TS_CONF_set_signer_digest(conf, section, NULL, resp_ctx)) {
|
// } else if (!TS_CONF_set_signer_digest(conf, section, NULL, resp_ctx)) {
|
||||||
// goto end;
|
// goto end;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (!TS_CONF_set_def_policy(conf, section, policy, resp_ctx))
|
if (!TS_CONF_set_def_policy(conf, section, policy, resp_ctx))
|
||||||
goto end;
|
goto end;
|
||||||
@ -335,8 +334,7 @@ end:
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data)
|
static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data) {
|
||||||
{
|
|
||||||
const char *serial_file = (const char *)data;
|
const char *serial_file = (const char *)data;
|
||||||
ASN1_INTEGER *serial = next_serial(serial_file);
|
ASN1_INTEGER *serial = next_serial(serial_file);
|
||||||
|
|
||||||
@ -351,8 +349,7 @@ static ASN1_INTEGER *serial_cb(TS_RESP_CTX *ctx, void *data)
|
|||||||
return serial;
|
return serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ASN1_INTEGER *next_serial(const char *serialfile)
|
static ASN1_INTEGER *next_serial(const char *serialfile) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
BIO *in = NULL;
|
BIO *in = NULL;
|
||||||
ASN1_INTEGER *serial = NULL;
|
ASN1_INTEGER *serial = NULL;
|
||||||
@ -363,15 +360,18 @@ static ASN1_INTEGER *next_serial(const char *serialfile)
|
|||||||
|
|
||||||
if ((in = BIO_new_file(serialfile, "r")) == NULL) {
|
if ((in = BIO_new_file(serialfile, "r")) == NULL) {
|
||||||
ERR_clear_error();
|
ERR_clear_error();
|
||||||
// BIO_printf(bio_err, "Warning: could not open file %s for "
|
// BIO_printf(bio_err, "Warning: could not open file %s for
|
||||||
// "reading, using serial number: 1\n", serialfile);
|
//"
|
||||||
|
// "reading, using serial number: 1\n",
|
||||||
|
//serialfile);
|
||||||
if (!ASN1_INTEGER_set(serial, 1))
|
if (!ASN1_INTEGER_set(serial, 1))
|
||||||
goto err;
|
goto err;
|
||||||
} else {
|
} else {
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
if (!a2i_ASN1_INTEGER(in, serial, buf, sizeof(buf))) {
|
if (!a2i_ASN1_INTEGER(in, serial, buf, sizeof(buf))) {
|
||||||
// BIO_printf(bio_err, "unable to load number from %s\n",
|
// BIO_printf(bio_err, "unable to load number from
|
||||||
// serialfile);
|
//%s\n",
|
||||||
|
// serialfile);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if ((bn = ASN1_INTEGER_to_BN(serial, NULL)) == NULL)
|
if ((bn = ASN1_INTEGER_to_BN(serial, NULL)) == NULL)
|
||||||
@ -395,8 +395,7 @@ err:
|
|||||||
return serial;
|
return serial;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial)
|
static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
BIO *out = NULL;
|
BIO *out = NULL;
|
||||||
|
|
||||||
@ -409,8 +408,9 @@ static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial)
|
|||||||
ret = 1;
|
ret = 1;
|
||||||
err:
|
err:
|
||||||
if (!ret)
|
if (!ret)
|
||||||
// BIO_printf(bio_err, "could not save serial number to %s\n",
|
// BIO_printf(bio_err, "could not save serial number to
|
||||||
// serialfile);
|
//%s\n",
|
||||||
|
// serialfile);
|
||||||
BIO_free_all(out);
|
BIO_free_all(out);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -7,8 +7,7 @@
|
|||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
void skeleton_daemon()
|
void skeleton_daemon() {
|
||||||
{
|
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
|
||||||
/* Fork off the parent process */
|
/* Fork off the parent process */
|
||||||
@ -27,7 +26,7 @@ void skeleton_daemon()
|
|||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
||||||
/* Catch, ignore and handle signals */
|
/* Catch, ignore and handle signals */
|
||||||
//TODO: Implement a working signal handler */
|
// TODO: Implement a working signal handler */
|
||||||
signal(SIGCHLD, SIG_IGN);
|
signal(SIGCHLD, SIG_IGN);
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
|
|
||||||
@ -51,11 +50,10 @@ void skeleton_daemon()
|
|||||||
|
|
||||||
/* Close all open file descriptors */
|
/* Close all open file descriptors */
|
||||||
int x;
|
int x;
|
||||||
for (x = sysconf(_SC_OPEN_MAX); x>0; x--)
|
for (x = sysconf(_SC_OPEN_MAX); x > 0; x--) {
|
||||||
{
|
close(x);
|
||||||
close (x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the log file */
|
/* Open the log file */
|
||||||
openlog ("firstdaemon", LOG_PID, LOG_DAEMON);
|
openlog("firstdaemon", LOG_PID, LOG_DAEMON);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user