#include "basedef.h"
#include "dbg.h"


void* secure_zero_memory(void* v, uint32 n) {
    volatile uint8 *p = v;
    while (n--) *p++ = 0;
    return v;
}


// val : little endian, ar : little endian
boolean array_to_uint16(uint16* val, const uint8* ar)
{
    uint32 t;

    if (val == NULL || ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    *val = 0;

    t = ar[0]; *val |=  (t);
    t = ar[1]; *val |=  (t << 8);

    return TRUE;
}


// val : little endian, ar : little endian
boolean array_to_uint32(uint32* val, const uint8* ar)
{
    uint32 t;

    if (val == NULL || ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    *val = 0;

    t = ar[0]; *val |=  (t);
    t = ar[1]; *val |=  (t << 8);
    t = ar[2]; *val |=  (t << 16);
    t = ar[3]; *val |=  (t << 24);

    return TRUE;
}


// val : little endian, ar : little endian
boolean uint16_to_array(const uint16 val, uint8* ar)
{
    if (ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    ar[0] = (uint8) (val);
    ar[1] = (uint8) (val >> 8);

    return TRUE;
}


// val : little endian, ar : little endian
boolean uint32_to_array(const uint32 val, uint8* ar)
{
    if (ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    ar[0] = (uint8) (val);
    ar[1] = (uint8) (val >> 8);
    ar[2] = (uint8) (val >> 16);
    ar[3] = (uint8) (val >> 24);

    return TRUE;
}


// val : little endian, ar : little endian
boolean uint64_to_array(const uint64 val, uint8* ar)
{
    if (ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    ar[0] = (uint8) (val);
    ar[1] = (uint8) (val >> 8);
    ar[2] = (uint8) (val >> 16);
    ar[3] = (uint8) (val >> 24);
    ar[4] = (uint8) (val >> 32);
    ar[5] = (uint8) (val >> 40);
    ar[6] = (uint8) (val >> 48);
    ar[7] = (uint8) (val >> 56);

    return TRUE;
}

// val : little endian, ar : little endian
boolean array_to_uint64(uint64* val, const uint8* ar)
{
    uint64 t;

    if (val == NULL || ar == NULL) {
        printD("param is invalid");
        return FALSE;
    }

    *val = 0;

    t = ar[0]; *val |=  (t);
    t = ar[1]; *val |=  (t << 8);
    t = ar[2]; *val |=  (t << 16);
    t = ar[3]; *val |=  (t << 24);
    t = ar[4]; *val |=  (t << 32);
    t = ar[5]; *val |=  (t << 40);
    t = ar[6]; *val |=  (t << 48);
    t = ar[7]; *val |=  (t << 56);

    return TRUE;
}
