|
@@ -0,0 +1,74 @@
|
|
|
+#include <cstring>
|
|
|
+
|
|
|
+#include "sgx_tcrypto.h"
|
|
|
+#include "sgx_tseal.h"
|
|
|
+#include "Enclave_t.h"
|
|
|
+#include "utils.hpp"
|
|
|
+
|
|
|
+// Our public and private identity keys
|
|
|
+sgx_ec256_private_t g_privkey;
|
|
|
+sgx_ec256_public_t g_pubkey;
|
|
|
+
|
|
|
+// Generate a new identity signature key. Output the public key and the
|
|
|
+// sealed private key. outsealedpriv must point to
|
|
|
+// sizeof(sgx_sealed_data_t) + sizeof(sgx_ec256_private_t) + 19 bytes of
|
|
|
+// memory.
|
|
|
+void ecall_identity_key_new(sgx_ec256_public_t *outpub,
|
|
|
+ sgx_sealed_data_t *outsealedpriv)
|
|
|
+{
|
|
|
+ sgx_ecc_state_handle_t ecc_handle;
|
|
|
+
|
|
|
+ sgx_ecc256_open_context(&ecc_handle);
|
|
|
+
|
|
|
+ sgx_ecc256_create_key_pair(&g_privkey, &g_pubkey, ecc_handle);
|
|
|
+ memmove(outpub, &g_pubkey, sizeof(g_pubkey));
|
|
|
+
|
|
|
+ sgx_ecc256_close_context(ecc_handle);
|
|
|
+
|
|
|
+ sgx_seal_data(19, (const uint8_t*)"TEEMS Identity key",
|
|
|
+ sizeof(g_privkey), (const uint8_t*)&g_privkey,
|
|
|
+ sizeof(sgx_sealed_data_t) + sizeof(sgx_ec256_private_t) + 19,
|
|
|
+ outsealedpriv);
|
|
|
+}
|
|
|
+
|
|
|
+// Load an identity key from a sealed privkey. Output the resulting
|
|
|
+// public key. insealedpriv must point to sizeof(sgx_sealed_data_t) +
|
|
|
+// sizeof(sgx_ec256_private_t) bytes of memory. Returns true for
|
|
|
+// success, false for failure.
|
|
|
+bool ecall_identity_key_load(sgx_ec256_public_t *outpub,
|
|
|
+ const sgx_sealed_data_t *insealedpriv)
|
|
|
+{
|
|
|
+ sgx_ecc_state_handle_t ecc_handle;
|
|
|
+
|
|
|
+ char aad[19];
|
|
|
+ uint32_t aadsize = sizeof(aad);
|
|
|
+ sgx_ec256_private_t privkey;
|
|
|
+ uint32_t privkeysize = sizeof(privkey);
|
|
|
+ sgx_status_t res = sgx_unseal_data(
|
|
|
+ insealedpriv, (uint8_t*)aad, &aadsize,
|
|
|
+ (uint8_t*)&privkey, &privkeysize);
|
|
|
+
|
|
|
+ if (res || aadsize != sizeof(aad) || privkeysize != sizeof(privkey)
|
|
|
+ || memcmp(aad, "TEEMS Identity key", sizeof(aad))) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ sgx_ecc256_open_context(&ecc_handle);
|
|
|
+
|
|
|
+ sgx_ec256_public_t pubkey;
|
|
|
+ int valid;
|
|
|
+ if (sgx_ecc256_calculate_pub_from_priv(&privkey, &pubkey) ||
|
|
|
+ sgx_ecc256_check_point(&pubkey, ecc_handle, &valid) ||
|
|
|
+ !valid) {
|
|
|
+ sgx_ecc256_close_context(ecc_handle);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ sgx_ecc256_close_context(ecc_handle);
|
|
|
+
|
|
|
+ memmove(&g_pubkey, &pubkey, sizeof(pubkey));
|
|
|
+ memmove(&g_privkey, &privkey, sizeof(privkey));
|
|
|
+ memmove(outpub, &pubkey, sizeof(pubkey));
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|