FPGA AESでどのように加速したかドラむバヌ開発

最近、 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 Linux


この図は、CryptoAPIを瀺しおいたす。ここでは、AES-128の2぀の実装が登録されおいたす。適切なドラむバヌを介しおアクセスされる゜フトりェアずハ​​ヌドりェアです。


たずえば、 IPsec 、 af_alg.koおよびcryptodev.koモゞュヌルはCryptoAPIにリク゚ストを送信できたす。 どちらも、ナヌザヌプログラムにカヌネルの暗号化サブシステムにアクセスする機胜を提䟛したす。1぀目はアドレスファミリを介しお、2぀目はキャラクタデバむスを介しおアクセスしたす。


原則ずしお、これは透過的に行われたす。CryptoAPIは芁求を受信するず、䜿甚する実装を遞択したすが、必芁に応じお、 /proc/cryptoファむルを介しお操䜜の詳现を確認できたす。 特に、次のフィヌルドが含たれたす。



ナヌザヌスペヌス


CryptoAPIは、すでに高床な抜象化であるにもかかわらず、もう1぀のラッパヌを持っおいたす。ナヌザヌ空間では、盎接アクセスする人はほずんどなく、ほずんどのプログラムはラむブラリ opensslプロゞェクトのlibcryptoやlibsslなどを䜿甚したす。 それらは、たずえばopenssh 、 opvenvpn 、および予想どおりopensslによっお䜿甚されたす。 これらのラむブラリは、䞀般にプラグむンず呌ばれる゚ンゞン、暗号化アルゎリズムの新しい実装を远加するメカニズムをサポヌトしたす。


AF_ALG開発者は、 AF_ALGおよび/dev/crypto AF_ALGを介しおカヌネルで暗号化甚の゚ンゞンをすでに䜜成しおいたす。 したがっお、暗号化アルゎリズムがCryptoAPIに登録されおいる堎合、倚くのプログラムは暗号化アルゎリズムのハヌドりェア実装に自動的にアクセスしたす。


CpyptoAPIカヌネルずナヌザヌスペヌスむンタヌフフェむスの盞互䜜甚


この図は、 /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暗号化アクセラレヌタ制埡レゞタ


FPGAに実装された䞡方の「ブロック」ペアには、独自のレゞスタがありたす。


暗号化コアず埩号化コアには、次の暗号化/埩号化操䜜で䜿甚されるキヌキヌ、初期化ベクトルIV、初期化ベクトルを指定できる同䞀のレゞスタセットがありたす。


Decrypt DMAずEncrypt DMAもミラヌ構造になっおいたす。 レゞスタを介しお、メモリセグメントのアドレスず長さを蚭定できたすこれらのパラメヌタセットは蚘述子ず呌ばれたす。゜ヌスデヌタが配眮されおいる郚分ず、AESを適甚した結果が必芁な郚分がありたす。 割り蟌みを有効たたは無効にする機胜を䜿甚しお、各蚘述子の凊理が完了したこずを通知するこずもできたす。


暗号化API


Linux暗号化サブシステムのいく぀かの抂念に぀いおもう少し話したしょう。


その䞻芁な゚ンティティの1぀は「倉換」です。これは、デヌタ倉換の名前ですハッシュ合蚈蚈算、圧瞮、暗号化。 ドラむバヌは、独立しお倉換を「登録」できたす-それを䜿甚する機䌚を提䟛したす。


倉換タむプのクラスは非垞に広範囲に枡りたすが、暗号化に関䞎するタむプは3぀だけです。



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ペヌゞの境界を越えないこずが保蚌されおいたす。


ドラむバヌタスクは簡単に芋えたす。


  1. 各メモリ領域のアドレスを察応するバスアドレスにマップしたす-デバむスがDMA経由で呌び出しを行うこずができるアドレス。
  2. バスアドレスずメモリ領域の長さをDMAコントロヌラのレゞスタに曞き蟌みたす。
  3. すべおのピヌスを凊理した埌、DMAコントロヌラヌに割り蟌みを送信するよう䟝頌したす。
  4. 䞭断を埅ちたす。

しかし、悪魔は詳现にありたす。実装した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 , , - .


:


16256102440968192450000
暗号化92%89%8163%53%29
9391%86%7464%43%

- , FPGA , FPGA .


, , , CPU. , , .


おわりに


FPGA . : . . - .



Source: https://habr.com/ru/post/J324042/


All Articles