#ifndef __SCP03_KDF_H__
#define __SCP03_KDF_H__

#include <stdint.h>
#include <string.h>
#include <stdlib.h>
#include "SCP03_crypto.h"
#include "sec_apdu.h"
#include "SCP03.h"

#define PRF_CMAC_OUTLENGTH_IN_BIT 128
#define KDF_COUNTER_SIZE 1
#define KDF_LABEL_SIZE 12
#define KDF_SEPERATION_INDICATOR_SIZE 1
//#define KDF_CONTEXT_SIZE 16
#define KDF_L_SIZE 2
#define KDF_SEQUENCE_COUNTER_SIZE 3

#define SENC 1
#define SMAC 2
#define SRMAC 3

#define KDF_PRF_INPUT_DATA_SIZE 32
void genSessionKey(uint8_t* input_key, uint8_t* output_key, uint8_t* hostChallenge, uint8_t* cardChallenge, int keyType);
void genCardChallenge (uint8_t* KEY_ENC, uint8_t* sequenceCounter, uint8_t* AID, int AIDLength, uint8_t* cCardChallenge);
void genCardCryptogram (uint8_t* S_MAC, uint8_t* hostChallenge, uint8_t* cardChallenge, uint8_t* cCardCryptogram);
void genHostCryptogram (uint8_t* S_MAC, uint8_t* hostCryptogram, uint8_t* hostChallenge, uint8_t* cardChallenge);
void kdf(uint8_t* input_key, uint8_t* label, uint8_t* context, int contextLength, uint8_t* output_length_in_bit, uint8_t* output_key);
#endif

