From 7aa6d37fff7e638b4845ce97ac0e85a17b507f6f Mon Sep 17 00:00:00 2001 From: Michael Rash Date: Mon, 30 Dec 2013 21:56:08 -0500 Subject: [PATCH] [libfko] added NULL check for fko_set_spa_data() data arg --- lib/fko_funcs.c | 3 +++ test/fko-wrapper/fko_wrapper.c | 44 +++++++++++++++++++++++++++------- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/lib/fko_funcs.c b/lib/fko_funcs.c index f84b155c..22ab05b0 100644 --- a/lib/fko_funcs.c +++ b/lib/fko_funcs.c @@ -562,6 +562,9 @@ fko_set_spa_data(fko_ctx_t ctx, const char * const enc_msg) if(!CTX_INITIALIZED(ctx)) return FKO_ERROR_CTX_NOT_INITIALIZED; + if(enc_msg == NULL) + return(FKO_ERROR_INVALID_DATA_FUNCS_SET_MSGLEN_VALIDFAIL); + enc_msg_len = strnlen(enc_msg, MAX_SPA_ENCODED_MSG_SIZE); if(! is_valid_encoded_msg_len(enc_msg_len)) diff --git a/test/fko-wrapper/fko_wrapper.c b/test/fko-wrapper/fko_wrapper.c index f81c1802..c2072420 100644 --- a/test/fko-wrapper/fko_wrapper.c +++ b/test/fko-wrapper/fko_wrapper.c @@ -18,6 +18,9 @@ #define NO_NEW_CTX 1 #define DO_PRINT 1 #define NO_PRINT 2 +#define NO_DIGEST 0 +#define DO_DIGEST 1 +#define RAW_DIGEST 2 #define ENC_KEY "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" /* 32 bytes */ #define HMAC_KEY "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" /* 32 bytes */ @@ -38,7 +41,8 @@ static void spa_func_getset_int(fko_ctx_t *ctx, char *set_name, static void spa_func_getset_short(fko_ctx_t *ctx, char *set_name, int (*spa_set)(fko_ctx_t ctx, const short modifier), char *get_name, int (*spa_get)(fko_ctx_t ctx, short *val), - int min, int max, int final_val, int new_ctx_flag, int destroy_ctx_flag); + int min, int max, int final_val, int digest_flag, + int new_ctx_flag, int destroy_ctx_flag); int spa_calls = 0; @@ -81,7 +85,7 @@ test_loop(int new_ctx_flag, int destroy_ctx_flag) &fko_set_spa_message_type, "fko_get_spa_message_type", &fko_get_spa_message_type, FKO_COMMAND_MSG-F_INT, FKO_LAST_MSG_TYPE+F_INT, FKO_ACCESS_MSG, - new_ctx_flag, destroy_ctx_flag); + NO_DIGEST, new_ctx_flag, destroy_ctx_flag); spa_func_int(&ctx, "fko_set_timestamp", &fko_set_spa_client_timeout, -F_INT, F_INT, 10, @@ -109,7 +113,7 @@ test_loop(int new_ctx_flag, int destroy_ctx_flag) &fko_set_spa_encryption_type, "fko_get_spa_encryption_type", &fko_get_spa_encryption_type, FKO_ENCRYPTION_INVALID_DATA-F_INT, FKO_LAST_ENCRYPTION_TYPE+F_INT, FKO_ENCRYPTION_RIJNDAEL, - new_ctx_flag, destroy_ctx_flag); + NO_DIGEST, new_ctx_flag, destroy_ctx_flag); spa_func_getset_int(&ctx, "fko_set_spa_encryption_mode", &fko_set_spa_encryption_mode, "fko_get_spa_encryption_mode", @@ -141,19 +145,33 @@ test_loop(int new_ctx_flag, int destroy_ctx_flag) &fko_set_spa_digest_type, "fko_get_spa_digest_type", &fko_get_spa_digest_type, FKO_DIGEST_INVALID_DATA-F_INT, FKO_LAST_DIGEST_TYPE+F_INT, FKO_DEFAULT_DIGEST, - new_ctx_flag, destroy_ctx_flag); + DO_DIGEST, new_ctx_flag, destroy_ctx_flag); spa_func_getset_short(&ctx, "fko_set_raw_spa_digest_type", &fko_set_spa_digest_type, "fko_get_raw_spa_digest_type", &fko_get_spa_digest_type, FKO_DIGEST_INVALID_DATA-F_INT, FKO_LAST_DIGEST_TYPE+F_INT, FKO_DEFAULT_DIGEST, - new_ctx_flag, destroy_ctx_flag); + RAW_DIGEST, new_ctx_flag, destroy_ctx_flag); spa_func_getset_short(&ctx, "fko_set_spa_hmac_type", &fko_set_spa_hmac_type, "fko_get_spa_hmac_type", &fko_get_spa_hmac_type, FKO_HMAC_INVALID_DATA-F_INT, FKO_LAST_HMAC_MODE+F_INT, FKO_HMAC_SHA256, - new_ctx_flag, destroy_ctx_flag); + NO_DIGEST, new_ctx_flag, destroy_ctx_flag); + + /* NULL tests */ + fko_set_rand_value(ctx, NULL); + fko_set_rand_value(ctx, NULL); + fko_set_username(ctx, NULL); + fko_set_username(ctx, NULL); + fko_set_spa_message(ctx, NULL); + fko_set_spa_message(ctx, NULL); + fko_set_spa_nat_access(ctx, NULL); + fko_set_spa_nat_access(ctx, NULL); + fko_set_spa_server_auth(ctx, NULL); + fko_set_spa_server_auth(ctx, NULL); + fko_set_spa_data(ctx, NULL); + fko_set_spa_data(ctx, NULL); printf("Trying encrypt / authenticate step with bogus key lengths...\n"); for (i=-100; i < 200; i += 10) { @@ -351,7 +369,8 @@ static void spa_func_int(fko_ctx_t *ctx, char *name, static void spa_func_getset_short(fko_ctx_t *ctx, char *set_name, int (*spa_set)(fko_ctx_t ctx, const short modifier), char *get_name, int (*spa_get)(fko_ctx_t ctx, short *val), - int min, int max, int final_val, int new_ctx_flag, int destroy_ctx_flag) + int min, int max, int final_val, int digest_flag, + int new_ctx_flag, int destroy_ctx_flag) { fko_ctx_t default_ctx = NULL; short get_val; @@ -364,11 +383,20 @@ static void spa_func_getset_short(fko_ctx_t *ctx, char *set_name, get_val = 1234; /* meaningless default */ printf("%s(%d): %s\n", set_name, i, fko_errstr((spa_set)(*ctx, i))); printf("%s(%d): %s (DUPE)\n", set_name, i, fko_errstr((spa_set)(*ctx, i))); + + if (digest_flag == DO_DIGEST) + fko_set_spa_digest(*ctx); + else if (digest_flag == RAW_DIGEST) + fko_set_raw_spa_digest(*ctx); + res = (spa_get)(*ctx, &get_val); printf("%s(%d): %s\n", get_name, get_val, fko_errstr(res)); ctx_update(ctx, new_ctx_flag, destroy_ctx_flag, DO_PRINT); - spa_calls += 3; + if (digest_flag == NO_DIGEST) + spa_calls += 3; + else + spa_calls += 4; /* also set on a fully populated context */ (spa_set)(default_ctx, i);