#ifdef DEBUG_LOW
#include "ssp.h"
#include "ssp_service.h"
#include "ssp_apdu.h"
#include "ssp_util.h"
#include "ssp_public.h"
#include "crypto_module.h"

#include "tz_platform.h"
#include "tz_debug.h"

#include "sem.h"

#include "sse.h"
#include "sse_entry_manage_util.h"
#include "sse_private.h"
#include "sec_apdu.h"
#include "sec_EseStatus.h"
#ifndef MAX_SSP_RAPDU_DATA_SIZE
#define MAX_SSP_RAPDU_DATA_SIZE 256
#endif
#define TID_HASHED_LENGTH   16
#ifndef TEST_FEATURE
#define RPDU_DATA_MAX_SIZE  256
#else
#ifndef RPDU_DATA_MAX_SIZE
#define RPDU_DATA_MAX_SIZE  2
#endif
#endif

SSPSTATUS generate_otp_key( uint8_t       otp_key[ SHA256_DIGEST_SIZE ],
                            const uint8_t ecc_secret[ SSP_ECC_SECRET_SIZE ],
                            const uint8_t apId[ SSP_AP_ID_SIZE ],
                            const uint8_t ese_id[ SSP_ESE_ID_SIZE ] );

void generate_otp_key_test( void )
{

    uint8_t otp_wrap_key[AES_256_KEY_SIZE];
    uint8_t otp_key[SSP_OTP_KEY_SIZE];
    uint8_t otp_key_2[SSP_OTP_KEY_SIZE];
    uint8_t otp_key_blob_out[SSP_MAX_WRAPPED_OTP_KEY_SIZE];

    ecc_key_t eccKey_1, eccKey_2;

    uint8_t apId[SSP_AP_ID_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    uint8_t eSEId[SSP_ESE_ID_SIZE] = {0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20};
    uint8_t mac[SSP_CMAC_SIZE];

    uint8_t rand_1[SSP_AP_ID_SIZE], rand_2[SSP_RESET_RANDOM_SIZE];

    crypto_gen_ecc_key( &eccKey_1 );
    crypto_gen_ecc_key( &eccKey_2 );

    hex_print_tag_debug("eccKey_1 pubkey", eccKey_1.pubkey_binary, SSP_ECC_PUBKEY_SIZE);
    hex_print_tag_debug("eccKey_2 pubkey", eccKey_2.pubkey_binary, SSP_ECC_PUBKEY_SIZE);

    crypto_gen_ecc_secret(&eccKey_1, eccKey_2.pubkey_binary, SSP_ECC_PUBKEY_SIZE);
    hex_print_tag_debug("ecc_secret - eccKey_1", eccKey_1.secretkey, SSP_ECC_SECRET_SIZE);
    crypto_gen_ecc_secret(&eccKey_2, eccKey_1.pubkey_binary, SSP_ECC_PUBKEY_SIZE);
    hex_print_tag_debug("ecc_secret - eccKey_2", eccKey_2.secretkey, SSP_ECC_SECRET_SIZE);

    generate_otp_key( otp_key, eccKey_1.secretkey, apId, eSEId );
    hex_print_tag_debug("otp_key", otp_key, SSP_OTP_KEY_SIZE);

    crypto_get_tz_encryption_key(otp_wrap_key);
    hex_print_tag_debug("otp_wrap_key", otp_wrap_key, AES_256_KEY_SIZE);

    crypto_aes_256_wrap_otp(otp_key, otp_key_blob_out, otp_wrap_key);
    hex_print_tag_debug("otp_key_blob_out", otp_key_blob_out, 40);

    crypto_aes_256_unwrap_otp(otp_key_blob_out, otp_key_2, otp_wrap_key);
    hex_print_tag_debug("otp_key_2", otp_key_2, SSP_OTP_KEY_SIZE);

    /* Verify taken C-MAC */
    crypto_aes_256_cmac( mac, otp_key,
                         eccKey_1.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         eccKey_2.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         NULL );
    hex_print_tag_debug("c-mac 1", mac, SSP_CMAC_SIZE);

    /* Verify taken C-MAC */
    crypto_aes_256_cmac( mac, otp_key,
                         eccKey_2.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         eccKey_1.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         NULL );
    hex_print_tag_debug("c-mac 2", mac, SSP_CMAC_SIZE);

    /* Verify taken C-MAC */
    crypto_aes_256_cmac( mac, otp_key,
                         eccKey_1.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         eccKey_2.pubkey_binary + 1, SSP_ECC_PUBKEY_SIZE - 1,
                         NULL );
    hex_print_tag_debug("c-mac 3", mac, SSP_CMAC_SIZE);

    crypto_gen_random(rand_1, SSP_AP_ID_SIZE);
    hex_print_tag_debug("rand_1-1", rand_1, SSP_AP_ID_SIZE);
    crypto_gen_random(rand_1, SSP_AP_ID_SIZE);
    hex_print_tag_debug("rand_1-2", rand_1, SSP_AP_ID_SIZE);
    crypto_gen_random(rand_2, SSP_RESET_RANDOM_SIZE);
    hex_print_tag_debug("rand_2-1", rand_2, SSP_RESET_RANDOM_SIZE);
    crypto_gen_random(rand_2, SSP_RESET_RANDOM_SIZE);
    hex_print_tag_debug("rand_2-2", rand_2, SSP_RESET_RANDOM_SIZE);
}

#if 0
static const uint8_t key_N[] = {
    0xb4, 0x76, 0x48, 0x02, 0x14, 0xff, 0xef, 0x76, 0x6c, 0x34, 0x23, 0xeb, 0x4b, 0xfb, 0xeb, 0x3e,
    0xb6, 0x9f, 0x30, 0x4b, 0xda, 0xcb, 0xa5, 0xb4, 0xd9, 0x7e, 0xab, 0x3b, 0x8a, 0x04, 0x69, 0x4a,
    0x34, 0x1e, 0x50, 0xe4, 0x7e, 0x0f, 0x54, 0xe2, 0x87, 0x01, 0x63, 0xda, 0x0a, 0xfb, 0x4f, 0xcf,
    0x32, 0xe4, 0xc0, 0x1c, 0xe5, 0x78, 0x46, 0x94, 0x33, 0x30, 0x00, 0x05, 0x9f, 0x88, 0x4a, 0x45,
    0x54, 0x84, 0x49, 0x4b, 0xeb, 0x16, 0x8c, 0x26, 0x99, 0xac, 0x97, 0xfd, 0x54, 0x44, 0x72, 0xe0,
    0x3d, 0x65, 0xee, 0xd3, 0x64, 0x8e, 0xbd, 0x97, 0x9e, 0xb1, 0xd7, 0x99, 0x69, 0xb7, 0x84, 0x3c,
    0xab, 0x10, 0x89, 0x2b, 0x24, 0xd8, 0xdb, 0x85, 0x41, 0xb4, 0x2c, 0xbc, 0xd4, 0x97, 0x0f, 0x11,
    0x16, 0xaa, 0xc4, 0x85, 0x0f, 0xf7, 0x21, 0x39, 0xe6, 0x0b, 0xb5, 0x26, 0x15, 0x83, 0xa8, 0x04,
    0x97, 0x16, 0x85, 0x46, 0x7a, 0x0f, 0xdb, 0x9d, 0xb5, 0x38, 0x21, 0x82, 0xfc, 0xeb, 0xbf, 0xff,
    0x04, 0xe4, 0xa0, 0x4c, 0xf6, 0xa0, 0xfa, 0x8a, 0xbe, 0x87, 0x67, 0xc5, 0x16, 0xda, 0xe1, 0x64,
    0x25, 0xad, 0x1c, 0x5c, 0x5d, 0x07, 0xbc, 0x61, 0x62, 0x4b, 0x76, 0x38, 0x22, 0x2a, 0xe2, 0xbe,
    0x9f, 0x0f, 0x8c, 0x44, 0x90, 0x9b, 0x4b, 0xce, 0xb1, 0x46, 0x90, 0x76, 0xb6, 0x98, 0xd9, 0x6c,
    0xdc, 0x37, 0x5f, 0x31, 0xc5, 0x50, 0x97, 0xc0, 0x77, 0xb7, 0x66, 0xd4, 0xba, 0x7b, 0x23, 0x2e,
    0x83, 0x94, 0x35, 0xfc, 0x65, 0x0a, 0x54, 0x7f, 0x4e, 0xa8, 0x8e, 0x9a, 0xa2, 0x0d, 0x98, 0x84,
    0x58, 0x95, 0xb7, 0x75, 0x9c, 0x7d, 0xa5, 0xc0, 0xd8, 0x0d, 0xd5, 0x33, 0x66, 0xb9, 0xd6, 0x02,
    0xa8, 0xc2, 0x99, 0x10, 0x77, 0x40, 0x2c, 0x31, 0x13, 0xb6, 0x6d, 0xb2, 0xb7, 0xca, 0x75, 0x5d
};


static const uint8_t key_e[] = {
    0x01, 0x00, 0x01
};
#endif

uint8_t signature_1[] = {
    0x54, 0x33, 0xA1, 0x6D, 0x8B, 0x79, 0x0E, 0xBD, 0x21, 0x31, 0xE8, 0x44, 0x76, 0x80, 0x75, 0xCA,
    0x74, 0x55, 0xFE, 0x19, 0x74, 0xBA, 0x1E, 0xCF, 0x3E, 0x55, 0x71, 0x34, 0x24, 0xC5, 0xD5, 0x5F,
    0x11, 0x8B, 0xA8, 0x36, 0x76, 0xEA, 0xEE, 0x5E, 0x02, 0x0D, 0xF7, 0xF2, 0xC2, 0xFB, 0x4C, 0x35,
    0x17, 0x8C, 0xA8, 0x72, 0x63, 0xC9, 0xFB, 0x3B, 0x8F, 0x1F, 0xB3, 0x79, 0x2B, 0xFA, 0xDE, 0x69,
    0x47, 0x27, 0x02, 0xB4, 0xF1, 0x4E, 0xD3, 0xA7, 0xDE, 0x6A, 0x49, 0x6F, 0x19, 0xB9, 0x80, 0x5A,
    0x4A, 0x34, 0x92, 0x67, 0x91, 0x37, 0xC5, 0x13, 0xBE, 0x12, 0xDA, 0xC7, 0x69, 0xC9, 0xD0, 0x20,
    0x62, 0x14, 0x57, 0x71, 0xCB, 0x4D, 0x23, 0x1E, 0x7E, 0xA9, 0x13, 0x68, 0x97, 0xBC, 0x37, 0x5A,
    0xB9, 0x53, 0x4E, 0xB1, 0x43, 0xDC, 0x4E, 0x46, 0x1A, 0xEF, 0x49, 0x73, 0x1E, 0xC3, 0x6C, 0xC1,
    0x56, 0xEE, 0x0D, 0xC4, 0x2C, 0x3F, 0x19, 0xF1, 0x2C, 0x90, 0xEC, 0x54, 0x3C, 0xA6, 0x4D, 0xF5,
    0x20, 0x8D, 0xB1, 0xAE, 0x21, 0xF1, 0xDA, 0x59, 0xF2, 0x59, 0xE5, 0x8E, 0xE1, 0x69, 0x18, 0xD0,
    0x82, 0x9D, 0xC2, 0x31, 0xA6, 0xDB, 0x92, 0x75, 0x65, 0x3E, 0x10, 0xAB, 0x31, 0xCD, 0xF2, 0x9D,
    0x07, 0x53, 0x5A, 0x7F, 0x23, 0x88, 0x09, 0x4E, 0x51, 0x9A, 0xE4, 0x9E, 0xD7, 0xA8, 0xA2, 0xE2,
    0x6D, 0x86, 0x7B, 0x59, 0x50, 0x64, 0xAA, 0xE5, 0x48, 0x90, 0xCF, 0xA8, 0x2B, 0x0A, 0x3C, 0xD5,
    0x7E, 0x60, 0x9B, 0xFA, 0x88, 0x5F, 0xCE, 0x23, 0x4B, 0x6A, 0x31, 0x94, 0x21, 0xFE, 0x65, 0x17,
    0x0E, 0x0C, 0xFE, 0x7A, 0xBA, 0xAD, 0x4A, 0x00, 0xE8, 0x7B, 0x0D, 0x27, 0xF7, 0x06, 0x1D, 0x24,
    0x37, 0x71, 0xC4, 0x27, 0x6C, 0xB4, 0x38, 0x28, 0xE4, 0x2D, 0x2F, 0xCD, 0xEA, 0x96, 0x7D, 0x37
};

uint8_t normal_data[] = {
    0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x0A
};

void rsa_test() {
    RSA  *rsaKey = NULL;
    rsa_key_t rsa_key_info;

    uint8_t testIn[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    uint8_t sig[500] = {0, };
    uint32_t sig_size = sizeof(sig);

    crypto_gen_rsa_key( &rsaKey, &rsa_key_info );

    if (crypto_rsa_sign_pss(MD_TYPE_SHA256, 0, rsaKey, testIn, sizeof(testIn), sig, &sig_size) != CRYPTO_STATUS_SUCCESS) {
        LOGE("crypto_rsa_sign_pss is failed");
        return;
    }
    hex_print_tag_debug("sig", sig, sig_size);

    if (crypto_rsa_verify_pss(MD_TYPE_SHA256, 0, rsaKey, testIn, sizeof(testIn), sig, sig_size) != CRYPTO_STATUS_SUCCESS) {
        LOGE("crypto_rsa_verify_pkcs is failed");
    }
    LOGD("crypto_rsa_verify_pss is success");

    crypto_clear_rsa_key(&rsaKey);
    LOGD("crypto_clear_rsa_key is done");
}



void sha_test() {
    uint8_t apId[SSP_AP_ID_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    uint8_t digest[SHA1_DIGEST_SIZE];

    uint8_t eID[SSP_ENTRY_ID_SIZE];

    LOGD("Sha Test");

    crypto_sha1(digest, apId, sizeof(apId), NULL);
    hex_print_tag_debug("apID sha1", digest, SHA1_DIGEST_SIZE);

    ssp_genEntryID(apId, sizeof(apId), eID);
    hex_print_tag_debug("entry Prefix of apId", eID, SSP_ENTRY_ID_SIZE);

}

void ecdsa_test() {
#if 0
    ecc_key_t eccKey, regen_eccKey;
    uint8_t testIn[SSP_AP_ID_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    uint8_t sig_s[32], sig_r[32];
    int32_t sig_s_len, sig_r_len;

    crypto_gen_ecc_key( &eccKey );
    crypto_regen_ecc_pubkey(&regen_eccKey, eccKey.pubkey_binary, eccKey.pubkey_size);

    crypto_ecdsa_sign_with_sha256(eccKey.ecc_keypair, testIn, sizeof(testIn), sig_r, &sig_r_len, sig_s, &sig_s_len);
    hex_print_tag_debug("public key", eccKey.pubkey_binary, eccKey.pubkey_size);
    hex_print_tag_debug("signature.r", sig_r, sig_r_len);
    hex_print_tag_debug("signature.s", sig_s, sig_s_len);
    LOGD("crypto_ecdsa_verify test 1");
    crypto_ecdsa_verify_with_sha256(eccKey.ecc_keypair, testIn, sizeof(testIn), sig_r, sig_r_len, sig_s, sig_s_len);
    LOGD("crypto_ecdsa_verify test 2");
    crypto_ecdsa_verify_with_sha256(regen_eccKey.ecc_keypair, testIn, sizeof(testIn), sig_r, sig_r_len, sig_s, sig_s_len);
#endif

#if 0
    ecc_key_t temp_eccPrivKey, temp_eccPubkey;
    uint8_t temp_in[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 ,0x07, 0x08, 0x09};
    uint8_t temp_privkey[] = {0x42, 0x2f, 0x8d, 0x21, 0x3e, 0xaa, 0x0a, 0x2e, 0x7a, 0x9b, 0x1a, 0x54, 0x1f, 0x77, 0x3e, 0xf9, 0xd4, 0x68, 0xb2, 0xb5, 0xdb, 0x47, 0xc7, 0x01, 0x65, 0x19, 0x86, 0x2b, 0xc2, 0x20, 0x1e, 0x04};
    uint8_t temp_pubkey[] =  {0x04, 0x60, 0xa0, 0x12, 0x2f, 0x70, 0x30, 0x83, 0xe0, 0xca, 0xd4, 0xa9, 0x16, 0x03, 0x1c, 0xfa, 0x8b, 0xd9, 0x74, 0x5a, 0x69, 0xb4, 0xa7, 0x32, 0x77, 0xd8, 0x87, 0x1d, 0x5a, 0xba, 0x37, 0x04, 0x71, 0xd8, 0x7a, 0x8e, 0x65, 0xf6, 0xdc, 0xe0, 0x4d, 0x8c, 0xc7, 0xc5, 0xe7, 0x7d, 0xcc, 0xac, 0x24, 0x57, 0x60, 0xc9, 0x20, 0x38, 0xbb, 0xbd, 0x1b, 0x18, 0x4e, 0xf8, 0x32, 0xa7, 0xc6, 0xc7, 0x68};
    uint8_t temp_sig_s[32], temp_sig_r[32];
    int32_t temp_sig_s_len, temp_sig_r_len;

    uint8_t temp_sig_r_2[] = {0x1b, 0x8f, 0x5b, 0x70, 0x16, 0xa8, 0xc3, 0xe8, 0xf1, 0x58, 0x19, 0x4c, 0x50, 0x98, 0x32, 0x4c, 0x32, 0x10, 0x3f, 0xa1, 0x0f, 0x2f, 0x12, 0xd7, 0x51, 0x72, 0x61, 0x99, 0x5e, 0x5e, 0xf0, 0xe4};
    uint8_t temp_sig_s_2[] = {0x40, 0xfe, 0xdb, 0x37, 0x71, 0x3d, 0x6f, 0xae, 0x49, 0x22, 0x88, 0x8d, 0xd3, 0x30, 0x04, 0xf5, 0xd8, 0x28, 0xe6, 0x8f, 0xd8, 0x76, 0x15, 0x69, 0xf5, 0x47, 0x25, 0x46, 0x71, 0x15, 0x74, 0xcb};

    uint8_t test_casd_cert[] = {
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56};

    uint8_t test_pubKey[SSP_ECC_PUBKEY_SIZE] = {0, };

    hex_print_tag_debug("temp_in", temp_in, sizeof(temp_in));
    hex_print_tag_debug("private key", temp_privkey, sizeof(temp_privkey));
    crypto_regen_ecc_privkey(&temp_eccPrivKey, temp_privkey, sizeof(temp_privkey));
    crypto_ecdsa_sign_with_sha256(temp_eccPrivKey.ecc_keypair, temp_in, sizeof(temp_in), temp_sig_r, &temp_sig_r_len, temp_sig_s, &temp_sig_s_len);
    hex_print_tag_debug("signature.r", temp_sig_r, sizeof(temp_sig_r));
    hex_print_tag_debug("signature.s", temp_sig_s, sizeof(temp_sig_s));
    hex_print_tag_debug("public key", temp_pubkey, sizeof(temp_pubkey));
    crypto_regen_ecc_pubkey(&temp_eccPubkey, temp_pubkey, sizeof(temp_pubkey));
    LOGD("crypto_ecdsa_verify test 3");
    crypto_ecdsa_verify_with_sha256(temp_eccPubkey.ecc_keypair, temp_in, sizeof(temp_in), temp_sig_r, sizeof(temp_sig_r), temp_sig_s, sizeof(temp_sig_s));
    LOGD("crypto_ecdsa_verify test 4");
    crypto_ecdsa_verify_with_sha256(temp_eccPubkey.ecc_keypair, temp_in, sizeof(temp_in), temp_sig_r_2, sizeof(temp_sig_r_2), temp_sig_s_2, sizeof(temp_sig_s_2));

    verify_casd_cert(test_casd_cert, sizeof(test_casd_cert), test_pubKey);
    hex_print_tag_debug("test_pubKey", test_pubKey, SSP_ECC_PUBKEY_SIZE);
#endif

#if 1
    ecc_key_t regen_eccKey;

    uint8_t pub[] = {
        0x04, 0x60, 0xa0, 0x12, 0x2f, 0x70, 0x30, 0x83, 0xe0, 0xca, 0xd4, 0xa9, 0x16, 0x03, 0x1c, 0xfa, 0x8b,
        0xd9, 0x74, 0x5a, 0x69, 0xb4, 0xa7, 0x32, 0x77, 0xd8, 0x87, 0x1d, 0x5a, 0xba, 0x37, 0x04, 0x71,
        0xd8, 0x7a, 0x8e, 0x65, 0xf6, 0xdc, 0xe0, 0x4d, 0x8c, 0xc7, 0xc5, 0xe7, 0x7d, 0xcc, 0xac, 0x24,
        0x57, 0x60, 0xc9, 0x20, 0x38, 0xbb, 0xbd, 0x1b, 0x18, 0x4e, 0xf8, 0x32, 0xa7, 0xc6, 0xc7, 0x68
    };

   uint8_t in[] = {
        0x37, 0x82, 0x04, 0x4A, 0x3F, 0x20, 0x28, 0x3F, 0x21, 0x05, 0xA0, 0x00, 0x00, 0x02, 0x20, 0x3F,
        0x22, 0x0D, 0xA0, 0x00, 0x00, 0x01, 0x51, 0x53, 0x50, 0x41, 0x53, 0x33, 0x53, 0x53, 0x44, 0x3F,
        0x23, 0x09, 0xA0, 0x00, 0x00, 0x02, 0x20, 0x65, 0x63, 0x68, 0x6F, 0x3F, 0x24, 0x01, 0x10, 0x3F,
        0x30, 0x82, 0x04, 0x1A, 0x3F, 0x31, 0x04, 0x20, 0x15, 0x05, 0x18, 0x3F, 0x32, 0x04, 0x00, 0x00,
        0x00, 0x01, 0x3F, 0x33, 0x02, 0x01, 0x00, 0x3F, 0x34, 0x01, 0x01, 0x3F, 0x35, 0x01, 0x01, 0x3F,
        0x36, 0x82, 0x03, 0x70, 0xF1, 0x14, 0x00, 0xA4, 0x04, 0x00, 0x0E, 0xA0, 0x00, 0x00, 0x01, 0x51,
        0x53, 0x50, 0x41, 0x4C, 0x43, 0x43, 0x4D, 0x44, 0x4D, 0x00, 0xF1, 0x0E, 0x80, 0x50, 0x35, 0x00,
        0x08, 0x96, 0x5E, 0x4A, 0xDC, 0x87, 0xAF, 0x77, 0x52, 0x00, 0xF1, 0x15, 0x84, 0x82, 0x33, 0x00,
        0x10, 0x23, 0x58, 0x58, 0x37, 0x4C, 0x36, 0xED, 0xDF, 0x5D, 0xDA, 0x7E, 0x49, 0x35, 0xC4, 0x39,
        0x99, 0xF1, 0x5E, 0x84, 0xE4, 0x00, 0x80, 0x58, 0x38, 0xB4, 0xB3, 0x63, 0x01, 0x72, 0xC4, 0x1E,
        0xEB, 0x0A, 0xCF, 0x2C, 0x9E, 0x42, 0x42, 0xA6, 0xB5, 0xE9, 0xF4, 0xD3, 0x75, 0x9D, 0x24, 0xC8,
        0x49, 0xA0, 0x30, 0x53, 0xDB, 0x6E, 0x52, 0x56, 0xD7, 0xAE, 0x3A, 0xB8, 0xA5, 0x58, 0x44, 0x28,
        0xD5, 0x38, 0x28, 0xAE, 0x96, 0xAE, 0x54, 0x88, 0x9F, 0xA1, 0x4A, 0x39, 0x70, 0x3C, 0xE9, 0xD5,
        0x76, 0x70, 0xF1, 0x82, 0x46, 0xA6, 0x91, 0xEA, 0x64, 0x54, 0xFC, 0xB3, 0xA1, 0x4B, 0xBF, 0x77,
        0x1C, 0xC5, 0x0D, 0x05, 0x84, 0x1F, 0xAC, 0xA2, 0x66, 0x1A, 0x0C, 0x44, 0x4F, 0x61, 0x31, 0xD8,
        0x00, 0xF1, 0x81, 0x8E, 0x84, 0xE6, 0x02, 0x00, 0x88, 0xC8, 0x0D, 0x51, 0x6A, 0x96, 0xC4, 0xCC,
        0x91, 0xA9, 0x64, 0xB3, 0x5E, 0x1C, 0x92, 0xF5, 0x9E, 0xA6, 0x0B, 0xCB, 0x62, 0x48, 0xC2, 0x18,
        0x04, 0x03, 0x38, 0xC5, 0x6E, 0x33, 0x6C, 0x04, 0x2E, 0xA4, 0x6A, 0xA1, 0xC0, 0xD2, 0xEE, 0x34,
        0x79, 0xF1, 0x1E, 0x81, 0xC5, 0x23, 0x46, 0x6B, 0xEC, 0xC3, 0x6B, 0x8D, 0x46, 0x48, 0x50, 0x5B,
        0x23, 0xB4, 0x9B, 0x94, 0x7D, 0x48, 0x7A, 0xA5, 0xE5, 0x75, 0x4C, 0x24, 0xFA, 0x94, 0x4D, 0xE0,
        0x99, 0xFB, 0xB9, 0x87, 0x4D, 0x34, 0xF1, 0x10, 0x47, 0x25, 0xF1, 0xA9, 0x87, 0x8E, 0xF6, 0xDE,
        0x04, 0x49, 0x66, 0x5A, 0x13, 0x88, 0x35, 0x27, 0xA2, 0x00, 0x23, 0x62, 0xF2, 0x19, 0x1A, 0x42,
        0xA5, 0xB0, 0x19, 0xF8, 0xA5, 0x5B, 0x23, 0xB6, 0x46, 0xC6, 0x36, 0xB8, 0xD4, 0x0F, 0x9A, 0x2D,
        0xAA, 0x55, 0xA5, 0x4D, 0x34, 0x9C, 0x3A, 0x6A, 0xFE, 0x85, 0x24, 0x84, 0x39, 0xEE, 0x3B, 0xBE,
        0x84, 0x00, 0xF1, 0x81, 0xFE, 0x84, 0xE8, 0x00, 0x00, 0xF8, 0xA4, 0x47, 0x9D, 0x0D, 0xB9, 0x06,
        0xBC, 0xD4, 0x46, 0xF7, 0x55, 0xF4, 0x86, 0xC3, 0x74, 0xBB, 0xAE, 0xA1, 0x0E, 0xB7, 0x8A, 0x0D,
        0xF4, 0x9B, 0x9C, 0x6B, 0xA3, 0x85, 0xF0, 0xC9, 0x26, 0xCA, 0xE3, 0xE5, 0x00, 0xED, 0xFE, 0x28,
        0xDE, 0xD0, 0x5E, 0x06, 0x20, 0x6C, 0x12, 0xC7, 0xB8, 0x42, 0x06, 0xA5, 0x75, 0x97, 0xA4, 0x81,
        0xA2, 0x1A, 0x36, 0xD7, 0xA2, 0x6F, 0xAA, 0x49, 0x53, 0x9F, 0xDB, 0xC2, 0x18, 0x20, 0x29, 0x2B,
        0x72, 0xC8, 0xE2, 0xEA, 0x6E, 0x61, 0xAE, 0x1D, 0xEF, 0x5E, 0x72, 0x24, 0xDB, 0xD4, 0x61, 0x92,
        0x0B, 0x18, 0x90, 0xC1, 0x48, 0xA5, 0x08, 0xF2, 0x86, 0x15, 0x8D, 0x5F, 0x4E, 0x58, 0xE4, 0x0C,
        0x93, 0x51, 0x0D, 0x4A, 0x28, 0x21, 0x87, 0x0D, 0xF0, 0x33, 0xDA, 0xFA, 0xAA, 0xC4, 0xE6, 0x24,
        0x9B, 0x3E, 0x52, 0x7F, 0xC6, 0x35, 0x30, 0x70, 0x07, 0xF9, 0x3D, 0x7E, 0x3E, 0xB4, 0x4B, 0x07,
        0x58, 0x20, 0xE6, 0x9E, 0xD8, 0x97, 0x62, 0xF1, 0x79, 0x78, 0xF4, 0xC3, 0x06, 0x15, 0xF8, 0x6E,
        0xA0, 0xF3, 0x08, 0x73, 0x58, 0x99, 0xED, 0xD7, 0xBD, 0xCF, 0x67, 0x41, 0x79, 0xFE, 0x0E, 0xE9,
        0x39, 0x5F, 0x99, 0xE0, 0x72, 0xBF, 0x5F, 0xAE, 0x4D, 0xCD, 0xFF, 0x6F, 0xC5, 0x0B, 0xCC, 0xB4,
        0xB1, 0x9B, 0xDE, 0xC2, 0x88, 0x26, 0xA6, 0xBA, 0xB1, 0xE9, 0xFA, 0xBE, 0x16, 0x34, 0x75, 0xBC,
        0x55, 0xC2, 0x69, 0x10, 0xB4, 0x19, 0xC0, 0xBE, 0xCE, 0x63, 0x45, 0x5A, 0x00, 0x8A, 0x31, 0x44,
        0x10, 0x48, 0xBF, 0x44, 0x35, 0x70, 0x1A, 0x08, 0x4D, 0xB3, 0xBC, 0x69, 0x65, 0xF4, 0x17, 0xB9,
        0x7A, 0x77, 0x8E, 0x6B, 0x90, 0xF4, 0x12, 0x18, 0x17, 0xED, 0xFC, 0xB1, 0x1F, 0x5F, 0xC1, 0x4A,
        0x4F, 0xF6, 0x00, 0xF1, 0x81, 0xBE, 0x84, 0xE8, 0x80, 0x01, 0xB8, 0xCB, 0x76, 0xF2, 0x34, 0xD9,
        0x5F, 0x08, 0xF0, 0x94, 0xA1, 0x3B, 0xF3, 0x1A, 0x4C, 0x1A, 0xF3, 0x40, 0x4C, 0x3F, 0xEE, 0x54,
        0x2B, 0xA3, 0x97, 0xE5, 0x9C, 0x9A, 0x4B, 0xEE, 0x98, 0x92, 0x15, 0xF4, 0x7E, 0xAF, 0xDF, 0x12,
        0xF7, 0x48, 0xE3, 0xE9, 0x3C, 0xB1, 0x33, 0x5A, 0x3E, 0xF5, 0xDA, 0x96, 0x9B, 0x4E, 0xA1, 0x51,
        0x04, 0x1C, 0xA6, 0x4A, 0x22, 0x56, 0x0F, 0x69, 0x6D, 0x7A, 0xC1, 0xB5, 0x22, 0x6B, 0xDB, 0xC7,
        0x98, 0xDD, 0xFC, 0x07, 0xDB, 0xBD, 0x3A, 0xE1, 0xDF, 0x02, 0x6B, 0x6F, 0x48, 0x61, 0x3C, 0xE7,
        0x42, 0xC6, 0x18, 0x2C, 0x25, 0x53, 0x35, 0x7E, 0xFD, 0xE6, 0x16, 0x0B, 0xCE, 0xF7, 0x09, 0xDD,
        0xCA, 0xD6, 0xF6, 0xD6, 0x06, 0x5C, 0x5D, 0x39, 0x8E, 0x89, 0x4E, 0x3C, 0x77, 0xA6, 0x77, 0x1E,
        0x6C, 0x4B, 0xC6, 0xDC, 0x43, 0x73, 0x78, 0x9B, 0xCB, 0xFA, 0xAF, 0x48, 0x34, 0x26, 0x42, 0xA1,
        0x9D, 0xDC, 0xCE, 0xD6, 0x2E, 0xDD, 0x79, 0x6A, 0x83, 0x2F, 0xB7, 0x86, 0x59, 0x8F, 0x57, 0xEC,
        0x51, 0xA4, 0x41, 0x12, 0x6A, 0xE6, 0x7F, 0x79, 0x4E, 0x7B, 0x18, 0x5C, 0xB7, 0x1C, 0x3F, 0x11,
        0xF9, 0xD1, 0xCD, 0xF5, 0x7E, 0xD5, 0xD8, 0x24, 0xCC, 0x81, 0x50, 0x20, 0xAC, 0xA1, 0xB8, 0xEE,
        0x55, 0x48, 0x9B, 0x00, 0xF1, 0x7E, 0x84, 0xE6, 0x0C, 0x00, 0x78, 0xF6, 0x0D, 0x8D, 0x1C, 0x9D,
        0x48, 0x6E, 0xBE, 0x4D, 0x92, 0x9E, 0x87, 0x22, 0x28, 0xEA, 0x24, 0xE8, 0x0A, 0x90, 0x38, 0x7E,
        0xB9, 0x1B, 0x4B, 0xD7, 0xDE, 0x62, 0x8D, 0x9A, 0xB7, 0x39, 0x26, 0x77, 0xBE, 0x93, 0xAC, 0x80,
        0xFD, 0x90, 0xBE, 0x36, 0x81, 0x41, 0x10, 0xB5, 0xB6, 0x08, 0x1E, 0xBD, 0xB1, 0x92, 0x0C, 0x9A,
        0xFF, 0x15, 0xAE, 0x2A, 0xEB, 0x5B, 0x96, 0x6D, 0xF4, 0x2F, 0x4E, 0xE2, 0x63, 0xF8, 0x0F, 0x64,
        0x88, 0xC8, 0x2D, 0xDC, 0x3F, 0x7C, 0x86, 0x44, 0x12, 0x07, 0xD4, 0x41, 0xCF, 0x62, 0x5C, 0x9E,
        0x7E, 0xDC, 0xD9, 0xC5, 0x04, 0x0B, 0x34, 0x22, 0xCB, 0x36, 0x29, 0x75, 0x43, 0x7C, 0xE6, 0x3E,
        0x96, 0xE6, 0xE6, 0x9C, 0x21, 0xFB, 0x70, 0x30, 0x6C, 0x8A, 0xAA, 0xC9, 0xA4, 0x29, 0xE2, 0x3C,
        0xFB, 0xC9, 0x4A, 0x00, 0x3F, 0x37, 0x64, 0x00, 0xA6, 0x1D, 0xA6, 0x1B, 0x90, 0x02, 0x03, 0x01,
        0x95, 0x01, 0x10, 0x96, 0x01, 0x00, 0x80, 0x01, 0x88, 0x81, 0x01, 0x10, 0x82, 0x01, 0x01, 0x83,
        0x01, 0x35, 0x91, 0x03, 0x00, 0x00, 0x01, 0x7F, 0x49, 0x41, 0x04, 0x24, 0x1E, 0x32, 0x22, 0xF2,
        0xAF, 0x04, 0x25, 0xE0, 0x73, 0x02, 0x4E, 0x66, 0x7B, 0x62, 0xDB, 0x6A, 0x87, 0x19, 0xFE, 0x99,
        0x20, 0x16, 0x4F, 0xBC, 0x2F, 0xA7, 0x98, 0xF7, 0xED, 0x3B, 0xE2, 0xE5, 0xE1, 0x80, 0x3B, 0x8B,
        0xE2, 0x3D, 0x6B, 0x3E, 0xC5, 0xBD, 0x8B, 0x38, 0x1E, 0xA5, 0x8A, 0xEE, 0x3B, 0x30, 0x26, 0x5B,
        0x66, 0xCB, 0x97, 0x38, 0x55, 0xBA, 0x27, 0x9A, 0x30, 0xB0, 0xC3, 0x3F, 0x38, 0x20, 0x8C, 0x9D,
        0x3A, 0x6F, 0xC9, 0x96, 0x58, 0x4B, 0x3B, 0xD2, 0x96, 0x5D, 0x0C, 0x04, 0xDC, 0xCD, 0xA8, 0x59,
        0x0F, 0x71, 0x92, 0x21, 0x54, 0xE5, 0xA4, 0xED, 0x1F, 0x26, 0x87, 0xAA, 0x26, 0x92
    };

    uint8_t sig_r[] = {
        0xb5, 0x62, 0x56, 0x1f, 0x31, 0x68, 0x32, 0x8b, 0x9e, 0x98, 0xaa, 0x50, 0xe3, 0x2e, 0xf4, 0x09,
        0x05, 0x67, 0xd4, 0x65, 0x2d, 0x46, 0xb3, 0xe2, 0x80, 0xbf, 0xe1, 0x7e, 0x21, 0x55, 0xc5, 0x97
    };
    uint8_t sig_s[] = {
        0x93, 0x0e, 0xc0, 0x4b, 0x69, 0xd1, 0xfb, 0xde, 0x19, 0x54, 0x48, 0x12, 0x51, 0x56, 0xe4, 0x6a,
        0x45, 0x81, 0xce, 0x69, 0x18, 0x04, 0x42, 0x9c, 0x4c, 0xbc, 0xaf, 0x77, 0x61, 0x55, 0x7f, 0xb9
    };

    hex_print_tag_debug("in", in, sizeof(in));
    hex_print_tag_debug("signature.r", sig_r, sizeof(sig_r));
    hex_print_tag_debug("signature.s", sig_s, sizeof(sig_s));
    hex_print_tag_debug("public key", pub, sizeof(pub));

    crypto_regen_ecc_pubkey(&regen_eccKey, pub, sizeof(pub));

    LOGD("crypto_ecdsa_verify test");
    crypto_ecdsa_verify_with_sha256(regen_eccKey.ecc_keypair, in, sizeof(in), sig_r, sizeof(sig_r), sig_s, sizeof(sig_s));

#endif

}

void ecdsa_test_2() {
    ecc_key_t eccKey;
    uint8_t testIn[SSP_AP_ID_SIZE] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10};
    uint8_t sig_r[32], sig_s[32];
    int32_t sig_r_len, sig_s_len;
    int32_t i, case_cnt = 0, loop_cnt = 10;

    for (i = 0 ; i < loop_cnt ; i++) {
        LOGD("cnt : %d", i);
        crypto_gen_ecc_key(&eccKey );
        crypto_ecdsa_sign_with_sha256(eccKey.ecc_keypair, testIn, sizeof(testIn), sig_r, &sig_r_len, sig_s, &sig_s_len);
        if ((sig_r_len < 32 && (int)sig_r[0] > 128 ) || (sig_s_len < 32 && (int)sig_s[0] > 128)) {
            hex_print_tag_debug("signature.r", sig_r, sig_r_len);
            hex_print_tag_debug("signature.s", sig_s, sig_s_len);
            case_cnt++;
        }
        crypto_ecdsa_verify_with_sha256(eccKey.ecc_keypair, testIn, sizeof(testIn), sig_r, sig_r_len, sig_s, sig_s_len);
        crypto_clear_ecc_context(&eccKey);
    }
    LOGD("Case cnt : %d", case_cnt);
}

void testGeneratePutCertData() {
    uint8_t test_root_cert[] = {
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F};

    uint8_t test_service_cert[] = {
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB0, 0x3F,
        0x02, 0xAD, 0x7B, 0x77, 0xE9, 0xE2, 0x10, 0xC2, 0x7B, 0xC0, 0x04, 0x56, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x21, 0x81, 0xC8, 0x93, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x42, 0x0A, 0x63, 0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x5F, 0x20, 0x0A, 0x63,
        0x64, 0x16, 0x00, 0x20, 0x00, 0x00, 0x00, 0x03, 0x2F, 0x95, 0x02, 0x00, 0x80, 0x5F, 0x24, 0x04,
        0x20, 0x22, 0x03, 0x06, 0x45, 0x0A, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
        0x7F, 0x49, 0x46, 0xB0, 0x41, 0x04, 0x18, 0xF1, 0x24, 0xE0, 0xB4, 0xA6, 0xD9, 0x64, 0xCE, 0xFC,
        0x84, 0x53, 0xED, 0x90, 0x3D, 0x52, 0xF1, 0xB8, 0xC8, 0x52, 0x58, 0xFE, 0x5B, 0x24, 0x59, 0x77,
        0x6C, 0x06, 0x30, 0xDC, 0x02, 0xFE, 0xF6, 0xD0, 0xB0, 0x82, 0xD6, 0xD1, 0x0B, 0x1E, 0xA7, 0x28,
        0xA5, 0x00, 0x37, 0xAE, 0x69, 0xEB, 0xD7, 0xCC, 0xA1, 0x0B, 0x1C, 0x73, 0xDA, 0x8A, 0xC3, 0xC2,
        0x87, 0xD2, 0x70, 0x4B, 0xF3, 0x25, 0xF0, 0x01, 0x00, 0x5F, 0x37, 0x40, 0xB0, 0x1A, 0x15, 0x1F,
        0x32, 0xDB, 0x4D, 0xD6, 0x0F, 0x30, 0xD3, 0xC5, 0xF0, 0x60, 0x9F, 0xA3, 0x4D, 0xF5, 0x4A, 0x1A,
        0xD2, 0x6B, 0x8C, 0xDF, 0x66, 0x53, 0xBF, 0xF0, 0x92, 0xE2, 0x4E, 0xFA, 0xF2, 0xDD, 0xE1, 0xF1,
        0xD4, 0x0F, 0xD2, 0x15, 0x22, 0x46, 0x30, 0x1D, 0xC9, 0x0F, 0x79, 0x9F, 0x50, 0xFC, 0xB7, 0x3D};

    uint8_t test_out[SSP_MAX_X509_CERT_SIZE + SSP_MAX_X509_CERT_SIZE + 32];
    uint32_t test_out_size;

    hex_print_tag_debug("test in", test_root_cert, sizeof(test_root_cert));
    generatePutCertData(test_root_cert, sizeof(test_root_cert), test_service_cert, sizeof(test_service_cert), test_out, &test_out_size);
    hex_print_tag_debug("test_out", test_out, test_out_size);

}

void crypto_test() {
    rsa_test();
    //sha_test();
    //ecdsa_test();
    //ecdsa_test_2();
    //testGeneratePutCertData();
    //generate_otp_key_test();
}
#endif

