Commit df5a0e76 authored by Greg Williams's avatar Greg Williams
Browse files

Completed integration of kinetic_auth module into the request pipeline. ISE...

Completed integration of kinetic_auth module into the request pipeline. ISE still failing, since now requires TLS encryption. Removed unnecesary includes from system tests since now built against static lib.
parent d5fff531
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -13,7 +13,8 @@ PUB_INC = ./include
CC ?= gcc
OPTIMIZE = -O3
SYSTEM_TEST_HOST ?= localhost
CLUSTER_VERSION ?= 0
SESSION_HMAC_KEY ?= \"asdfasdf\"
SESSION_PIN ?= \"1234\"
WARN = -Wall -Wextra -Wstrict-prototypes -Wcast-align -pedantic -Wno-missing-field-initializers -Werror=strict-prototypes
CDEFS += -D_POSIX_C_SOURCE=199309L -D_C99_SOURCE=1 -DSYSTEM_TEST_HOST=\"${SYSTEM_TEST_HOST}\" -DCLUSTER_VERSION=${CLUSTER_VERSION}
CFLAGS += -std=c99 -fPIC -g $(WARN) $(CDEFS) $(OPTIMIZE)
@@ -165,6 +166,7 @@ uninstall:
	$(RM) -f $(PREFIX)${LIBDIR}/lib$(PROJECT)*.a
	$(RM) -f $(PREFIX)${LIBDIR}/lib$(PROJECT)*.so
	$(RM) -f $(PREFIX)/include/${API_NAME}.h
	$(RM) -f $(PREFIX)/include/kinetic_admin_api.h
	$(RM) -f $(PREFIX)/include/kinetic_types.h
	$(RM) -f $(PREFIX)/include/kinetic_proto.h
	$(RM) -f $(PREFIX)/include/protobuf-c/protobuf-c.h
+1 −2
Original line number Diff line number Diff line
@@ -159,7 +159,7 @@ typedef enum {
    KINETIC_STATUS_SESSION_EMPTY,       // Session was NULL in request
    KINETIC_STATUS_SESSION_INVALID,     // Session configuration was invalid or NULL
    KINETIC_STATUS_HOST_EMPTY,          // Host was empty in request
    KINETIC_STATUS_HMAC_EMPTY,          // HMAC key is empty or NULL
    KINETIC_STATUS_HMAC_REQUIRED,          // HMAC key is empty or NULL
    KINETIC_STATUS_NO_PDUS_AVAVILABLE,  // All PDUs for the session have been allocated
    KINETIC_STATUS_DEVICE_BUSY,         // Device busy (retry later)
    KINETIC_STATUS_CONNECTION_ERROR,    // No connection/disconnected
@@ -179,7 +179,6 @@ typedef enum {
    KINETIC_STATUS_MISSING_VALUE_BUFFER,// An operation is missing a required value buffer
    KINETIC_STATUS_PIN_REQUIRED,        // The operation requires a PIN and one was not specified
    KINETIC_STATUS_SSL_REQUIRED,        // The operation requires an SSL connection and the specified connection is non-SSL
    KINTEIC_STATUS_AUTH_INFO_MISSING,   // The specified session contains no authentication info
    KINETIC_STATUS_COUNT                // Number of status codes in KineticStatusDescriptor
} KineticStatus;

+2 −2
Original line number Diff line number Diff line
@@ -70,9 +70,9 @@ KineticStatus KineticAdminClient_InstantSecureErase(KineticSession const * const
    assert(session->connection != NULL);

    KineticStatus status;
    status = KineticAuth_EnsurePinSupplied(session);
    status = KineticAuth_EnsurePinSupplied(&session->config);
    if (status != KINETIC_STATUS_SUCCESS) {return status;}
    status = KineticAuth_EnsureSslEnabled(session);
    status = KineticAuth_EnsureSslEnabled(&session->config);
    if (status != KINETIC_STATUS_SUCCESS) {return status;}

    KineticOperation* operation = KineticController_CreateOperation(session);
+3 −3
Original line number Diff line number Diff line
@@ -29,13 +29,13 @@
//==============================================================================

#define KINETIC_LIST_LOCK(_list) { \
    /*LOG_LOCATION; LOGF3("Locking list! (list_addr=0x%llX)", (_list));*/ \
    /*LOG_LOCATION; LOGF3("Locking list! (list_addr=%p)", (_list));*/ \
    pthread_mutex_lock(&((_list)->mutex)); \
    ((_list)->locked) = true; \
}

#define KINETIC_LIST_UNLOCK(_list) { \
    /*LOG_LOCATION; LOGF3("Unlocking list! (list_addr=0x%llX)", (_list));*/ \
    /*LOG_LOCATION; LOGF3("Unlocking list! (list_addr=%p)", (_list));*/ \
    assert(((_list)->locked)); \
    pthread_mutex_unlock(&((_list)->mutex)); \
    ((_list)->locked) = false; \
@@ -174,7 +174,7 @@ static void KineticAllocator_FreeList(KineticList* const list)
        for (KineticListItem* item = list->start; item; item = next) {
            next = item->next;
            
            LOGF3("  Freeing list item (0x%0llX) w/ data (0x%llX)",
            LOGF3("  Freeing list item (0x%0llX) w/ data (%p)",
                    (long long)item, (long long)&item->data);
                if (item->data != NULL) {
                    free(item->data);
+25 −24
Original line number Diff line number Diff line
@@ -22,21 +22,21 @@
#include "kinetic_proto.h"
#include "kinetic_logger.h"

KineticStatus KineticAuth_EnsurePinSupplied(KineticSession const * const session)
KineticStatus KineticAuth_EnsurePinSupplied(KineticSessionConfig const * const config)
{
    assert(session);
    if (session->config.pin.data == NULL) {return KINETIC_STATUS_PIN_REQUIRED;}
    assert(config);
    if (config->pin.data == NULL) {return KINETIC_STATUS_PIN_REQUIRED;}
    return KINETIC_STATUS_SUCCESS;
}

KineticStatus KineticAuth_EnsureSslEnabled(KineticSession const * const session)
KineticStatus KineticAuth_EnsureSslEnabled(KineticSessionConfig const * const config)
{
    assert(session);
    if (!session->config.useSsl) {return KINETIC_STATUS_SSL_REQUIRED;}
    assert(config);
    if (!config->useSsl) {return KINETIC_STATUS_SSL_REQUIRED;}
    return KINETIC_STATUS_SUCCESS;
}

void auth_add_pin(KineticSession const * const session, KineticPDU * const pdu)
void auth_add_pin(KineticSessionConfig const * const config, KineticPDU * const pdu)
{
    LOG3("Adding PIN auth info");
    KineticMessage* msg = &pdu->protoData.message;
@@ -50,17 +50,17 @@ void auth_add_pin(KineticSession const * const session, KineticPDU * const pdu)
    msg->command.header = &msg->header;
    
    // Configure PIN support
    ByteArray const * const pin = &session->config.pin;
    ByteArray const * const pin = &config->pin;
    assert(pin->len <= KINETIC_PIN_MAX_LEN);
    assert(pin->data != NULL);
    msg->message.pinAuth->pin = (ProtobufCBinaryData) {
        .data = session->config.pin.data,
        .len = session->config.pin.len,
        .data = config->pin.data,
        .len = config->pin.len,
    };
    msg->message.pinAuth->has_pin = true;
}

void auth_add_hmac(KineticSession const * const session, KineticPDU * const pdu)
void auth_add_hmac(KineticSessionConfig const * const config, KineticPDU * const pdu)
{
    LOG3("Adding HMAC auth info");
    KineticProto_Message* msg = &pdu->protoData.message.message;
@@ -74,7 +74,7 @@ void auth_add_hmac(KineticSession const * const session, KineticPDU * const pdu)
    msg->has_authType = true;

    // Configure HMAC support
    ByteArray const * const hmac = &session->config.hmacKey;
    ByteArray const * const hmac = &config->hmacKey;
    assert(hmac->len <= KINETIC_HMAC_MAX_LEN);
    assert(hmac->data != NULL);
    msg->hmacAuth = &pdu->protoData.message.hmacAuth;
@@ -83,29 +83,30 @@ void auth_add_hmac(KineticSession const * const session, KineticPDU * const pdu)
        .len = pdu->hmac.len,
    };
    msg->hmacAuth->has_hmac = true;
    msg->hmacAuth->identity = session->config.identity;
    msg->hmacAuth->identity = config->identity;
    msg->hmacAuth->has_identity = true;
}

KineticStatus KineticAuth_Populate(KineticSession const * const session, KineticPDU * const pdu)
KineticStatus KineticAuth_Populate(KineticSessionConfig const * const config, KineticPDU * const pdu)
{
    assert(session);
    assert(config);
    assert(pdu);

    if ((session->config.pin.data == NULL) && (session->config.hmacKey.data == NULL)) {
        return KINTEIC_STATUS_AUTH_INFO_MISSING;
    if (pdu->pinOp) {
        if (config->pin.data == NULL) {
            return KINETIC_STATUS_PIN_REQUIRED;
        }

    // PIN auth takes precedence over HMAC, if both specified
    if (session->config.pin.data != NULL) {
        if (!session->config.useSsl) {
        if (!config->useSsl) {
            return KINETIC_STATUS_SSL_REQUIRED;
        }
        auth_add_pin(session, pdu);
        auth_add_pin(config, pdu);
    }
    else
    {
        auth_add_hmac(session, pdu);
        if (config->hmacKey.data == NULL) {
            return KINETIC_STATUS_HMAC_REQUIRED;
        }
        auth_add_hmac(config, pdu);
    }

    return KINETIC_STATUS_SUCCESS;
Loading