ã·ãªãŒãºã®ãã®éšåã«å ããŠããœãŒã¹ã³ãŒããæäŸãããŠããŸãããšã³ã¯ã¬ãŒãã¹ã¿ããšã€ã³ã¿ãŒãã§ã€ã¹é¢æ°ã ãã®ã³ãŒãã¯ããŠã³ããŒãå¯èœã§ãã
ã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£
ãšã³ã¯ã¬ãŒãã€ã³ã¿ãŒãã§ã€ã¹ãèšèšããåã«ãã¢ããªã±ãŒã·ã§ã³ã®å šäœçãªã¢ãŒããã¯ãã£ã«ã€ããŠèããå¿ èŠããããŸãã 第1éšã§èª¬æããããã«ããšã³ã¯ã¬ãŒãã¯ãã€ãããã¯ãªã³ã¯ã©ã€ãã©ãªïŒWindows *ã§ã¯DLLãLinux *ã§ã¯å ±æã©ã€ãã©ãªïŒãšããŠå®è£ ããã100ïŒ ãã€ãã£ãCã³ãŒããšã®ã¿ãªã³ã¯ããå¿ èŠããããŸãã
åæã«ããã¥ãŒããªã¢ã«ãã¹ã¯ãŒããããŒãžã£ãŒããã°ã©ã ã®ã°ã©ãã£ã«ã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã¯CïŒã§èšè¿°ãããŠããŸãã C ++ / CLIã§èšè¿°ãããæ··åã¢ã»ã³ããªã¯ããããŒãžã³ãŒãããã¢ã³ãããŒãžã³ãŒãã«åãæ¿ããããã«äœ¿çšãããŸããããã®ã¢ã»ã³ããªã«ã¯ç¬èªã®ã³ãŒããå«ãŸããŠããŸããã100ïŒ ãã€ãã£ãã³ãŒãã§æ§æãããŠããªããããIntel SGXãšã³ã¯ã¬ãŒããšçŽæ¥ããåãããããšã¯ã§ããŸããã ä¿¡é Œã§ããªããšã³ã¯ã¬ãŒãããªããžé¢æ°ãC ++ / CLIã¢ã»ã³ããªã«å°å ¥ããããšãããšãèŽåœçãªãšã©ãŒãçºçããŸãã
Command line error D8045: cannot compile C file 'Enclave_u.c'; with the /clr option
ã€ãŸããä¿¡é Œã§ããªãããªããžã®æ©èœã¯ãå®å šã«ãã€ãã£ãã³ãŒãã§æ§æãããå¥ã®DLLã©ã€ãã©ãªã«é 眮ããå¿ èŠããããŸãã ãã®çµæãã¢ããªã±ãŒã·ã§ã³ã«ã¯å°ãªããšã3ã€ã®DLLãå«ãŸããŸããC++ / CLIã³ã¢ããšã³ã¯ã¬ãŒãããªããžãããã³ãšã³ã¯ã¬ãŒãèªäœã§ãã ãã®æ§é ãå³ã«ç€ºããŸãã 1ã
å³1.ãšã³ã¯ã¬ãŒããå«ãæ··åã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãã
ãããªãæŽç·Ž
ãšã³ã¯ã¬ãŒãããªããžã®é¢æ°ã¯å¥ã®DLLã©ã€ãã©ãªã«ããå¿ èŠãããããã次ã®ã¹ããããå®è¡ããŸãããšã³ã¯ã¬ãŒããšçŽæ¥å¯Ÿè©±ãããã¹ãŠã®é¢æ°ããã®ã©ã€ãã©ãªã«å ¥ããŸãã ãã®ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®åé¢ã¯ãããã°ã©ã 管çãšãããã°ãç°¡çŽ åããä»ã®ã¢ãžã¥ãŒã«ãžã®åœ±é¿ãæžããããšã§çµ±åã®å©äŸ¿æ§ãé«ããŸãã ã¯ã©ã¹ãŸãã¯ã¢ãžã¥ãŒã«ãæ確ã«å®çŸ©ãããå¢çã§ç¹å®ã®ã¿ã¹ã¯ãå®è¡ããå Žåãä»ã®ã¢ãžã¥ãŒã«ãžã®å€æŽã圱é¿ãäžããå¯èœæ§ã¯äœããªããŸãã
ç§ãã¡ã®å Žåã PasswordManagerCoreNativeã¯ã©ã¹ã¯ããšã³ã¯ã¬ãŒãã€ã³ã¹ã¿ã³ã¹ãäœæããè¿œå ã®ã¿ã¹ã¯ãè² æ ããã¹ãã§ã¯ãããŸããã ãã®ã¯ã©ã¹ã¯ã察å¿ããæ©èœãå®è¡ããããã«ãIntel SGXæ¡åŒµãã©ãããã©ãŒã ããµããŒãããŠããå Žåã«ã®ã¿ç¥ãå¿ èŠããããŸãã
äŸãšããŠã次ã®ã³ãŒããã©ã°ã¡ã³ãã¯unlockïŒïŒã¡ãœããã瀺ããŠããŸãã
int PasswordManagerCoreNative::vault_unlock(const LPWSTR wpassphrase) { int rv; UINT16 size; char *mbpassphrase = tombs(wpassphrase, -1, &size); if (mbpassphrase == NULL) return NL_STATUS_ALLOC; rv= vault.unlock(mbpassphrase); SecureZeroMemory(mbpassphrase, size); delete[] mbpassphrase; return rv; }
ããã¯éåžžã«ç°¡åãªæ¹æ³ã§ãããŠãŒã¶ãŒã®ãã¹ãã¬ãŒãºãwchar_tã®åœ¢åŒã§åãåããå¯å€é·ãšã³ã³ãŒãïŒUTF-8ïŒã«å€æããŠãããã¹ãã¬ãŒãžãªããžã§ã¯ãã§unlockïŒïŒã¡ãœãããåŒã³åºããŸãã ãã®ã¯ã©ã¹ãšãã®ã¡ãœããããšã³ã¯ã¬ãŒãé¢æ°ã§ä¹±éã«ãã代ããã«ã1è¡è¿œå ããŠãã®ã¡ââãœããã«ãšã³ã¯ã¬ãŒããµããŒããè¿œå ããããšããå§ãããŸãã
int PasswordManagerCoreNative::vault_unlock(const LPWSTR wpassphrase) { int rv; UINT16 size; char *mbpassphrase = tombs(wpassphrase, -1, &size); if (mbpassphrase == NULL) return NL_STATUS_ALLOC; // Call the enclave bridge function if we support Intel SGX if (supports_sgx()) rv = ew_unlock(mbpassphrase); else rv= vault.unlock(mbpassphrase); SecureZeroMemory(mbpassphrase, size); delete[] mbpassphrase; return rv; }
ç§ãã¡ã®ç®æšã¯ããã®ã¯ã©ã¹ãé£ã³å°ã§æ倧éã«åãããšãã解æŸããããšã§ãã PasswordManagerCoreNativeã¯ã©ã¹ã«å¿ èŠãªãã®ä»ã®è¿œå ã«ã¯ãIntel SGXãã©ã°ã®ãµããŒããšããã®ãã©ã°ãèšå®ããã³åä¿¡ããããã®ã¡ãœãããå«ãŸããŸãã
class PASSWORDMANAGERCORE_API PasswordManagerCoreNative { int _supports_sgx; // Other class members ommitted for clarity protected: void set_sgx_support(void) { _supports_sgx = 1; } int supports_sgx(void) { return _supports_sgx; }
ãšã³ã¯ã¬ãŒããã¶ã€ã³
ã¢ããªã±ãŒã·ã§ã³ã®äžè¬çãªèšç»ã®æºåãã§ããŠããã®ã§ããšã³ã¯ã¬ãŒããšãã®ã€ã³ã¿ãŒãã§ãŒã¹ãèšèšã§ããŸãã ãããè¡ãããã«ãã¢ããªã±ãŒã·ã§ã³ã«ãŒãã«ã®ã¯ã©ã¹ãã€ã¢ã°ã©ã ã«æ»ããŸããããã«ã€ããŠã¯ãæåã«ç¬¬3éšã§èª¬æããŸããããããå³ã«ç€ºããŸãã 2.å²ãŸãããªããžã§ã¯ãã¯ç·è²ã§ãä¿¡é Œã§ããªãã³ã³ããŒãã³ãã¯éè²ã§ç¶²æããããŸãã
å³2. Intel Software Guard Extensionsã䜿çšãããã¥ãŒããªã¢ã«Password Managerã®ã¯ã©ã¹å³ã
ãšã³ã¯ã¬ãŒãã®å¢çãè¶ããæ¥ç¶ã¯1ã€ã ãã§ããPasswordManagerCoreNativeãªããžã§ã¯ããšVaultãªããžã§ã¯ãéã®æ¥ç¶ã§ãã ã€ãŸããã»ãšãã©ã®ECALLã¯ãåã«Vaultã®ã¯ã©ã¹ã¡ãœããã®ã©ãããŒã«ãªããŸãã ãšã³ã¯ã¬ãŒãã€ã³ãã©ã¹ãã©ã¯ãã£ã管çããã«ã¯ãè¿œå ã®ECALLãè¿œå ããå¿ èŠããããŸãã ãšã³ã¯ã¬ãŒãã®éçºã«ãããå°é£ã®1ã€ã¯ãECALLãOCALLãããã³ããªããžé¢æ°ããã€ãã£ãCã³ãŒãã§ãªããã°ãªãããC ++ã³ã³ããŒãã³ããåºç¯å²ã«äœ¿çšããããšã§ãã ãšã³ã¯ã¬ãŒããéå§ããåŸãCãšC ++ã®éã®ã®ã£ãããåããé¢æ°ïŒãªããžã§ã¯ããã³ã³ã¹ãã©ã¯ã¿ãŒããªãŒããŒããŒããªã©ïŒãå¿ èŠã«ãªããŸãã
ããªããžã®ã·ã§ã«ãšæ©èœã¯ãEnclaveBridge.dllãšåŒã°ããç¬èªã®DLLã«ãããŸãã æ確ã«ããããã«ãã·ã§ã«é¢æ°ã«æ¥é èŸãew _ãïŒãšã³ã¯ã¬ãŒãã©ãããŒ-ãšã³ã¯ã¬ãŒãã·ã§ã«ïŒãæäŸããECALLãæ§æããããªããžé¢æ°ã«æ¥é èŸãve _ãïŒããŒã«ããšã³ã¯ã¬ãŒã-ãšã³ã¯ã¬ãŒãã¹ãã¬ãŒãžïŒãæäŸããŸãã
PasswordManagerCoreNativeããVaultã®å¯Ÿå¿ããã¡ãœãããžã®åŒã³åºãã¯ãå³ã«ç€ºããã¹ã«åŸããŸãã 3ã
å³3.ããªããžããã³ECALLæ©èœãå®è¡ããããã®ãã¹ã
PasswordManagerCoreNativeã®ã¡ãœããã¯ãEnclaveBridge.dllã®ã©ãããŒé¢æ°ãåŒã³åºããŸãã ãã®ã·ã§ã«ã¯ããšã³ã¯ã¬ãŒãã«å ¥ãã Vaultãªããžã§ã¯ãå ã®å¯Ÿå¿ããã¯ã©ã¹ã¡ãœãããåŒã³åºã1ã€ä»¥äžã®ECALLãåŒã³åºããŸãã ãã¹ãŠã®ECALLãå®äºãããšãã©ãããŒé¢æ°ã¯PasswordManagerCoreNativeã®åŒã³åºãã¡ãœããã«æ»ããæ»ãå€ãæäŸããŸãã
ç©æµãšã³ã¯ã¬ãŒã
ãšã³ã¯ã¬ãŒããäœæãããšãã¯ããŸããšã³ã¯ã¬ãŒãèªäœã管çããã·ã¹ãã ã決å®ããå¿ èŠããããŸãã ãšã³ã¯ã¬ãŒããå®è¡ãããŠããŠãçµæã®ãšã³ã¯ã¬ãŒãèå¥åãECALLé¢æ°ã«æäŸãããŠããå¿ èŠããããŸãã çæ³çã«ã¯ããããã¯ãã¹ãŠã¢ããªã±ãŒã·ã§ã³ã®äžäœã¬ãã«ã«å¯ŸããŠééçã§ãªããã°ãªããŸããã
ãã¥ãŒããªã¢ã«ãã¹ã¯ãŒããããŒãžã£ãŒã®æãç°¡åãªãœãªã¥ãŒã·ã§ã³ã¯ãEnclaveBridge DLLã®ã°ããŒãã«å€æ°ã䜿çšããŠãšã³ã¯ã¬ãŒãæ å ±ããã¹ãããããšã§ãã ãã®ãããªæ±ºå®ã«ã¯å¶éããããŸãã1ã€ã®ãšã³ã¯ã¬ãŒãã«ã¢ã¯ãã£ããªã¹ããªãŒã ã¯äžåºŠã«1ã€ããååšã§ããŸããã ããã¯ãè€æ°ã®ã¹ã¬ããã䜿çšããŠãªããžããªãæäœãããšãã«ãã¹ã¯ãŒããããŒãžã£ãŒã®ããã©ãŒãã³ã¹ãåäžããªããããåççãªãœãªã¥ãŒã·ã§ã³ã§ãã ã»ãšãã©ã®ã¢ã¯ã·ã§ã³ã¯ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«ãã£ãŠå¶åŸ¡ãããCPUã«å€§ããªè² è·ããããããšã¯ãããŸããã
éææ§ã®åé¡ã解決ããã«ã¯ãåã©ãããŒé¢æ°ã¯æåã«é¢æ°ãåŒã³åºããŠããšã³ã¯ã¬ãŒããå®è¡ãããŠãããã©ããã確èªãããŸã å®è¡ãããŠããªãå Žåã¯å®è¡ããå¿ èŠããããŸãã ããžãã¯ã¯éåžžã«ç°¡åã§ãã
#define ENCLAVE_FILE _T("Enclave.signed.dll") static sgx_enclave_id_t enclaveId = 0; static sgx_launch_token_t launch_token = { 0 }; static int updated= 0; static int launched = 0; static sgx_status_t sgx_status= SGX_SUCCESS; // Ensure the enclave has been created/launched. static int get_enclave(sgx_enclave_id_t *eid) { if (launched) return 1; else return create_enclave(eid); } static int create_enclave(sgx_enclave_id_t *eid) { sgx_status = sgx_create_enclave(ENCLAVE_FILE, SGX_DEBUG_FLAG, &launch_token, &updated, &enclaveId, NULL); if (sgx_status == SGX_SUCCESS) { if ( eid != NULL ) *eid = enclaveId; launched = 1; return 1; } return 0; }
æåã«ãåã©ãããŒé¢æ°ã¯get_enclaveïŒïŒé¢æ°ãåŒã³åºããŸãããã®é¢æ°ã¯ããšã³ã¯ã¬ãŒããéçå€æ°ã«å¯ŸããŠå®è¡ãããŠãããã©ããã確èªããŸãã ããã§ããå Žåããã®é¢æ°ã¯ïŒå¿ èŠã«å¿ããŠïŒ eidãã€ã³ã¿ãŒã«ãšã³ã¯ã¬ãŒãIDãé 眮ããŸãã ãšã³ã¯ã¬ãŒãèå¥åãã°ããŒãã«å€æ°enclaveIDã«æ ŒçŽããããããããã¯ãªãã·ã§ã³ã®æé ã§ãããçŽæ¥äœ¿çšã§ããŸãã
åé»ãŸãã¯ç°åžžçµäºãåŒãèµ·ãããšã©ãŒã®ããã«é£ã³å°ã倱ãããå Žåã¯ã©ããªããŸããïŒ ãããè¡ãã«ã¯ãECALLã®æ»ãå€ããã§ãã¯ããŸããECALLæäœèªäœã®æåãŸãã¯å€±æã瀺ãããšã³ã¯ã¬ãŒãã§åŒã³åºãããé¢æ°ã§ã¯ãããŸããã
sgx_status = ve_initialize(enclaveId, &vault_rv);
ãšã³ã¯ã¬ãŒãã§åŒã³åºãããé¢æ°ã®æ»ãå€ïŒããå ŽåïŒã¯ã2çªç®ã®ECALLåŒæ°ãšããŠæäŸããããã€ã³ã¿ãŒãä»ããŠæž¡ãããŸãïŒãããã®é¢æ°ãããã¿ã€ãã¯Edger8rã«ãã£ãŠèªåçã«äœæãããŸãïŒã ECALLã®æ»ãå€ãåžžã«ç¢ºèªããŠãã ããã SGX_SUCCESS以å€ã®çµæã¯ãããã°ã©ã ããšã³ã¯ã¬ãŒãã«æ£åžžã«å ¥ãããšãã§ãããèŠæ±ãããæ©èœãèµ·åãããªãã£ãããšã瀺ããŸãã ïŒ sgx_statusãã°ããŒãã«å€æ°ãšããŠå®çŸ©ããããšã«æ³šæããŠãã ãããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®ã·ã³ã°ã«ã¹ã¬ããã¢ãŒããã¯ãã£ã«ããå¥ã®åçŽåã§ãïŒã
ECALLé¢æ°ã«ãã£ãŠè¿ããããšã©ãŒãåæããé£ã³å°ã®ç¶æ ïŒãã¹ããã¯ã©ãã·ã¥ïŒããã§ãã¯ããé¢æ°ãè¿œå ããŸãã
static int lost_enclave() { if (sgx_status == SGX_ERROR_ENCLAVE_LOST || sgx_status == SGX_ERROR_ENCLAVE_CRASHED) { launched = 0; return 1; } return 0; }
ãããã¯ä¿®æ£å¯èœãªãšã©ãŒã§ãã äžäœã¬ãã«ã§ã¯ããããã®æ¡ä»¶ãåŠçã§ããããžãã¯ã¯ãŸã ãããŸããããããã°ã©ã ã®ãããªãéçºããµããŒãããããã«EnclaveBridge DLLã§æäŸããŠããŸãã
ãŸããé£ã³å°ãç Žå£ããæ©èœããªãããšã«æ³šæããŠãã ããã ãŠãŒã¶ãŒã®ã·ã¹ãã ã§ãã¹ã¯ãŒããããŒãžã£ãŒã¢ããªã±ãŒã·ã§ã³ãéããŠããéããŠãŒã¶ãŒãããŒã«ããããã¯ããå Žåã§ããã¡ã¢ãªå ã«é£ã³å°ãååšããŸãã ããã¯é£ã³å°ã§äœæ¥ããã®ã«è¯ãæ¹æ³ã§ã¯ãããŸããã ãšã³ã¯ã¬ãŒãã¯ãç¡æäœã§ãã£ãŠããç¡å¶éã®ããŒã«ããé ãé¢ããå ŽæãããªãœãŒã¹ãæ¶è²»ããŸãã ããŒã¿ã®ã·ãŒãªã³ã°ã«ã€ããŠèª¬æããéã«ããã®ã·ãªãŒãºã®ä»åŸã®èšäºã§ãã®åé¡ã«å¯ŸåŠããŸãã
ãšã³ã¯ã¬ãŒãå®çŸ©èšèª
ãšã³ã¯ã¬ãŒãèšèšã«ç§»ãåã«ããšã³ã¯ã¬ãŒãå®çŸ©èšèªïŒEDLïŒã®æ§æã«ã€ããŠå°ã話ããŸãããã ãšã³ã¯ã¬ãŒãããªããžé¢æ°ïŒECALLãšOCALLã®äž¡æ¹ïŒã®EDLãã¡ã€ã«ã«ã¯ã次ã®äžè¬çãªæ§é ãæã€ãããã¿ã€ãããããŸãã
enclave { // Include files // Import other edl files // Data structure declarations to be used as parameters of the function prototypes in edl trusted { // Include file if any. It will be inserted in the trusted header file (enclave_t.h) // Trusted function prototypes (ECALLs) }; untrusted { // Include file if any. It will be inserted in the untrusted header file (enclave_u.h) // Untrusted function prototypes (OCALLs) }; };
ECALLãããã¿ã€ãã¯ä¿¡é Œã§ããéšåã«ãããOCALLã¯ä¿¡é Œã§ããªãéšåã«ãããŸãã EDLèšèªã®æ§æã¯Cã®æ§æã«äŒŒãŠãããEDLé¢æ°ã®ãããã¿ã€ãã¯Cé¢æ°ã®ãããã¿ã€ãã«éåžžã«äŒŒãŠããŸãããåäžã§ã¯ãããŸããã ç¹ã«ãããªããžé¢æ°ã®ãã©ã¡ãŒã¿ãŒãšæ»ãå€ã¯ããã€ãã®åºæ¬çãªããŒã¿åã«å¶éãããŠãããEDLã«ã¯ããšã³ã¯ã¬ãŒãã®åäœã決å®ããããã®è¿œå ã®ããŒã¯ãŒããšæ§æãå«ãŸããŠããŸãã ã€ã³ãã«ãœãããŠã§ã¢ã¬ãŒããšã¯ã¹ãã³ã·ã§ã³ïŒã€ã³ãã«SGXïŒSDKãŠãŒã¶ãŒã¬ã€ãã§ã¯ãEDLæ§æã«ã€ããŠè©³ãã説æãããµã³ãã«ãšã³ã¯ã¬ãŒãã®äœæã«é¢ãããã¥ãŒããªã¢ã«ãæäŸããŠããŸãã ããã§æžãããŠããããšããã¹ãŠç¹°ãè¿ãã®ã§ã¯ãªããã¢ããªã±ãŒã·ã§ã³ã«é¢é£ãããã®èšèªã®èŠçŽ ã«ã€ããŠç°¡åã«èª¬æããŸãã
ãã©ã¡ãŒã¿ããšã³ã¯ã¬ãŒãé¢æ°ã«æž¡ããããšãä¿è·ããããšã³ã¯ã¬ãŒãã¡ã¢ãªç©ºéã«é 眮ãããŸãã å€ãšããŠæž¡ããããã©ã¡ãŒã¿ãŒã®å Žåãå€ã¯ãšã³ã¯ã¬ãŒãã®ä¿è·ãããã¹ã¿ãã¯ã«é 眮ããããããä»ã®é¢æ°ã®åŒã³åºããšåæ§ã«ãè¿œå ã®ã¢ã¯ã·ã§ã³ã¯äžèŠã§ãã ãã€ã³ã¿ãŒã®å Žåãç¶æ³ã¯ãŸã£ããç°ãªããŸãã
ãã€ã³ã¿ãŒãšããŠæž¡ããããã©ã¡ãŒã¿ãŒã®å Žåããã€ã³ã¿ãŒã«ãã£ãŠåç §ãããããŒã¿ã¯ããšã³ã¯ã¬ãŒããšã®éã§åãæž¡ãå¿ èŠããããŸãã ãã®ããŒã¿è»¢éãå®è¡ããå¢çããã·ãŒãžã£ã¯ã次ã®2ã€ã®ããšããèªèãããå¿ èŠããããŸãã
- ããŒã¿ãã©ã®æ¹åã«ã³ããŒããå¿ èŠããããŸããïŒããªããžæ©èœãžãããªããžæ©èœããããŸãã¯ãã®äž¡æ¹ã§ããïŒ
- ãã€ã³ã¿ãŒã«ãã£ãŠåç §ãããããŒã¿ãããã¡ãŒã®ãµã€ãºã¯ïŒ
ãã€ã³ã¿ãŒã®æ¹å
ãã€ã³ã¿ãŒãã©ã¡ãŒã¿ãŒé¢æ°ãæäŸããå Žåãè§æ¬åŒ§å ã®ããŒã¯ãŒãã䜿çšããŠæ¹åãæå®ããå¿ èŠããããŸãããããã£ãŠã[in]ã[out]ããŸãã¯[inãout]ã§ãã ãããã®ããŒã¯ãŒãã®æå³ãè¡š1ã«ç€ºããŸãã
æ¹å | ECALL | OCALL |
---|---|---|
㧠| ãããã¡ã¯ã¢ããªã±ãŒã·ã§ã³ãããšã³ã¯ã¬ãŒãã«ã³ããŒãããŸãã å€æŽã¯ããšã³ã¯ã¬ãŒãå ã®ãããã¡ãŒã«ã®ã¿åœ±é¿ããŸãã | ãããã¡ãŒããšã³ã¯ã¬ãŒãããã¢ããªã±ãŒã·ã§ã³ã«ã³ããŒãããŸãã å€æŽã¯ããšã³ã¯ã¬ãŒãå€ã®ãããã¡ã«ã®ã¿åœ±é¿ããŸãã |
ã¢ãŠã | ãããã¡ã¯ãšã³ã¯ã¬ãŒãå ã«å²ãåœãŠããããŒãå€ã§åæåãããŸãã ECALLãçµäºãããšããœãŒã¹ãããã¡ã«ã³ããŒãããŸãã | ãããã¡ã¯é£ã³å°ã®å€åŽã«å²ãåœãŠããããŒãå€ã§åæåãããŸãã ãã®ä¿¡é Œã§ããªããããã¡ã¯ãOCALLã®çµäºæã«å ã®ãããã¡ã«ã³ããŒãããŸãã |
ã€ã³ãã¢ãŠã | ããŒã¿ã¯ååŸã«ã³ããŒãããŸãã | ECALLãšåãã§ãã
|
æ¹åã¯ãããªããžã®åŒã³åºãããé¢æ°ã«çžå¯Ÿçã§ããããšã«æ³šæããŠãã ããã ECALLæ©èœã®å Žåã[in]ã¯ããšã³ã¯ã¬ãŒããžã®ã³ããŒãããã¡ãŒããæå³ããŸãããOCALLã®å Žåãåããã©ã¡ãŒã¿ãŒã¯ããããã¡ãŒãä¿¡é Œã§ããªãæ©èœãžã³ããŒããæå³ããŸãã ïŒä»£ããã«äœ¿çšã§ããuser_checkãã©ã¡ãŒã¿ãŒããããŸãããããã¯èª¬æã®äž»é¡ãšã¯é¢ä¿ãããŸããããã®ç®çãšäœ¿çšã«ã€ããŠã¯ãSDKã®ããã¥ã¡ã³ããåç §ããŠãã ãããïŒ
ãããã¡ãµã€ãº
å¢çããã·ãŒãžã£ã¯ã次ã®ããã«åèšãããã¡ãµã€ãºããã€ãåäœã§èšç®ããŸãã
= element_size * element_count
ããã©ã«ãã§ã¯ãããŒããŒããã·ãŒãžã£ã®å Žåã element_countã®å€ã¯1ã§ããã element_sizeã¯ãã€ã³ã¿ãŒãã©ã¡ãŒã¿ãŒã«ãã£ãŠåç §ãããèŠçŽ ã«åºã¥ããŠèšç®ãããŸããããšãã°ãæŽæ°ãã€ã³ã¿ãŒã®å Žåã element_sizeã¯æ¬¡ã®ããã«ãªããŸã ã
sizeof(int)
intãfloatãªã©ã®åºå®ããŒã¿åã®åäžèŠçŽ ã®å ŽåãEDLé¢æ°ã®ãããã¿ã€ãã§è¿œå æ å ±ãæäŸããå¿ èŠã¯ãããŸããã voidãã€ã³ã¿ãŒã¯èŠçŽ ã®ãµã€ãºã«èšå®ããå¿ èŠããããŸããããããªããšãã³ã³ãã€ã«äžã«ãšã©ãŒãçºçããŸãã ããŒã¿ãããã¡ãŒã1ã€ã®èŠçŽ ãããé·ãé åãcharããã³wchar_tæååãããã³ãã®ä»ã®ã¿ã€ãã®å Žåããããã¡ãŒå ã®èŠçŽ ã®æ°ãæå®ããå¿ èŠããããŸããããããªããšã1ã€ã®èŠçŽ ã®ã¿ãã³ããŒãããŸãã
è§ãã£ãå ã®ããŒã¯ãŒãã«ã«ãŠã³ããŸãã¯ãµã€ãºãã©ã¡ãŒã¿ïŒãŸãã¯äž¡æ¹ïŒãè¿œå ããŸãã ãããã¯ãå®æ°å€ãŸãã¯é¢æ°ãã©ã¡ãŒã¿ãŒã®ããããã«èšå®ã§ããŸãã ã»ãšãã©ã®å Žåã ã«ãŠã³ããšãµã€ãºã®æ©èœã¯åãã§ãããé©åãªã³ã³ããã¹ãã§äœ¿çšããããšããå§ãããŸãã å³å¯ã«èšãã°ããµã€ãºã¯voidãã€ã³ã¿ãŒãæž¡ããšãã«ã®ã¿æå®ããå¿ èŠããããŸãã ãã以å€ã®å Žåã¯ãcountã䜿çšããŸãã
æååCãšwstringïŒNULLçµç«¯ã®charãŸãã¯wchar_té åïŒãæž¡ããšãã countãŸãã¯sizeã®ä»£ããã«stringãŸãã¯wstringãã©ã¡ãŒã¿ãŒã䜿çšã§ããŸãã ãã®å Žåãå¢çããã·ãŒãžã£ã¯ãæååã®é·ããçŽæ¥ååŸããããšã«ããããããã¡ã®ãµã€ãºã決å®ããŸãã
function([in, size=12] void *param); function([in, count=len] char *buffer, uint32_t len); function([in, string] char *cstr);
stringãŸãã¯wstringã¯ã[in]ãŸãã¯[inãout]ã®æ¹åãæå®ãããŠããå Žåã«ã®ã¿äœ¿çšã§ããããšã«æ³šæããŠãã ããã [out]æ¹åã®ã¿ãæå®ãããŠããå Žåãã©ã€ã³ã¯ãŸã äœæãããŠããªããããå¢çããã·ãŒãžã£ã¯ãããã¡ã®ãµã€ãºãååŸã§ããŸããã [outãstring]ãæå®ãããšãã³ã³ãã€ã«äžã«ãšã©ãŒãçºçããŸãã
ã·ã§ã«ããã³ããªããžæ©èœ
ããã§ãããªããžã®ã·ã§ã«ãšæ©èœãå®çŸ©ã§ããŸãã åè¿°ã®ããã«ãã»ãšãã©ã®ECALLã¯Vaultã®ã¯ã©ã¹ã¡ãœããã®ã©ãããŒã«ãããŸããã ãããªãã¯ã¡ã³ããŒé¢æ°ã®ã¯ã©ã¹å®çŸ©ã以äžã«ç€ºããŸãã
class PASSWORDMANAGERCORE_API Vault { // Non-public methods and members ommitted for brevity public: Vault(); ~Vault(); int initialize(); int initialize(const char *header, UINT16 size); int load_vault(const char *edata); int get_header(unsigned char *header, UINT16 *size); int get_vault(unsigned char *edate, UINT32 *size); UINT32 get_db_size(); void lock(); int unlock(const char *password); int set_master_password(const char *password); int change_master_password(const char *oldpass, const char *newpass); int accounts_get_count(UINT32 *count); int accounts_get_info(UINT32 idx, char *mbname, UINT16 *mbname_len, char *mblogin, UINT16 *mblogin_len, char *mburl, UINT16 *mburl_len); int accounts_get_password(UINT32 idx, char **mbpass, UINT16 *mbpass_len); int accounts_set_info(UINT32 idx, const char *mbname, UINT16 mbname_len, const char *mblogin, UINT16 mblogin_len, const char *mburl, UINT16 mburl_len); int accounts_set_password(UINT32 idx, const char *mbpass, UINT16 mbpass_len); int accounts_generate_password(UINT16 length, UINT16 pwflags, char *cpass); int is_valid() { return _VST_IS_VALID(state); } int is_locked() { return ((state&_VST_LOCKED) == _VST_LOCKED) ? 1 : 0; } };
ãã®ã¯ã©ã¹ã«ã¯ããã€ãã®åé¡ã®ããæ©èœããããŸãã ãããã®ããã€ãã¯æããã§ãïŒäŸãã°ãã³ã³ã¹ãã©ã¯ã¿ããã¹ãã©ã¯ã¿ãããã³initializeïŒïŒã®ãªãŒããŒããŒãã ãããã¯ãCé¢æ°ã䜿çšããŠåŒã³åºãå¿ èŠãããC ++ã³ã³ããŒãã³ãã§ãããããã€ãã®åé¡ã¯ãé¢æ°ããã€ã¹ã«åºæã§ãããããããã»ã©æ確ã§ã¯ãããŸããã ãããã®åé¡ã®ããã¡ãœããã®ããã€ãã¯ããã®ãã¥ãŒããªã¢ã«ã®ç¹å®ã®åé¡ã«å¯ŸåŠã§ããããã«ãæå³çã«äžé©åã«äœæãããŸããããä»ã®ã¡ãœããã¯ãåºç¯å²ã«åã¶ç®æšãªãã«èª€ã£ãŠäœæãããŸããã ã·ã§ã«é¢æ°ã®ãããã¿ã€ããšãããã·/ããªããžããã·ãŒãžã£ã®EDLãããã¿ã€ãã®äž¡æ¹ãå°å ¥ããããšã«ããããããã®åé¡ãé 次解決ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿
Intel SGXã䜿çšããªãã³ãŒããã©ã³ãã§ã¯ã Vaultã¯ã©ã¹ã¯PasswordManagerCoreNativeã®ã¡ã³ããŒã§ãã ããã¯ãIntel SGXã³ãŒããã©ã³ãã§ã¯å®è¡ã§ããŸããã ãã ããããªããžé¢æ°èªäœãCé¢æ°ã§ããå Žåããšã³ã¯ã¬ãŒãã«ã¯C ++ã³ãŒããå«ãŸããããšããããŸãã
ãšã³ã¯ã¬ãŒããåäžã®ã¹ã¬ããã«å¶éãããããVaultã¯ã©ã¹ããšã³ã¯ã¬ãŒãå ã®éçãªã°ããŒãã«ãªããžã§ã¯ãã«ããããšãã§ããŸãã ããã«ãããã³ãŒããå€§å¹ ã«ç°¡çŽ åãããã€ã³ã¹ã¿ã³ã¹ãäœæããããã®ããªããžããã³ããžãã¯æ©èœãäžèŠã«ãªããŸãã
initializeïŒïŒã¡ãœããã®ãªãŒããŒããŒã
initializeïŒïŒã¡ãœããã«ã¯2ã€ã®ãããã¿ã€ãããããŸã ã
- åŒæ°ãªãã®ã¡ãœããã¯ãæ°ãããã¹ã¯ãŒããªãããŒã«ãã®Vaultãªããžã§ã¯ããåæåããŸãã ããã¯ããŠãŒã¶ãŒãåããŠäœæãããã¹ã¯ãŒãã¹ãã¢ã§ãã
- åŒæ°ã2ã€ã®ã¡ãœããã¯ããªããžããªãã¡ã€ã«ããããŒããVaultãªããžã§ã¯ããåæåããŸãã ããã¯ããŠãŒã¶ãŒãéãïŒããã³ããã¯ã解é€ããããšããïŒæ¢åã®ãã¹ã¯ãŒãã¹ãã¢ã§ãã
ãã®ã¡ãœããã¯ã2ã€ã®ã©ãããŒé¢æ°ã«åå²ãããŸãã
ENCLAVEBRIDGE_API int ew_initialize(); ENCLAVEBRIDGE_API int ew_initialize_from_header(const char *header, uint16_t hsize);
察å¿ããECALLé¢æ°ã¯æ¬¡ã®ããã«å®çŸ©ãããŠããŸãã
public int ve_initialize (); public int ve_initialize_from_header ([in, count=len] unsigned char *header, uint16_t len);
get_headerïŒïŒ
ãã®æ¹æ³ã«ã¯æ ¹æ¬çãªåé¡ããããŸãã ãããã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
int get_header(unsigned char *header, uint16_t *size);
ãã®é¢æ°ã¯ã次ã®ã¿ã¹ã¯ãå®è¡ããŸãã
- ã¹ãã¬ãŒãžãã¡ã€ã«ã®ããããŒãããã¯ãåãåããããããŒãæããããã¡ãŒã«é 眮ããŸãã åŒã³åºãã¡ãœããã¯ããã®ããŒã¿ãæ ŒçŽããã®ã«ååãªã¡ã¢ãªãå²ãåœãŠãå¿ èŠããããŸãã
- ããããŒãã©ã¡ãŒã¿ãŒã«NULLãã€ã³ã¿ãŒãæž¡ããšããã€ã³ã¿ãŒãæãuint16_tãããããŒãããã¯ã®ãµã€ãºãèšå®ãããããåŒã³åºãå ã®ã¡ãœããã¯å²ãåœãŠãã¡ã¢ãªéãèªèããŸãã
ããã¯ãäžéšã®ããã°ã©ãã³ã°ã³ãã¥ããã£ã§ã¯ããªãäžè¬çãªå§çž®æè¡ã§ããããšã³ã¯ã¬ãŒãã«ã¯åé¡ããããŸãïŒECALLãŸãã¯OCALLã«ãã€ã³ã¿ãŒã転éããå Žåãå¢çé¢æ°ã¯ããã€ã³ã¿ãŒã«ãã£ãŠåç §ãããããŒã¿ããšã³ã¯ã¬ãŒãïŒãŸãã¯ãã®äž¡æ¹ïŒã«ã³ããŒããŸãã ãããã®å¢çé¢æ°ã§ã¯ãã³ããŒãããã€ãæ°ãç¥ãããã«ããŒã¿ãããã¡ãŒãµã€ãºãå¿ èŠã§ãã æåã®ã±ãŒã¹ã§ã¯ãå¯å€ãµã€ãºã®æå¹ãªãã€ã³ã¿ãŒã䜿çšãããŸãããããã¯é£ãããããŸãããã2çªç®ã®ã±ãŒã¹ã§ã¯ãNULLãã€ã³ã¿ãŒãšãŒãã«çãããµã€ãºããããŸãã
ECALLé¢æ°ã®ãã®ãããªEDLãããã¿ã€ããèãåºãããšãã§ããŸããããã¹ãŠæ©èœããŸãããéåžžã¯ç°¡æœããããæ確ããéèŠã§ãã ãããã£ãŠãã³ãŒãã2ã€ã®ECALLé¢æ°ã«åå²ããããšããå§ãããŸãã
public int ve_get_header_size ([out] uint16_t *sz); public int ve_get_header ([out, count=len] unsigned char *header, uint16_t len);
ãšã³ã¯ã¬ãŒãã·ã§ã«é¢æ°ã¯å¿ èŠãªããžãã¯ãæäŸãããããä»ã®ã¯ã©ã¹ãå€æŽããå¿ èŠã¯ãããŸããã
ENCLAVEBRIDGE_API int ew_get_header(unsigned char *header, uint16_t *size) { int vault_rv; if (!get_enclave(NULL)) return NL_STATUS_SGXERROR; if ( header == NULL ) sgx_status = ve_get_header_size(enclaveId, &vault_rv, size); else sgx_status = ve_get_header(enclaveId, &vault_rv, header, *size); RETURN_SGXERROR_OR(vault_rv); }
accounts_get_infoïŒïŒ
ãã®ã¡ãœããã¯get_headerïŒïŒãšåæ§ã«æ©èœããŸããNULLãã€ã³ã¿ãŒãæž¡ãã察å¿ãããã©ã¡ãŒã¿ãŒã§ãªããžã§ã¯ãã®ãµã€ãºãè¿ããŸãã ãã ãããã®ã¡ãœããã¯ããã©ã¡ãŒã¿ãŒã®åŒæ°ãå€ããããåªé ããšäŸ¿å©ãã§ã¯åºå¥ãããŸããã 2ã€ã®ã·ã§ã«é¢æ°ã«åå²ããããšããå§ãããŸãã
ENCLAVEBRIDGE_API int ew_accounts_get_info_sizes(uint32_t idx, uint16_t *mbname_sz, uint16_t *mblogin_sz, uint16_t *mburl_sz); ENCLAVEBRIDGE_API int ew_accounts_get_info(uint32_t idx, char *mbname, uint16_t mbname_sz, char *mblogin, uint16_t mblogin_sz, char *mburl, uint16_t mburl_sz);
ãããŠã2ã€ã®å¯Ÿå¿ããECALLé¢æ°ïŒ
public int ve_accounts_get_info_sizes (uint32_t idx, [out] uint16_t *mbname_sz, [out] uint16_t *mblogin_sz, [out] uint16_t *mburl_sz); public int ve_accounts_get_info (uint32_t idx, [out, count=mbname_sz] char *mbname, uint16_t mbname_sz, [out, count=mblogin_sz] char *mblogin, uint16_t mblogin_sz, [out, count=mburl_sz] char *mburl, uint16_t mburl_sz );
accounts_get_passwordïŒïŒ
ããã¯ãã¢ããªã±ãŒã·ã§ã³å šäœã§æãåé¡ã®ããã³ãŒãã§ãã ãããã¿ã€ãã¯æ¬¡ã®ãšããã§ãã
int accounts_get_password(UINT32 idx, char **mbpass, UINT16 *mbpass_len);
æåã«ç®ãåŒãã®ã¯ãmbpassãžã®ãã€ã³ã¿ãŒãžã®ãã€ã³ã¿ãŒãæž¡ãããšã§ãã ãã®ã¡ãœããã¯ã¡ã¢ãªãå²ãåœãŠãŸãã
æããã«ããã¯è¯ãèãã§ã¯ãããŸããã Vault , , API , . , : .
-. , ECALL, , Vault , PasswordManagerCoreNative . : , â , . PasswordManagerCoreNative , - ( Intel SGX).
ENCLAVEBRIDGE_API int ew_accounts_get_password_size(uint32_t idx, uint16_t *len); ENCLAVEBRIDGE_API int ew_accounts_get_password(uint32_t idx, char *mbpass, uint16_t len);
EDL :
public int ve_accounts_get_password_size (uint32_t idx, [out] uint16_t *mbpass_sz); public int ve_accounts_get_password (uint32_t idx, [out, count=mbpass_sz] char *mbpass, uint16_t mbpass_sz);
load_vault()
load_vault() . :
int load_vault(const char *edata);
Vault . Vault , , .
, . ECALL, , , . .
- :
ENCLAVEBRIDGE_API int ew_load_vault(const unsigned char *edata);
ECALL , EDL:
public int ve_load_vault ([in, count=len] unsigned char *edata, uint32_t len)
, - . ECALL.
ENCLAVEBRIDGE_API int ew_load_vault(const unsigned char *edata) { int vault_rv; uint32_t dbsize; if (!get_enclave(NULL)) return NL_STATUS_SGXERROR; // We need to get the size of the password database before entering the enclave // to send the encrypted blob. sgx_status = ve_get_db_size(enclaveId, &dbsize); if (sgx_status == SGX_SUCCESS) { // Now we can send the encrypted vault data across. sgx_status = ve_load_vault(enclaveId, &vault_rv, (unsigned char *) edata, dbsize); } RETURN_SGXERROR_OR(vault_rv); }
, PasswordManagerCoreNative wchar_t char. , wchar_t?
. Windows wchar_t API- Win32, UTF-16 . UTF-16 16 : , ASCII, , , . UTF-16 , 16 , ASCII.
, ASCII. , . Tutorial Password Manager , .NET, UTF-8 . UTF-8 â , 8 . ASCII UTF-16 ASCII. , UTF-8 , UTF-16, , , .
( , , ).
ã³ãŒãäŸ
åè¿°ã®ããã«ããã®ããŒãã§ã¯ããŠã³ããŒããããµã³ãã«ã³ãŒããæäŸããŸã ãæ·»ä»ã®ã¢ãŒã«ã€ãã«ã¯ããã¥ãŒããªã¢ã«ãã¹ã¯ãŒããããŒãžã£ãŒããªããžDLLããã³ãšã³ã¯ã¬ãŒãDLLã®ãœãŒã¹ã³ãŒããå«ãŸããŠããŸãããããŸã§ã®ãšã³ã¯ã¬ãŒãé¢æ°ã¯åãªãã¹ã¿ãã§ããã5çªç®ã®éšåã§åããããŸãã
å°æ¥ã®ãªãªãŒã¹ã§
ãã®ãã¥ãŒããªã¢ã«ã®ç¬¬5éšã§ã¯ãæå·ãDRNGãããã³Vaultã¯ã©ã¹ããšã³ã¯ã¬ãŒãã«ç§»åããããããECALLé¢æ°ã«æ¥ç¶ããŠããšã³ã¯ã¬ãŒãã®äœæãå®äºããŸãã ãã¥ãŒã¹ããã©ããŒããŠãã ããïŒ