æè¿ã EthondããŒããããã«ãŒã¿ãŒãšããŠäœ¿çšããOpenVPNãèµ·åããŸããã
ããããããã»ããµã®è² è·ã¯100ïŒ
ã§ããããšãå€ããé床ã15ã16 Mbit / sãè¶
ããããšã¯ãããŸããã§ããã éä¿¡ãã£ãã«ã§ã¯ã100ã¡ã¬ãããã¯éåžžã«å°ãããããããŒããŠã§ã¢ã§ããã»ã¹ãé«éåããããšã«ããŸããã
FPGAéçºè
ã°ã«ãŒãã®ã¡ã³ããŒã¯ãAltera CycloneVã®ãªãŒãã³IPã³ã¢ã«åºã¥ããŠã8 Gb / sã®æå·åãš700 Mbit / sã®åŸ©å·åãå¯èœãªAES-128æå·ãå®è£
ãããã¡ãŒã ãŠã§ã¢ãäœæããŸããã æ¯èŒã®ããã«ãåãCycloneVã®CPUïŒARM Cortex A9ïŒäžã®openssl
ããã°ã©ã ã¯ãçŽ160 MbpsããåŠçã§ããŸããã
ãã®èšäºã¯ãAESããŒããŠã§ã¢æå·åã®äœ¿çšã«é¢ããç 究ã«å°å¿µããŠããŸãã Linuxã®æå·åã€ã³ãã©ã¹ãã©ã¯ãã£ã«ã€ããŠç°¡åã«èª¬æããFPGAãšã«ãŒãã«éã§äº€æããããã©ã€ããŒïŒãœãŒã¹ã³ãŒãã¯githubã§å
¬éãããŠããŸãïŒã«ã€ããŠèª¬æããŸãã FPGAã§ã®æå·åã®å®è£
ã¯ãã®èšäºã®ãããã¯ã§ã¯ãããŸãããããã»ããµãã¢ã¯ã»ã©ã¬ãŒã¿ãšå¯Ÿè©±ããã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã説æããŸãã
ãã£ãã«ã¹ã«ãŒããããäœäžãããäž»ãªèŠå ã¯äœã§ããããæåã«å€æããæ¹ãããããšãç解ããŸãããæå·åããã»ã¹ãæ¬åœã«éèŠã§ã¯ãªãããœãããŠã§ã¢ã¹ã¿ãã¯ã®ééã«æéããããå Žåã¯ã©ãã§ããããã ãããè¡ããªãã£ããããçµæãšããŠã®ããã©ãŒãã³ã¹ã®åäžã¯äºæ³ãšã¯ãŸã£ããç°ãªãããšãå€æããŸããã ãã ãããŸã ããã€ãã®å©ç¹ããããŸãïŒLinuxã§ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¡ã«ããºã ãç»é²ããæ¹æ³ããŠãŒã¶ãŒããã°ã©ã ããã¢ã¯ã»ã¹ããæ¹æ³ããããŠæåŸã«ããœãããŠã§ã¢ã«å®è£
ãããæšæºã¢ã«ãŽãªãºã ã§ã¯ãªãã openssl
ãopenvpn
ãªã©ã®äººæ°ã®ãããã®ã«ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã¢ã«ãŽãªãºã ãéžæãããæ¹æ³ãåŠã¶ã®ã¯èå³æ·±ãããšã§ããã
å°æ¥ã Ethond㧠OpenVPNãé«éåããäºå®ã§ãããã®åŸãå¥ã®èšäºãæåŸ
ããŠãã ããïŒ
ã¯ããã«
ãªãæå·åã«ããã»ã©èå³ãããã®ã§ããïŒ äžèŠãç§ãã¡ãäœã£ãæ©åšãšäžŠãã§ããããã§ã¯ãããŸããã ãã ãããã®ããã®ã¢ããªã±ãŒã·ã§ã³ãèŠã€ããããšãã§ããŸãã ãã©ãã£ãã¯ã®å€§éšåã¯æå·åãããŠããããã¹ãŠã®ã€ã³ã¿ãŒããããŠãŒã¶ãŒã¯ãç¥ããªããŠãæå·åã«å®æçã«ééããŸãã ããšãã°ãVPNã®äººæ°ã¯é«ãŸã£ãŠããŸãã 調æ»ã«ãããšã2017幎ã®åãã«ã10人äž3人ããã®ãã¯ãããžãŒã䜿çšããŠããŸãã
æå·åãšåŸ©å·åãé«éã§å®è¡ã§ããç¬èªã®å°ããªã«ãŒã¿ãŒãäœæãããšããã¢ã€ãã¢ãæãã€ããŸããã ã¢ã€ãã¢ã¯ããã·ã³ã®ãŠãŒã¶ãŒã§ã¯ãªãVPNçµç±ã§æ¥ç¶ãããšããããšã§ãã ããŠãæ°ããããšã«ææŠããŠã¿ãã®ã¯ãããããã£ãã§ãã
æå·åã¢ã«ãŽãªãºã ã®é«éåã¯ã©ã®ããã«éæã§ããŸããïŒ ç®è¡æŒç®ãšè«çæŒç®ã§è¡šçŸãããšããã£ãããšå€æããŸãã ç¹æ®ãªããžã¿ã«åè·¯ã«å®è£
ãããšãã¯ããã«é«ãããã©ãŒãã³ã¹ãå®çŸã§ããŸãã é¢é£ãªã³ã¯ã®è¯ãã»ããã¯ãAESåœä»€ã»ããã«é¢ããWikipediaã®èšäºã«ãããŸãã
CPUã®ããŒããŠã§ã¢ã«ã¢ã«ãŽãªãºã ãå®è£
ããç¹å¥ãªåœä»€ãéããŠãã®å®è¡ãåŒã³åºãããšãã§ããŸãã æåãªäŸã¯ã Intelã®AES-NIã§ãã ãã ããçµã¿èŸŒã¿ããã»ããµã«ã¯å€ãã®å Žåããã®æ©èœããªããããšã¯ã¹ããŒã/ã€ã³ããŒãã«å¶éããããŸãã ãã®å ŽåãããŒã¿ãåŠçããåšèŸºæ©åšãè¿œå ã€ã³ã¹ããŒã«ã§ããŸãã ãããŠããã¡ããããã®ãããªåšèŸºæ©åšã®æ©èœã¯FPGAã«å®è£
ããããšãã§ããŸãã
å¯èœæ§ãçŸå®ã«å€æããããšã«æ±ºãããããFPGAã§ã®æå·åã®ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã®ç 究ãéå§ããŸããã
çè«æ
å ±
FPGAãšãŠãŒã¶ãŒããã°ã©ã ã§ããŒããŠã§ã¢æå·åãçµã¿åãããæ¹æ³ãç 究ããéçšã§ãç§ãã¡ã¯ãã°ããã®éææã®ç 究ã«ãšããããŠããŸããã
Linuxã«ãŒãã«
Linuxã«ãŒãã«ã¯ã察称æå·ãããã·ã¥ããããã¯æå·ã®åäœã¢ãŒããªã©ãå€ãã®æå·ã¢ã«ãŽãªãºã ãå®è£
ããŠããŸãã ããã¯ãã¹ãŠãã«ãŒãã«èªäœã§äœ¿çšã§ããŸããããšãã°ããã£ã¹ã¯ã®æå·åïŒdm-cryptïŒãäœæ¥VPNïŒIPsecïŒã«äœ¿çšã§ããŸãã æå·åæ©èœãžã®çµ±åã¢ã¯ã»ã¹ã¯Kernel CryptoAPIã«ããæäŸããããã©ã€ããŒã¯å¯Ÿå¿ããã¢ã«ãŽãªãºã ã®ããŒããŠã§ã¢å®è£
ãç»é²ã§ããŸãã
ãŠãŒã¶ãŒããã°ã©ã ã¯CryptoAPIã«ãã¢ã¯ã»ã¹ã§ããŸãã ãã®æ©èœãæäŸããã€ã³ã¿ãŒãã§ã€ã¹ã®1ã€ã¯ãã¢ãã¬ã¹ãã¡ããªAF_ALG
ãšãã®äžã®AF_ALG
ã©ãããŒã©ã€ãã©ãªã§ãã AF_ALG
ã®äž»ãªç«¶åAF_ALG
ã¯ã cryptodev
ã«ãŒãã«cryptodev
ïŒ /dev/crypto
characterããã€ã¹ãä»ããCryptoAPIãžã®ã¢ã¯ã»ã¹ïŒã
cryptodev
ã®äœè
ã«ãããšã圌ãã®ãœãªã¥ãŒã·ã§ã³ã¯AF_ALG
ãããã¯ããã«çç£çAF_ALG
ïŒ æ¯èŒãåç
§ïŒã
ãã®å³ã¯ãCryptoAPIã瀺ããŠããŸããããã§ã¯ãAES-128ã®2ã€ã®å®è£
ãç»é²ãããŠããŸããé©åãªãã©ã€ããŒãä»ããŠã¢ã¯ã»ã¹ããããœãããŠã§ã¢ãšãââãŒããŠã§ã¢ã§ãã
ããšãã°ã IPsec
ã af_alg.ko
ããã³cryptodev.ko
ã¢ãžã¥ãŒã«ã¯CryptoAPIã«ãªã¯ãšã¹ããéä¿¡ã§ããŸãã ã©ã¡ããããŠãŒã¶ãŒããã°ã©ã ã«ã«ãŒãã«ã®æå·åãµãã·ã¹ãã ã«ã¢ã¯ã»ã¹ããæ©èœãæäŸããŸãã1ã€ç®ã¯ã¢ãã¬ã¹ãã¡ããªãä»ããŠã2ã€ç®ã¯ãã£ã©ã¯ã¿ããã€ã¹ãä»ããŠã¢ã¯ã»ã¹ããŸãã
ååãšããŠãããã¯ééçã«è¡ãããŸããCryptoAPIã¯èŠæ±ãåä¿¡ãããšã䜿çšããå®è£
ãéžæããŸãããå¿
èŠã«å¿ããŠã /proc/crypto
ãã¡ã€ã«ãä»ããŠæäœã®è©³çŽ°ã確èªã§ããŸãã ç¹ã«ã次ã®ãã£ãŒã«ããå«ãŸããŸãã
- name-å®è£
ãããã¢ã«ãŽãªãºã ã®ååã
driver
ã¯ãã¢ã«ãŽãªãºã ã®åå¥ã®å®è£
ã®äžæã®ååã§ãã -generic
ã§çµãããã®ã¯éåžžãã«ãŒãã«å
ã®æšæºãœãããŠã§ã¢å®è£
ã§ããpriority
-åªå
床ã ã«ãŒãã«ã«åãã¢ã«ãŽãªãºã ã®å®è£
ãè€æ°ããå Žåãæãåªå
床ã®é«ãå®è£
ãéžæãããŸãã åãã©ã€ããŒèªäœã¯ãã¢ã«ãŽãªãºã ã®ç»é²æã«ä»»æã®åªå
é äœãå²ãåœãŠãŸãã æãåªå
床ã®é«ãå®è£
ãéžæãããŸãã
ãŠãŒã¶ãŒã¹ããŒã¹
CryptoAPIã¯ããã§ã«é«åºŠãªæœè±¡åã§ããã«ããããããããã1ã€ã®ã©ãããŒãæã£ãŠããŸãããŠãŒã¶ãŒç©ºéã§ã¯ãçŽæ¥ã¢ã¯ã»ã¹ãã人ã¯ã»ãšãã©ãªããã»ãšãã©ã®ããã°ã©ã ã¯ã©ã€ãã©ãªïŒ openssl
ãããžã§ã¯ãã®libcrypto
ãlibssl
ãªã©ïŒã䜿çšããŸãã ãããã¯ãããšãã°openssh
ã opvenvpn
ãããã³äºæ³ã©ããopenssl
ã«ãã£ãŠäœ¿çšãããŸãã ãããã®ã©ã€ãã©ãªã¯ãäžè¬ã«ãã©ã°ã€ã³ãšåŒã°ãããšã³ãžã³ãæå·åã¢ã«ãŽãªãºã ã®æ°ããå®è£
ãè¿œå ããã¡ã«ããºã ããµããŒãããŸãã
AF_ALG
éçºè
ã¯ã AF_ALG
ããã³/dev/crypto
AF_ALG
ãä»ããŠã«ãŒãã«ã§æå·åçšã®ãšã³ãžã³ããã§ã«äœæããŠããŸãã ãããã£ãŠãæå·åã¢ã«ãŽãªãºã ãCryptoAPIã«ç»é²ãããŠããå Žåãå€ãã®ããã°ã©ã ã¯æå·åã¢ã«ãŽãªãºã ã®ããŒããŠã§ã¢å®è£
ã«èªåçã«ã¢ã¯ã»ã¹ããŸãã
ãã®å³ã¯ã /dev/crypto
AF_ALG
ãŸãã¯AF_ALG
ä»ããŠCryptoAPIã«ã¢ã¯ã»ã¹ã§ããlibssl
ããã³libcrypto
ã©ã€ãã©ãªã§æäŸãããæå·åæ©èœã䜿çšããããã€ãã®ããã°ã©ã ã瀺ããŠããŸãã ããšãã°ã libcrypto
cryptodev engine
ãšafalg engine
äž¡æ¹ã«æå®ãããŠããŸãã
å®éã®çµéš
çè«ãæ±ã£ãåŸãç§ãã¡ã¯å³ããçŸå®ã«ç®ãåããŸããããã¯ç§ãã¡ã®å®éã®çµéšã®èšè¿°ã§ãã
ç 究ç®ç
æå·åã¢ã¯ã»ã©ã¬ãŒã¿ãã©ã€ããŒãéçºããéã®äž»ãªç 究課é¡ã¯ãCycloneVãªã³ããŒãïŒEthondãBlueSomãªã© ïŒãæèŒãããã¶ãŒããŒãã§FPGAãšãŠãŒã¶ãŒããã°ã©ã éã®åž¯åå¹
ãæäŸã§ãããã©ããã§ãã ã ç§ãã¡ã®ç¶æ³ã§ã¯ãããã¯éèŠã§ããããšãå€æããŸãããæå·åãéåžžã«é«éãªå Žåãã»ãšãã©ã®æéã¯ããŒã¿ã®éä¿¡ãšã·ã¹ãã ã®ããŸããŸãªéšåã§èµ·ãã£ãŠããããšã®åæã«è²»ããããŸãã
ãã©ã€ããŒã¯ãæäŸããããŒããŠã§ã¢ã«ãã£ãŠã»ãŒå®å
šã«æ±ºå®ãããŸãã ãããã£ãŠãããŒããŠã§ã¢ã®èª¬æããå§ããŸãã
ãã®å³ã¯ãCycloneV SoCå
ã®ããã»ããµãšFPGAã®çžäºäœçšã®åçŽåãããã¢ãã«ã瀺ããŠããŸãã ããæ£ç¢ºã§è©³çŽ°ãªèª¬æã«ã€ããŠã¯ã Cyclone V Device Handbook Volume 3ïŒHard Processor Technical Reference Manualã®é
åçã ãåãæ¬ã®ãIntroduction to the Hard Processorãã®ç« ã®å
ã®ç»åãåç
§ã§ããŸãã
ãã©ã€ããŒãæèŒããLinuxã¯ãHPSïŒããŒãããã»ããµãŒã·ã¹ãã ïŒå
éšã®MPUïŒãã€ã¯ãããã»ããµãŒãŠãããïŒã§å®è¡ãããŠããŸãã ããã»ããµã¯ãHPS-to-FPGAã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠL3 SWITCHãä»ããŠFPGAã¬ãžã¹ã¿ã«ã¢ã¯ã»ã¹ã§ããŸãã å³ã®ã¬ãžã¹ã¿ã®åŒã³åºãã¯ãéãç¢å°ã§ç€ºãããŠããŸãã
FPGAã«å®è£
ãããããã€ã¹ã¯ãDMAãä»ããŠFPGA-to-HPSãä»ããŠSDRAMã¡ã¢ãªã«ã¢ã¯ã»ã¹ãïŒç·è²ã®ç¢å°ïŒãããã»ããµã«å²ã蟌ã¿ãéä¿¡ããŸãïŒèµ€è²ã®ç¢å°ïŒã FPGAã¯ãæå·åã¢ã¯ã»ã©ã¬ãŒã¿ãšåŸ©å·åã¢ã¯ã»ã©ã¬ãŒã¿ã®2ã€ã®ç¬ç«ãããšã³ãã£ãã£ãå®è£
ããŠããŸãã ããããã2ã€ã®æ¥ç¶ããããããã¯ã§æ§æããã1ã€ã¯ã¢ã«ãŽãªãºã ïŒæå·å/埩å·åïŒãå®è£
ãããã1ã€ã¯DMAãä»ããŠã¡ã¢ãªãšããŒã¿ã亀æããŸãã
FPGAã«å®è£
ãããäž¡æ¹ã®ããããã¯ããã¢ã«ã¯ãç¬èªã®ã¬ãžã¹ã¿ããããŸãã
æå·åã³ã¢ãšåŸ©å·åã³ã¢ã«ã¯ã次ã®æå·å/埩å·åæäœã§äœ¿çšãããããŒïŒããŒïŒãåæåãã¯ãã«ïŒIVãåæåãã¯ãã«ïŒãæå®ã§ããåäžã®ã¬ãžã¹ã¿ã»ããããããŸãã
Decrypt DMAãšEncrypt DMAããã©ãŒæ§é ã«ãªã£ãŠããŸãã ã¬ãžã¹ã¿ãä»ããŠãã¡ã¢ãªã»ã°ã¡ã³ãã®ã¢ãã¬ã¹ãšé·ããèšå®ã§ããŸãïŒãããã®ãã©ã¡ãŒã¿ã»ããã¯èšè¿°åãšåŒã°ããŸãïŒããœãŒã¹ããŒã¿ãé
眮ãããŠããéšåãšãAESãé©çšããçµæãå¿
èŠãªéšåããããŸãã å²ã蟌ã¿ãæå¹ãŸãã¯ç¡å¹ã«ããæ©èœã䜿çšããŠãåèšè¿°åã®åŠçãå®äºããããšãéç¥ããããšãã§ããŸãã
æå·åAPI
Linuxæå·åãµãã·ã¹ãã ã®ããã€ãã®æŠå¿µã«ã€ããŠããå°ã話ããŸãããã
ãã®äž»èŠãªãšã³ãã£ãã£ã®1ã€ã¯ãå€æãã§ããããã¯ãããŒã¿å€æã®ååã§ãïŒããã·ã¥åèšèšç®ãå§çž®ãæå·åã ãã©ã€ããŒã¯ãç¬ç«ããŠå€æããç»é²ãã§ããŸã-ããã䜿çšããæ©äŒãæäŸããŸãã
å€æã¿ã€ãã®ã¯ã©ã¹ã¯éåžžã«åºç¯å²ã«æž¡ããŸãããæå·åã«é¢äžããã¿ã€ãã¯3ã€ã ãã§ãã
CRYPTO_ALG_TYPE_CIPHER
ïŒåäžãããã¯ã§åäœããæå·ïŒãããã¯æå·ã®èŠ³ç¹ããïŒãCRYPTO_ALG_TYPE_BLKCIPHER
ïŒãããã¯ãµã€ãºã®åæ°ã®é·ãã®ããŒã¿ãæäœããæå·ãåæïŒæå·åæ©èœã¯ãæå·åãå®äºãããŸã§çµäºããŸãããCRYPTO_ALG_TYPE_ABLKCIPHER
ïŒéåæã§ãããšããç¹ã§ä»¥åã®ãã®ãšç°ãªããŸããæå·åæ©èœã¯ãæå·åãéå§ããããã ãã«äœ¿çšãããå®äºãåŸ
ããã«çµäºããŸãã æäœã®çµäºã¯ãæå·åãå®è£
ãããã©ã€ããŒèªäœã«ãã£ãŠå ±åãããŸãã
CryptoAPIã§ã¯ãããã³ãã¬ãŒãã-åäžã®ããŒã¿ãããã¯ã®æå·åãããã·ã¥ãµã ã®èšç®ãªã©ã®åçŽãªå€æã«åºã¥ãããç¹å®ã®ãããã¯æå·ãHMACã¢ãŒããªã©ã®è€éãªãšã³ãã£ãã£ã®å®è£
ãèšå®ã§ããŸãã
ç¹ã«ããã³ãã¬ãŒãã®ååšã«ããã CRYPTO_ALG_TYPE_CIPHER
ã䜿çšããŠãããã¯æå·ãå®è£
ã§ããŸãããå€æèªäœã¯16ãã€ããããã¯ã®ã¿ã§åäœããŸãã ãã ããããã¯CPUã«å€§ããªè² è·ããããŸããã«ãŒãã«èªäœãæå·ã®åäœã¢ãŒããå¶åŸ¡ããŸãã CRYPTO_ALG_TYPE_ABLKCIPHER
ãšCRYPTO_ALG_TYPE_ABLKCIPHER
ã¯ãããèªåèªèº«ã«CRYPTO_ALG_TYPE_ABLKCIPHER
ããã«ãŒãã«ã¯ã¢ãŒããæäŸãããã³ãã¬ãŒãã䜿çšããå¿
èŠã¯ãããŸããã
FPGAã®ãã¡ãŒã ãŠã§ã¢ãCBCã¢ãŒãã§AES-128ãå®è£
ããããã«ãªã£ãããã CRYPTO_ALG_TYPE_CIPHER
ã¯CRYPTO_ALG_TYPE_CIPHER
ã¯ãããŸãããå¿
èŠãªåäœã¢ãŒããæ¢ã«å®è£
ããŠãããããã»ããµããã®è¿œå ã³ã¹ãã¯äžèŠã§ãã
ç§ãã¡ã®ãã©ã€ããŒã¯CRYPTO_ALG_TYPE_BLKCIPHER
ãããªå€æãæäŸããŸããããããå®è£
ããæ¹ãç°¡åã ãšæãããŸããã
å€æã«ãããIVïŒåæåãã¯ãã«ïŒãããŒãæå·åããã³åŸ©å·åãèšå®ããããã®CryptoAPIé¢æ°ãæäŸãããŸãã ãããã¯ãã¹ãŠã blkcipher_alg
æ§é äœã®ãã£ãŒã«ãã«ç»é²ããããšãã«ãå€æãã©ã€ããŒã«ãã£ãŠç€ºãããŸãã ãã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã
struct blkcipher_alg { int (*setkey)(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen); int (*encrypt)(struct blkcipher_desc *desc, struct scatterlist *dst, struct scatterlist *src, unsigned int nbytes); int (*decrypt)(struct blkcipher_desc *desc, struct scatterlist *dst, struct scatterlist *src, unsigned int nbytes); const char *geniv; unsigned int min_keysize; unsigned int max_keysize; unsigned int ivsize; };
æãèå³æ·±ããã£ãŒã«ããèããŠã¿ãŸãããïŒ setkey
ãããŒãèšå®ããããã®ã³ãŒã«ããã¯ãããã³encrypt
/ decrypt
ããã®æå·å/埩å·åã blkcipher_desc
æ§é ã«ã¯ãæå·åæäœã®IVãå«ãŸããŠããŸãã encrypt
ããã³decrypt
ã³ãŒã«ããã¯ã®src
ããã³dst
ã³ãŒã«ããã¯encrypt
ã¯ããœãŒã¹ããŒã¿ãååŸããçµæãé
眮ããã¡ã¢ãªé åãæå®ããŸãã
äŸãšããŠOpensslã䜿çšããæå·ã¹ã¿ãã¯ãªãã·ã§ã³
ããã§ãLinuxã§æå·ã¹ã¿ãã¯ãã©ã®ããã«å®è£
ãããŠããããå°ããããããããªããé¢é£ããããŸããŸãªé·æãšçæã䜿ã£ãŠæ§ç¯ããããã®ããŸããŸãªãªãã·ã§ã³ããã責任ãæã£ãŠæ€èšã§ããŸãã
æããã«ãæå·åã¢ã¯ã»ã©ã¬ãŒã¿ã®ãã©ã€ããã«ãŒãã«èªäœã§äœ¿çšããå¿
èŠãããå ŽåïŒããšãã°IPsecã§ïŒãå®è£
ãCryptoAPIã«ç»é²ããå¿
èŠããããŸãã ãã®å ŽåããŠãŒã¶ãŒããã°ã©ã ãšLinuxã®äž¡æ¹ããã©ã€ããŒã«ã¢ã¯ã»ã¹ã§ããŸãã ããã¯ãå³ã§ã¯ããã©ã€ããŒãªãã·ã§ã³1ããšããŠããŒã¯ãããŠããŸãã
ãã ããããã©ã€ããŒãªãã·ã§ã³2ããšåŒã°ãã代æ¿æ©èœããããŸãcryptodev
ãšaf_alg
ããã³af_alg
ãã€ãã¹ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ãaf_alg
ã ããã¯ééã£ã決å®ã®ããã«æãããããããŸãããæšæºåãããã¡ã«ããºã ãé¿ããããšã¯ãã£ãã«æ¥œããçµæã«ã€ãªãããŸããã ãã ãããã®ã±ãŒã¹ãCryptoAPIã«ããŸãé©åããé倧ãªããã©ãŒãã³ã¹å¶éã課ããªãããšã確èªããã®ã«ååãªã»ã©ããã®åé¡ããŸã 調æ»ããŠããŸããã
çŸåšã®å®è£
ã§ã¯ãæåã®ãªãã·ã§ã³ãéžæããŠããŸããã2çªç®ã®ãªãã·ã§ã³ãè©Šãæºåãã§ããŠããŸãã
SOC-AES-ACCELã¢ãŒããã¯ãã£
ã«ãŒãã«ãäœããæå·åãŸãã¯åŸ©å·åããããšãåžæããå Žåã fpga_encrypt
ããã³fpga_decrypt
ãfpga_decrypt
ã ãããã¯åäžã®çœ²åãæã¡ãåãããšãè¡ããŸããFPGAå
ã®æå·åããã€ã¹ã®ã¬ãžã¹ã¿ã«ã¢ã¯ã»ã¹ããã®ã¯1ã€ã ãã§ã2çªç®ã¯åŸ©å·ååšã®ã¬ãžã¹ã¿ãåç
§ããŸãã
ãããã®é¢æ°ã¯ã struct scatterlist
ããé
åãžã®2ã€ã®ãã€ã³ã¿ãŒãåãå
¥ããŸãã ããããã«äžé£ã®ã¡ã¢ãªé åãæ ŒçŽãããŸãdst
ãœãŒã¹ããŒã¿ã®ååŸå
ã dst
çµæã®æ ŒçŽå
ã ãããã®ã¡ã¢ãªããããã1ããŒãžã®å¢çãè¶ããªãããšãä¿èšŒãããŠããŸãã
ãã©ã€ããŒã¿ã¹ã¯ã¯ç°¡åã«èŠããŸãã
- åã¡ã¢ãªé åã®ã¢ãã¬ã¹ã察å¿ãããã¹ã¢ãã¬ã¹ã«ãããããŸã-ããã€ã¹ãDMAçµç±ã§åŒã³åºããè¡ãããšãã§ããã¢ãã¬ã¹ã
- ãã¹ã¢ãã¬ã¹ãšã¡ã¢ãªé åã®é·ããDMAã³ã³ãããŒã©ã®ã¬ãžã¹ã¿ã«æžã蟌ã¿ãŸãã
- ãã¹ãŠã®ããŒã¹ãåŠçããåŸãDMAã³ã³ãããŒã©ãŒã«å²ã蟌ã¿ãéä¿¡ããããäŸé ŒããŸãã
- äžæãåŸ
ã¡ãŸãã
ããããæªéã¯è©³çŽ°ã«ãããŸããå®è£
ããDMAã³ã³ãããŒã©ãŒã®FPGAããŒãžã§ã³ã¯ã16ãã€ãã®åæ°ã§ããå
¥åããŒã¿ã®ã¿ãåãå
¥ããŸãã ããã«ãã®å¶éã¯ãªããªããŸãããFPGAéçºè
ã¯ãã¡ãŒã ãŠã§ã¢ãå€æŽããæéããããŸãããã16ãã€ãã®åæ°ã§ã¯ãªãã¡ã¢ãªã®äžéšãã·ãªã¢ã«ãããã¡ãŒã«ã³ããŒããŸãã
æ§èœ
ãã©ã€ããŒãäœæãããã®ã§ãæžã蟌ã¿ã«é¢ãã質åã«çããå¿
èŠããããŸãã
ãã¡ããã枬å®ã«opensslã䜿çšããããšãå¯èœã§ãããç¬èªã®ããã°ã©ã openssl_benchmark.cãäœæããããšã«ããŸãããopensslã¯ååãªæè»æ§ãæäŸããŸããã ç¹ã«ãopensslã¯å
¥åãéšåçã«åŠçããããšã決å®ããå¯èœæ§ããããããlibcryptoã«éä¿¡ãããåäžã®ãããã¡ãŒã®æ£ç¢ºãªãµã€ãºãèšå®ããããšã¯ã§ããŸããã ãŸããããã©ãŒãã³ã¹ã€ã³ãžã±ãŒã¿ã¯ãI / Oãã¡ã¢ãªå²ãåœãŠãopensslã®åæåãªã©ã«æéãããããããåºå¥ãé£ãããªããŸãã
ç§ãã¡ã®ããã°ã©ã ã¯åçŽã«åäœããŸããæå®ããããµã€ãºã®ãããã¡ãŒãå
¥åãšããŠå²ãåœãŠãŠãŒãã«ããæå®ãããåæ°åŠçããããã«ããããlibcryptoã«éä¿¡ããŸãã libcryptoåŒã³åºãã«ããã£ãæéã®ã¿ã枬å®ããŸãã åŠçãäœåºŠãçºçãããšããäºå®ã«ãããå
¥åããŒã¿ã®ååŸãªã©ã®è£å©ã¿ã¹ã¯ã«ããæ倱ãèæ
®ããã«ãAESå®è¡ã®ããã©ãŒãã³ã¹ãéåžžã«æ£ç¢ºã«ç¢ºç«ããããšãã§ããŸãã
ãã®ããã°ã©ã ã䜿çšããŠãç°ãªãé·ãã®ãããã¡ãŒãæå·åããã³æå·å解é€ããŸããïŒãããã¡ãŒé·ããšã«äž¡æ¹ã®ã¿ã€ãã®1000ã®æäœïŒã 次ã«ãã¹ã«ãŒããããMbpsã§èšç®ããŸããã ãã®ãã¹ãŠã2åè¡ããŸãããæåã®ã±ãŒã¹ã§ã¯ãlibcryptoã¯ãœãããŠã§ã¢å®è£
ïŒã°ã©ãäžã®ããœãããŠã§ã¢ãïŒã§ããŒã¿ãæå·åãã2çªç®ã§ã¯ãcryptodevãšã³ãžã³ïŒã°ã©ãäžã®ãããŒããŠã§ã¢ãïŒãéããŠã«ãŒãã«ãæäŸããŸããã
ç¹ã«èå³æ·±ãã®ã¯ã垯åå¹
ã®ç¹ã§ããŒããŠã§ã¢å®è£
ããœãããŠã§ã¢ãè¿œãæãç¹ã§ãã ããçãééã§ãããçãééã§æž¬å®ãè¡ããŸãã
ãœãããŠã§ã¢å®è£
ã®ããã©ãŒãã³ã¹ã¯ããããã¡ã®ãµã€ãºã«å®è³ªçã«äŸåããªãããšãããããŸãã ããã¯ãããã°ã©ã ãšlibcryptoã®éã®ããŒã¿äº€æãéåžžã«é«éã§ããããããã¡ã®ãµã€ãºã倧ãããªããšãé¢æ°ãåŒã³åºãããã®ç®ç«ããªãæéã®ç¡é§ã«ãªããšããäºå®ã«ãã£ãŠèª¬æã§ããŸãã
FPGAæå·åã§ã¯ãç¶æ³ã¯ããè€éã§ãã libryptoã®åŒã³åºãã¯cryptodevãšã³ãžã³ã«æž¡ããã /dev/crypto
cryptãéããŠãããã€ãã®ã·ã¹ãã ã³ãŒã«ã§æå·åã®ã»ãã·ã§ã³ãæ§æããæå·åãããã¡ãŒãžã®ãã€ã³ã¿ãŒãcryptodev
ã¢ãžã¥ãŒã«ã«cryptodev
ãŸãã 次ã«ã struct scatterlist *
圢åŒã§ãã©ãŒã ãäœæãããŠãŒã¶ãŒãããã¡ãŒãä»®æ³ã¢ãã¬ã¹ç©ºéã«æ圱ãããç©çããŒãžã®2ã€ã®ãªã¹ããCryptoAPIã«æž¡ããŸãã ç§ãã¡ã®ãã©ã€ããŒã¯ãç»é²ãããŠãããã¹ãŠã®AESå®è£
ã®äžã§æãé«ãåªå
é äœãæã£ãŠããããããªã¹ããååŸããŸãã ãã©ã€ããŒã¯ããã¹ãŠã®ã¡ã¢ãªã®é·ããAESãããã¯ã®é·ãã®åæ°ã§ããããšã確èªãããšã察å¿ãããã¹ã¢ãã¬ã¹ãåä¿¡ããããããFPGAã¬ãžã¹ã¿ã«æžã蟌ã¿ãŸãã
FPGAãšãŠãŒã¶ãŒããã°ã©ã ã®éã§ã¯ããªã¯ãšã¹ãã¯è€æ°ã®ã¬ã€ã€ãŒãééããå¿
èŠãããããããã®æéæ倱ã¯éåžžã«å€§ããããšãããããŸãã éåžžã«å€§éã®åž¯åå¹
ã®ããŒã¿ã§ã®ã¿ããªã¯ãšã¹ãã®å®è£
ã«åŒ·ã圱é¿ãäžããæéã¯ãªããªããŸãã ã°ã©ãã§ã¯ããã®ç¬éã¯ç·ãã»ãŒæ°Žå¹³ã«ãªããšããäºå®ã«ãã£ãŠå€æã§ããŸããã»ãšãã©ã®æéã¯ããŒã¿åŠçã«è²»ããããŸãã
ç·ã®åœ¢ã ãã§ãªãç¹å®ã®æ°å€ãèŠãèªè
ã¯ããã£ãšé©ãããããšã§ãããããªã埩å·åã¯250 Mbit / sã§ãæå·åã¯400 Mbit / sã§å®å®ããã®ã§ããããïŒ , , FPGA, , -.
, CPU . CPU : CPU , . , .
CPU top
. , " " top
, , - .
:
| |
16 | 256 | 1024 | 4096 | 8192 | 450000 |
æå·å | 92% | 89% | 81ïŒ
| 63% | 53% | 29ïŒ
|
| 93ïŒ
| 91% | 86% | 74ïŒ
| 64% | 43% |
- , FPGA , FPGA .
, , , CPU. , , .
ãããã«
FPGA . : . . - .