Intel SGX - Enclave内で使用不可能なC標準関数一覧

# Intel SGX - Enclave内で使用不可能なC標準関数一覧
以前参考文献[1]のページに載っていた、Enclave内で使用できないC標準関数一覧を手元に残しておいたものをそのまま掲載します。

本記事の執筆時点で[1]が消滅したのが割と前なので情報が古い可能性はありますが、SGXのOSを信頼していないという性質上、あまり大きく変わってはいないはずです。

| ヘッダ名    | SGXSDKに含まれるか | 非対応マクロ                                                                                                                                                                                                                                                                                     | 非対応関数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| ----------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| complex.h   | Yes                | Intelコンパイラ16.0使用時のみ使用可                                                                                                                                                                                                                                                              | Intelコンパイラ16.0使用時のみ使用可                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| inttypes.h  | Yes                | `SCNdN`, `SCNiN`, `SCNoN`, `SCNuN`, `SCNxN`, `SCNdLEASTN`, `SCNiLEASTN`, `SCNoLEASTN`, `SCNuLEASTN`, `SCNxLEASTN`, `SCNdFASTN`, `SCNiFASTN`, `SCNoFASTN`, `SCNuFASTN`, `SCNxFASTN`,` SCNdMAX`, `SCNiMAX`, `SCNoMAX`, `SCNuMAX`, `SCNxMAX`, `SCNdPTR`, `SCNiPTR`, `SCNoPTR`, `SCNuPTR`, `SCNxPTR` | `wcstoimax()`, `wcstoumax()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| locale.h    | No                 | `LC_ALL`, `LC_COLLATE`, `LC_CTYPE`, `LC_MONETARY`, `LC_NUMERIC`, `LC_TIME`, `struct lconv`                                                                                                                                                                                                       | `setlocale()`, `localeconv()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| signal.h    | No                 | `sig_atomic_t`, `SIG_DFL`, `SIG_ERR`, `SIG_IGN`, `SIGABRT`, `SIGFPE`, `SIGILL`, `SIGINT`, `SIGSEGV`, `SIGTERM`                                                                                                                                                                                   | `signal()`, `raise()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| stdatomic.h | Yes                | `ATOMIC_<TYPE>_LOCK_FREE`, `atomic_<datatype>`                                                                                                                                                                                                                                                   | `kill_dependency()`, `atomic_fetch_and()`, `atomic_fetch_and_explicit()`, `atomic_thread_fence()`, `atomic_signal_fence()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| stdio.h     | Yes                | `FILE`, `fpos_t`, `_IOFBF`, `_IOLBF`, `_IONBF`, `FILENAME_MAX`, `FOPEN_MAX`, `L_tmpnam`, `SEEK_CUR`, `SEEK_END`, `SEEK_SET`, `TMP_MAX`, `stderr`, `stdin`, `stdout`                                                                                                                              | `remove()`, `rename()`, `tmpfile()`, `tmpnam()`, `fclose()`, `fflush()`, `fopen()`, `fopen_s()`, `freopen()`, `freopen_s()`, `setbuf()`, `setvbuf()`, `fprintf()`, `fprintf_s()`, `fscanf()`, `fscanf_s()`, `printf()`, `scanf()`, `scan_s()`, `snprintf_s()`, `sprintf()`, `sprintf_s()`, `sscanf()`, `sscanf_s()`, `vfprintf()`, `vfprintf_s()`, `vfscanf()`, `vfscanf_s()`, `vprintf()`, `vprintf_s()`, `vscanf()`, `vscanf_s()`, `vsnprintf_s()`, `vsprintf()`, `vsprintf_s()`, `vsscanf()`, `vsscanf_s()`, `fgetc()`, `fgets()`, `fputc()`, `fputs()`, `getc()`, `getchar()`, `gets()`, `gets_s()`, `putc()`, `putchar()`, `puts()`, `ungetc()`, `fread()`, `fwrite()`, `fgetpos()`, `fseek()`, `fsetpos()`, `ftell()`, `rewind()`, `clearerr()`, `feof()`, `ferror()`, `perror()` |
| stdlib.h    | Yes                | なし                                                                                                                                                                                                                                                                                             | `rand()`, `srand()`, `atexit()`, `exit()`, `_Exit()`, `quick_exit()`, `at_quick_exit()`, `getenv()`, `getenv_s()`, `system()`, `bsearch_s()`, `qsort_s()`, `mblen()`, `mbtowc()`, `wctomb()`, `wctomb_s()`, `mbstowcs()`, `mbstowcs_s()`, `wcstombs()`, `wcstombs_s()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| string.h    | Yes                | なし                                                                                                                                                                                                                                                                                             | `memcpy_s()`, `memmove_s()`, `strcpy()`, `strcpy_s()`, `strncpy_s()`, `strcat()`, `strcat_s()`, `strstr()`(*), `strtok_s()`, `strerror_s()`, `strerrorlen_s()`, `strlen_s()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| threads.h   | No                 | `thrd_t`, `thrd_success`, `thrd_timeout`, `thrd_busy`, `thrd_nomem`, `thrd_error`, `thrd_start_t`, `mtx_t`, `mtx_plain mtx_recursive`, `mtx_timed`, `cnd_t`, `tss_t`, `TSS_DTOR_ITERATIONS`, `tss_dtor_t`                                                                                        | `thrd_create()`, `thrd_equal()`, `thrd_current()`, `thrd_sleep()`, `thrd_yield()`, `thrd_exit()`, `thrd_detach()`, `thrd_join()`, `mtx_init()`, `mtx_lock()`, `mtx_timedlock()`, `mtx_trylock()`, `mtx_unlock()`, `mxm_destroy()`, `call_once()`, `cnd_init()`, `cnd_signal()`, `cnd_broadcast()`, `cnd_wait()`, `cnd_timedwait()`, `cnd_destroy()`, `tss_create()`, `tss_get()`, `tss_set()`, `tss_delete()`                                                                                                                                                                                                                                                                                                                                                                           |
| time.h      | Yes                | `timespec`                                                                                                                                                                                                                                                                                       | `clock()`, `mktime()`, `time()`, `asctime_s()`, `ctime()`, `ctime_s()`, `gmtime()`, `gtime_s()`, `localtime()`, `localtime_s()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| uchar.h     | Yes                | `__STDC_UTF_16__`, `__STDC_UTF_32__`                                                                                                                                                                                                                                                             | `mbrtoc16()` ,                    `c16rtomb()`,                     `mbrtoc32()`,                     `c32rtomb()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| wchar.h     | Yes                | なし                                                                                                                                                                                                                                                                                             | `fwprintf()`, `fwscanf()`, `swscanf()`, `vfwprintf()`, `vfwscanf()`, `vswscanf()`, `vwprintf()`, `vwscanf()`, `wprintf()`, `wscanf()`, `fgetwc()`, `fgetws()`, `fputwc()`, `fputws()`, `fwide()`, `getwc()`, `getwchar()`, `putwc()`, `putwchar()`, `ungetwc()`, `wcstod()`, `wcstof()`, `wcstold()`, `wcstol()`, `wcstoll()`, `wcstoul()`, `wcstoull()`, `wcscpy()`, `wcscpy_s()`, `wcsncpy_s()`, `wmemcpy_s()`, `wmemmove_s()`, `wcscat()`, `wcscat_s()`, `wcsncat_s()`, `wcstok_s()`, `wcsnlen_s()`, `wcsftime()`,  `wctob()`, `mbsinit()`, `mbrlen()`, `mbrtowc()`, `wcrtomb()`, `wcrtomb_s()`, `mbsrtowcs()`, `mbsrtowcs_s()`, `wcsrtombs()`, `wcsrtombs_s()`                                                                                                                      |
| wctype.h    | Yes                | なし                                                                                                                                                                                                                                                                                             | `iswalnum()`, `iswalpha()`, `iswblank()`, `iswcntrl()`, `iswdigit()`, `iswgraph()`, `iswlower()`, `iswprint()`, `iswpunct()`, `iswspace()`, `iswupper()`, `iswxdigit()`, `wctype()`, `towlower()`, `towupper()`, `towctrans()`, `wctrans()`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |

* フォーマット文字列攻撃を回避するため、`%n`指定子の利用は即時のランタイムエラーを引き起こします。

* `strstr()`はTrusted-C(Enclave用に安全性を向上させたCライブラリ)独自仕様のものを利用可能です。標準Cのものは`char strstr(const char*, const char*)`ですが、Trusted-Cのものは`const char* strstr (const char*, const char*)`となっています。

## memset関数について
標準Cの`memset`関数の他に、Trusted-C独自の`memset_s`関数が利用可能です。memset関数は秘密情報を含まない場合の初期化やクリア、memset_s関数は秘密情報を含む場合の(特に)クリアに用いるべきです。memset関数はコンパイラの最適化の段階で安全でない挙動を取る場合があるため、秘密情報を扱う場合はmemset_s関数を使うべきでしょう。ただし、memset_s関数はパフォーマンスの最適化がmemset関数に比べ不十分であるため、使用は必要最低限に留めるべきです。

## 参考
[1][Intel® Software Guard Extensions SDK - Unsupported C Standard Functions](https://software.intel.com/en-us/sgx-sdk-dev-reference-unsupported-c-standard-functions) (リンク無効)