occlum/demos/local_attestation/DiffieHellmanLibrary/DiffieHellmanLibrary.patch
2023-04-18 13:12:37 +08:00

387 lines
13 KiB
Diff

From a99d284c16a46f02bff4ff56c8e7361ebc0ae7b2 Mon Sep 17 00:00:00 2001
From: "Hui,Chunyang" <sanqian.hcy@antfin.com>
Date: Tue, 3 Mar 2020 09:45:53 +0000
Subject: [PATCH] Diffie-hellman library change for Occlum local attestation
demo
---
.../DiffieHellmanLibrary/crypto_aes_gcm.cpp | 7 +-
.../DiffieHellmanLibrary/ec_dh.cpp | 221 +++++++++++++++++-
.../include/sgx_dh_internal.h | 3 +-
.../DiffieHellmanLibrary/sgx_cmac128.cpp | 1 -
.../DiffieHellmanLibrary/sgx_ecc256.cpp | 11 +-
.../DiffieHellmanLibrary/sgx_sha256_msg.cpp | 1 -
6 files changed, 225 insertions(+), 19 deletions(-)
diff --git a/demos/local_attestation/DiffieHellmanLibrary/crypto_aes_gcm.cpp b/demos/local_attestation/DiffieHellmanLibrary/crypto_aes_gcm.cpp
index 329338b..bb0c604 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/crypto_aes_gcm.cpp
+++ b/demos/local_attestation/DiffieHellmanLibrary/crypto_aes_gcm.cpp
@@ -31,8 +31,7 @@
#include "stdlib.h"
#include "string.h"
-#include "ssl_crypto.h"
-#include "sgx_memset_s.h"
+#include "sgx_tcrypto.h"
#include <openssl/aes.h>
#include <openssl/evp.h>
@@ -143,7 +142,7 @@ sgx_status_t sgx_rijndael128GCM_decrypt(const sgx_aes_gcm_128bit_key_t *p_key, c
// Autenthication Tag returned by Decrypt to be compared with Tag created during seal
//
- memset_s(&l_tag, SGX_AESGCM_MAC_SIZE, 0, SGX_AESGCM_MAC_SIZE);
+ memset(&l_tag, 0, SGX_AESGCM_MAC_SIZE);
memcpy(l_tag, p_in_mac, SGX_AESGCM_MAC_SIZE);
do {
@@ -205,6 +204,6 @@ sgx_status_t sgx_rijndael128GCM_decrypt(const sgx_aes_gcm_128bit_key_t *p_key, c
{
EVP_CIPHER_CTX_free(pState);
}
- memset_s(&l_tag, SGX_AESGCM_MAC_SIZE, 0, SGX_AESGCM_MAC_SIZE);
+ memset(&l_tag, 0, SGX_AESGCM_MAC_SIZE);
return ret;
}
diff --git a/demos/local_attestation/DiffieHellmanLibrary/ec_dh.cpp b/demos/local_attestation/DiffieHellmanLibrary/ec_dh.cpp
index 40c1539..dd8ab9e 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/ec_dh.cpp
+++ b/demos/local_attestation/DiffieHellmanLibrary/ec_dh.cpp
@@ -29,21 +29,25 @@
*
*/
-#include <sgx_secure_align.h>
+#define __STDC_WANT_LIB_EXT1__ 1
#include <limits.h>
-#include "stdlib.h"
-#include "string.h"
+#include <stdlib.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <unistd.h>
+#include "sgx_secure_align.h"
#include "sgx.h"
#include "sgx_defs.h"
-#include "sgx_utils.h"
#include "sgx_ecp_types.h"
#include "sgx_key.h"
#include "sgx_report.h"
#include "sgx_attributes.h"
-#include "sgx_trts.h"
#include "ecp_interface.h"
#include "sgx_dh_internal.h"
#include "sgx_lfence.h"
+#include "sgx_dh.h"
#define NONCE_SIZE 16
#define MSG_BUF_LEN (static_cast<uint32_t>(sizeof(sgx_ec256_public_t)*2))
@@ -53,6 +57,213 @@
#define SAFE_FREE(ptr) {if (NULL != (ptr)) {free(ptr); (ptr)=NULL;}}
#endif
+typedef struct {
+ const sgx_target_info_t* target_info; // input (optional)
+ const sgx_report_data_t* report_data; // input (optional)
+ sgx_report_t* report; // output
+} sgxioc_create_report_arg_t;
+
+#define SGXIOC_SELF_TARGET _IOR('s', 3, sgx_target_info_t)
+#define SGXIOC_CREATE_REPORT _IOWR('s', 4, sgxioc_create_report_arg_t)
+#define SGXIOC_VERIFY_REPORT _IOW('s', 5, sgx_report_t)
+
+sgx_status_t sgx_create_report(const sgx_target_info_t *target_info, const sgx_report_data_t *report_data, sgx_report_t *report)
+{
+ sgxioc_create_report_arg_t arg;
+ arg.target_info = target_info;
+ arg.report_data = report_data;
+ arg.report=report;
+ int sgx_fd;
+
+ if ((sgx_fd = open("/dev/sgx", O_RDONLY)) < 0) {
+ printf("open sgx device error\n");
+ return SGX_ERROR_UNEXPECTED;
+ }
+
+ if (ioctl(sgx_fd, SGXIOC_CREATE_REPORT, &arg) < 0) {
+ close(sgx_fd);
+ printf("ioctl error\n");
+ return SGX_ERROR_UNEXPECTED;
+ }
+ close(sgx_fd);
+ return SGX_SUCCESS;
+}
+
+sgx_status_t sgx_verify_report(const sgx_report_t *report)
+{
+ int sgx_fd;
+ if ((sgx_fd = open("/dev/sgx", O_RDONLY)) < 0) {
+ return SGX_ERROR_UNEXPECTED;
+ }
+ if (ioctl(sgx_fd, SGXIOC_VERIFY_REPORT, report) < 0) {
+ printf("failed to verify report");
+ close(sgx_fd);
+ return SGX_ERROR_UNEXPECTED;
+ }
+ close(sgx_fd);
+ return SGX_SUCCESS;
+}
+
+const sgx_report_t *sgx_self_report(void)
+{
+ static sgx_report_t _report = {
+ .body = {
+ .cpu_svn = {0},
+ .misc_select = 0,
+ .reserved1 = {0},
+ .isv_ext_prod_id = {0},
+ .attributes = {0, 0},
+ .mr_enclave = {0},
+ .reserved2 = {0},
+ .mr_signer = {0},
+ .reserved3 = {0},
+ .config_id = {0},
+ .isv_prod_id = 0,
+ .isv_svn = 0,
+ .config_svn = 0,
+ .reserved4 = {0},
+ .isv_family_id = {0},
+ .report_data = {0}
+ },
+ .key_id = {0},
+ .mac = {0}
+ };
+ if (0 == _report.body.attributes.flags)
+ sgx_create_report(nullptr, nullptr, &_report);
+
+ return &_report;
+}
+
+#ifndef ERROR_BREAK
+#define ERROR_BREAK(x) if(x != ippStsNoErr){break;}
+#endif
+#ifndef NULL_BREAK
+#define NULL_BREAK(x) if(!x){break;}
+#endif
+#ifndef SAFE_FREE
+#define SAFE_FREE(ptr) {if (NULL != (ptr)) {free(ptr); (ptr)=NULL;}}
+#endif
+
+#define MAC_KEY_SIZE 16
+
+#define EC_DERIVATION_BUFFER_SIZE(label_length) ((label_length) +4)
+
+sgx_status_t derive_key(
+ const sgx_ec256_dh_shared_t* shared_key,
+ const char* label,
+ uint32_t label_length,
+ sgx_ec_key_128bit_t* derived_key)
+{
+ sgx_status_t se_ret = SGX_SUCCESS;
+ uint8_t cmac_key[MAC_KEY_SIZE];
+ sgx_ec_key_128bit_t key_derive_key;
+ if (!shared_key || !derived_key || !label) {
+ return SGX_ERROR_INVALID_PARAMETER;
+ }
+
+ /*check integer overflow */
+ if (label_length > EC_DERIVATION_BUFFER_SIZE(label_length)) {
+ return SGX_ERROR_INVALID_PARAMETER;
+ }
+ memset(cmac_key, 0, MAC_KEY_SIZE);
+ se_ret = sgx_rijndael128_cmac_msg((sgx_cmac_128bit_key_t *)cmac_key,
+ (uint8_t*)shared_key,
+ sizeof(sgx_ec256_dh_shared_t),
+ (sgx_cmac_128bit_tag_t *)&key_derive_key);
+ if (SGX_SUCCESS != se_ret) {
+ memset(&key_derive_key, 0, sizeof(key_derive_key));
+ INTERNAL_SGX_ERROR_CODE_CONVERTOR(se_ret);
+ return se_ret;
+ }
+ /* derivation_buffer = counter(0x01) || label || 0x00 || output_key_len(0x0080) */
+ uint32_t derivation_buffer_length = EC_DERIVATION_BUFFER_SIZE(label_length);
+ uint8_t *p_derivation_buffer = (uint8_t *)malloc(derivation_buffer_length);
+ if (p_derivation_buffer == NULL) {
+ return SGX_ERROR_OUT_OF_MEMORY;
+ }
+ memset(p_derivation_buffer, 0, derivation_buffer_length);
+
+ /*counter = 0x01 */
+ p_derivation_buffer[0] = 0x01;
+ /*label*/
+ memcpy(&p_derivation_buffer[1], label, label_length);
+ /*output_key_len=0x0080*/
+ uint16_t *key_len = (uint16_t *)&p_derivation_buffer[derivation_buffer_length - 2];
+ *key_len = 0x0080;
+
+ se_ret = sgx_rijndael128_cmac_msg((sgx_cmac_128bit_key_t *)&key_derive_key,
+ p_derivation_buffer,
+ derivation_buffer_length,
+ (sgx_cmac_128bit_tag_t *)derived_key);
+ memset(&key_derive_key, 0, sizeof(key_derive_key));
+ free(p_derivation_buffer);
+ if(SGX_SUCCESS != se_ret) {
+ INTERNAL_SGX_ERROR_CODE_CONVERTOR(se_ret);
+ }
+ return se_ret;
+}
+
+static void * (* const volatile __memset_vp)(void *, int, size_t)
+ = (memset);
+
+#undef memset_s /* in case it was defined as a macro */
+
+int memset_s(void *s, size_t smax, int c, size_t n)
+{
+ int err = 0;
+
+ if (s == NULL) {
+ err = -1;
+ goto out;
+ }
+ if (smax > SIZE_MAX) {
+ err = -1;
+ goto out;
+ }
+ if (n > SIZE_MAX) {
+ err = -1;
+ n = smax;
+ }
+ if (n > smax) {
+ err = -1;
+ n = smax;
+ }
+
+ /* Calling through a volatile pointer should never be optimised away. */
+ (*__memset_vp)(s, c, n);
+
+out:
+ if (err == 0)
+ return 0;
+ else {
+ /* XXX call runtime-constraint handler */
+ return err;
+ }
+}
+
+int consttime_memequal(const void *b1, const void *b2, size_t len)
+{
+ const unsigned char *c1 = (const unsigned char *)b1, *c2 =(const unsigned char *) b2;
+ unsigned int res = 0;
+
+ while (len--)
+ res |= *c1++ ^ *c2++;
+
+ /*
+ * Map 0 to 1 and [1, 256) to 0 using only constant-time
+ * arithmetic.
+ *
+ * This is not simply `!res' because although many CPUs support
+ * branchless conditional moves and many compilers will take
+ * advantage of them, certain compilers generate branches on
+ * certain CPUs for `!res'.
+ */
+ return (1 & ((res - 1) >> 8));
+}
+
+#define sgx_is_within_enclave(ptr, len) (1)
+#define offsetof(type,field) ((char *) &((type *) 0)->field - (char *) 0)
+
static bool LAv2_verify_message2(const sgx_dh_msg2_t *, const sgx_key_128bit_t *);
static sgx_status_t LAv2_generate_message3(const sgx_dh_msg2_t *,
const sgx_ec256_public_t *, const sgx_key_128bit_t *, sgx_dh_msg3_t *);
diff --git a/demos/local_attestation/DiffieHellmanLibrary/include/sgx_dh_internal.h b/demos/local_attestation/DiffieHellmanLibrary/include/sgx_dh_internal.h
index 98b7d3f..5a7a75a 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/include/sgx_dh_internal.h
+++ b/demos/local_attestation/DiffieHellmanLibrary/include/sgx_dh_internal.h
@@ -36,7 +36,6 @@
#include "sgx.h"
#include "sgx_defs.h"
#include "sgx_ecp_types.h"
-#include "arch.h"
// Disable SGX_USE_LAv2_INITIATOR to allow compiling both LAv1/2 APIs
#ifdef SGX_USE_LAv2_INITIATOR
@@ -81,7 +80,7 @@ typedef struct _sgx_internal_dh_session_t{
};
} sgx_internal_dh_session_t;
-se_static_assert(sizeof(sgx_internal_dh_session_t) == SGX_DH_SESSION_DATA_SIZE); /*size mismatch on sgx_internal_dh_session_t and sgx_dh_session_t*/
+//se_static_assert(sizeof(sgx_internal_dh_session_t) == SGX_DH_SESSION_DATA_SIZE); /*size mismatch on sgx_internal_dh_session_t and sgx_dh_session_t*/
#pragma pack(pop)
diff --git a/demos/local_attestation/DiffieHellmanLibrary/sgx_cmac128.cpp b/demos/local_attestation/DiffieHellmanLibrary/sgx_cmac128.cpp
index a810542..53f9b90 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/sgx_cmac128.cpp
+++ b/demos/local_attestation/DiffieHellmanLibrary/sgx_cmac128.cpp
@@ -32,7 +32,6 @@
#include "stdlib.h"
#include "string.h"
#include "sgx_tcrypto.h"
-#include "se_tcrypto_common.h"
#include "openssl/cmac.h"
#include "openssl/err.h"
diff --git a/demos/local_attestation/DiffieHellmanLibrary/sgx_ecc256.cpp b/demos/local_attestation/DiffieHellmanLibrary/sgx_ecc256.cpp
index 85a482e..ed8ec46 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/sgx_ecc256.cpp
+++ b/demos/local_attestation/DiffieHellmanLibrary/sgx_ecc256.cpp
@@ -30,7 +30,6 @@
*/
#include "string.h"
-#include "se_tcrypto_common.h"
#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/err.h>
@@ -170,9 +169,9 @@ sgx_status_t sgx_ecc256_create_key_pair(sgx_ec256_private_t *p_private,
if (SGX_SUCCESS != ret) {
// in case of error, clear output buffers
//
- memset_s(p_private, sizeof(p_private), 0, sizeof(p_private));
- memset_s(p_public->gx, sizeof(p_public->gx), 0, sizeof(p_public->gx));
- memset_s(p_public->gy, sizeof(p_public->gy), 0, sizeof(p_public->gy));
+ memset(p_private, 0, sizeof(p_private));
+ memset(p_public->gx, 0, sizeof(p_public->gx));
+ memset(p_public->gy, 0, sizeof(p_public->gy));
}
//free temp data
@@ -367,7 +366,7 @@ sgx_status_t sgx_ecc256_compute_shared_dhkey(sgx_ec256_private_t *p_private_b,
} while(0);
if (ret != SGX_SUCCESS) {
- memset_s(p_shared_key->s, sizeof(p_shared_key->s), 0, sizeof(p_shared_key->s));
+ memset(p_shared_key->s, 0, sizeof(p_shared_key->s));
}
// clear and free memory
@@ -470,7 +469,7 @@ sgx_status_t sgx_ecc256_calculate_pub_from_priv(const sgx_ec256_private_t *p_att
//in case of failure clear public key
//
if (ret != SGX_SUCCESS) {
- (void)memset_s(p_att_pub_key, sizeof(sgx_ec256_public_t), 0, sizeof(sgx_ec256_public_t));
+ (void)memset(p_att_pub_key, 0, sizeof(sgx_ec256_public_t));
}
BN_clear_free(bn_o);
diff --git a/demos/local_attestation/DiffieHellmanLibrary/sgx_sha256_msg.cpp b/demos/local_attestation/DiffieHellmanLibrary/sgx_sha256_msg.cpp
index 44fd1e2..b3ee3ed 100644
--- a/demos/local_attestation/DiffieHellmanLibrary/sgx_sha256_msg.cpp
+++ b/demos/local_attestation/DiffieHellmanLibrary/sgx_sha256_msg.cpp
@@ -29,7 +29,6 @@
*
*/
-#include "se_tcrypto_common.h"
#include <openssl/sha.h>
#include <openssl/err.h>
#include "sgx_tcrypto.h"
--
2.17.1