OCALLを使用して、信頼できないメモリにダイナミックに作成されたC文字列を自分のエンクレーブにコピーしたいとします。したがって、[out, string]
属性を使用する必要があります。SGXエンクレーブ文字列引数を[in]属性と併用する必要がある
しかし、私は[in]
属性も追加する必要があるので、これを行うことはできません。問題は、実際には文字列のサイズがわからず、OCALLを作成するたびに、エンクレーブから信頼できないメモリへの不要な文字列のコピーからのオーバヘッド([in]
)が欲しくないということです。
私のEDLファイル:
enclave {
trusted {
public void ecall_open(void);
};
untrusted {
void ocall_get_string([out, string] char* str);
};
};
error: string/wstring/sizefunc should be used with an 'in' attribute
なぜ[in]
属性を追加する必要がありますか?
パフォーマンス上の理由から、このオーバーヘッドを避ける方法はありますか?
void ocall_get_string([out] char** str, [out] size_t* length);
し、手動でmemcpy()
を使用して信頼されていないメモリから信頼されるにCの文字列をコピーします。
開発者のマニュアルでは、 "STRING'と' wstring'が が '単体out'で使用することはできません'" と述べています。おそらく、自分自身でECALLを使ってデータをエンクレーブに送信することができます: 'ocall_get_string()ecall_to_pass_string([in、string] char * str)'。このマニュアルでは、* ECALLsへのアクセス許可*というタイトルで書かれています。 – Daniel