接口说明

secGear 机密计算统一编程框架分为安全侧和非安全侧,这里给出用户开发应用程序所需的接口。除这些接口外,安全侧还继承了 ARM TrustZone 和 Intel SGX 的开源 POSIC 接口。

cc_enclave_create

创建 enclave 接口

功能

初始化接口,函数根据不同 type,调用不同的 TEE 创建函数,完成不同 TEE 方案关于 enclave 上下文初始化,由非安全侧调用

函数声明:

cc_enclave_result_t cc_enclave_create(const char* path, enclave_type_t type, uint32_t version,uint32_t flags,const enclave_features_t* features,uint32_t features_count, cc_enclave_t ** enclave);

参数:

  • Path:入参,要加载的 enclave 路径
  • Type:入参,用来指定 TEE 解决方案, 如 SGX_ENCLAVE_TYPE、GP_ENCLAVE_TYPE、AUTO_ENCLAVE_TYPE
  • version:入参,指定的 enclave engine 的版本,目前只有一个版本,取值为 0。
  • Flags:入参,标志位,说明这个 enclave 运行状态,例如调试状态 SECGEAR_DEBUG_FLAG、模拟状态 SECGEAR_SIMULATE_FLAG(目前不支持)
  • features:入参,用于设置一些关于 enclave 支持的特性,例如 SGX 的 PCL、 switchless 等。目前不支持,请设置为 NULL
  • features_count:入参,入参 features 特性结构体的数量。目前不支持,请设置为 0
  • enclave:出参,创建的 enclave 上下文

返回值:

  • CE_SUCCESS:认证信息验证成功
  • CE_ERROR_INVALID_PARAMETER:输入参数有误
  • CE_ERROR_OUT_OF_MEMORY:无可用内存
  • CC_FAIL:通用错误
  • CC_ERROR_UNEXPECTED:不可预期错误
  • CC_ERROR_ENCLAVE_MAXIMUM:单个 app 创建的 enclave 数量达到最
  • CC_ERROR_INVALID_PATH:安全二进制路径无效
  • CC_ERROR_NO_FIND_REGFUNC:enclave 引擎搜索失败

cc_enclave_destroy

销毁 enclave 接口

功能

调用不同 TEE 的退出函数,释放已经创建的 enclave 实体,由非安全侧调用

函数声明:

cc_enclave_result_t cc_enclave_destroy (cc_enclave_t ** enclave);

参数:

  • enclave:入参,已经创建 enclave 的上下文

返回值:

  • CE_SUCCESS:认证信息验证成功
  • CE_ERROR_INVALID_PARAMETER:输入参数有误
  • CE_ERROR_OUT_OF_MEMORY:无可用内存
  • CC_ERROR_NO_FIND_UNREGFUNC:enclave引擎搜索失败
  • CC_FAIL:通用错误
  • CC_ERROR_UNEXPECTED:不可预期错误

cc_enclave_generate_random

随机数生成

功能

用于在安全侧生成密码安全的随机数

函数声明:

cc_enclave_result_t cc_enclave_generate_random(void *buffer, size_t size)

参数:

  • *buffer:入参,生成随机数的缓冲区
  • size:入参,缓冲区的长度

返回值:

  • CE_OK:认证信息验证成功
  • CE_ERROR_INVALID_PARAMETER:输入参数有误
  • CE_ERROR_OUT_OF_MEMORY:无可用内存

cc_enclave_seal_data

数据持久化

功能

用于加密 enclave 内部数据,使数据可以在 enclave 外部持久化存储,由安全侧调用

函数声明:

cc_enclave_result_t cc_enclave_seal_data(uint8_t *seal_data, uint32_t seal_data_len,

​ cc_enclave_sealed_data_t *sealed_data, uint32_t sealed_data_len,

​ uint8_t *additional_text, uint32_t additional_text_len)

参数:

  • seal_data:入参,需要加密的数据
  • seal_data_len:入参,需要加密数据的长度
  • sealed_data:出参,加密后的数据处理句柄
  • sealed_data_len:出参,加密后的密文长度
  • additional_text:入参,加密所需的附加消息
  • additional_text_len:入参,附加消息长度

返回值:

  • CE_SUCCESS:数据加密成功
  • CE_ERROR_INVALID_PARAMETER:输入参数有误
  • CE_ERROR_OUT_OF_MEMORY:无可用内存
  • CC_ERROR_SHORT_BUFFER:传入的buffer过小
  • CC_ERROR_GENERIC:底层硬件通用错误

cc_enclave_unseal_data

数据解密

功能

用于解密 enclave 密封过的数据,用于将外部持久化数据重新导回 enclave 环境中,由安全侧调用

函数声明:

cc_enclave_result_t cc_enclave_unseal_data(cc_enclave_sealed_data_t *sealed_data,

  1. uint8_t *decrypted_data, uint32_t *decrypted_data_len,
  2. uint8_t *additional_text, uint32_t *additional_text_len)

参数:

  • sealed_data:入参,已加密数据的句柄
  • decrypted_data:出参,解密之后的密文数据buffer
  • decrypted_data_len:出参,解密后密文长度
  • additional_text:出参,解密后附加消息
  • additional_text_len:出参,解密后附加消息长度

返回值:

  • CE_SUCCESS:数据解密成功
  • CE_ERROR_INVALID_PARAMETER:输入参数有误
  • CE_ERROR_OUT_OF_MEMORY:无可用内存
  • CC_ERROR_SHORT_BUFFER:传入的buffer过小
  • CC_ERROR_GENERIC:底层硬件通用错误

cc_enclave_get_sealed_data_size

获取加密数据的大小

功能

用于 sealed_data 数据的大小,主要用于分配解密后的数据空间,由安全侧与非安全侧皆可调用

函数声明:

uint32_t cc_enclave_get_sealed_data_size(const uint32_t add_len, const uint32_t seal_data_len);

参数:

  • add_len:入参,附加消息长度
  • sealed_data_len:入参,加密信息的长度

返回值:

  • UINT32_MAX:参数错误或函数执行错误
  • others:函数执行成功,返回值为当前 sealed_data 结构的大小

cc_enclave_get_encrypted_text_size

获取加密消息的长度

功能

获取加密数数据中加密消息的长度,由安全侧调用

函数声明:

uint32_t cc_enclave_get_encrypted_text_size(const cc_enclave_sealed_data_t *sealed_data);

参数:

  • sealed_data:入参,加密数据的句柄

返回值:

  • UINT32_MAX:参数错误或函数执行错误
  • others:函数执行成功,返回值为当前 sealed_data 中加密消息的长度

cc_enclave_get_add_text_size

获取附加消息的长度

功能

获取加密数数据中附加消息的长度,由安全侧调用

函数声明:

uint32_t cc_enclave_get_add_text_size(const cc_enclave_sealed_data_t *sealed_data);

参数:

  • sealed_data:入参,加密数据的句柄

返回值:

  • UINT32_MAX:参数错误或函数执行错误
  • others:函数执行成功,返回值为当前sealed_data中附加消息的长度

cc_enclave_memory_in_enclave

安全内存检查

功能

用于校验指定长度的内存地址是否都属于安全侧内存,由安全侧调用

函数声明:

bool cc_enclave_memory_in_enclave(const void *addr, size_t size)

参数:

  • *addr:入参,指定需要校验的内存地址
  • size:入参,自内存地址起需要校验的长度

返回值:

  • true:指定区域内存都在安全区范围内
  • false:指定区域的内存有部分或者全部不在安全范围内

cc_enclave_memory_out_enclave

安全内存检查

功能

用于校验指定长度的内存地址是否都属于非安全侧内存,由安全侧调用

函数声明:

bool cc_enclave_memory_out_enclave(const void *addr, size_t size)

参数:

  • *addr:入参,指定需要校验的内存地址
  • size:入参,自内存地址起需要校验的长度

返回值:

  • true:指定区域内存都在非安全区
  • false:指定区域的内存有部分或者全部在安全区

PrintInfo

消息打印

功能

用于安全侧日志的打印,本接口输出安全侧用户想打印的信息,输入日志保存在非安全侧/var/log/secgear/secgear.log中

函数声明:

void PrintInfo(int level, const char *fmt, …);

参数:

  • level:入参,日志打印等级,可选项为PRINT_ERROR, PRINT_WARNING, PRINT_STRACE, PRINT_DEBUG
  • fmt: 入参,需要输出的字符创

返回值: