Skip to content
This repository was archived by the owner on Jul 25, 2024. It is now read-only.

Commit d65bf51

Browse files
author
wanghouqi
committed
dkey rotation
Signed-off-by: wanghouqi <[email protected]>
1 parent 02c8fc4 commit d65bf51

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+5840
-435
lines changed

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131

3232
include buildenv.mk
3333

34-
SUB_DIR := utils/tkey_exchange utils/ukey_exchange core dkeycache dkeyserver enroll_app
34+
SUB_DIR := utils/tkey_exchange utils/ukey_exchange core dkeycache dkeyserver dkeyserver/dkeyrotation enroll_app
3535
SSL_DIR := third_party/intel-sgx-ssl
3636
export DESTDIR = ${OPENSSL_PATH}
3737

core/App/ehsm_provider.cpp

+77-6
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include <sgx_error.h>
4343
#include <sgx_eid.h>
4444
#include <sgx_urts.h>
45+
#include <thread>
46+
#include <sys/un.h>
4547

4648
#include "enclave_hsm_u.h"
4749
#include "ehsm_provider.h"
@@ -93,6 +95,48 @@ sgx_ra_context_t g_context = INT_MAX;
9395

9496
sgx_enclave_id_t g_enclave_id;
9597

98+
#define UNIX_DOMAIN (std::string(RUNTIME_FOLDER) + "dkeyprovision.sock").c_str()
99+
100+
bool g_ready_flag = true;
101+
102+
int server_sock_fd;
103+
104+
void recv_msg()
105+
{
106+
int byte_num;
107+
_response_header_t *res_msg = (_response_header_t*)malloc(sizeof(_response_header_t));
108+
109+
do
110+
{
111+
uint32_t sgxStatus;
112+
sgx_status_t ret;
113+
114+
byte_num = recv(server_sock_fd, reinterpret_cast<char *>(res_msg), sizeof(_response_header_t), 0);
115+
if (byte_num > 0)
116+
{
117+
if (res_msg->type == MSG_ROTATE_END)
118+
{
119+
ret = enclave_la_message_exchange(g_enclave_id, &sgxStatus);
120+
if (ret != SGX_SUCCESS || sgxStatus != SGX_SUCCESS)
121+
{
122+
log_e("test_message_exchange Ecall failed: ECALL return 0x%x, error code is 0x%x.\n", ret, sgxStatus);
123+
return;
124+
}
125+
log_i("update dk\n");
126+
127+
g_ready_flag = true;
128+
log_i("ready flag change to %s\n", g_ready_flag == true ? "true" : "false");
129+
}
130+
else if (res_msg->type == MSG_ROTATE_START)
131+
{
132+
g_ready_flag = false;
133+
log_i("ready flag change to %s\n", g_ready_flag == true ? "true" : "false");
134+
}
135+
}
136+
137+
} while (1);
138+
}
139+
96140
static ehsm_status_t SetupSecureChannel(sgx_enclave_id_t eid)
97141
{
98142
uint32_t sgxStatus;
@@ -117,13 +161,30 @@ static ehsm_status_t SetupSecureChannel(sgx_enclave_id_t eid)
117161
log_i("Succeed to exchange secure message...\n");
118162

119163
// close ECDH session
120-
ret = enclave_la_close_session(eid, &sgxStatus);
121-
if (ret != SGX_SUCCESS || sgxStatus != SGX_SUCCESS)
164+
// ret = enclave_la_close_session(eid, &sgxStatus);
165+
// if (ret != SGX_SUCCESS || sgxStatus != SGX_SUCCESS)
166+
// {
167+
// log_e("test_close_session Ecall failed: ECALL return 0x%x, error code is 0x%x.\n", ret, sgxStatus);
168+
// return EH_LA_CLOSE_ERROR;
169+
// }
170+
// log_i("Succeed to close Session...\n");
171+
172+
server_sock_fd = socket(PF_UNIX, SOCK_STREAM, 0);
173+
if (server_sock_fd == -1)
122174
{
123-
log_e("test_close_session Ecall failed: ECALL return 0x%x, error code is 0x%x.\n", ret, sgxStatus);
124-
return EH_LA_CLOSE_ERROR;
175+
log_e("socket error");
176+
return EH_FUNCTION_FAILED;
125177
}
126-
log_i("Succeed to close Session...\n");
178+
179+
struct sockaddr_un server_addr;
180+
server_addr.sun_family = AF_UNIX;
181+
strcpy(server_addr.sun_path, UNIX_DOMAIN);
182+
183+
if (connect(server_sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) >= 0)
184+
log_w("socket connect ok");
185+
186+
std::thread thread(recv_msg);
187+
thread.detach();
127188

128189
return EH_OK;
129190
}
@@ -209,7 +270,17 @@ uint32_t EHSM_FFI_CALL(const char *reqJson, char *respJson)
209270
RetJsonObj retJsonObj;
210271
uint32_t action = -1;
211272
JsonObj payloadJson;
212-
if(respJson == NULL){
273+
274+
if (g_ready_flag == false)
275+
{
276+
retJsonObj.setCode(retJsonObj.CODE_FAILED);
277+
retJsonObj.setMessage("rotating.");
278+
retJsonObj.toChar(respJson);
279+
return EH_GENERAL_ERROR;
280+
}
281+
282+
if (respJson == NULL)
283+
{
213284
retJsonObj.setCode(retJsonObj.CODE_FAILED);
214285
retJsonObj.setMessage("Argument bad.");
215286
retJsonObj.toChar(respJson);

core/Enclave/enclave_hsm.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,13 @@
3131

3232
#include "enclave_hsm_t.h"
3333
#include "openssl/rand.h"
34+
#include "openssl/sha.h"
3435
#include "datatypes.h"
3536
#include "key_factory.h"
3637
#include "key_operation.h"
3738

39+
extern sgx_aes_gcm_256bit_key_t g_domain_key;
40+
3841
using namespace std;
3942

4043
// Used to store the secret passed by the SP in the sample code.
@@ -109,6 +112,17 @@ static size_t get_signature_length(ehsm_keyspec_t keyspec)
109112
}
110113
}
111114

115+
void compute_dk_hash(ehsm_keyblob_t *cmk)
116+
{
117+
SHA256_CTX ctx;
118+
SHA256_Init(&ctx);
119+
unsigned int len = SGX_DOMAIN_KEY_SIZE;
120+
unsigned char result[SHA256_DIGEST_LENGTH] = {0};
121+
SHA256_Update(&ctx, g_domain_key, len);
122+
SHA256_Final(result, &ctx);
123+
memcpy(cmk->metadata.dk_hashcode, result, SHA256_DIGEST_LENGTH);
124+
}
125+
112126
sgx_status_t enclave_create_key(ehsm_keyblob_t *cmk, size_t cmk_size)
113127
{
114128
sgx_status_t ret = SGX_ERROR_UNEXPECTED;
@@ -120,6 +134,8 @@ sgx_status_t enclave_create_key(ehsm_keyblob_t *cmk, size_t cmk_size)
120134
return SGX_ERROR_INVALID_PARAMETER;
121135
}
122136

137+
compute_dk_hash(cmk);
138+
123139
switch (cmk->metadata.keyspec)
124140
{
125141
case EH_AES_GCM_128:

core/Enclave/key_factory.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ sgx_status_t ehsm_create_keyblob(uint8_t *plaintext,
115115
if (SGX_SUCCESS != ret)
116116
{
117117
log_e("gcm encrypting failed.\n");
118-
}
118+
}
119119
else
120120
{
121121
keyblob_data->ciphertext_size = plaintext_size;
@@ -331,7 +331,7 @@ sgx_status_t ehsm_create_rsa_key(ehsm_keyblob_t *cmk)
331331
if (bio)
332332
BIO_free(bio);
333333
if (e)
334-
BN_free(e);
334+
BN_free(e);
335335

336336
SAFE_MEMSET(pem_keypair, key_size, 0, key_size);
337337
SAFE_FREE(pem_keypair);

core/Test/function_test.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -1376,27 +1376,27 @@ void function_test()
13761376
{
13771377
test_symmertric_encrypt_decrypt();
13781378

1379-
test_symmertric_encrypt_decrypt_without_aad();
1379+
// test_symmertric_encrypt_decrypt_without_aad();
13801380

1381-
test_RSA_encrypt_decrypt();
1381+
// test_RSA_encrypt_decrypt();
13821382

1383-
test_RSA_sign_verify();
1383+
// test_RSA_sign_verify();
13841384

1385-
test_sm2_sign_verify();
1385+
// test_sm2_sign_verify();
13861386

1387-
test_ec_sign_verify();
1387+
// test_ec_sign_verify();
13881388

1389-
test_SM2_encrypt_decrypt();
1389+
// test_SM2_encrypt_decrypt();
13901390

1391-
test_generate_AES_datakey();
1391+
// test_generate_AES_datakey();
13921392

1393-
test_generate_SM4_datakey();
1393+
// test_generate_SM4_datakey();
13941394

1395-
test_export_datakey();
1395+
// test_export_datakey();
13961396

1397-
test_GenerateQuote_and_VerifyQuote();
1397+
// test_GenerateQuote_and_VerifyQuote();
13981398

1399-
test_Enroll();
1399+
// test_Enroll();
14001400

14011401
log_i("All of tests done. %d/%d success\n", success_number, case_number);
14021402
}

0 commit comments

Comments
 (0)