#if !defined( COMMON_DEFS_H_ )
#define COMMON_DEFS_H_
#include <stdint.h>
#include <stdbool.h>
#include <oqs/oqs.h>
#define MAX_HASH 32
#define I_LEN 16
#define MAX_MERKLE_HEIGHT 25
#define MIN_MERKLE_HEIGHT 5
#define MIN_HSS_LEVELS 1
#define MAX_HSS_LEVELS 8
#define SEED_LEN 32
#if MAX_MERKLE_HEIGHT > 31
typedef uint_fast64_t merkle_index_t;
#error We need to extend the id we place within a hash to more than 4 bytes
#else
typedef uint_fast32_t merkle_index_t;
#endif
typedef uint_fast32_t param_set_t;
typedef uint_fast64_t sequence_t;
#define LMS_SHA256_N32_H5 0x00000005
#define LMS_SHA256_N32_H10 0x00000006
#define LMS_SHA256_N32_H15 0x00000007
#define LMS_SHA256_N32_H20 0x00000008
#define LMS_SHA256_N32_H25 0x00000009
#define LMOTS_SHA256_N32_W1 0x00000001
#define LMOTS_SHA256_N32_W2 0x00000002
#define LMOTS_SHA256_N32_W4 0x00000003
#define LMOTS_SHA256_N32_W8 0x00000004
#define MESG_I 0
#define MESG_Q 16
#define MESG_D 20
#define MESG_C 22
#define MESG_PREFIX_LEN(n) (MESG_C + (n))
#define MESG_PREFIX_MAXLEN MESG_PREFIX_LEN(MAX_HASH)
#define D_MESG 0x8181
#define ITER_I 0
#define ITER_Q 16
#define ITER_K 20
#define ITER_J 22
#define ITER_PREV 23
#define ITER_LEN(hash_len) (ITER_PREV + (hash_len))
#define ITER_MAX_LEN ITER_LEN(MAX_HASH)
#define PBLC_I 0
#define PBLC_Q 16
#define PBLC_D 20
#define PBLC_PREFIX_LEN 22
#define D_PBLC 0x8080
#define LEAF_I 0
#define LEAF_R 16
#define LEAF_D 20
#define LEAF_PK 22
#define LEAF_LEN(root_len) (LEAF_PK + (root_len))
#define LEAF_MAX_LEN LEAF_LEN(MAX_HASH)
#define D_LEAF 0x8282
#define INTR_I 0
#define INTR_R 16
#define INTR_D 20
#define INTR_PK 22
#define INTR_LEN(root_len) (INTR_PK + 2 * (root_len))
#define INTR_MAX_LEN INTR_LEN(MAX_HASH)
#define D_INTR 0x8383
#define PRG_I 0
#define PRG_Q 16
#define PRG_J 20
#define PRG_FF 22
#define PRG_SEED 23
#define PRG_LEN(seed_len) (23 + (seed_len))
#define PRG_MAX_LEN PRG_LEN(MAX_HASH)
#define QTREE_I 0
#define QTREE_Q 16
#define QTREE_D 20
#define QTREE_SEED 22
#define QTREE_LEN (22 + 32)
#define QTREE_MAX_LEN QTREE_LEN
#define D_QTREE 0xffff
#define TOPSEED_I 0
#define TOPSEED_Q 16
#define TOPSEED_D 20
#define TOPSEED_WHICH 22
#define TOPSEED_SEED 23
#define TOPSEED_LEN (TOPSEED_SEED + 32)
#define D_TOPSEED 0xfefe
#define DAUX_I 0
#define DAUX_Q 16
#define DAUX_D 20
#define DAUX_PREFIX_LEN 22
#define D_DAUX 0xfdfd
#define SET_D(p, value) (void)(((p)[0] = (value) >> 8), \
((p)[1] = (value) & 0xff))
#endif