- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
here is my program where i create, increase and read a monotonic counter.
Because i am new here. I want your opinion. Is that code safe - trusted and isolated?
May i have to add something else?
thanks a lot George
#include "Enclave_t.h" #include "sgx_tae_service.h" #include "sgx.h" #include "sgx_tcrypto.h" #include <stdio.h> #include "sgx_trts.h" #include "Enclave.h" #include <string.h> #include <sgx_cpuid.h> #include <cstring> // monotonic counter sgx_mc_uuid_t counter_uuid; void check_sgx_status(sgx_status_t &ret); uint32_t latest_counter; void ecall_sgx_read_rand(unsigned char *ptr, int len) { sgx_status_t ret = sgx_read_rand(ptr, len); if (ret != SGX_SUCCESS) abort(); } int test_ecc(void) { int i; sgx_status_t ret; sgx_ecc_state_handle_t ecc_handle; sgx_ec256_private_t p_private; sgx_ec256_public_t p_public; sgx_ec256_signature_t p_signature; uint8_t sample_data[8] = {0x12, 0x13, 0x3f, 0x00, 0x9a, 0x02, 0x10, 0x53}; ret = sgx_ecc256_open_context(&ecc_handle); if (ret != SGX_SUCCESS) { switch (ret) { case SGX_ERROR_OUT_OF_MEMORY: ocall_print("SGX_ERROR_OUT_OF_MEMORY"); break; case SGX_ERROR_UNEXPECTED: ocall_print("SGX_ERROR_UNEXPECTED"); break; } } // create private, public key pair ret = sgx_ecc256_create_key_pair(&p_private, &p_public, ecc_handle); ocall_print("ecc private key"); ocall_uint8_t_print(p_private.r, SGX_ECP256_KEY_SIZE); ocall_print("ecc public key.gx"); ocall_uint8_t_print(p_public.gx, SGX_ECP256_KEY_SIZE); ocall_print("ecc public key.gy"); ocall_uint8_t_print(p_public.gy, SGX_ECP256_KEY_SIZE); // create digital signature used ecc ret = sgx_ecdsa_sign(sample_data, sizeof(sample_data) / sizeof(sample_data[0]), &p_private, &p_signature, ecc_handle); ocall_print("ecdsa signature x"); ocall_uint32_t_print(p_signature.x, SGX_NISTP_ECP256_KEY_SIZE); ocall_print("ecdsa signature y"); ocall_uint32_t_print(p_signature.y, SGX_NISTP_ECP256_KEY_SIZE); if (ret != SGX_SUCCESS) { ocall_print("ecdsa sign error"); } // print p_signature uint8_t p_result; ret = sgx_ecdsa_verify(sample_data, 8, &p_public, &p_signature, &p_result, ecc_handle); ocall_print("verify result"); ocall_uint8_t_print(&p_result, 1); // 0 on success, 1 on fail ret = sgx_ecc256_close_context(ecc_handle); if (ret != SGX_SUCCESS) { ocall_print("ecc256 close fails"); } sgx_sha256_hash_t p_hash; sgx_sha256_msg(sample_data, 8, &p_hash); ocall_print("sha256"); ocall_uint8_t_print(p_hash, SGX_SHA256_HASH_SIZE); } uint32_t create_counter(void) { sgx_status_t ret; int busy_retry_times = 2; do { ret = sgx_create_pse_session(); } while (ret == SGX_ERROR_BUSY && busy_retry_times--); if (ret != SGX_SUCCESS) return ret; ret = sgx_create_monotonic_counter(&counter_uuid, &latest_counter); check_sgx_status(ret); sgx_close_pse_session(); return latest_counter; } uint32_t increment_counter(void) { sgx_status_t ret; int busy_retry_times = 2; do { ret = sgx_create_pse_session(); } while (ret == SGX_ERROR_BUSY && busy_retry_times--); if (ret != SGX_SUCCESS) return ret; ret = sgx_increment_monotonic_counter(&counter_uuid, &latest_counter); check_sgx_status(ret); sgx_close_pse_session(); return latest_counter; } uint32_t read_counter(uint32_t *ctr) { sgx_status_t ret ; int busy_retry_times = 2; do { ret = sgx_create_pse_session(); } while (ret == SGX_ERROR_BUSY && busy_retry_times--); if (ret != SGX_SUCCESS) return ret; ret = sgx_read_monotonic_counter(&counter_uuid, &latest_counter); check_sgx_status(ret); sgx_close_pse_session(); *ctr = latest_counter; return latest_counter; } uint32_t destroy_counter(void) { sgx_status_t ret ; int busy_retry_times = 2; do { ret = sgx_create_pse_session(); } while (ret == SGX_ERROR_BUSY && busy_retry_times--); if (ret != SGX_SUCCESS) return ret; ret = sgx_destroy_monotonic_counter(&counter_uuid); check_sgx_status(ret); sgx_close_pse_session(); return latest_counter; } void check_sgx_status(sgx_status_t &ret) { if(ret != SGX_SUCCESS) { switch(ret) { case SGX_ERROR_SERVICE_UNAVAILABLE: /* Architecture Enclave Service Manager is not installed or not working properly.*/ break; case SGX_ERROR_SERVICE_TIMEOUT: /* retry the operation later*/ break; case SGX_ERROR_BUSY: /* retry the operation later*/ break; case SGX_ERROR_MC_OVER_QUOTA: /* SGX Platform Service enforces a quota scheme on the Monotonic Counters a SGX app can maintain. the enclave has reached the quota.*/ break; case SGX_ERROR_MC_USED_UP: /* the Monotonic Counter has been used up and cannot create Monotonic Counter anymore.*/ break; default: /*other errors*/ break; } } }
Link Copied
0 Replies

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page