/*
 * Copyright (C) 2011-2018 Intel Corporation. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in
 *     the documentation and/or other materials provided with the
 *     distribution.
 *   * Neither the name of Intel Corporation nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */

#ifndef _REF_WL_GEN_H_
#define _REF_WL_GEN_H_

#include "ref_le.h"
#include "se_types.h"

typedef enum
{
    UNKNOWN = 0,
    GEN_WL
} gen_wl_cmd_t;

class CRefWLGen
{
public:
    CRefWLGen();
    ~CRefWLGen();

    bool run(int argc, char* argv[]);

private:
    gen_wl_cmd_t parse_cmd(int argc, char **argv);
    bool generate_wl();
    bool process_line(char *line, ref_le_white_list_entry_t *entry);
    bool get_hash_from_pubkey_file(const char* pubkey_file, sgx_measurement_t* p_hash);
    bool get_hash_from_sigstruct_file(const char* sig_file, sgx_measurement_t* p_hash);
    bool get_hash_from_string(char* hash_str, sgx_measurement_t* p_hash);

    bool set_key_and_sign(const char* prikey_file, ref_le_white_list_t *p_wl, uint16_t wl_count, sgx_rsa3072_signature_t* p_signature);

    void print_byte_array(bool always_print, const uint8_t *array, size_t size, const char *line_prefix, int line_len = 32);
    void print_line(bool always_print, const char* format, ...);
    void reverse_byte_array(uint8_t *array, size_t size);
    char* clean_start(char *str);

    char *m_cfgfile;
    char *m_outfile;
    char *m_keyfile;
    uint32_t m_version;
    bool m_verbose;
};

#endif // _REF_WL_GEN_H_
