#include "crypto_module.h"

#include <qsee_hash.h>
#include <qsee_fs.h>
#include <qsee_kdf.h>
#include <qsee_prng.h>
#include <stdio.h>

#if AP_ID_SIZE * 2 != SHA256_DIGEST_SIZE
#   error Bad apId derivation algorithm
#endif

CRYPTO_STATUS crypto_gen_random(uint8_t *out, uint32_t size) {
    int32_t res;
    uint8_t *out_ptr = out;

    while ( size != 0 ) {
        res = qsee_prng_getdata(out_ptr, (size < QSEE_MAX_PRNG) ? size : QSEE_MAX_PRNG);
        if (res <= 0) {
            LOGE("qsee_prng_getdata failed with code %d", res);
            return CRYPTO_STATUS_FAILED;
        }

        out_ptr += res;
        size -= res;
    }

    return CRYPTO_STATUS_SUCCESS;
}

CRYPTO_STATUS crypto_get_tz_encryption_key(uint8_t out[AES_256_KEY_SIZE]) {
    int res;
    uint8_t keyLabel[] = "SKPM_ENCRYPTION_KEY";
    uint8_t keySalt[] = "SKPM_TZ_SALT";

    res = qsee_kdf(NULL, AES_256_KEY_SIZE,
                   keyLabel, sizeof(keyLabel) - 1,
                   keySalt, sizeof(keySalt) - 1,
                   out, AES_256_KEY_SIZE);
    if (0 != res) {
        LOGE("qsee_kdf failed with code %d", res);
        return CRYPTO_STATUS_FAILED;
    }

    return CRYPTO_STATUS_SUCCESS;
}

